| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import EventEmitter from 'events';
- import type { IPage, IUserHasId } from '@growi/core';
- import { pagePathUtils } from '@growi/core/dist/utils';
- import type { HydratedDocument } from 'mongoose';
- import mongoose from 'mongoose';
- import type { PageDocument, PageModel } from '~/server/models/page';
- import loggerFactory from '~/utils/logger';
- import { deleteCompletelyUserHomeBySystem } from '../service/page/delete-completely-user-home-by-system';
- const logger = loggerFactory('growi:events:user');
- class UserEvent extends EventEmitter {
- crowi: any;
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
- constructor(crowi: any) {
- super();
- this.crowi = crowi;
- }
- async onActivated(user: IUserHasId): Promise<void> {
- const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>('Page');
- const userHomepagePath = pagePathUtils.userHomepagePath(user);
- try {
- let page: HydratedDocument<PageDocument> | null = await Page.findByPath(userHomepagePath, true);
- // TODO: Make it more type safe
- // Since the type of page.creator is 'any', we resort to the following comparison,
- // checking if page.creator.toString() is not equal to user._id.toString(). Our code covers null, string, or object types.
- if (page != null && page.creator != null && page.creator.toString() !== user._id.toString()) {
- await deleteCompletelyUserHomeBySystem(userHomepagePath, this.crowi.pageService);
- page = null;
- }
- if (page == null) {
- const body = `# ${user.username}\nThis is ${user.username}'s page`;
- await this.crowi.pageService.create(userHomepagePath, body, user, {});
- logger.debug('User page created', page);
- }
- }
- catch (err) {
- logger.error('Failed to create user page', err);
- }
- }
- }
- export default UserEvent;
|