feat: workspace cache version instead of event emitter (#2637)
This commit is contained in:
@ -1,11 +0,0 @@
|
||||
export class WorkspaceMigrationAppliedEvent {
|
||||
private readonly _workspaceId: string;
|
||||
|
||||
constructor(worskapceId: string) {
|
||||
this._workspaceId = worskapceId;
|
||||
}
|
||||
|
||||
get workspaceId(): string {
|
||||
return this._workspaceId;
|
||||
}
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
export enum WorkspaceMigrationEvents {
|
||||
MigrationApplied = '@workspace/migration-applied',
|
||||
}
|
||||
@ -2,11 +2,16 @@ import { Module } from '@nestjs/common';
|
||||
|
||||
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
|
||||
import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module';
|
||||
import { WorkspaceCacheVersionModule } from 'src/metadata/workspace-cache-version/workspace-cache-version.module';
|
||||
|
||||
import { WorkspaceMigrationRunnerService } from './workspace-migration-runner.service';
|
||||
|
||||
@Module({
|
||||
imports: [WorkspaceDataSourceModule, WorkspaceMigrationModule],
|
||||
imports: [
|
||||
WorkspaceDataSourceModule,
|
||||
WorkspaceMigrationModule,
|
||||
WorkspaceCacheVersionModule,
|
||||
],
|
||||
exports: [WorkspaceMigrationRunnerService],
|
||||
providers: [WorkspaceMigrationRunnerService],
|
||||
})
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
|
||||
import {
|
||||
QueryRunner,
|
||||
@ -18,8 +17,7 @@ import {
|
||||
WorkspaceMigrationColumnCreate,
|
||||
WorkspaceMigrationColumnRelation,
|
||||
} from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { WorkspaceMigrationEvents } from 'src/workspace/workspace-migration-runner/events/workspace-migration-events';
|
||||
import { WorkspaceMigrationAppliedEvent } from 'src/workspace/workspace-migration-runner/events/workspace-migration-applied.event';
|
||||
import { WorkspaceCacheVersionService } from 'src/metadata/workspace-cache-version/workspace-cache-version.service';
|
||||
|
||||
import { customTableDefaultColumns } from './utils/custom-table-default-column.util';
|
||||
|
||||
@ -28,7 +26,7 @@ export class WorkspaceMigrationRunnerService {
|
||||
constructor(
|
||||
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
|
||||
private readonly workspaceMigrationService: WorkspaceMigrationService,
|
||||
private readonly eventEmitter: EventEmitter2,
|
||||
private readonly workspaceCacheVersionService: WorkspaceCacheVersionService,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@ -82,11 +80,8 @@ export class WorkspaceMigrationRunnerService {
|
||||
|
||||
await queryRunner.release();
|
||||
|
||||
// Emit event when migration is applied
|
||||
this.eventEmitter.emit(
|
||||
WorkspaceMigrationEvents.MigrationApplied,
|
||||
new WorkspaceMigrationAppliedEvent(workspaceId),
|
||||
);
|
||||
// Increment workspace cache version
|
||||
await this.workspaceCacheVersionService.incrementVersion(workspaceId);
|
||||
|
||||
return flattenedPendingMigrations;
|
||||
}
|
||||
|
||||
@ -6,11 +6,13 @@ import { MemoryStorageModule } from 'src/integrations/memory-storage/memory-stor
|
||||
import { MemoryStorageJsonSerializer } from 'src/integrations/memory-storage/serializers/json.serializer';
|
||||
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
|
||||
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
|
||||
import { WorkspaceCacheVersionModule } from 'src/metadata/workspace-cache-version/workspace-cache-version.module';
|
||||
import { WorkspaceSchemaStorageService } from 'src/workspace/workspace-schema-storage/workspace-schema-storage.service';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
ObjectMetadataModule,
|
||||
WorkspaceCacheVersionModule,
|
||||
MemoryStorageModule.forRoot({
|
||||
identifier: 'objectMetadataCollection',
|
||||
type: MemoryStorageType.Local,
|
||||
@ -22,6 +24,11 @@ import { WorkspaceSchemaStorageService } from 'src/workspace/workspace-schema-st
|
||||
type: MemoryStorageType.Local,
|
||||
options: {},
|
||||
}),
|
||||
MemoryStorageModule.forRoot({
|
||||
identifier: 'cacheVersion',
|
||||
type: MemoryStorageType.Local,
|
||||
options: {},
|
||||
}),
|
||||
],
|
||||
providers: [WorkspaceSchemaStorageService],
|
||||
exports: [WorkspaceSchemaStorageService],
|
||||
|
||||
@ -1,11 +1,9 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { OnEvent } from '@nestjs/event-emitter';
|
||||
|
||||
import { InjectMemoryStorage } from 'src/integrations/memory-storage/decorators/inject-memory-storage.decorator';
|
||||
import { MemoryStorageService } from 'src/integrations/memory-storage/memory-storage.service';
|
||||
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
|
||||
import { WorkspaceMigrationAppliedEvent } from 'src/workspace/workspace-migration-runner/events/workspace-migration-applied.event';
|
||||
import { WorkspaceMigrationEvents } from 'src/workspace/workspace-migration-runner/events/workspace-migration-events';
|
||||
import { WorkspaceCacheVersionService } from 'src/metadata/workspace-cache-version/workspace-cache-version.service';
|
||||
|
||||
@Injectable()
|
||||
export class WorkspaceSchemaStorageService {
|
||||
@ -16,8 +14,32 @@ export class WorkspaceSchemaStorageService {
|
||||
>,
|
||||
@InjectMemoryStorage('typeDefs')
|
||||
private readonly typeDefsMemoryStorageService: MemoryStorageService<string>,
|
||||
@InjectMemoryStorage('cacheVersion')
|
||||
private readonly cacheVersionMemoryStorageService: MemoryStorageService<string>,
|
||||
private readonly workspaceCacheVersionService: WorkspaceCacheVersionService,
|
||||
) {}
|
||||
|
||||
async validateCacheVersion(workspaceId: string): Promise<void> {
|
||||
const currentVersion =
|
||||
(await this.cacheVersionMemoryStorageService.read({
|
||||
key: workspaceId,
|
||||
})) ?? '0';
|
||||
const latestVersion = await this.workspaceCacheVersionService.getVersion(
|
||||
workspaceId,
|
||||
);
|
||||
|
||||
if (currentVersion !== latestVersion) {
|
||||
// Invalidate cache if version mismatch is detected
|
||||
await this.invalidateCache(workspaceId);
|
||||
|
||||
// Update the cache version after invalidation
|
||||
await this.cacheVersionMemoryStorageService.write({
|
||||
key: workspaceId,
|
||||
data: latestVersion,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
setObjectMetadata(
|
||||
workspaceId: string,
|
||||
objectMetadata: ObjectMetadataEntity[],
|
||||
@ -49,12 +71,8 @@ export class WorkspaceSchemaStorageService {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the workspace schema storage when new migrations are applied for a specific workspace
|
||||
*/
|
||||
@OnEvent(WorkspaceMigrationEvents.MigrationApplied)
|
||||
handleMigrationAppliedEvent({ workspaceId }: WorkspaceMigrationAppliedEvent) {
|
||||
this.objectMetadataMemoryStorageService.delete({ key: workspaceId });
|
||||
this.typeDefsMemoryStorageService.delete({ key: workspaceId });
|
||||
async invalidateCache(workspaceId: string): Promise<void> {
|
||||
await this.objectMetadataMemoryStorageService.delete({ key: workspaceId });
|
||||
await this.typeDefsMemoryStorageService.delete({ key: workspaceId });
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,6 +39,9 @@ export class WorkspaceFactory {
|
||||
return new GraphQLSchema({});
|
||||
}
|
||||
|
||||
// Validate cache version
|
||||
await this.workspaceSchemaStorageService.validateCacheVersion(workspaceId);
|
||||
|
||||
// Get object metadata from cache
|
||||
let objectMetadataCollection =
|
||||
await this.workspaceSchemaStorageService.getObjectMetadata(workspaceId);
|
||||
|
||||
Reference in New Issue
Block a user