diff --git a/src/database/migrations/1722922766205-unique_name_item.ts b/src/database/migrations/1722922766205-unique_name_item.ts new file mode 100644 index 0000000..b9e0430 --- /dev/null +++ b/src/database/migrations/1722922766205-unique_name_item.ts @@ -0,0 +1,29 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class UniqueNameItem1722922766205 implements MigrationInterface { + name = 'UniqueNameItem1722922766205'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "item_bundlings" DROP CONSTRAINT "FK_a50e7abf2caba4d0394f3726b86"`, + ); + await queryRunner.query( + `ALTER TABLE "items" ADD CONSTRAINT "UQ_213736582899b3599acaade2cd1" UNIQUE ("name")`, + ); + await queryRunner.query( + `ALTER TABLE "item_bundlings" ADD CONSTRAINT "FK_a50e7abf2caba4d0394f3726b86" FOREIGN KEY ("item_bundling_id") REFERENCES "items"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "item_bundlings" DROP CONSTRAINT "FK_a50e7abf2caba4d0394f3726b86"`, + ); + await queryRunner.query( + `ALTER TABLE "items" DROP CONSTRAINT "UQ_213736582899b3599acaade2cd1"`, + ); + await queryRunner.query( + `ALTER TABLE "item_bundlings" ADD CONSTRAINT "FK_a50e7abf2caba4d0394f3726b86" FOREIGN KEY ("item_bundling_id") REFERENCES "items"("id") ON DELETE CASCADE ON UPDATE CASCADE`, + ); + } +} diff --git a/src/modules/item-related/item/data/models/item.model.ts b/src/modules/item-related/item/data/models/item.model.ts index 1ad37d5..a25633e 100644 --- a/src/modules/item-related/item/data/models/item.model.ts +++ b/src/modules/item-related/item/data/models/item.model.ts @@ -22,7 +22,7 @@ export class ItemModel extends BaseStatusModel implements ItemEntity { - @Column('varchar', { name: 'name' }) + @Column('varchar', { name: 'name', unique: true }) name: string; @Column('varchar', { name: 'image_url', nullable: true }) @@ -116,4 +116,19 @@ export class ItemModel onUpdate: 'CASCADE', }) gates: GateModel[]; + + // relasi untuk mendapatkan parent bundling + @ManyToMany(() => ItemModel, (model) => model.bundling_parents) + @JoinTable({ + name: 'item_bundlings', + joinColumn: { + name: 'item_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'item_bundling_id', + referencedColumnName: 'id', + }, + }) + bundling_parents: ItemModel[]; } diff --git a/src/modules/item-related/item/domain/usecases/managers/batch-delete-item.manager.ts b/src/modules/item-related/item/domain/usecases/managers/batch-delete-item.manager.ts index d36aecd..66fc2b6 100644 --- a/src/modules/item-related/item/domain/usecases/managers/batch-delete-item.manager.ts +++ b/src/modules/item-related/item/domain/usecases/managers/batch-delete-item.manager.ts @@ -26,7 +26,12 @@ export class BatchDeleteItemManager extends BaseBatchDeleteManager { } get validateRelations(): validateRelations[] { - return []; + return [ + { + relation: 'bundling_parents', + message: `Gagal! Item sudah berelasi dengen bundling`, + }, + ]; } get entityTarget(): any { diff --git a/src/modules/item-related/item/domain/usecases/managers/create-item.manager.ts b/src/modules/item-related/item/domain/usecases/managers/create-item.manager.ts index aebe725..2b9d9e0 100644 --- a/src/modules/item-related/item/domain/usecases/managers/create-item.manager.ts +++ b/src/modules/item-related/item/domain/usecases/managers/create-item.manager.ts @@ -33,7 +33,7 @@ export class CreateItemManager extends BaseCreateManager { } get uniqueColumns(): columnUniques[] { - return []; + return [{ column: 'name' }]; } get eventTopics(): EventTopics[] { diff --git a/src/modules/item-related/item/domain/usecases/managers/delete-item.manager.ts b/src/modules/item-related/item/domain/usecases/managers/delete-item.manager.ts index ea95c6f..cb56206 100644 --- a/src/modules/item-related/item/domain/usecases/managers/delete-item.manager.ts +++ b/src/modules/item-related/item/domain/usecases/managers/delete-item.manager.ts @@ -29,7 +29,12 @@ export class DeleteItemManager extends BaseDeleteManager { } get validateRelations(): validateRelations[] { - return []; + return [ + { + relation: 'bundling_parents', + message: `Gagal! Item sudah berelasi dengen bundling`, + }, + ]; } get entityTarget(): any {