mirror of
https://github.com/colanode/colanode.git
synced 2026-02-24 11:59:53 +01:00
Fix cleanup on account logout (#296)
This commit is contained in:
@@ -4,7 +4,11 @@ import ms from 'ms';
|
||||
import { SelectWorkspace } from '@colanode/client/databases';
|
||||
import { eventBus } from '@colanode/client/lib/event-bus';
|
||||
import { parseApiError } from '@colanode/client/lib/ky';
|
||||
import { mapAccount, mapWorkspace } from '@colanode/client/lib/mappers';
|
||||
import {
|
||||
mapAccount,
|
||||
mapMetadata,
|
||||
mapWorkspace,
|
||||
} from '@colanode/client/lib/mappers';
|
||||
import { AccountSocket } from '@colanode/client/services/accounts/account-socket';
|
||||
import { AppService } from '@colanode/client/services/app-service';
|
||||
import { ServerService } from '@colanode/client/services/server-service';
|
||||
@@ -117,11 +121,21 @@ export class AccountService {
|
||||
throw new Error('Failed to delete account');
|
||||
}
|
||||
|
||||
await this.app.database
|
||||
const deletedMetadata = await this.app.database
|
||||
.deleteFrom('metadata')
|
||||
.returningAll()
|
||||
.where('namespace', '=', this.account.id)
|
||||
.execute();
|
||||
|
||||
if (deletedMetadata.length > 0) {
|
||||
for (const metadata of deletedMetadata) {
|
||||
eventBus.publish({
|
||||
type: 'metadata.deleted',
|
||||
metadata: mapMetadata(metadata),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await this.app.jobs.addJob(
|
||||
{
|
||||
type: 'token.delete',
|
||||
|
||||
@@ -85,6 +85,8 @@ export class AppService {
|
||||
this.eventSubscriptionId = eventBus.subscribe((event) => {
|
||||
if (event.type === 'account.deleted') {
|
||||
this.accounts.delete(event.account.id);
|
||||
} else if (event.type === 'workspace.deleted') {
|
||||
this.workspaces.delete(event.workspace.userId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
workspaceDatabaseMigrations,
|
||||
} from '@colanode/client/databases/workspace';
|
||||
import { eventBus } from '@colanode/client/lib/event-bus';
|
||||
import { mapMetadata } from '@colanode/client/lib/mappers';
|
||||
import { AccountService } from '@colanode/client/services/accounts/account-service';
|
||||
import { CollaborationService } from '@colanode/client/services/workspaces/collaboration-service';
|
||||
import { DocumentService } from '@colanode/client/services/workspaces/document-service';
|
||||
@@ -161,11 +162,21 @@ export class WorkspaceService {
|
||||
.where('user_id', '=', this.workspace.userId)
|
||||
.execute();
|
||||
|
||||
await this.account.app.database
|
||||
const deletedMetadata = await this.account.app.database
|
||||
.deleteFrom('metadata')
|
||||
.returningAll()
|
||||
.where('namespace', '=', this.workspace.userId)
|
||||
.execute();
|
||||
|
||||
if (deletedMetadata.length > 0) {
|
||||
for (const metadata of deletedMetadata) {
|
||||
eventBus.publish({
|
||||
type: 'metadata.deleted',
|
||||
metadata: mapMetadata(metadata),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await this.account.app.jobs.removeJobSchedule(
|
||||
this.workspaceFilesCleanJobScheduleId
|
||||
);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Collection } from '@tanstack/react-db';
|
||||
|
||||
import { eventBus } from '@colanode/client/lib';
|
||||
import {
|
||||
Download,
|
||||
LocalNode,
|
||||
@@ -36,6 +37,16 @@ export class WorkspaceCollections {
|
||||
this.nodes = createNodesCollection(userId);
|
||||
this.nodeReactions = createNodeReactionsCollection(userId);
|
||||
}
|
||||
|
||||
public async cleanup(): Promise<void> {
|
||||
await Promise.all([
|
||||
this.users.cleanup(),
|
||||
this.downloads.cleanup(),
|
||||
this.uploads.cleanup(),
|
||||
this.nodes.cleanup(),
|
||||
this.nodeReactions.cleanup(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
export class AppCollections {
|
||||
@@ -62,6 +73,21 @@ export class AppCollections {
|
||||
}
|
||||
|
||||
public async preload(): Promise<void> {
|
||||
eventBus.subscribe((event) => {
|
||||
if (event.type === 'workspace.deleted') {
|
||||
try {
|
||||
const workspaceCollections = this.workspaceCollections.get(
|
||||
event.workspace.userId
|
||||
);
|
||||
if (workspaceCollections) {
|
||||
this.workspaceCollections.delete(event.workspace.userId);
|
||||
}
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all([
|
||||
this.servers.preload(),
|
||||
this.accounts.preload(),
|
||||
|
||||
@@ -31,6 +31,7 @@ export const AppProvider = ({ type }: AppProviderProps) => {
|
||||
setInitOutput('success');
|
||||
})
|
||||
.catch((err) => {
|
||||
setInitOutput('error');
|
||||
console.error('Colanode | Error preloading', err);
|
||||
});
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user