added base service

This commit is contained in:
hannathkadher
2024-12-17 19:21:00 +04:00
parent d1050babd1
commit e35cefb03b
4 changed files with 94 additions and 116 deletions
@@ -11,13 +11,16 @@ import {
SubspaceProductModelEntity,
} from '@app/common/modules/space-model';
import { SubspaceProductItemRepository } from '@app/common/modules/space/repositories/subspace.repository';
import { CreateSpaceProductItemDto } from 'src/space/dtos';
import { CreateSpaceProductItemDto } from '../../dtos';
import { BaseProductItemService } from '../../common';
@Injectable()
export class SubspaceProductItemService {
export class SubspaceProductItemService extends BaseProductItemService {
constructor(
private readonly productItemRepository: SubspaceProductItemRepository,
) {}
) {
super();
}
async createItemFromModel(
product: SubspaceProductEntity,
@@ -64,10 +67,10 @@ export class SubspaceProductItemService {
space: SpaceEntity,
) {
if (!itemDto?.length) return;
const incomingTags = itemDto.map((item) => item.tag);
await this.validateTags(incomingTags, queryRunner, space.uuid);
try {
await this.validateTags(itemDto, queryRunner, space);
const productItems = itemDto.map((dto) =>
queryRunner.manager.create(SubspaceProductItemEntity, {
tag: dto.tag,
@@ -86,59 +89,4 @@ export class SubspaceProductItemService {
);
}
}
private async validateTags(
subspaceItemModelDtos: CreateSpaceProductItemDto[],
queryRunner: QueryRunner,
space: SpaceEntity,
) {
const incomingTags = subspaceItemModelDtos.map((item) => item.tag);
const duplicateTags = incomingTags.filter(
(tag, index) => incomingTags.indexOf(tag) !== index,
);
if (duplicateTags.length > 0) {
throw new HttpException(
`Duplicate tags found in the request: ${[...new Set(duplicateTags)].join(', ')}`,
HttpStatus.BAD_REQUEST,
);
}
const existingTagsQuery = `
SELECT spi.tag
FROM "space-product-item" spi
INNER JOIN "space-product" spm
ON spi.space_product_uuid = spm.uuid
WHERE spm.space_uuid = $1
UNION
SELECT spi.tag
FROM "subspace-product-item" spi
INNER JOIN "subspace-product" spm
ON spi.subspace_product_uuid = spm.uuid
INNER JOIN "subspace" sm
ON spm.subspace_uuid = sm.uuid
WHERE sm.space_uuid = $1;
`;
const existingTags = await queryRunner.manager.query(existingTagsQuery, [
space.uuid,
]);
console.log(existingTags);
const existingTagsSet = new Set(
existingTags.map((row: { tag: string }) => row.tag),
);
const conflictingTags = [...incomingTags].filter((tag) =>
existingTagsSet.has(tag),
);
if (conflictingTags.length > 0) {
throw new HttpException(
`Tags already exist in the model: ${conflictingTags.join(', ')}`,
HttpStatus.CONFLICT,
);
}
}
}