feeding-plan.service.ts 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { Injectable } from '@nestjs/common';
  2. import { CreateFeedingPlanRequest } from '@/pet-feeder/dto/create-feeding-plan.request';
  3. import { FeedingPlan } from '@/pet-feeder/entity/feeding-plan.entity';
  4. import { InjectRepository } from '@nestjs/typeorm';
  5. import { Repository } from 'typeorm';
  6. import { FeedingPlanProduct } from '@/pet-feeder/entity/feeding-plan-product.entity';
  7. import { PetService } from '@/pet-feeder/service/pet.service';
  8. import { ProductService } from '@/pet-feeder/service/product.service';
  9. @Injectable()
  10. export class FeedingPlanService {
  11. constructor(
  12. @InjectRepository(FeedingPlan)
  13. private readonly feedingPlanRepository: Repository<FeedingPlan>,
  14. @InjectRepository(FeedingPlanProduct)
  15. private readonly feedingPlanProductRepository: Repository<FeedingPlanProduct>,
  16. private readonly petService: PetService,
  17. private readonly productService: ProductService,
  18. ) {}
  19. async create(
  20. createFeedingPlanRequest: CreateFeedingPlanRequest,
  21. ): Promise<FeedingPlan> {
  22. const feedingPlan = this.feedingPlanRepository.create({
  23. feedingGoal: createFeedingPlanRequest.feedingGoal,
  24. targetWeight: createFeedingPlanRequest.targetWeight,
  25. });
  26. feedingPlan.pet = await this.petService.get(createFeedingPlanRequest.petId);
  27. const feedingPlanProducts: FeedingPlanProduct[] = [];
  28. await Promise.all(
  29. createFeedingPlanRequest.products.map(async (product) => {
  30. const existProduct = await this.productService.get(product.id);
  31. const feedingPlanProduct = this.feedingPlanProductRepository.create({
  32. product: existProduct,
  33. dailyUsageWeight: product.dailyUsageWeight,
  34. percentage: product.percentage,
  35. });
  36. feedingPlanProducts.push(
  37. await this.feedingPlanProductRepository.save(feedingPlanProduct),
  38. );
  39. }),
  40. );
  41. feedingPlan.feedingPlanProducts = feedingPlanProducts;
  42. return this.feedingPlanRepository.save(feedingPlan);
  43. }
  44. async update(
  45. id: string,
  46. updateFeedingPlanRequest: CreateFeedingPlanRequest,
  47. ): Promise<FeedingPlan> {
  48. const feedingPlan = await this.get(id);
  49. feedingPlan.feedingGoal = updateFeedingPlanRequest.feedingGoal;
  50. feedingPlan.targetWeight = updateFeedingPlanRequest.targetWeight;
  51. const feedingPlanProducts: FeedingPlanProduct[] = [];
  52. await Promise.all(
  53. updateFeedingPlanRequest.products.map(async (product) => {
  54. const existProduct = await this.productService.get(product.id);
  55. const exitFeedingPlanProduct =
  56. await this.feedingPlanProductRepository.findOneBy({
  57. product: existProduct,
  58. });
  59. if (exitFeedingPlanProduct) {
  60. exitFeedingPlanProduct.dailyUsageWeight = product.dailyUsageWeight;
  61. exitFeedingPlanProduct.percentage = product.percentage;
  62. feedingPlanProducts.push(
  63. await this.feedingPlanProductRepository.save(
  64. exitFeedingPlanProduct,
  65. ),
  66. );
  67. } else {
  68. const feedingPlanProduct = this.feedingPlanProductRepository.create({
  69. product: existProduct,
  70. dailyUsageWeight: product.dailyUsageWeight,
  71. percentage: product.percentage,
  72. });
  73. feedingPlanProducts.push(
  74. await this.feedingPlanProductRepository.save(feedingPlanProduct),
  75. );
  76. }
  77. }),
  78. );
  79. return this.feedingPlanRepository.save(feedingPlan);
  80. }
  81. async get(id: string): Promise<FeedingPlan> {
  82. const feedingPlan = await this.feedingPlanRepository.findOneBy({ id });
  83. if (!feedingPlan) {
  84. throw new Error('Feeding plan not found');
  85. }
  86. return feedingPlan;
  87. }
  88. }