Просмотр исходного кода

Merge branch 'feat/descendant-notifications' into feat/create-notification-when-parentPage-are-deleted

Shunm634-source 3 лет назад
Родитель
Сommit
0ba42d2d81

+ 2 - 2
packages/app/src/server/models/activity.ts

@@ -72,8 +72,8 @@ activitySchema.methods.getNotificationTargetUsers = async function() {
   const { user: actionUser, target } = this;
   const { user: actionUser, target } = this;
 
 
   const [subscribeUsers, unsubscribeUsers] = await Promise.all([
   const [subscribeUsers, unsubscribeUsers] = await Promise.all([
-    Subscription.getSubscription((target as Types.ObjectId)),
-    Subscription.getUnsubscription((target as Types.ObjectId)),
+    Subscription.getSubscription(target),
+    Subscription.getUnsubscription(target),
   ]);
   ]);
   const unique = array => Object.values(array.reduce((objects, object) => ({ ...objects, [object.toString()]: object }), {}));
   const unique = array => Object.values(array.reduce((objects, object) => ({ ...objects, [object.toString()]: object }), {}));
   const filter = (array, pull) => {
   const filter = (array, pull) => {

+ 7 - 7
packages/app/src/server/models/subscription.ts

@@ -10,7 +10,7 @@ import { SubscriptionStatusType, AllSubscriptionStatusType } from '~/interfaces/
 export interface ISubscription {
 export interface ISubscription {
   user: Types.ObjectId
   user: Types.ObjectId
   targetModel: string
   targetModel: string
-  target: Types.ObjectId
+  target: Types.ObjectId | Document
   status: string
   status: string
   createdAt: Date
   createdAt: Date
 
 
@@ -24,9 +24,9 @@ export interface SubscriptionModel extends Model<SubscriptionDocument> {
   findByUserIdAndTargetId(userId: Types.ObjectId | string, targetId: Types.ObjectId | string): any
   findByUserIdAndTargetId(userId: Types.ObjectId | string, targetId: Types.ObjectId | string): any
   upsertSubscription(user: Types.ObjectId, targetModel: string, target: Types.ObjectId, status: string): any
   upsertSubscription(user: Types.ObjectId, targetModel: string, target: Types.ObjectId, status: string): any
   subscribeByPageId(user: Types.ObjectId, pageId: Types.ObjectId, status: string): any
   subscribeByPageId(user: Types.ObjectId, pageId: Types.ObjectId, status: string): any
-  getSubscription(target: Types.ObjectId): Promise<Types.ObjectId[]>
-  getUnsubscription(target: Types.ObjectId): Promise<Types.ObjectId[]>
-  getSubscriptions(targets: Types.ObjectId[]): Promise<Types.ObjectId[]>
+  getSubscription(target: Types.ObjectId | Document): Promise<Types.ObjectId[]>
+  getUnsubscription(target: Types.ObjectId | Document): Promise<Types.ObjectId[]>
+  getSubscriptions(targets: Types.ObjectId[] | Document[]): Promise<Types.ObjectId[]>
 }
 }
 
 
 const subscriptionSchema = new Schema<SubscriptionDocument, SubscriptionModel>({
 const subscriptionSchema = new Schema<SubscriptionDocument, SubscriptionModel>({
@@ -80,15 +80,15 @@ subscriptionSchema.statics.subscribeByPageId = function(user, pageId, status) {
   return this.upsertSubscription(user, 'Page', pageId, status);
   return this.upsertSubscription(user, 'Page', pageId, status);
 };
 };
 
 
-subscriptionSchema.statics.getSubscription = async function(target) {
+subscriptionSchema.statics.getSubscription = async function(target: Types.ObjectId | Document) {
   return this.find({ target, status: SubscriptionStatusType.SUBSCRIBE }).distinct('user');
   return this.find({ target, status: SubscriptionStatusType.SUBSCRIBE }).distinct('user');
 };
 };
 
 
-subscriptionSchema.statics.getUnsubscription = async function(target) {
+subscriptionSchema.statics.getUnsubscription = async function(target: Types.ObjectId | Document) {
   return this.find({ target, status: SubscriptionStatusType.UNSUBSCRIBE }).distinct('user');
   return this.find({ target, status: SubscriptionStatusType.UNSUBSCRIBE }).distinct('user');
 };
 };
 
 
-subscriptionSchema.statics.getSubscriptions = async function(targets) {
+subscriptionSchema.statics.getSubscriptions = async function(targets: Document[] | Types.ObjectId[]) {
   return this.find({ $in: targets, status: SubscriptionStatusType.SUBSCRIBE }).distinct('user');
   return this.find({ $in: targets, status: SubscriptionStatusType.SUBSCRIBE }).distinct('user');
 };
 };
 
 

+ 12 - 12
packages/app/src/server/service/page.ts

@@ -160,7 +160,7 @@ class PageService {
       this.pageEvent.onUpdate();
       this.pageEvent.onUpdate();
 
 
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_UPDATE);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_UPDATE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -173,7 +173,7 @@ class PageService {
       const isRecursively = descendantPages != null;
       const isRecursively = descendantPages != null;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_RENAME : SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_RENAME : SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME;
       try {
       try {
-        await this.createAndSendNotifications(page, descendantPages, user, action);
+        await this.createAndSendNotifications(page, user, action, descendantPages);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -183,7 +183,7 @@ class PageService {
     // duplicate
     // duplicate
     this.pageEvent.on('duplicate', async(page, user) => {
     this.pageEvent.on('duplicate', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DUPLICATE);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DUPLICATE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -195,7 +195,7 @@ class PageService {
       const isRecursively = descendantPages != null;
       const isRecursively = descendantPages != null;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_DELETE : SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE;
       const action = isRecursively ? SUPPORTED_ACTION_TYPE.ACTION_PAGE_RECURSIVELY_DELETE : SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE;
       try {
       try {
-        await this.createAndSendNotifications(page, descendantPages, user, action);
+        await this.createAndSendNotifications(page, user, action, descendantPages);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -205,7 +205,7 @@ class PageService {
     // delete completely
     // delete completely
     this.pageEvent.on('deleteCompletely', async(page, user) => {
     this.pageEvent.on('deleteCompletely', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE_COMPLETELY);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE_COMPLETELY);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -215,7 +215,7 @@ class PageService {
     // revert
     // revert
     this.pageEvent.on('revert', async(page, user) => {
     this.pageEvent.on('revert', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_REVERT);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_REVERT);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -225,7 +225,7 @@ class PageService {
     // likes
     // likes
     this.pageEvent.on('like', async(page, user) => {
     this.pageEvent.on('like', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_LIKE);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_LIKE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -235,7 +235,7 @@ class PageService {
     // bookmark
     // bookmark
     this.pageEvent.on('bookmark', async(page, user) => {
     this.pageEvent.on('bookmark', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, null, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_BOOKMARK);
+        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_BOOKMARK);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -2242,7 +2242,7 @@ class PageService {
     return shortBodiesMap;
     return shortBodiesMap;
   }
   }
 
 
-  private async createAndSendNotifications(page, descendantPages, user, action) {
+  private async createAndSendNotifications(page: PageDocument, user: any, action: any, descendantPages?: PageDocument[]) {
     const { activityService, inAppNotificationService } = this.crowi;
     const { activityService, inAppNotificationService } = this.crowi;
 
 
     const snapshot = stringifySnapshot(page);
     const snapshot = stringifySnapshot(page);
@@ -2256,12 +2256,12 @@ class PageService {
     };
     };
     const activity = await activityService.createByParameters(parameters);
     const activity = await activityService.createByParameters(parameters);
     // Get user to be notified
     // Get user to be notified
-    const targetUsers = await activity.getNotificationTargetUsers();
-    if (descendantPages != null) {
+    let targetUsers = await activity.getNotificationTargetUsers();
+    if (descendantPages !== undefined && descendantPages.length > 0) {
       const User = this.crowi.model('User');
       const User = this.crowi.model('User');
       const targetDescendantsUsers = await Subscription.getSubscriptions(descendantPages);
       const targetDescendantsUsers = await Subscription.getSubscriptions(descendantPages);
       const descendantsUsers = targetDescendantsUsers.filter(item => (item.toString() !== user._id.toString()));
       const descendantsUsers = targetDescendantsUsers.filter(item => (item.toString() !== user._id.toString()));
-      targetUsers.concat(await User.find({
+      targetUsers = targetUsers.concat(await User.find({
         _id: { $in: descendantsUsers },
         _id: { $in: descendantsUsers },
         status: User.STATUS_ACTIVE,
         status: User.STATUS_ACTIVE,
       }).distinct('_id'));
       }).distinct('_id'));