Source: pages/api/data/stars.js

  1. /** @module pages/api/data/stars */
  2. import { getServerSession } from "../../../lib/auth";
  3. import { starPost, unstarPost } from "../../../lib/db/writes";
  4. import {
  5. BAD_REQUEST,
  6. METHOD_NOT_ALLOWED,
  7. SERVER_ERROR,
  8. FORBIDDEN,
  9. } from "../../../lib/errors";
  10. /**
  11. * This endpoint is used to star and unstar dreams.
  12. * To star a dream means to save it to a user's list of starred/saved dreams.
  13. * This endpoint only supports POST and DELETE.
  14. */
  15. function starsHandler(req, res) {
  16. switch (req.method) {
  17. case "POST":
  18. return post(req, res);
  19. case "DELETE":
  20. return del(req, res);
  21. default:
  22. res.setHeader("Allow", ["POST", "DELETE"]);
  23. res.status(405).end(METHOD_NOT_ALLOWED);
  24. return res;
  25. }
  26. }
  27. /**
  28. * @private
  29. */
  30. async function post(req, res) {
  31. const session = await getServerSession(req, res);
  32. if (!session) {
  33. res.status(403).end(FORBIDDEN);
  34. return res;
  35. }
  36. if (!req.body.dreamId) {
  37. res.status(400).end(BAD_REQUEST);
  38. return res;
  39. }
  40. const data = {
  41. dreamId: req.body.dreamId,
  42. session,
  43. };
  44. try {
  45. const result = await starPost(data);
  46. const objectId = result.insertedId.toString();
  47. res.setHeader("Content-Type", "application/json");
  48. res.status(201).send({ objectId });
  49. return res;
  50. } catch (error) {
  51. console.error({
  52. error,
  53. service: "api",
  54. pathname: "/api/data/stars",
  55. method: "post",
  56. });
  57. res.status(500).end(SERVER_ERROR);
  58. return res;
  59. }
  60. }
  61. /**
  62. * @private
  63. */
  64. async function del(req, res) {
  65. const session = await getServerSession(req, res);
  66. if (!session) {
  67. res.status(403).end(FORBIDDEN);
  68. return res;
  69. }
  70. if (!req.body?.dreamId) {
  71. res.status(400).end(BAD_REQUEST);
  72. return res;
  73. }
  74. const data = {
  75. dreamId: req.body.dreamId,
  76. session,
  77. };
  78. try {
  79. const result = await unstarPost(data);
  80. res.setHeader("Content-Type", "application/json");
  81. res.status(200).send(result);
  82. return res;
  83. } catch (error) {
  84. console.error({
  85. error,
  86. service: "api",
  87. pathname: "/api/data/stars",
  88. method: "delete",
  89. });
  90. res.status(500).end(SERVER_ERROR);
  91. return res;
  92. }
  93. }
  94. export default starsHandler;