Source: lib/db/comments/reads.js

import { ObjectID } from "bson";
import { getCommentsCollection } from "../mongodb";
import { getPostById } from "../reads";

/**
 * Gets all the comments from a publication
 *
 * @param {string} postId
 */
export async function getComments(postId) {
  const [collection, post] = await Promise.all([
    getCommentsCollection(),
    getPostById(postId),
  ]);

  if (!post) {
    console.error({
      name: "Post miss",
      message: "No publication found to append comment",
    });

    return;
  }

  const cursor = collection
    .find({ dreamId: ObjectID(postId) })
    .sort({ _id: 1 });

  const result = await cursor.toArray();

  if (result.lenght === 0) {
    return null;
  }

  return result;
}

/**
 * Gets all the comments from a user
 *
 * @param {string} userId
 */
export async function getCommentsByUserId(userId) {
  const collection = await getCommentsCollection();

  const cursor = collection
    .find({ userId: ObjectID(userId) })
    .sort({ _id: -1 });

  const result = await cursor.toArray();

  if (result.lenght === 0) {
    return null;
  }

  return result;
}

/**
 * Gets a comment on a publication by its id
 *
 * @param {string} commentId The comment id
 */
export async function getCommentById(commentId) {
  const collection = await getCommentsCollection();

  const cursor = collection.find({ _id: ObjectID(commentId) }).limit(1);

  const result = await cursor.toArray();

  await cursor.close();

  if (result.lenght === 0) {
    return null;
  }

  const data = result[0];

  return data;
}

/**
 * Checks whether a user has commented on a post or not
 *
 * @param {string} userName The user name
 * @param {string} postId The post id
 * @returns {Promise<boolean>}
 */
export async function hasCommentedOnPost(userName, postId) {
  const collection = await getCommentsCollection();

  return (
    (await collection
      .find({ userName: userName, dreamId: ObjectID(postId) })
      .count()) > 0
  );
}