/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/src/api/product/services/product.ts
import { ApplicationError } from '@strapi/utils/dist/errors';
import { Core } from "@strapi/strapi";
import { Product, ProductResponse } from "../common/types/product";
import { Service as PricingService } from "src/api/pricing/services/pricing";
import { round } from 'src/api/utils/math';
import { Configuration } from 'src/api/configuration/common/types/pricing';
import { getDiscountMultiplier } from 'src/api/pricing/common/utils/discount-multiplier';
export class Service {
private readonly pricingService: PricingService;
constructor(private readonly strapi: Core.Strapi) {
this.pricingService = new PricingService(this.strapi);
}
async transform(product: Product, exchangeRate: number, pageCount?: number): Promise<ProductResponse> {
const configuration = await this.strapi.query('api::configuration.configuration').findOne({
populate: {
defaultBookSetting: {
populate: {
bookType: true,
}
},
},
}) as Configuration
pageCount = pageCount || configuration.defaultBookSetting.bookType.minPages;
if (!product.pricing) {
throw new ApplicationError(`Product service transform. Product ${product.id} does not have pricing data`);
}
const pricing = this.pricingService.transform(product.pricing, exchangeRate);
const price = pricing.base + (pricing.perPage * pageCount);
const discountMultiplier = pricing.discount ? getDiscountMultiplier(pricing.discount) : null;
const discountedPrice = discountMultiplier ? price * discountMultiplier : null;
return {
...product,
pricing,
price: round(price),
discountedPrice: discountedPrice ? round(discountedPrice) : null,
}
}
}