feat(core): new favorite (#7590)

This commit is contained in:
EYHN
2024-07-26 08:15:32 +00:00
parent 5207e7abfc
commit 3eb09cde5e
47 changed files with 1248 additions and 167 deletions

View File

@@ -1,10 +1,12 @@
import type { Framework } from '../../framework';
import { WorkspaceScope, WorkspaceService } from '../workspace';
import { DBService } from './services/db';
import { WorkspaceDBService } from './services/db';
export { AFFiNE_DB_SCHEMA } from './schema';
export { DBService } from './services/db';
export { AFFiNE_WORKSPACE_DB_SCHEMA } from './schema';
export { WorkspaceDBService } from './services/db';
export function configureDBModule(framework: Framework) {
framework.scope(WorkspaceScope).service(DBService, [WorkspaceService]);
export function configureWorkspaceDBModule(framework: Framework) {
framework
.scope(WorkspaceScope)
.service(WorkspaceDBService, [WorkspaceService]);
}

View File

@@ -1 +1 @@
export { AFFiNE_DB_SCHEMA } from './schema';
export { AFFiNE_WORKSPACE_DB_SCHEMA } from './schema';

View File

@@ -2,7 +2,7 @@ import { nanoid } from 'nanoid';
import { type DBSchemaBuilder, f } from '../../../orm';
export const AFFiNE_DB_SCHEMA = {
export const AFFiNE_WORKSPACE_DB_SCHEMA = {
folders: {
id: f.string().primaryKey().optional().default(nanoid),
parentId: f.string().optional(),
@@ -11,4 +11,13 @@ export const AFFiNE_DB_SCHEMA = {
index: f.string(),
},
} as const satisfies DBSchemaBuilder;
export type AFFiNE_DB_SCHEMA = typeof AFFiNE_DB_SCHEMA;
export type AFFiNE_WORKSPACE_DB_SCHEMA = typeof AFFiNE_WORKSPACE_DB_SCHEMA;
export const AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA = {
favorite: {
key: f.string().primaryKey(),
index: f.string(),
},
} as const satisfies DBSchemaBuilder;
export type AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA =
typeof AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA;

View File

@@ -2,17 +2,29 @@ import { Doc as YDoc } from 'yjs';
import { Service } from '../../../framework';
import { createORMClient, type TableMap, YjsDBAdapter } from '../../../orm';
import { ObjectPool } from '../../../utils';
import type { WorkspaceService } from '../../workspace';
import { AFFiNE_DB_SCHEMA } from '../schema';
import { AFFiNE_WORKSPACE_DB_SCHEMA } from '../schema';
import { AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA } from '../schema/schema';
export class DBService extends Service {
db: TableMap<AFFiNE_DB_SCHEMA>;
const WorkspaceDBClient = createORMClient(AFFiNE_WORKSPACE_DB_SCHEMA);
const WorkspaceUserdataDBClient = createORMClient(
AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA
);
type WorkspaceUserdataDBClient = InstanceType<typeof WorkspaceUserdataDBClient>;
export class WorkspaceDBService extends Service {
db: TableMap<AFFiNE_WORKSPACE_DB_SCHEMA>;
userdataDBPool = new ObjectPool<string, WorkspaceUserdataDBClient>({
onDangling() {
return false; // never release
},
});
constructor(private readonly workspaceService: WorkspaceService) {
super();
const Client = createORMClient(AFFiNE_DB_SCHEMA);
this.db = new Client(
new YjsDBAdapter(AFFiNE_DB_SCHEMA, {
this.db = new WorkspaceDBClient(
new YjsDBAdapter(AFFiNE_WORKSPACE_DB_SCHEMA, {
getDoc: guid => {
const ydoc = new YDoc({
// guid format: db${workspaceId}${guid}
@@ -26,7 +38,33 @@ export class DBService extends Service {
);
}
// eslint-disable-next-line @typescript-eslint/ban-types
userdataDB(userId: (string & {}) | '__local__') {
// __local__ for local workspace
const userdataDb = this.userdataDBPool.get(userId);
if (userdataDb) {
return userdataDb.obj;
}
const newDB = new WorkspaceUserdataDBClient(
new YjsDBAdapter(AFFiNE_WORKSPACE_USERDATA_DB_SCHEMA, {
getDoc: guid => {
const ydoc = new YDoc({
// guid format: userdata${userId}${workspaceId}${guid}
guid: `userdata$${userId}$${this.workspaceService.workspace.id}$${guid}`,
});
this.workspaceService.workspace.engine.doc.addDoc(ydoc, false);
this.workspaceService.workspace.engine.doc.setPriority(ydoc.guid, 50);
return ydoc;
},
})
);
this.userdataDBPool.put(userId, newDB);
return newDB;
}
static isDBDocId(docId: string) {
return docId.startsWith('db$');
return docId.startsWith('db$') || docId.startsWith('userdata$');
}
}