import { factories } from '@strapi/strapi'
import { ApplicationError } from '@strapi/utils/dist/errors';
import { ValidationError } from 'yup';
import { Configuration } from 'src/api/configuration/common/types/pricing';
import { getProductSchema } from '../common/schemas/get-product';
import { ExchangeRateService } from '../../exchange-rate/common/types/service';
import { Product } from '../common/types/product';
import { Service } from '../services/product';
import { User } from 'src/extensions/users-permissions/common/types/user';
import { UserService } from 'src/api/my-user/services/user';
export default factories.createCoreController('api::product.product', ({ strapi }) => ({
async find(ctx) {
try {
const { query } = ctx as { query: { currency?: string } };
let user: User;
if (ctx.state.user) {
const userService = new UserService(strapi);
user = await userService.get(ctx.state.user?.id);
}
getProductSchema.validate(query)
const configuration: Configuration = await strapi.db.query('api::configuration.configuration').findOne();
const currency = user?.currency || query.currency || configuration.defaultCurrency;
const products = await strapi.db.query('api::product.product').findMany({
populate: { pricing: true }
}) as Product[];
let exchangeRate = 1;
if (currency !== configuration.defaultCurrency) {
const exchangeRateService = strapi.service('api::exchange-rate.exchange-rate') as ExchangeRateService;
exchangeRate = await exchangeRateService.get(query.currency);
if (!exchangeRate) {
ctx.throw(400, `Currency ${query.currency} not supported`);
return;
}
}
const service = new Service(strapi);
return Promise.all(products.map(async product => await service.transform(product, exchangeRate)));
} catch (error) {
if (error instanceof ValidationError) {
ctx.throw(400, error.errors);
return;
}
if (error instanceof ApplicationError) {
ctx.throw(error.details?.status || 500, error.message);
return;
}
strapi.log.error('Error fetching pricing:', error);
ctx.throw(500, 'Internal server error');
}
}
}));