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
@@ -0,0 +1,42 @@
import { readFile } from 'node:fs/promises';
import path from 'node:path';
import { faker } from '@faker-js/faker';
import type { Snapshot } from '@prisma/client';
import { Mocker } from './factory';
export type MockDocSnapshotInput = {
user: { id: string };
workspaceId: string;
docId?: string;
blob?: Uint8Array;
};
export type MockedDocSnapshot = Snapshot;
export class MockDocSnapshot extends Mocker<
MockDocSnapshotInput,
MockedDocSnapshot
> {
override async create(input: MockDocSnapshotInput) {
if (!input.blob) {
const snapshot = await readFile(
path.join(import.meta.dirname, '../__fixtures__/test-doc.snapshot.bin')
);
input.blob = snapshot;
}
const snapshot = await this.db.snapshot.create({
data: {
id: input.docId ?? faker.string.nanoid(),
workspaceId: input.workspaceId,
blob: input.blob,
createdAt: new Date(),
updatedAt: new Date(),
createdBy: input.user.id,
updatedBy: input.user.id,
},
});
return snapshot;
}
}
@@ -6,6 +6,7 @@ export * from './workspace-user.mock';
import { MockCopilotProvider } from './copilot.mock';
import { MockDocMeta } from './doc-meta.mock';
import { MockDocSnapshot } from './doc-snapshot.mock';
import { MockEventBus } from './eventbus.mock';
import { MockMailer } from './mailer.mock';
import { MockJobQueue } from './queue.mock';
@@ -22,6 +23,7 @@ export const Mockers = {
WorkspaceUser: MockWorkspaceUser,
UserSettings: MockUserSettings,
DocMeta: MockDocMeta,
DocSnapshot: MockDocSnapshot,
};
export { MockCopilotProvider, MockEventBus, MockJobQueue, MockMailer };
@@ -5,6 +5,7 @@ import { JobQueue } from '../../base';
export class MockJobQueue {
add = Sinon.createStubInstance(JobQueue).add.resolves();
remove = Sinon.createStubInstance(JobQueue).remove.resolves();
last<Job extends JobName>(name: Job): { name: Job; payload: Jobs[Job] } {
const addJobName = this.add.lastCall?.args[0];
@@ -1,3 +1,6 @@
import { readFile } from 'node:fs/promises';
import path from 'node:path';
import { faker } from '@faker-js/faker';
import type { Prisma, Workspace } from '@prisma/client';
import { omit } from 'lodash-es';
@@ -7,6 +10,7 @@ import { Mocker } from './factory';
export type MockWorkspaceInput = Prisma.WorkspaceCreateInput & {
owner?: { id: string };
snapshot?: Uint8Array | true;
};
export type MockedWorkspace = Workspace;
@@ -14,8 +18,18 @@ export type MockedWorkspace = Workspace;
export class MockWorkspace extends Mocker<MockWorkspaceInput, MockedWorkspace> {
override async create(input?: Partial<MockWorkspaceInput>) {
const owner = input?.owner;
input = omit(input, 'owner');
return await this.db.workspace.create({
if (input?.snapshot === true) {
const snapshot = await readFile(
path.join(
import.meta.dirname,
'../__fixtures__/test-root-doc.snapshot.bin'
)
);
input.snapshot = snapshot;
}
const snapshot = input?.snapshot;
input = omit(input, 'owner', 'snapshot');
const workspace = await this.db.workspace.create({
data: {
name: faker.animal.cat(),
public: false,
@@ -31,5 +45,21 @@ export class MockWorkspace extends Mocker<MockWorkspaceInput, MockedWorkspace> {
: undefined,
},
});
// create a rootDoc snapshot
if (snapshot) {
await this.db.snapshot.create({
data: {
id: workspace.id,
workspaceId: workspace.id,
blob: snapshot,
createdAt: new Date(),
updatedAt: new Date(),
createdBy: owner?.id,
updatedBy: owner?.id,
},
});
}
return workspace;
}
}