From 6a57e3edb2c02d7729f36f0a68994e7e3bdf1408 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Mon, 22 Apr 2024 23:40:50 +0100 Subject: [PATCH] Make colloboration module not dependant on page module * add unloadImmediately to collab --- .../collaboration/collaboration.gateway.ts | 1 + .../src/collaboration/collaboration.module.ts | 3 +-- .../extensions/history.extension.ts | 15 ++++++------ .../extensions/persistence.extension.ts | 20 ++++++++++------ .../page/services/page-history.service.ts | 23 ++----------------- .../src/core/page/services/page.service.ts | 18 --------------- .../kysely/repos/page/page-history.repo.ts | 16 +++++++++++++ 7 files changed, 41 insertions(+), 55 deletions(-) diff --git a/apps/server/src/collaboration/collaboration.gateway.ts b/apps/server/src/collaboration/collaboration.gateway.ts index b34bd9ee..a12894e8 100644 --- a/apps/server/src/collaboration/collaboration.gateway.ts +++ b/apps/server/src/collaboration/collaboration.gateway.ts @@ -17,6 +17,7 @@ export class CollaborationGateway { private hocuspocus = HocuspocusServer.configure({ debounce: 5000, maxDebounce: 10000, + unloadImmediately: false, extensions: [ this.authenticationExtension, this.persistenceExtension, diff --git a/apps/server/src/collaboration/collaboration.module.ts b/apps/server/src/collaboration/collaboration.module.ts index db9cb946..7bda3918 100644 --- a/apps/server/src/collaboration/collaboration.module.ts +++ b/apps/server/src/collaboration/collaboration.module.ts @@ -2,7 +2,6 @@ import { Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { AuthModule } from '../core/auth/auth.module'; import { AuthenticationExtension } from './extensions/authentication.extension'; import { PersistenceExtension } from './extensions/persistence.extension'; -import { PageModule } from '../core/page/page.module'; import { CollaborationGateway } from './collaboration.gateway'; import { HttpAdapterHost } from '@nestjs/core'; import { CollabWsAdapter } from './adapter/collab-ws.adapter'; @@ -17,7 +16,7 @@ import { HistoryExtension } from './extensions/history.extension'; PersistenceExtension, HistoryExtension, ], - imports: [AuthModule, PageModule], + imports: [AuthModule], }) export class CollaborationModule implements OnModuleInit, OnModuleDestroy { private collabWsAdapter: CollabWsAdapter; diff --git a/apps/server/src/collaboration/extensions/history.extension.ts b/apps/server/src/collaboration/extensions/history.extension.ts index 1c15dc1b..28c3879d 100644 --- a/apps/server/src/collaboration/extensions/history.extension.ts +++ b/apps/server/src/collaboration/extensions/history.extension.ts @@ -4,8 +4,8 @@ import { onDisconnectPayload, } from '@hocuspocus/server'; import { Injectable } from '@nestjs/common'; -import { PageService } from '../../core/page/services/page.service'; -import { PageHistoryService } from '../../core/page/services/page-history.service'; +import { PageRepo } from '@docmost/db/repos/page/page.repo'; +import { PageHistoryRepo } from '@docmost/db/repos/page/page-history.repo'; @Injectable() export class HistoryExtension implements Extension { @@ -14,8 +14,8 @@ export class HistoryExtension implements Extension { lastEditTimeMap = new Map(); constructor( - private readonly pageService: PageService, - private readonly pageHistoryService: PageHistoryService, + private readonly pageRepo: PageRepo, + private readonly pageHistoryRepo: PageHistoryRepo, ) {} async onChange(data: onChangePayload): Promise { @@ -53,10 +53,11 @@ export class HistoryExtension implements Extension { async recordHistory(pageId: string) { try { - const includeContent = true; - const page = await this.pageService.findById(pageId, includeContent); + const page = await this.pageRepo.findById(pageId, { + includeContent: true, + }); // Todo: compare if data is the same as the previous version - await this.pageHistoryService.saveHistory(page); + await this.pageHistoryRepo.saveHistory(page); console.log(`New history created for: ${pageId}`); } catch (err) { console.error('An error occurred saving page history', err); diff --git a/apps/server/src/collaboration/extensions/persistence.extension.ts b/apps/server/src/collaboration/extensions/persistence.extension.ts index 05b04cf3..2fa234e1 100644 --- a/apps/server/src/collaboration/extensions/persistence.extension.ts +++ b/apps/server/src/collaboration/extensions/persistence.extension.ts @@ -4,14 +4,14 @@ import { onStoreDocumentPayload, } from '@hocuspocus/server'; import * as Y from 'yjs'; -import { PageService } from '../../core/page/services/page.service'; import { Injectable } from '@nestjs/common'; import { TiptapTransformer } from '@hocuspocus/transformer'; import { jsonToText, tiptapExtensions } from '../collaboration.util'; +import { PageRepo } from '@docmost/db/repos/page/page.repo'; @Injectable() export class PersistenceExtension implements Extension { - constructor(private readonly pageService: PageService) {} + constructor(private readonly pageRepo: PageRepo) {} async onLoadDocument(data: onLoadDocumentPayload) { const { documentName, document } = data; @@ -21,7 +21,10 @@ export class PersistenceExtension implements Extension { return; } - const page = await this.pageService.findById(pageId, true, true); + const page = await this.pageRepo.findById(pageId, { + includeContent: true, + includeYdoc: true, + }); if (!page) { console.log('page does not exist.'); @@ -68,11 +71,14 @@ export class PersistenceExtension implements Extension { const textContent = jsonToText(tiptapJson); try { - await this.pageService.updateState( + await this.pageRepo.updatePage( + { + content: tiptapJson, + textContent: textContent, + ydoc: ydocState, + lastUpdatedById: context.user.id, + }, pageId, - tiptapJson, - textContent, - ydocState, ); } catch (err) { console.error(`Failed to update page ${documentName}`); diff --git a/apps/server/src/core/page/services/page-history.service.ts b/apps/server/src/core/page/services/page-history.service.ts index 0ad0d607..47ea3190 100644 --- a/apps/server/src/core/page/services/page-history.service.ts +++ b/apps/server/src/core/page/services/page-history.service.ts @@ -1,4 +1,4 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { PageHistoryRepo } from '@docmost/db/repos/page/page-history.repo'; import { Page, PageHistory } from '@docmost/db/types/entity.types'; import { PaginationOptions } from '@docmost/db/pagination/pagination-options'; @@ -9,26 +9,7 @@ export class PageHistoryService { constructor(private pageHistoryRepo: PageHistoryRepo) {} async findById(historyId: string): Promise { - const history = await this.pageHistoryRepo.findById(historyId); - if (!history) { - throw new BadRequestException('History not found'); - } - return history; - } - - async saveHistory(page: Page): Promise { - await this.pageHistoryRepo.insertPageHistory({ - pageId: page.id, - title: page.title, - content: page.content, - slug: page.slug, - icon: page.icon, - version: 1, // TODO: make incremental - coverPhoto: page.coverPhoto, - lastUpdatedById: page.lastUpdatedById ?? page.creatorId, - spaceId: page.spaceId, - workspaceId: page.workspaceId, - }); + return await this.pageHistoryRepo.findById(historyId); } async findHistoryByPageId( diff --git a/apps/server/src/core/page/services/page.service.ts b/apps/server/src/core/page/services/page.service.ts index 24ddef68..a0d5c88c 100644 --- a/apps/server/src/core/page/services/page.service.ts +++ b/apps/server/src/core/page/services/page.service.ts @@ -117,24 +117,6 @@ export class PageService { return await this.pageRepo.findById(pageId); } - async updateState( - pageId: string, - content: any, - textContent: string, - ydoc: any, - userId?: string, // TODO: fix this - ): Promise { - await this.pageRepo.updatePage( - { - content: content, - textContent: textContent, - ydoc: ydoc, - ...(userId && { lastUpdatedById: userId }), - }, - pageId, - ); - } - withHasChildren(eb: ExpressionBuilder) { return eb .selectFrom('pages as child') diff --git a/apps/server/src/kysely/repos/page/page-history.repo.ts b/apps/server/src/kysely/repos/page/page-history.repo.ts index 8f8a23cd..3aed048a 100644 --- a/apps/server/src/kysely/repos/page/page-history.repo.ts +++ b/apps/server/src/kysely/repos/page/page-history.repo.ts @@ -4,6 +4,7 @@ import { KyselyDB, KyselyTransaction } from '../../types/kysely.types'; import { dbOrTx } from '../../utils'; import { InsertablePageHistory, + Page, PageHistory, UpdatablePageHistory, } from '@docmost/db/types/entity.types'; @@ -64,6 +65,21 @@ export class PageHistoryRepo { .executeTakeFirst(); } + async saveHistory(page: Page): Promise { + await this.insertPageHistory({ + pageId: page.id, + title: page.title, + content: page.content, + slug: page.slug, + icon: page.icon, + version: 1, // TODO: make incremental + coverPhoto: page.coverPhoto, + lastUpdatedById: page.lastUpdatedById ?? page.creatorId, + spaceId: page.spaceId, + workspaceId: page.workspaceId, + }); + } + async findPageHistoryByPageId(pageId: string, pagination: PaginationOptions) { const query = this.db .selectFrom('pageHistory')