import { UploadedFileTypes } from '@/common/enums/enums' import { GoodPricingModel } from '@/generated/prisma/enums' import { GoodSelect } from '@/generated/prisma/models' import { UploaderService } from '@/modules/uploader/uploader.service' import { Injectable } from '@nestjs/common' export interface CreateGoodDto { name: string sku_id: string category_id: string measure_unit_id: string pricing_model: GoodPricingModel description?: string is_default_guild_good?: boolean } export interface UpdateGoodDto extends Partial {} @Injectable() export class GoodsSharedService { constructor(private readonly uploaderService: UploaderService) {} readonly defaultSelect: GoodSelect = { id: true, name: true, pricing_model: true, image_url: true, description: true, sku: { select: { id: true, name: true, }, }, measure_unit: { select: { id: true, name: true, }, }, category: { select: { id: true, name: true, }, }, } async prepareCreateData(data: CreateGoodDto, file?: Express.Multer.File) { const { category_id, measure_unit_id, sku_id, ...rest } = data let image_url = '' if (file) { const uploadedUrl = await this.uploaderService.uploadFile( file, UploadedFileTypes.GOOD, ) image_url = uploadedUrl || '' } return { ...rest, image_url, sku: { connect: { id: sku_id, }, }, measure_unit: { connect: { id: measure_unit_id, }, }, category: { connect: { id: category_id, }, }, } } async prepareUpdateData(id: string, data: UpdateGoodDto, file?: Express.Multer.File) { const { category_id, measure_unit_id, sku_id, ...rest } = data let image_url = '' if (file) { const uploadedUrl = await this.uploaderService.uploadFile( file, UploadedFileTypes.GOOD, ) image_url = uploadedUrl || '' } const updateData: any = { ...rest, image_url, } if (sku_id) { updateData.sku = { connect: { id: sku_id } } } if (measure_unit_id) { updateData.measure_unit = { connect: { id: measure_unit_id } } } if (category_id) { updateData.category = { connect: { id: category_id } } } return updateData } async handleImageUpdate(id: string, prisma: any, image_url: string) { if (image_url) { const prevImage = await prisma.good.findUnique({ where: { id }, select: { image_url: true }, }) if (prevImage?.image_url) { this.uploaderService.deleteFile(prevImage.image_url, UploadedFileTypes.GOOD) } } } }