activity.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { getModelSafely } from '@growi/core';
  2. import { IActivity, AllSupportedActionToNotifiedType } from '~/interfaces/activity';
  3. import { IPage } from '~/interfaces/page';
  4. import Activity from '~/server/models/activity';
  5. import loggerFactory from '../../utils/logger';
  6. import Crowi from '../crowi';
  7. const logger = loggerFactory('growi:service:ActivityService');
  8. type ParameterType = Omit<IActivity, 'createdAt'>
  9. class ActivityService {
  10. crowi!: Crowi;
  11. activityEvent: any;
  12. inAppNotificationService!: any;
  13. constructor(crowi: Crowi) {
  14. this.crowi = crowi;
  15. this.activityEvent = crowi.event('activity');
  16. this.inAppNotificationService = crowi.inAppNotificationService;
  17. this.updateByParameters = this.updateByParameters.bind(this);
  18. this.initActivityEventListeners();
  19. }
  20. initActivityEventListeners(): void {
  21. this.activityEvent.on('update', async(activityId: string, parameters: ParameterType, target?: IPage) => {
  22. // update activity
  23. let activity: IActivity;
  24. try {
  25. activity = await this.updateByParameters(activityId, parameters);
  26. }
  27. catch (err) {
  28. logger.error('Update activity failed', err);
  29. return;
  30. }
  31. // create inAppNotification
  32. const shouldNotification = (AllSupportedActionToNotifiedType as ReadonlyArray<string>).includes(activity.action);
  33. if (shouldNotification) {
  34. try {
  35. await this.inAppNotificationService.createInAppNotification(activity, target);
  36. }
  37. catch (err) {
  38. logger.error('Create InAppNotification failed', err);
  39. }
  40. }
  41. });
  42. }
  43. /**
  44. * @param {object} parameters
  45. * @return {Promise}
  46. */
  47. createByParameters = function(parameters) {
  48. const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
  49. return Activity.create(parameters);
  50. };
  51. updateByParameters = async function(activityId: string, parameters: ParameterType): Promise<IActivity> {
  52. const activity = await Activity.findOneAndUpdate({ _id: activityId }, parameters, { new: true }) as unknown as IActivity;
  53. return activity;
  54. };
  55. /**
  56. * @param {User} user
  57. * @return {Promise}
  58. */
  59. findByUser = function(user) {
  60. return this.find({ user }).sort({ createdAt: -1 }).exec();
  61. };
  62. }
  63. module.exports = ActivityService;