user.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import EventEmitter from 'events';
  2. import type { IPage, IUserHasId } from '@growi/core';
  3. import { pagePathUtils } from '@growi/core/dist/utils';
  4. import type { HydratedDocument } from 'mongoose';
  5. import mongoose from 'mongoose';
  6. import type { PageDocument, PageModel } from '~/server/models/page';
  7. import loggerFactory from '~/utils/logger';
  8. import { deleteCompletelyUserHomeBySystem } from '../service/page/delete-completely-user-home-by-system';
  9. const logger = loggerFactory('growi:events:user');
  10. class UserEvent extends EventEmitter {
  11. crowi: any;
  12. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  13. constructor(crowi: any) {
  14. super();
  15. this.crowi = crowi;
  16. }
  17. async onActivated(user: IUserHasId): Promise<void> {
  18. const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>('Page');
  19. const userHomepagePath = pagePathUtils.userHomepagePath(user);
  20. try {
  21. let page: HydratedDocument<PageDocument> | null = await Page.findByPath(userHomepagePath, true);
  22. // TODO: Make it more type safe
  23. // Since the type of page.creator is 'any', we resort to the following comparison,
  24. // checking if page.creator.toString() is not equal to user._id.toString(). Our code covers null, string, or object types.
  25. if (page != null && page.creator != null && page.creator.toString() !== user._id.toString()) {
  26. await deleteCompletelyUserHomeBySystem(userHomepagePath, this.crowi.pageService);
  27. page = null;
  28. }
  29. if (page == null) {
  30. const body = `# ${user.username}\nThis is ${user.username}'s page`;
  31. await this.crowi.pageService.create(userHomepagePath, body, user, {});
  32. logger.debug('User page created', page);
  33. }
  34. }
  35. catch (err) {
  36. logger.error('Failed to create user page', err);
  37. }
  38. }
  39. }
  40. export default UserEvent;