pre-notify.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import {
  2. getIdForRef,
  3. type IPage, type IUser, type Ref,
  4. } from '@growi/core';
  5. import type { ActivityDocument } from '../models/activity';
  6. import Subscription from '../models/subscription';
  7. import { getModelSafely } from '../util/mongoose-utils';
  8. export type PreNotifyProps = {
  9. notificationTargetUsers?: Ref<IUser>[],
  10. }
  11. export type PreNotify = (props: PreNotifyProps) => Promise<void>;
  12. export type GetAdditionalTargetUsers = (activity: ActivityDocument) => Promise<Ref<IUser>[]>;
  13. export type GeneratePreNotify = (activity: ActivityDocument, getAdditionalTargetUsers?: GetAdditionalTargetUsers) => PreNotify;
  14. interface IPreNotifyService {
  15. generateInitialPreNotifyProps: (PreNotifyProps) => { notificationTargetUsers?: Ref<IUser>[] },
  16. generatePreNotify: GeneratePreNotify
  17. }
  18. class PreNotifyService implements IPreNotifyService {
  19. generateInitialPreNotifyProps = (): PreNotifyProps => {
  20. const initialPreNotifyProps: Ref<IUser>[] = [];
  21. return { notificationTargetUsers: initialPreNotifyProps };
  22. };
  23. generatePreNotify = (activity: ActivityDocument, getAdditionalTargetUsers?: GetAdditionalTargetUsers): PreNotify => {
  24. const preNotify = async(props: PreNotifyProps) => {
  25. const { notificationTargetUsers } = props;
  26. const User = getModelSafely('User') || require('~/server/models/user')();
  27. const actionUser = activity.user;
  28. const target = activity.target;
  29. const subscribedUsers = await Subscription.getSubscription(target as unknown as Ref<IPage>);
  30. const notificationUsers = subscribedUsers.filter(item => (item.toString() !== getIdForRef(actionUser).toString()));
  31. const activeNotificationUsers = await User.find({
  32. _id: { $in: notificationUsers },
  33. status: User.STATUS_ACTIVE,
  34. }).distinct('_id');
  35. if (getAdditionalTargetUsers == null) {
  36. notificationTargetUsers?.push(...activeNotificationUsers);
  37. }
  38. else {
  39. const AdditionalTargetUsers = await getAdditionalTargetUsers(activity);
  40. notificationTargetUsers?.push(
  41. ...activeNotificationUsers,
  42. ...AdditionalTargetUsers,
  43. );
  44. }
  45. };
  46. return preNotify;
  47. };
  48. }
  49. export const preNotifyService = new PreNotifyService();