diff --git a/packages/twenty-server/src/database/typeorm/metadata/migrations/1712923480448-addIsAuditLogged.ts b/packages/twenty-server/src/database/typeorm/metadata/migrations/1712923480448-addIsAuditLogged.ts new file mode 100644 index 000000000..d79b54624 --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/metadata/migrations/1712923480448-addIsAuditLogged.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddIsAuditLogged1712923480448 implements MigrationInterface { + name = 'AddIsAuditLogged1712923480448'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."objectMetadata" ADD "isAuditLogged" boolean NOT NULL DEFAULT true`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."objectMetadata" DROP COLUMN "isAuditLogged"`, + ); + } +} diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts index 8288a94d4..cd7d0ac59 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts @@ -49,7 +49,7 @@ export class EntityEventsToDbListener { payload: ObjectRecordCreateEvent, operation: string, ) { - if (payload.objectMetadata.isSystem) { + if (!payload.objectMetadata.isAuditLogged) { return; } diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface.ts index d20201de8..d40ace01b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface.ts @@ -16,4 +16,5 @@ export interface ObjectMetadataInterface { isCustom: boolean; isActive: boolean; isRemote: boolean; + isAuditLogged: boolean; } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts index ed2102881..ac806670c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts @@ -64,6 +64,9 @@ export class ObjectMetadataEntity implements ObjectMetadataInterface { @Column({ default: false }) isSystem: boolean; + @Column({ default: true }) + isAuditLogged: boolean; + @Column({ nullable: true }) labelIdentifierFieldMetadataId?: string; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/is-not-audit-logged.decorator.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/is-not-audit-logged.decorator.ts new file mode 100644 index 000000000..394303d03 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/is-not-audit-logged.decorator.ts @@ -0,0 +1,7 @@ +import { TypedReflect } from 'src/utils/typed-reflect'; + +export function IsNotAuditLogged() { + return function (target: object) { + TypedReflect.defineMetadata('isAuditLogged', false, target); + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator.ts index 0c559d5ae..2d21189aa 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator.ts @@ -8,6 +8,8 @@ export function ObjectMetadata( ): ClassDecorator { return (target) => { const isSystem = TypedReflect.getMetadata('isSystem', target) ?? false; + const isAuditLogged = + TypedReflect.getMetadata('isAuditLogged', target) ?? true; const gate = TypedReflect.getMetadata('gate', target); const objectName = convertClassNameToObjectMetadataName(target.name); @@ -20,6 +22,7 @@ export function ObjectMetadata( isSystem, isCustom: false, isRemote: false, + isAuditLogged, description: params.description, icon: params.icon, gate, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/reflect-object-metadata.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/reflect-object-metadata.interface.ts index 26a17b913..95d371389 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/reflect-object-metadata.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/interfaces/reflect-object-metadata.interface.ts @@ -15,5 +15,6 @@ export interface ReflectObjectMetadata extends ObjectMetadataDecoratorParams { isSystem: boolean; isCustom: boolean; isRemote: boolean; + isAuditLogged: boolean; gate?: GateDecoratorParams; } diff --git a/packages/twenty-server/src/modules/event/standard-objects/event.object-metadata.ts b/packages/twenty-server/src/modules/event/standard-objects/event.object-metadata.ts index fe5d9e7f9..90bc5c20e 100644 --- a/packages/twenty-server/src/modules/event/standard-objects/event.object-metadata.ts +++ b/packages/twenty-server/src/modules/event/standard-objects/event.object-metadata.ts @@ -4,6 +4,7 @@ import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-m import { CustomObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/custom-objects/custom.object-metadata'; import { DynamicRelationFieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/dynamic-field-metadata.interface'; import { FieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/field-metadata.decorator'; +import { IsNotAuditLogged } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-not-audit-logged.decorator'; import { IsNullable } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-nullable.decorator'; import { IsSystem } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-system.decorator'; import { ObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator'; @@ -22,6 +23,7 @@ import { WorkspaceMemberObjectMetadata } from 'src/modules/workspace-member/stan icon: 'IconJson', }) @IsSystem() +@IsNotAuditLogged() export class EventObjectMetadata extends BaseObjectMetadata { @FieldMetadata({ standardId: eventStandardFieldIds.properties, diff --git a/packages/twenty-server/src/utils/typed-reflect.ts b/packages/twenty-server/src/utils/typed-reflect.ts index 6ec7a9666..2e3463bc0 100644 --- a/packages/twenty-server/src/utils/typed-reflect.ts +++ b/packages/twenty-server/src/utils/typed-reflect.ts @@ -16,6 +16,7 @@ export interface ReflectMetadataTypeMap { gate: GateDecoratorParams; isNullable: true; isSystem: true; + isAuditLogged: false; } export class TypedReflect {