feat: workspace cache version instead of event emitter (#2637)

This commit is contained in:
Jérémy M
2023-11-22 14:51:26 +01:00
committed by GitHub
parent 85646a8072
commit 5c8c141556
15 changed files with 140 additions and 49 deletions
@@ -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 });
}
}