mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-19 15:26:59 +08:00
refactor: create and load workspace will return workspaceUnit
This commit is contained in:
@@ -6,7 +6,6 @@ import type {
|
||||
} from '../base';
|
||||
import type { User } from '../../types';
|
||||
import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store';
|
||||
import { BlockSchema } from '@blocksuite/blocks/models';
|
||||
import { storage } from './storage.js';
|
||||
import assert from 'assert';
|
||||
import { WebsocketProvider } from './sync.js';
|
||||
@@ -14,9 +13,16 @@ import { WebsocketProvider } from './sync.js';
|
||||
import { getApis } from './apis/index.js';
|
||||
import type { Apis, WorkspaceDetail, Callback } from './apis';
|
||||
import { setDefaultAvatar } from '../utils.js';
|
||||
import { MessageCode } from '../../message';
|
||||
import { MessageCode } from '../../message/index.js';
|
||||
import { token } from './apis/token.js';
|
||||
import { WebsocketClient } from './channel';
|
||||
import {
|
||||
loadWorkspaceUnit,
|
||||
createWorkspaceUnit,
|
||||
syncToCloud,
|
||||
} from './utils.js';
|
||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||
import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
||||
|
||||
export interface AffineProviderConstructorParams
|
||||
extends ProviderConstructorParams {
|
||||
@@ -153,78 +159,25 @@ export class AffineProvider extends BaseProvider {
|
||||
return [];
|
||||
}
|
||||
const workspacesList = await this._apis.getWorkspaces();
|
||||
const workspaces: WorkspaceMeta0[] = workspacesList.map(w => {
|
||||
return {
|
||||
...w,
|
||||
memberCount: 0,
|
||||
name: '',
|
||||
provider: 'affine',
|
||||
syncMode: 'core',
|
||||
};
|
||||
});
|
||||
const workspaceInstances = workspaces.map(({ id }) => {
|
||||
const workspace =
|
||||
this._workspacesCache.get(id) ||
|
||||
new BlocksuiteWorkspace({
|
||||
room: id,
|
||||
}).register(BlockSchema);
|
||||
this._workspacesCache.set(id, workspace);
|
||||
if (workspace) {
|
||||
return new Promise<BlocksuiteWorkspace>(resolve => {
|
||||
this._apis.downloadWorkspace(id).then(data => {
|
||||
applyUpdate(workspace.doc, new Uint8Array(data));
|
||||
resolve(workspace);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve(null);
|
||||
}
|
||||
});
|
||||
|
||||
(await Promise.all(workspaceInstances)).forEach((workspace, i) => {
|
||||
if (workspace) {
|
||||
workspaces[i] = {
|
||||
...workspaces[i],
|
||||
name: workspace.meta.name,
|
||||
avatar: workspace.meta.avatar,
|
||||
};
|
||||
}
|
||||
});
|
||||
const getDetailList = workspacesList.map(w => {
|
||||
const { id } = w;
|
||||
return new Promise<{ id: string; detail: WorkspaceDetail | null }>(
|
||||
resolve => {
|
||||
this._apis.getWorkspaceDetail({ id }).then(data => {
|
||||
resolve({ id, detail: data || null });
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
const ownerList = await Promise.all(getDetailList);
|
||||
(await Promise.all(ownerList)).forEach(detail => {
|
||||
if (detail) {
|
||||
const { id, detail: workspaceDetail } = detail;
|
||||
if (workspaceDetail) {
|
||||
const { owner, member_count } = workspaceDetail;
|
||||
const currentWorkspace = workspaces.find(w => w.id === id);
|
||||
if (currentWorkspace) {
|
||||
currentWorkspace.owner = {
|
||||
id: owner.id,
|
||||
name: owner.name,
|
||||
avatar: owner.avatar_url,
|
||||
email: owner.email,
|
||||
};
|
||||
currentWorkspace.memberCount = member_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
workspaces.forEach(workspace => {
|
||||
this._workspaces.add(workspace);
|
||||
});
|
||||
|
||||
return workspaces;
|
||||
const workspaceUnits = await Promise.all(
|
||||
workspacesList.map(w => {
|
||||
return loadWorkspaceUnit(
|
||||
{
|
||||
id: w.id,
|
||||
name: '',
|
||||
avatar: undefined,
|
||||
owner: undefined,
|
||||
published: w.public,
|
||||
memberCount: 1,
|
||||
provider: 'affine',
|
||||
syncMode: 'core',
|
||||
},
|
||||
this._apis
|
||||
);
|
||||
})
|
||||
);
|
||||
this._workspaces.add(workspaceUnits);
|
||||
return workspaceUnits;
|
||||
}
|
||||
|
||||
override async auth() {
|
||||
@@ -310,52 +263,29 @@ export class AffineProvider extends BaseProvider {
|
||||
// return workspace;
|
||||
}
|
||||
|
||||
public override async createWorkspaceInfo(
|
||||
public override async createWorkspace(
|
||||
meta: CreateWorkspaceInfoParams
|
||||
): Promise<WorkspaceMeta0> {
|
||||
): Promise<WorkspaceUnit | undefined> {
|
||||
const { id } = await this._apis.createWorkspace(meta);
|
||||
|
||||
const workspaceInfo: WorkspaceMeta0 = {
|
||||
const workspaceUnit = await createWorkspaceUnit({
|
||||
id,
|
||||
name: meta.name,
|
||||
id: id,
|
||||
published: false,
|
||||
avatar: '',
|
||||
avatar: undefined,
|
||||
owner: await this.getUserInfo(),
|
||||
syncMode: 'core',
|
||||
memberCount: 1,
|
||||
provider: 'affine',
|
||||
};
|
||||
return workspaceInfo;
|
||||
}
|
||||
|
||||
public override async createWorkspace(
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace,
|
||||
meta: WorkspaceMeta0
|
||||
): Promise<BlocksuiteWorkspace | undefined> {
|
||||
const workspaceId = blocksuiteWorkspace.room;
|
||||
assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).');
|
||||
this._logger('Creating affine workspace');
|
||||
|
||||
this._applyCloudUpdates(blocksuiteWorkspace);
|
||||
this.linkLocal(blocksuiteWorkspace);
|
||||
|
||||
const workspaceInfo: WorkspaceMeta0 = {
|
||||
name: meta.name,
|
||||
id: workspaceId,
|
||||
published: false,
|
||||
avatar: '',
|
||||
owner: undefined,
|
||||
syncMode: 'core',
|
||||
memberCount: 1,
|
||||
provider: 'affine',
|
||||
};
|
||||
syncMode: 'core',
|
||||
});
|
||||
|
||||
if (!blocksuiteWorkspace.meta.avatar) {
|
||||
await setDefaultAvatar(blocksuiteWorkspace);
|
||||
workspaceInfo.avatar = blocksuiteWorkspace.meta.avatar;
|
||||
}
|
||||
this._workspaces.add(workspaceInfo);
|
||||
return blocksuiteWorkspace;
|
||||
await syncToCloud(
|
||||
workspaceUnit.blocksuiteWorkspace!,
|
||||
this._apis.token.refresh
|
||||
);
|
||||
this._workspaces.add(workspaceUnit);
|
||||
|
||||
return workspaceUnit;
|
||||
}
|
||||
|
||||
public override async publish(id: string, isPublish: boolean): Promise<void> {
|
||||
@@ -377,22 +307,41 @@ export class AffineProvider extends BaseProvider {
|
||||
: null;
|
||||
}
|
||||
|
||||
public override async assign(
|
||||
to: BlocksuiteWorkspace,
|
||||
from: BlocksuiteWorkspace
|
||||
): Promise<BlocksuiteWorkspace> {
|
||||
assert(to.room, 'Blocksuite Workspace without room(workspaceId).');
|
||||
const ws = this._getWebsocketProvider(to);
|
||||
applyUpdate(to.doc, encodeStateAsUpdate(from.doc));
|
||||
// TODO: upload blobs and make sure doc is synced
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
ws.once('synced', () => {
|
||||
setTimeout(() => resolve(), 1000);
|
||||
});
|
||||
ws.once('lost-connection', () => reject());
|
||||
ws.once('connection-error', () => reject());
|
||||
public override async extendWorkspace(
|
||||
workspaceUnit: WorkspaceUnit
|
||||
): Promise<WorkspaceUnit> {
|
||||
const { id } = await this._apis.createWorkspace({
|
||||
name: workspaceUnit.name,
|
||||
});
|
||||
return to;
|
||||
const newWorkspaceUnit = new WorkspaceUnit({
|
||||
id,
|
||||
name: workspaceUnit.name,
|
||||
avatar: undefined,
|
||||
owner: await this.getUserInfo(),
|
||||
published: false,
|
||||
memberCount: 1,
|
||||
provider: 'affine',
|
||||
syncMode: 'core',
|
||||
});
|
||||
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(id);
|
||||
|
||||
await new Promise(resolve => {
|
||||
assert(workspaceUnit.blocksuiteWorkspace);
|
||||
const doc = blocksuiteWorkspace.doc;
|
||||
doc.once('update', resolve);
|
||||
applyUpdate(
|
||||
doc,
|
||||
encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc)
|
||||
);
|
||||
});
|
||||
|
||||
await syncToCloud(blocksuiteWorkspace, this._apis.token.refresh);
|
||||
|
||||
newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||
|
||||
this._workspaces.add(newWorkspaceUnit);
|
||||
return newWorkspaceUnit;
|
||||
}
|
||||
|
||||
public override async logout(): Promise<void> {
|
||||
|
||||
95
packages/data-center/src/provider/affine/utils.ts
Normal file
95
packages/data-center/src/provider/affine/utils.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
import assert from 'assert';
|
||||
import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store';
|
||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||
import type { WorkspaceUnitCtorParams } from '../../workspace-unit';
|
||||
import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
||||
import type { Apis } from './apis';
|
||||
import { WebsocketProvider } from './sync.js';
|
||||
import { setDefaultAvatar } from '../utils.js';
|
||||
|
||||
export const loadWorkspaceUnit = async (
|
||||
params: WorkspaceUnitCtorParams,
|
||||
apis: Apis
|
||||
) => {
|
||||
const workspaceUnit = new WorkspaceUnit(params);
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(workspaceUnit.id);
|
||||
|
||||
const updates = await apis.downloadWorkspace(
|
||||
workspaceUnit.id,
|
||||
params.published
|
||||
);
|
||||
if (updates && updates.byteLength) {
|
||||
await new Promise(resolve => {
|
||||
const doc = blocksuiteWorkspace.doc;
|
||||
doc.once('update', resolve);
|
||||
BlocksuiteWorkspace.Y.applyUpdate(doc, new Uint8Array(updates));
|
||||
});
|
||||
}
|
||||
|
||||
const details = await apis.getWorkspaceDetail({ id: workspaceUnit.id });
|
||||
const owner = details?.owner;
|
||||
|
||||
workspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||
workspaceUnit.update({
|
||||
name: blocksuiteWorkspace.meta.name,
|
||||
avatar: blocksuiteWorkspace.meta.avatar,
|
||||
memberCount: details?.member_count || 1,
|
||||
owner: owner
|
||||
? {
|
||||
id: owner.id,
|
||||
name: owner.name,
|
||||
avatar: owner.avatar_url,
|
||||
email: owner.email,
|
||||
}
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return workspaceUnit;
|
||||
};
|
||||
|
||||
export const syncToCloud = async (
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace,
|
||||
refreshToken: string
|
||||
) => {
|
||||
const workspaceId = blocksuiteWorkspace.room;
|
||||
assert(workspaceId, 'Blocksuite workspace without room(workspaceId).');
|
||||
|
||||
const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${
|
||||
window.location.host
|
||||
}/api/sync/`;
|
||||
|
||||
const ws = new WebsocketProvider(
|
||||
wsUrl,
|
||||
workspaceId,
|
||||
blocksuiteWorkspace.doc,
|
||||
{
|
||||
params: { token: refreshToken },
|
||||
}
|
||||
);
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
ws.once('synced', () => {
|
||||
// FIXME: we don't when send local data to cloud successfully, so hack to wait 1s.
|
||||
// Server will support this by add a new api.
|
||||
setTimeout(resolve, 1000);
|
||||
});
|
||||
ws.once('lost-connection', () => reject());
|
||||
ws.once('connection-error', () => reject());
|
||||
});
|
||||
};
|
||||
|
||||
export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => {
|
||||
const workspaceUnit = new WorkspaceUnit(params);
|
||||
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(workspaceUnit.id);
|
||||
|
||||
blocksuiteWorkspace.meta.setName(workspaceUnit.name);
|
||||
if (!workspaceUnit.avatar) {
|
||||
await setDefaultAvatar(blocksuiteWorkspace);
|
||||
workspaceUnit.update({ avatar: blocksuiteWorkspace.meta.avatar });
|
||||
}
|
||||
|
||||
workspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||
|
||||
return workspaceUnit;
|
||||
};
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store';
|
||||
import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store';
|
||||
import { MessageCenter } from '../message';
|
||||
import { Logger, User } from '../types';
|
||||
import type { WorkspaceUnitCollectionScope } from '../workspace-unit-collection';
|
||||
import type { WorkspaceUnitCtorParams } from '../workspace-unit';
|
||||
import type { WorkspaceUnitCtorParams, WorkspaceUnit } from '../workspace-unit';
|
||||
import { Member } from './affine/apis';
|
||||
|
||||
const defaultLogger = () => {
|
||||
@@ -44,12 +44,6 @@ export class BaseProvider {
|
||||
return;
|
||||
}
|
||||
|
||||
public async createWorkspaceInfo(
|
||||
params: CreateWorkspaceInfoParams
|
||||
): Promise<WorkspaceMeta0> {
|
||||
throw new Error(`provider: ${this.id} createWorkspaceInfo Not implemented`);
|
||||
}
|
||||
|
||||
/**
|
||||
* auth provider
|
||||
*/
|
||||
@@ -87,7 +81,7 @@ export class BaseProvider {
|
||||
/**
|
||||
* load workspaces
|
||||
**/
|
||||
public async loadWorkspaces(): Promise<WorkspaceMeta0[]> {
|
||||
public async loadWorkspaces(): Promise<WorkspaceUnit[]> {
|
||||
throw new Error(`provider: ${this.id} loadWorkSpace Not implemented`);
|
||||
}
|
||||
|
||||
@@ -183,13 +177,18 @@ export class BaseProvider {
|
||||
|
||||
/**
|
||||
* create workspace by workspace meta
|
||||
* @param {WorkspaceMeta} meta
|
||||
* @param {CreateWorkspaceInfoParams} meta
|
||||
*/
|
||||
public async createWorkspace(
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace,
|
||||
meta: WorkspaceMeta0
|
||||
): Promise<BlocksuiteWorkspace | undefined> {
|
||||
return blocksuiteWorkspace;
|
||||
meta: CreateWorkspaceInfoParams
|
||||
): Promise<WorkspaceUnit | undefined> {
|
||||
throw new Error(`provider: ${this.id} createWorkspace not implemented`);
|
||||
}
|
||||
|
||||
public async extendWorkspace(
|
||||
workspaceUnit: WorkspaceUnit
|
||||
): Promise<WorkspaceUnit | undefined> {
|
||||
throw new Error(`provider: ${this.id} extendWorkspace not implemented`);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -214,16 +213,6 @@ export class BaseProvider {
|
||||
return workspace;
|
||||
}
|
||||
|
||||
/**
|
||||
* merge one workspaces to another
|
||||
* @param workspace
|
||||
* @returns
|
||||
*/
|
||||
public async assign(to: BlocksuiteWorkspace, from: BlocksuiteWorkspace) {
|
||||
from;
|
||||
return to;
|
||||
}
|
||||
|
||||
/**
|
||||
* get workspace members
|
||||
* @param {string} workspaceId
|
||||
|
||||
@@ -2,9 +2,12 @@ import assert from 'assert';
|
||||
import * as idb from 'lib0/indexeddb.js';
|
||||
import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store';
|
||||
|
||||
const { encodeStateAsUpdate } = BlocksuiteWorkspace.Y;
|
||||
const { applyUpdate, encodeStateAsUpdate, mergeUpdates } =
|
||||
BlocksuiteWorkspace.Y;
|
||||
|
||||
export const initStore = async (blocksuiteWorkspace: BlocksuiteWorkspace) => {
|
||||
export const writeUpdatesToLocal = async (
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace
|
||||
) => {
|
||||
const workspaceId = blocksuiteWorkspace.room;
|
||||
assert(workspaceId);
|
||||
await idb.deleteDB(workspaceId);
|
||||
@@ -18,3 +21,25 @@ export const initStore = async (blocksuiteWorkspace: BlocksuiteWorkspace) => {
|
||||
await idb.addAutoKey(updatesStore, currState);
|
||||
}
|
||||
};
|
||||
|
||||
export const applyLocalUpdates = async (
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace
|
||||
) => {
|
||||
const workspaceId = blocksuiteWorkspace.room;
|
||||
assert(workspaceId, 'Blocksuite workspace without room(workspaceId).');
|
||||
const db = await idb.openDB(workspaceId, db =>
|
||||
idb.createStores(db, [['updates', { autoIncrement: true }], ['custom']])
|
||||
);
|
||||
|
||||
const [updatesStore] = idb.transact(db, ['updates']); // , 'readonly')
|
||||
if (updatesStore) {
|
||||
const updates = await idb.getAll(updatesStore);
|
||||
const doc = blocksuiteWorkspace.doc;
|
||||
await new Promise(resolve => {
|
||||
const mergedUpdates = mergeUpdates(updates);
|
||||
doc.once('update', resolve);
|
||||
applyUpdate(doc, mergedUpdates);
|
||||
});
|
||||
}
|
||||
return blocksuiteWorkspace;
|
||||
};
|
||||
|
||||
@@ -16,12 +16,10 @@ test.describe.serial('local provider', () => {
|
||||
let workspaceId: string | undefined;
|
||||
|
||||
test('create workspace', async () => {
|
||||
const workspaceInfo = await provider.createWorkspaceInfo({
|
||||
const workspaceUnit = await provider.createWorkspace({
|
||||
name: workspaceName,
|
||||
});
|
||||
workspaceId = workspaceInfo.id;
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(workspaceId);
|
||||
await provider.createWorkspace(blocksuiteWorkspace, workspaceInfo);
|
||||
workspaceId = workspaceUnit?.id;
|
||||
|
||||
expect(workspaceMetaCollection.workspaces.length).toEqual(1);
|
||||
expect(workspaceMetaCollection.workspaces[0].name).toEqual(workspaceName);
|
||||
|
||||
@@ -8,9 +8,9 @@ import type {
|
||||
import { varStorage as storage } from 'lib0/storage';
|
||||
import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store';
|
||||
import { IndexedDBProvider } from './indexeddb/indexeddb.js';
|
||||
import { initStore } from './indexeddb/utils.js';
|
||||
import assert from 'assert';
|
||||
import { setDefaultAvatar } from '../utils.js';
|
||||
import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js';
|
||||
import type { WorkspaceUnit } from '../../workspace-unit';
|
||||
|
||||
const WORKSPACE_KEY = 'workspaces';
|
||||
|
||||
@@ -22,21 +22,12 @@ export class LocalProvider extends BaseProvider {
|
||||
super(params);
|
||||
}
|
||||
|
||||
private _storeWorkspaces(workspaces: WorkspaceMeta0[]) {
|
||||
private _storeWorkspaces(workspaceUnits: WorkspaceUnit[]) {
|
||||
storage.setItem(
|
||||
WORKSPACE_KEY,
|
||||
JSON.stringify(
|
||||
workspaces.map(w => {
|
||||
return {
|
||||
id: w.id,
|
||||
name: w.name,
|
||||
avatar: w.avatar,
|
||||
owner: w.owner,
|
||||
published: w.published,
|
||||
memberCount: w.memberCount,
|
||||
provider: w.provider,
|
||||
syncMode: w.syncMode,
|
||||
};
|
||||
workspaceUnits.map(w => {
|
||||
return w.toJSON();
|
||||
})
|
||||
)
|
||||
);
|
||||
@@ -60,20 +51,23 @@ export class LocalProvider extends BaseProvider {
|
||||
return workspace;
|
||||
}
|
||||
|
||||
override loadWorkspaces(): Promise<WorkspaceMeta0[]> {
|
||||
override async loadWorkspaces(): Promise<WorkspaceUnit[]> {
|
||||
const workspaceStr = storage.getItem(WORKSPACE_KEY);
|
||||
let workspaces: WorkspaceMeta0[] = [];
|
||||
if (workspaceStr) {
|
||||
try {
|
||||
workspaces = JSON.parse(workspaceStr) as WorkspaceMeta0[];
|
||||
workspaces.forEach(workspace => {
|
||||
this._workspaces.add(workspace);
|
||||
});
|
||||
const workspaceMetas = JSON.parse(workspaceStr) as WorkspaceMeta0[];
|
||||
const workspaceUnits = await Promise.all(
|
||||
workspaceMetas.map(meta => {
|
||||
return loadWorkspaceUnit(meta);
|
||||
})
|
||||
);
|
||||
this._workspaces.add(workspaceUnits);
|
||||
return workspaceUnits;
|
||||
} catch (error) {
|
||||
this._logger(`Failed to parse workspaces from storage`);
|
||||
}
|
||||
}
|
||||
return Promise.resolve(workspaces);
|
||||
return [];
|
||||
}
|
||||
|
||||
public override async deleteWorkspace(id: string): Promise<void> {
|
||||
@@ -95,10 +89,10 @@ export class LocalProvider extends BaseProvider {
|
||||
this._storeWorkspaces(this._workspaces.list());
|
||||
}
|
||||
|
||||
public override async createWorkspaceInfo(
|
||||
public override async createWorkspace(
|
||||
meta: CreateWorkspaceInfoParams
|
||||
): Promise<WorkspaceMeta0> {
|
||||
const workspaceInfo: WorkspaceMeta0 = {
|
||||
): Promise<WorkspaceUnit | undefined> {
|
||||
const workspaceUnit = await createWorkspaceUnit({
|
||||
name: meta.name,
|
||||
id: uuidv4(),
|
||||
published: false,
|
||||
@@ -107,35 +101,10 @@ export class LocalProvider extends BaseProvider {
|
||||
syncMode: 'core',
|
||||
memberCount: 1,
|
||||
provider: 'local',
|
||||
};
|
||||
return Promise.resolve(workspaceInfo);
|
||||
}
|
||||
|
||||
public override async createWorkspace(
|
||||
blocksuiteWorkspace: BlocksuiteWorkspace,
|
||||
meta: WorkspaceMeta0
|
||||
): Promise<BlocksuiteWorkspace | undefined> {
|
||||
const workspaceId = blocksuiteWorkspace.room;
|
||||
assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).');
|
||||
this._logger('Creating affine workspace');
|
||||
|
||||
const workspaceInfo: WorkspaceMeta0 = {
|
||||
...meta,
|
||||
};
|
||||
|
||||
blocksuiteWorkspace.meta.setName(meta.name);
|
||||
|
||||
if (!meta.avatar) {
|
||||
await setDefaultAvatar(blocksuiteWorkspace);
|
||||
workspaceInfo.avatar = blocksuiteWorkspace.meta.avatar;
|
||||
}
|
||||
|
||||
await initStore(blocksuiteWorkspace);
|
||||
|
||||
this._workspaces.add(workspaceInfo);
|
||||
});
|
||||
this._workspaces.add(workspaceUnit);
|
||||
this._storeWorkspaces(this._workspaces.list());
|
||||
|
||||
return blocksuiteWorkspace;
|
||||
return workspaceUnit;
|
||||
}
|
||||
|
||||
public override async clear(): Promise<void> {
|
||||
|
||||
34
packages/data-center/src/provider/local/utils.ts
Normal file
34
packages/data-center/src/provider/local/utils.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||
import type { WorkspaceUnitCtorParams } from '../../workspace-unit';
|
||||
import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
||||
import { applyLocalUpdates, writeUpdatesToLocal } from './indexeddb/utils.js';
|
||||
import { setDefaultAvatar } from '../utils.js';
|
||||
|
||||
export const loadWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => {
|
||||
const workspaceUnit = new WorkspaceUnit(params);
|
||||
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(workspaceUnit.id);
|
||||
|
||||
await applyLocalUpdates(blocksuiteWorkspace);
|
||||
|
||||
workspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||
|
||||
return workspaceUnit;
|
||||
};
|
||||
|
||||
export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => {
|
||||
const workspaceUnit = new WorkspaceUnit(params);
|
||||
|
||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(workspaceUnit.id);
|
||||
blocksuiteWorkspace.meta.setName(workspaceUnit.name);
|
||||
if (!workspaceUnit.avatar) {
|
||||
await setDefaultAvatar(blocksuiteWorkspace);
|
||||
workspaceUnit.update({ avatar: blocksuiteWorkspace.meta.avatar });
|
||||
}
|
||||
|
||||
await writeUpdatesToLocal(blocksuiteWorkspace);
|
||||
|
||||
workspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||
|
||||
return workspaceUnit;
|
||||
};
|
||||
Reference in New Issue
Block a user