Source: pages/api/data/inbox.js

/** @module pages/api/data/inbox */
import { getServerSession } from "../../../lib/auth";
import {
  deleteAllInboxMessages,
  deleteSomeInboxMessages,
  markAllInboxMessagesAsRead,
  markSomeInboxMessagesAsRead,
} from "../../../lib/db/writes";
import {
  BAD_REQUEST,
  METHOD_NOT_ALLOWED,
  SERVER_ERROR,
  FORBIDDEN,
} from "../../../lib/errors";

/**
 * This is the API route for managing inbox messages.
 * It supports PATCH and DELETE, allowing users to mark messages as read and
 * delete them.
 */
function inboxHandler(req, res) {
  switch (req.method) {
    case "PATCH":
      return patch(req, res);
    case "DELETE":
      return del(req, res);
    default:
      res.setHeader("Allow", ["PATCH", "DELETE"]);
      res.status(405).end(METHOD_NOT_ALLOWED);
      return res;
  }
}

/**
 * @private
 */
async function patch(req, res) {
  const session = await getServerSession(req, res);

  if (!session) {
    res.status(403).end(FORBIDDEN);
    return res;
  }

  if (!req.body?.inboxIds) {
    res.status(400).end(BAD_REQUEST);
    return res;
  }

  try {
    if (req.body?.all) {
      await markAllInboxMessagesAsRead(session.user.email);

      res.setHeader("Content-Type", "application/json");
      res.status(201).send({});

      return res;
    }

    await markSomeInboxMessagesAsRead(req.body.inboxIds);

    res.setHeader("Content-Type", "application/json");
    res.status(201).send({});

    return res;
  } catch (error) {
    console.error({
      error,
      service: "api",
      pathname: "/api/data/inbox",
      method: "patch",
    });
    res.status(500).end(SERVER_ERROR);

    return res;
  }
}

/**
 * @private
 */
async function del(req, res) {
  const session = await getServerSession(req, res);

  if (!session) {
    res.status(403).end(FORBIDDEN);
    return res;
  }

  if (!req.body?.inboxIds) {
    res.status(400).end(BAD_REQUEST);
    return res;
  }

  try {
    if (req.body?.all) {
      await deleteAllInboxMessages(session.user.email);

      res.setHeader("Content-Type", "application/json");
      res.status(201).send({});

      return res;
    }

    await deleteSomeInboxMessages(req.body.inboxIds);

    res.setHeader("Content-Type", "application/json");
    res.status(201).send({});

    return res;
  } catch (error) {
    console.error({
      error,
      service: "api",
      pathname: "/api/data/inbox",
      method: "delete",
    });
    res.status(500).end(SERVER_ERROR);

    return res;
  }
}

export default inboxHandler;