diff --git a/packages/client/src/data/document.tsx b/packages/client/src/data/document.tsx index b2f41d13..3ee7ad69 100644 --- a/packages/client/src/data/document.tsx +++ b/packages/client/src/data/document.tsx @@ -30,7 +30,7 @@ export const useRecentDocuments = () => { const { data, error, isLoading, refetch } = useQuery( DocumentApiDefinition.recent.client(), getRecentVisitedDocuments, - { staleTime: 0, refetchOnMount: true } + { staleTime: 3000 } ); return { data, error, loading: isLoading, refresh: refetch }; }; diff --git a/packages/client/src/data/wiki.tsx b/packages/client/src/data/wiki.tsx index ebb9bca7..127093fd 100644 --- a/packages/client/src/data/wiki.tsx +++ b/packages/client/src/data/wiki.tsx @@ -175,8 +175,10 @@ export const getWikiDetail = (wikiId, cookie = null): Promise => { * @returns */ export const useWikiDetail = (wikiId) => { - const { data, error, isLoading, refetch } = useQuery(WikiApiDefinition.getDetailById.client(wikiId), () => - wikiId ? getWikiDetail(wikiId) : null + const { data, error, isLoading, refetch } = useQuery( + WikiApiDefinition.getDetailById.client(wikiId), + () => (wikiId ? getWikiDetail(wikiId) : null), + { staleTime: 3000 } ); /** diff --git a/packages/server/src/services/document.service.ts b/packages/server/src/services/document.service.ts index 0bf5b52e..3fe73ef3 100644 --- a/packages/server/src/services/document.service.ts +++ b/packages/server/src/services/document.service.ts @@ -175,13 +175,14 @@ export class DocumentService { * @returns */ async addDocUser(user: OutUser, dto: DocAuthDto) { - const doc = await this.documentRepo.findOne(dto.documentId); const targetUser = await this.userService.findOne({ name: dto.userName }); if (!targetUser) { throw new HttpException('用户不存在', HttpStatus.BAD_REQUEST); } + const doc = await this.documentRepo.findOne(dto.documentId); + await this.wikiService.addWikiUser(user, doc.wikiId, { userName: targetUser.name, userRole: WikiUserRole.normal, @@ -250,6 +251,7 @@ export class DocumentService { */ async getDocUsers(user: OutUser, documentId) { const doc = await this.documentRepo.findOne({ id: documentId }); + if (!doc) { throw new HttpException('文档不存在', HttpStatus.BAD_REQUEST); } @@ -411,21 +413,19 @@ export class DocumentService { * @returns */ public async getDocumentDetail(user: OutUser, documentId: string, userAgent) { - // 1. 记录访问 - await this.viewService.create({ userId: user.id, documentId, userAgent }); - // 2. 查询文档 - const document = await this.documentRepo.findOne(documentId); - // 3. 查询权限 - const authority = await this.documentAuthorityRepo.findOne({ - documentId, - userId: user.id, - }); - // 4. 查询访问 - const views = await this.viewService.getDocumentTotalViews(documentId); - // 5. 生成响应 - const doc = instanceToPlain(document); + // 异步记录访问 + this.viewService.create({ userId: user.id, documentId, userAgent }); + const [document, authority, views] = await Promise.all([ + this.documentRepo.findOne(documentId), + this.documentAuthorityRepo.findOne({ + documentId, + userId: user.id, + }), + this.viewService.getDocumentTotalViews(documentId), + ]); + const doc = lodash.omit(instanceToPlain(document), ['state', 'content']); const createUser = await this.userService.findById(doc.createUserId); - return { document: lodash.omit({ ...doc, views, createUser }, ['state', 'content']), authority }; + return { document: { ...doc, views, createUser }, authority }; } /** @@ -474,12 +474,16 @@ export class DocumentService { throw new HttpException('密码错误,请重新输入', HttpStatus.BAD_REQUEST); } - await this.viewService.create({ userId: 'public', documentId, userAgent }); - const views = await this.viewService.getDocumentTotalViews(documentId); - const createUser = await this.userService.findById(document.createUserId); - const wiki = await this.wikiService.getPublicWikiDetail(document.wikiId); + const doc = lodash.omit(document, ['state']); + const [views, createUser, wiki] = await Promise.all([ + this.viewService.getDocumentTotalViews(documentId), + this.userService.findById(document.createUserId), + this.wikiService.getPublicWikiDetail(document.wikiId), + ]); + // 异步创建 + this.viewService.create({ userId: 'public', documentId, userAgent }); - return { ...document, views, wiki, createUser }; + return { ...doc, views, wiki, createUser }; } /** @@ -536,14 +540,14 @@ export class DocumentService { return lodash.omit(item, ['content', 'state']); }); - const docsWithCreateUser = await Promise.all( - docs.map(async (doc) => { - const createUser = await this.userService.findById(doc.createUserId); - return { ...doc, createUser }; - }) - ); + // const docsWithCreateUser = await Promise.all( + // docs.map(async (doc) => { + // const createUser = await this.userService.findById(doc.createUserId); + // return { ...doc, createUser }; + // }) + // ); - return docsWithCreateUser; + return docs; } async getShareChildrenDocuments(data: { wikiId: string; documentId?: string }) { @@ -590,14 +594,14 @@ export class DocumentService { return lodash.omit(item, ['content', 'state']); }); - const docsWithCreateUser = await Promise.all( - docs.map(async (doc) => { - const createUser = await this.userService.findById(doc.createUserId); - return { ...doc, createUser }; - }) - ); + // const docsWithCreateUser = await Promise.all( + // docs.map(async (doc) => { + // const createUser = await this.userService.findById(doc.createUserId); + // return { ...doc, createUser }; + // }) + // ); - return docsWithCreateUser; + return docs; } /** @@ -627,8 +631,10 @@ export class DocumentService { await this.userService.findById(doc.createUserId), ]); + const optimizedDoc = lodash.omit(doc, ['state', 'content', 'index', 'createUserId']); + return { - ...instanceToPlain(doc), + ...optimizedDoc, views, visitedAt: visitedAtMap[documentId], createUser, @@ -636,9 +642,7 @@ export class DocumentService { }) ); - return ret.filter(Boolean).map((item) => { - return lodash.omit(item, ['state', 'content', 'index', 'createUserId']); - }); + return ret.filter(Boolean); } /** @@ -664,13 +668,13 @@ export class DocumentService { const data = ret.filter(Boolean); - const withCreateUserRes = await Promise.all( - data.map(async (doc) => { - const createUser = await this.userService.findById(doc.createUserId); - return { createUser, ...doc }; - }) - ); + // const withCreateUserRes = await Promise.all( + // data.map(async (doc) => { + // const createUser = await this.userService.findById(doc.createUserId); + // return { createUser, ...doc }; + // }) + // ); - return withCreateUserRes; + return data; } } diff --git a/packages/server/src/services/wiki.service.ts b/packages/server/src/services/wiki.service.ts index c7f8af21..af72aa8a 100644 --- a/packages/server/src/services/wiki.service.ts +++ b/packages/server/src/services/wiki.service.ts @@ -559,14 +559,14 @@ export class WikiService { return lodash.omit(item, ['content', 'state']); }); - const docsWithCreateUser = await Promise.all( - docs.map(async (doc) => { - const createUser = await this.userService.findById(doc.createUserId); - return { ...doc, createUser }; - }) - ); + // const docsWithCreateUser = await Promise.all( + // docs.map(async (doc) => { + // const createUser = await this.userService.findById(doc.createUserId); + // return { ...doc, createUser }; + // }) + // ); - return array2tree(docsWithCreateUser); + return array2tree(docs); } /** @@ -576,6 +576,8 @@ export class WikiService { * @param relations */ public async orderWikiTocs(relations: Array<{ id: string; parentDocumentId?: string; index: number }>) { + if (!relations.length) return; + await Promise.all( relations.map(async (relation) => { const { id, parentDocumentId, index } = relation;