preNotify.ts 2.0 KB

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