activity.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { getModelSafely } from '@growi/core';
  2. import { IActivity, AllSupportedActionToNotifiedType } from '~/interfaces/activity';
  3. import { IPage } from '~/interfaces/page';
  4. import { stringifySnapshot } from '~/models/serializers/in-app-notification-snapshot/page';
  5. import Activity from '~/server/models/activity';
  6. import Crowi from '../crowi';
  7. type ParameterType = Omit<IActivity, 'createdAt'>
  8. class ActivityService {
  9. crowi!: Crowi;
  10. inAppNotificationService!: any;
  11. constructor(crowi: Crowi) {
  12. this.crowi = crowi;
  13. this.inAppNotificationService = crowi.inAppNotificationService;
  14. }
  15. /**
  16. * @param {object} parameters
  17. * @return {Promise}
  18. */
  19. createByParameters = function(parameters) {
  20. const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
  21. return Activity.create(parameters);
  22. };
  23. updateByParameters = async function(activityId: string, parameters: ParameterType, target?: IPage): Promise<void> {
  24. const activity = await Activity.findOneAndUpdate({ _id: activityId }, parameters, { new: true });
  25. const shouldNotification = activity != null && target != null && (AllSupportedActionToNotifiedType as ReadonlyArray<string>).includes(activity.action);
  26. if (shouldNotification) {
  27. const notificationTargetUsers = await activity.getNotificationTargetUsers();
  28. const snapshotForInAppNotification = stringifySnapshot(target);
  29. await this.inAppNotificationService.upsertByActivity(notificationTargetUsers, activity, snapshotForInAppNotification);
  30. await this.inAppNotificationService.emitSocketIo(notificationTargetUsers);
  31. }
  32. };
  33. /**
  34. * @param {User} user
  35. * @return {Promise}
  36. */
  37. findByUser = function(user) {
  38. return this.find({ user }).sort({ createdAt: -1 }).exec();
  39. };
  40. }
  41. module.exports = ActivityService;