update service fare query to include min and max fare, and pagination

This commit is contained in:
wayanrivan
2026-03-30 14:49:04 +07:00
parent f809f697f1
commit 81004a6c7d

View File

@ -36,26 +36,31 @@ export class ServiceFareController {
limit: Joi.number().required().min(1).label("Limit"),
with_deleted: Joi.bool().required().label("With Deleted"),
order_field: Joi.string().required().label("Order Field"),
order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"),
order_direction: Joi.string().valid("ASC", "DESC").uppercase().required().label("Order Direction"),
});
let param: Paging = await schema.validateAsync(req.query);
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
const offset = (param.page - 1) * param.limit;
const limit = param.limit;
var query = await ServiceModel.list(filter);
const offset = (param.page - 1) * param.limit;
let limit = param.limit;
const res_count = query;
const res_count = query.clone();
const res_list = query
.leftJoinAndSelect("Service.servicefare", "servicefare")
.leftJoinAndSelect("servicefare.serviceClass", "serviceClass")
// .leftJoinAndSelect('ServiceFare.faretype', 'faretype')
.select([
"Service.id",
"Service.name",
])
.leftJoin("Service.servicefare", "servicefare")
.addSelect("MIN(servicefare.fare)", "min_fare")
.addSelect("MAX(servicefare.fare)", "max_fare")
.groupBy("Service.id")
.orderBy("Service." + param.order_field, param.order_direction)
.offset(offset)
.limit(limit);
.skip(offset)
.take(limit);
if (param.with_deleted) {
res_count.withDeleted();
@ -64,10 +69,17 @@ export class ServiceFareController {
const current_page = param.page;
const total_count_data = await res_count.getCount();
const list_data = await res_list.getMany();
const count_data = CommonHelper.countObject(list_data);
const list_data = await res_list.getRawAndEntities();
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data);
const merged = list_data.entities.map((entity, index) => ({
...entity,
min_fare: list_data.raw[index]?.min_fare ?? null,
max_fare: list_data.raw[index]?.max_fare ?? null,
}));
const count_data = CommonHelper.countObject(merged);
return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, merged);
} catch (e: unknown) {
log.error(e);
const err = e as Error;