in-app-notification.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { IInAppNotification } from '../../../interfaces/in-app-notification';
  2. const express = require('express');
  3. const { serializeUserSecurely } = require('../../models/serializers/user-serializer');
  4. const router = express.Router();
  5. module.exports = (crowi) => {
  6. const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
  7. const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
  8. const csrf = require('../../middlewares/csrf')(crowi);
  9. const inAppNotificationService = crowi.inAppNotificationService;
  10. const User = crowi.model('User');
  11. router.get('/list', accessTokenParser, loginRequiredStrictly, async(req, res) => {
  12. const user = req.user;
  13. const limit = parseInt(req.query.limit) || 10;
  14. let offset = 0;
  15. if (req.query.offset) {
  16. offset = parseInt(req.query.offset, 10);
  17. }
  18. const queryOptions = {
  19. offset,
  20. limit,
  21. };
  22. // set in-app-notification status to categorize
  23. if (req.query.status != null) {
  24. Object.assign(queryOptions, { status: req.query.status });
  25. }
  26. const paginationResult = await inAppNotificationService.getLatestNotificationsByUser(user._id, queryOptions);
  27. const getActionUsersFromActivities = function(activities) {
  28. return activities.map(({ user }) => user).filter((user, i, self) => self.indexOf(user) === i);
  29. };
  30. const serializedDocs: Array<IInAppNotification> = paginationResult.docs.map((doc) => {
  31. if (doc.user != null && doc.user instanceof User) {
  32. doc.user = serializeUserSecurely(doc.user);
  33. }
  34. // To add a new property into mongoose doc, need to change the format of doc to an object
  35. const docObj: IInAppNotification = doc.toObject();
  36. const actionUsersNew = getActionUsersFromActivities(doc.activities);
  37. const serializedActionUsers = actionUsersNew.map((actionUser) => {
  38. return serializeUserSecurely(actionUser);
  39. });
  40. docObj.actionUsers = serializedActionUsers;
  41. return docObj;
  42. });
  43. const serializedPaginationResult = {
  44. ...paginationResult,
  45. docs: serializedDocs,
  46. };
  47. return res.apiv3(serializedPaginationResult);
  48. });
  49. router.get('/status', accessTokenParser, loginRequiredStrictly, async(req, res) => {
  50. const userId = req.user._id;
  51. try {
  52. const count = await inAppNotificationService.getUnreadCountByUser(userId);
  53. return res.apiv3({ count });
  54. }
  55. catch (err) {
  56. return res.apiv3Err(err);
  57. }
  58. });
  59. router.post('/read', accessTokenParser, loginRequiredStrictly, csrf, async(req, res) => {
  60. const user = req.user;
  61. try {
  62. await inAppNotificationService.read(user);
  63. return res.apiv3();
  64. }
  65. catch (err) {
  66. return res.apiv3Err(err);
  67. }
  68. });
  69. router.post('/open', accessTokenParser, loginRequiredStrictly, csrf, async(req, res) => {
  70. const user = req.user;
  71. const id = req.body.id;
  72. try {
  73. const notification = await inAppNotificationService.open(user, id);
  74. const result = { notification };
  75. return res.apiv3(result);
  76. }
  77. catch (err) {
  78. return res.apiv3Err(err);
  79. }
  80. });
  81. router.put('/all-statuses-open', accessTokenParser, loginRequiredStrictly, csrf, async(req, res) => {
  82. const user = req.user;
  83. try {
  84. await inAppNotificationService.updateAllNotificationsAsOpened(user);
  85. return res.apiv3();
  86. }
  87. catch (err) {
  88. return res.apiv3Err(err);
  89. }
  90. });
  91. return router;
  92. };