|
|
@@ -1,22 +1,59 @@
|
|
|
import { getModelSafely } from '@growi/core';
|
|
|
|
|
|
-import { IActivity } from '~/interfaces/activity';
|
|
|
+import { IActivity, AllSupportedActionToNotifiedType } from '~/interfaces/activity';
|
|
|
+import { IPage } from '~/interfaces/page';
|
|
|
import Activity from '~/server/models/activity';
|
|
|
|
|
|
+import loggerFactory from '../../utils/logger';
|
|
|
import Crowi from '../crowi';
|
|
|
|
|
|
|
|
|
+const logger = loggerFactory('growi:service:ActivityService');
|
|
|
+
|
|
|
type ParameterType = Omit<IActivity, 'createdAt'>
|
|
|
|
|
|
class ActivityService {
|
|
|
|
|
|
crowi!: Crowi;
|
|
|
|
|
|
+ activityEvent: any;
|
|
|
+
|
|
|
inAppNotificationService!: any;
|
|
|
|
|
|
constructor(crowi: Crowi) {
|
|
|
this.crowi = crowi;
|
|
|
+ this.activityEvent = crowi.event('activity');
|
|
|
this.inAppNotificationService = crowi.inAppNotificationService;
|
|
|
+
|
|
|
+ this.updateByParameters = this.updateByParameters.bind(this);
|
|
|
+
|
|
|
+ this.initActivityEventListeners();
|
|
|
+ }
|
|
|
+
|
|
|
+ initActivityEventListeners(): void {
|
|
|
+ this.activityEvent.on('update', async(activityId: string, parameters: ParameterType, target?: IPage) => {
|
|
|
+
|
|
|
+ // update activity
|
|
|
+ let activity: IActivity;
|
|
|
+ try {
|
|
|
+ activity = await this.updateByParameters(activityId, parameters);
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ logger.error('Update activity failed', err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // create inAppNotification
|
|
|
+ const shouldNotification = (AllSupportedActionToNotifiedType as ReadonlyArray<string>).includes(activity.action);
|
|
|
+ if (shouldNotification) {
|
|
|
+ try {
|
|
|
+ await this.inAppNotificationService.createInAppNotification(activity, target);
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ logger.error('Create InAppNotification failed', err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
|