mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-11-27 07:54:54 +00:00
added subspace product item
This commit is contained in:
@ -42,5 +42,5 @@ export class SubspaceModelEntity extends AbstractEntity<SubSpaceModelDto> {
|
||||
nullable: true,
|
||||
},
|
||||
)
|
||||
public subspaceProductModels: SubspaceProductModelEntity[];
|
||||
public productModels: SubspaceProductModelEntity[];
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ export class SubspaceProductModelEntity extends AbstractEntity<SubpaceProductMod
|
||||
|
||||
@ManyToOne(
|
||||
() => SubspaceModelEntity,
|
||||
(spaceModel) => spaceModel.subspaceProductModels,
|
||||
(spaceModel) => spaceModel.productModels,
|
||||
{
|
||||
nullable: false,
|
||||
},
|
||||
|
||||
@ -46,5 +46,5 @@ export class SubspaceProductEntity extends AbstractEntity<SpaceProductModelDto>
|
||||
nullable: true,
|
||||
},
|
||||
)
|
||||
model: SubspaceProductItemModelEntity;
|
||||
model: SubspaceProductModelEntity;
|
||||
}
|
||||
|
||||
@ -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[];
|
||||
}
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -61,6 +61,8 @@ export class ValidationService {
|
||||
where: { uuid: spaceModelUuid },
|
||||
relations: [
|
||||
'subspaceModels',
|
||||
'subspaceModels.productModels.product',
|
||||
'subspaceModels.productModels',
|
||||
'spaceProductModels',
|
||||
'spaceProductModels.product',
|
||||
'spaceProductModels.items',
|
||||
|
||||
@ -1,2 +1,4 @@
|
||||
export * from './subspace.service';
|
||||
export * from './subspace-device.service';
|
||||
export * from './subspace-product-item.service';
|
||||
export * from './subspace-product.service';
|
||||
|
||||
50
src/space/services/subspace/subspace-product-item.service.ts
Normal file
50
src/space/services/subspace/subspace-product-item.service.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
66
src/space/services/subspace/subspace-product.service.ts
Normal file
66
src/space/services/subspace/subspace-product.service.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -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(
|
||||
|
||||
@ -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],
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user