[fix] Increment cache version after object/field/relation update (#5316)

Fixes #5276.

Updates were not triggering a cache version incrementation because they
do not trigger migrations while that is where the caching version logic
was.
We have decided to move the cache incrementation logic to the services.
This commit is contained in:
Marie
2024-05-07 16:30:25 +02:00
committed by GitHub
parent b0d1cc9dcb
commit 7c3e82870c
22 changed files with 160 additions and 39 deletions

View File

@ -0,0 +1,13 @@
import { InputType } from '@nestjs/graphql';
import { IDField } from '@ptc-org/nestjs-query-graphql';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
@InputType()
export class DeleteOneRelationInput {
@IDField(() => UUIDScalarType, {
description: 'The id of the relation to delete.',
})
id!: string;
}

View File

@ -11,6 +11,8 @@ import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/
import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module';
import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module';
import { WorkspaceCacheVersionModule } from 'src/engine/metadata-modules/workspace-cache-version/workspace-cache-version.module';
import { RelationMetadataResolver } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.resolver';
import { RelationMetadataService } from './relation-metadata.service';
import { RelationMetadataEntity } from './relation-metadata.entity';
@ -30,6 +32,7 @@ import { RelationMetadataDTO } from './dtos/relation-metadata.dto';
FieldMetadataModule,
WorkspaceMigrationRunnerModule,
WorkspaceMigrationModule,
WorkspaceCacheVersionModule,
],
services: [RelationMetadataService],
resolvers: [
@ -41,13 +44,13 @@ import { RelationMetadataDTO } from './dtos/relation-metadata.dto';
pagingStrategy: PagingStrategies.CURSOR,
create: { many: { disabled: true } },
update: { disabled: true },
delete: { many: { disabled: true } },
delete: { disabled: true },
guards: [JwtAuthGuard],
},
],
}),
],
providers: [RelationMetadataService],
providers: [RelationMetadataService, RelationMetadataResolver],
exports: [RelationMetadataService],
})
export class RelationMetadataModule {}

View File

@ -0,0 +1,28 @@
import { UseGuards } from '@nestjs/common';
import { Args, Mutation, Resolver } from '@nestjs/graphql';
import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { RelationMetadataService } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { RelationMetadataDTO } from 'src/engine/metadata-modules/relation-metadata/dtos/relation-metadata.dto';
import { DeleteOneRelationInput } from 'src/engine/metadata-modules/relation-metadata/dtos/delete-relation.input';
@UseGuards(JwtAuthGuard)
@Resolver()
export class RelationMetadataResolver {
constructor(
private readonly relationMetadataService: RelationMetadataService,
) {}
@Mutation(() => RelationMetadataDTO)
deleteOneRelation(
@Args('input') input: DeleteOneRelationInput,
@AuthWorkspace() { id: workspaceId }: Workspace,
) {
return this.relationMetadataService.deleteOneRelation(
input.id,
workspaceId,
);
}
}

View File

@ -26,6 +26,7 @@ import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target
import { generateMigrationName } from 'src/engine/metadata-modules/workspace-migration/utils/generate-migration-name.util';
import { InvalidStringException } from 'src/engine/metadata-modules/errors/InvalidStringException';
import { validateMetadataName } from 'src/engine/metadata-modules/utils/validate-metadata-name.utils';
import { WorkspaceCacheVersionService } from 'src/engine/metadata-modules/workspace-cache-version/workspace-cache-version.service';
import {
RelationMetadataEntity,
@ -42,6 +43,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
private readonly fieldMetadataService: FieldMetadataService,
private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
private readonly workspaceCacheVersionService: WorkspaceCacheVersionService,
) {
super(relationMetadataRepository);
}
@ -110,6 +112,10 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
relationMetadataInput.workspaceId,
);
await this.workspaceCacheVersionService.incrementVersion(
relationMetadataInput.workspaceId,
);
return createdRelationMetadata;
}
@ -307,7 +313,10 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
});
}
override async deleteOne(id: string): Promise<RelationMetadataEntity> {
public async deleteOneRelation(
id: string,
workspaceId: string,
): Promise<RelationMetadataEntity> {
// TODO: This logic is duplicated with the BeforeDeleteOneRelation hook
const relationMetadata = await this.relationMetadataRepository.findOne({
where: { id },
@ -318,10 +327,10 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
throw new NotFoundException('Relation does not exist');
}
const deletedRelationMetadata = super.deleteOne(id);
await super.deleteOne(id);
// TODO: Move to a cdc scheduler
this.fieldMetadataService.deleteMany({
await this.fieldMetadataService.deleteMany({
id: {
in: [
relationMetadata.fromFieldMetadataId,
@ -330,7 +339,10 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
},
});
return deletedRelationMetadata;
await this.workspaceCacheVersionService.incrementVersion(workspaceId);
// TODO: Return id for delete endpoints
return relationMetadata;
}
async findManyRelationMetadataByFieldMetadataIds(