added subspace product item

This commit is contained in:
hannathkadher
2024-12-17 12:18:03 +04:00
parent 3099e905e2
commit b3e8af7540
11 changed files with 179 additions and 12 deletions

View File

@ -42,5 +42,5 @@ export class SubspaceModelEntity extends AbstractEntity<SubSpaceModelDto> {
nullable: true,
},
)
public subspaceProductModels: SubspaceProductModelEntity[];
public productModels: SubspaceProductModelEntity[];
}

View File

@ -16,7 +16,7 @@ export class SubspaceProductModelEntity extends AbstractEntity<SubpaceProductMod
@ManyToOne(
() => SubspaceModelEntity,
(spaceModel) => spaceModel.subspaceProductModels,
(spaceModel) => spaceModel.productModels,
{
nullable: false,
},

View File

@ -46,5 +46,5 @@ export class SubspaceProductEntity extends AbstractEntity<SpaceProductModelDto>
nullable: true,
},
)
model: SubspaceProductItemModelEntity;
model: SubspaceProductModelEntity;
}

View File

@ -1,5 +1,13 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsString } from 'class-validator';
import { Type } from 'class-transformer';
import {
IsArray,
IsNotEmpty,
IsOptional,
IsString,
ValidateNested,
} from 'class-validator';
import { ProductAssignmentDto } from '../add.space.dto';
export class AddSubspaceDto {
@ApiProperty({
@ -9,4 +17,15 @@ export class AddSubspaceDto {
@IsNotEmpty()
@IsString()
subspaceName: string;
@ApiProperty({
description: 'List of products assigned to this space',
type: [ProductAssignmentDto],
required: false,
})
@IsArray()
@ValidateNested({ each: true })
@IsOptional()
@Type(() => ProductAssignmentDto)
products?: ProductAssignmentDto[];
}

View File

@ -6,3 +6,4 @@ export * from './space-link';
export * from './space-scene.service';
export * from './space-products';
export * from './space-product-items';
export * from './space-validation.service';

View File

@ -61,6 +61,8 @@ export class ValidationService {
where: { uuid: spaceModelUuid },
relations: [
'subspaceModels',
'subspaceModels.productModels.product',
'subspaceModels.productModels',
'spaceProductModels',
'spaceProductModels.product',
'spaceProductModels.items',

View File

@ -1,2 +1,4 @@
export * from './subspace.service';
export * from './subspace-device.service';
export * from './subspace-product-item.service';
export * from './subspace-product.service';

View File

@ -0,0 +1,50 @@
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { QueryRunner } from 'typeorm';
import { SubspaceProductEntity } from '@app/common/modules/space';
import { SubspaceProductModelEntity } from '@app/common/modules/space-model';
import { SubspaceProductItemRepository } from '@app/common/modules/space/repositories/subspace.repository';
@Injectable()
export class SubspaceProductItemService {
constructor(
private readonly productItemRepository: SubspaceProductItemRepository,
) {}
async createItemFromModel(
product: SubspaceProductEntity,
productModel: SubspaceProductModelEntity,
queryRunner: QueryRunner,
): Promise<void> {
const itemModels = productModel.itemModels;
if (!itemModels?.length) return;
try {
const productItems = itemModels.map((model) =>
this.createProductItem(product, model, queryRunner),
);
await queryRunner.manager.save(
this.productItemRepository.target,
productItems,
);
} catch (error) {
throw new HttpException(
error.message || 'An error occurred while creating product items.',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
private createProductItem(
product: SubspaceProductEntity,
model: any,
queryRunner: QueryRunner,
): Partial<any> {
return queryRunner.manager.create(this.productItemRepository.target, {
tag: model.tag,
product,
});
}
}

View File

@ -0,0 +1,66 @@
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { QueryRunner } from 'typeorm';
import {
SubspaceEntity,
SubspaceProductEntity,
} from '@app/common/modules/space';
import {
SubspaceModelEntity,
SubspaceProductModelEntity,
} from '@app/common/modules/space-model';
import { SubspaceProductItemService } from './subspace-product-item.service';
@Injectable()
export class SubspaceProductService {
constructor(
private readonly subspaceProductItemService: SubspaceProductItemService,
) {}
async createFromModel(
subspaceModel: SubspaceModelEntity,
subspace: SubspaceEntity,
queryRunner: QueryRunner,
): Promise<void> {
const productModels = subspaceModel.productModels;
if (!productModels?.length) return;
try {
const newSpaceProducts = productModels.map((productModel) =>
this.createSubspaceProductEntity(subspace, productModel),
);
const subspaceProducts = await queryRunner.manager.save(
SubspaceProductEntity,
newSpaceProducts,
);
await Promise.all(
subspaceProducts.map((subspaceProduct, index) =>
this.subspaceProductItemService.createItemFromModel(
subspaceProduct,
productModels[index],
queryRunner,
),
),
);
} catch (error) {
throw new HttpException(
`Transaction failed: Unable to create subspace products ${error}`,
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
private createSubspaceProductEntity(
subspace: SubspaceEntity,
productModel: SubspaceProductModelEntity,
): Partial<SubspaceProductEntity> {
return {
subspace,
product: productModel.product,
productCount: productModel.productCount,
model: productModel,
};
}
}

View File

@ -13,19 +13,28 @@ import {
SpaceEntity,
SubspaceEntity,
} from '@app/common/modules/space/entities';
import { SpaceModelEntity } from '@app/common/modules/space-model';
import {
SpaceModelEntity,
SubspaceModelEntity,
} from '@app/common/modules/space-model';
import { ValidationService } from '../space-validation.service';
import { SubspaceRepository } from '@app/common/modules/space/repositories/subspace.repository';
import { SubspaceProductService } from './subspace-product.service';
@Injectable()
export class SubSpaceService {
constructor(
private readonly subspaceRepository: SubspaceRepository,
private readonly validationService: ValidationService,
private readonly productService: SubspaceProductService,
) {}
async createSubspaces(
subspaceData: Array<{ subspaceName: string; space: SpaceEntity }>,
subspaceData: Array<{
subspaceName: string;
space: SpaceEntity;
subSpaceModel?: SubspaceModelEntity;
}>,
queryRunner: QueryRunner,
): Promise<SubspaceEntity[]> {
try {
@ -47,17 +56,27 @@ export class SubSpaceService {
space: SpaceEntity,
queryRunner: QueryRunner,
): Promise<void> {
const subSpaces = spaceModel.subspaceModels;
const subSpaceModels = spaceModel.subspaceModels;
if (!subSpaces?.length) return;
if (!subSpaceModels?.length) return;
const subspaceData = subSpaces.map((subSpaceModel) => ({
const subspaceData = subSpaceModels.map((subSpaceModel) => ({
subspaceName: subSpaceModel.subspaceName,
space,
subSpaceModel,
}));
await this.createSubspaces(subspaceData, queryRunner);
const subspaces = await this.createSubspaces(subspaceData, queryRunner);
await Promise.all(
subSpaceModels.map((model, index) => {
this.productService.createFromModel(
model,
subspaces[index],
queryRunner,
);
}),
);
}
async createSubspacesFromNames(

View File

@ -18,6 +18,7 @@ import {
SpaceService,
SpaceUserService,
SubspaceDeviceService,
SubspaceProductItemService,
SubSpaceService,
} from './services';
import {
@ -46,8 +47,12 @@ import { SceneDeviceRepository } from '@app/common/modules/scene-device/reposito
import { ProjectRepository } from '@app/common/modules/project/repositiories';
import { SpaceModelRepository } from '@app/common/modules/space-model';
import { CommunityModule } from 'src/community/community.module';
import { ValidationService } from './services/space-validation.service';
import { SubspaceRepository } from '@app/common/modules/space/repositories/subspace.repository';
import { ValidationService } from './services';
import {
SubspaceProductItemRepository,
SubspaceRepository,
} from '@app/common/modules/space/repositories/subspace.repository';
import { SubspaceProductService } from './services';
@Module({
imports: [ConfigModule, SpaceRepositoryModule, CommunityModule],
@ -82,6 +87,7 @@ import { SubspaceRepository } from '@app/common/modules/space/repositories/subsp
SceneRepository,
DeviceService,
DeviceStatusFirebaseService,
SubspaceProductItemRepository,
DeviceStatusLogRepository,
SceneDeviceRepository,
SpaceProductService,
@ -91,6 +97,8 @@ import { SubspaceRepository } from '@app/common/modules/space/repositories/subsp
SubspaceRepository,
SpaceProductItemService,
SpaceProductItemRepository,
SubspaceProductService,
SubspaceProductItemService,
],
exports: [SpaceService],
})