feat(server): handle workspace doc updates (#11937)

This commit is contained in:
fengmk2
2025-05-14 14:52:41 +00:00
parent 6792c3e656
commit afa984da54
33 changed files with 1940 additions and 34 deletions

View File

@@ -1,14 +1,17 @@
import { Injectable } from '@nestjs/common';
import { OnEvent } from '../../base';
import { JobQueue, OnEvent } from '../../base';
import { Models } from '../../models';
import { PgWorkspaceDocStorageAdapter } from './adapters/workspace';
import { DocReader } from './reader';
@Injectable()
export class DocEventsListener {
constructor(
private readonly docReader: DocReader,
private readonly models: Models
private readonly models: Models,
private readonly workspace: PgWorkspaceDocStorageAdapter,
private readonly queue: JobQueue
) {}
@OnEvent('doc.snapshot.updated')
@@ -26,6 +29,17 @@ export class DocEventsListener {
return;
}
await this.models.doc.upsertMeta(workspaceId, docId, content);
await this.queue.add(
'indexer.indexDoc',
{
workspaceId,
docId,
},
{
jobId: `${workspaceId}/${docId}`,
priority: 100,
}
);
} else {
// update workspace content to database
const content = this.docReader.parseWorkspaceContent(blob);
@@ -33,6 +47,33 @@ export class DocEventsListener {
return;
}
await this.models.workspace.update(workspaceId, content);
await this.queue.add(
'indexer.indexWorkspace',
{
workspaceId,
},
{
jobId: workspaceId,
priority: 100,
}
);
}
}
@OnEvent('user.deleted')
async clearUserWorkspaces(payload: Events['user.deleted']) {
for (const workspace of payload.ownedWorkspaces) {
await this.workspace.deleteSpace(workspace);
await this.queue.add(
'indexer.deleteWorkspace',
{
workspaceId: workspace,
},
{
jobId: workspace,
priority: 0,
}
);
}
}
}

View File

@@ -1,9 +1,8 @@
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { JobQueue, OnEvent, OnJob } from '../../base';
import { JobQueue, OnJob } from '../../base';
import { Models } from '../../models';
import { PgWorkspaceDocStorageAdapter } from './adapters/workspace';
declare global {
interface Jobs {
@@ -15,7 +14,6 @@ declare global {
export class DocStorageCronJob {
constructor(
private readonly models: Models,
private readonly workspace: PgWorkspaceDocStorageAdapter,
private readonly queue: JobQueue
) {}
@@ -34,11 +32,4 @@ export class DocStorageCronJob {
async cleanExpiredHistories() {
await this.models.history.cleanExpired();
}
@OnEvent('user.deleted')
async clearUserWorkspaces(payload: Events['user.deleted']) {
for (const workspace of payload.ownedWorkspaces) {
await this.workspace.deleteSpace(workspace);
}
}
}