fix package list query

This commit is contained in:
ItsMalma
2025-12-18 08:33:57 +07:00
parent abc127617b
commit 380c92a62b
2 changed files with 34 additions and 35 deletions

View File

@@ -42,7 +42,11 @@ import type {
PackageDetailResponse,
PackageResponse,
} from "@/modules/package/package.types";
import { wrap } from "@mikro-orm/core";
import {
wrap,
type QBFilterQuery,
type QBQueryOrderMap,
} from "@mikro-orm/core";
import { Router, type Request, type Response } from "express";
import slugify from "slugify";
import { ulid } from "ulid";
@@ -152,36 +156,39 @@ export class PackageController extends Controller {
const count = await orm.em.count(Package);
let packageQueryBuilder = orm.em
.createQueryBuilder(Package, "_package")
.select(["*"])
.limit(query.per_page)
.offset((query.page - 1) * query.per_page)
.leftJoinAndSelect("_package.partner", "_partner");
const distinctOn: (keyof Package)[] = ["id"];
const where: QBFilterQuery<Package> = {};
const orderBy: QBQueryOrderMap<Package> = {
id: "desc",
};
if ("class" in query && query.class) {
packageQueryBuilder = packageQueryBuilder.where({ class: query.class });
where.class = query.class;
}
if ("by_ideal" in query && query.by_ideal === "1") {
packageQueryBuilder = packageQueryBuilder.distinctOn(["class"]).orderBy({
class: "ASC",
});
distinctOn.push("class");
orderBy.class = "ASC";
}
switch (query.sort_by) {
case "newest":
packageQueryBuilder = packageQueryBuilder.orderBy({
createdAt: "DESC",
});
orderBy.createdAt = "DESC";
break;
case "oldest":
packageQueryBuilder = packageQueryBuilder.orderBy({
createdAt: "ASC",
});
orderBy.createdAt = "ASC";
break;
}
const packages = await packageQueryBuilder.getResultList();
const packages = await orm.em
.createQueryBuilder(Package, "_package")
.select(["*"])
.distinctOn(distinctOn)
.limit(query.per_page)
.offset((query.page - 1) * query.per_page)
.leftJoinAndSelect("_package.partner", "_partner")
.where(where)
.orderBy(orderBy)
.getResultList();
return res.status(200).json({
data: packages.map(this.mapper.mapEntityToResponse.bind(this.mapper)),

View File

@@ -207,23 +207,15 @@ export const packageDetailRequestSchema = z.object({
export const packageQuerySchema = z.intersection(
paginationQuerySchema,
z.intersection(
z.union([
z.object({
class: z
.enum(PackageClass, "Must be either 'silver', 'gold', or 'platinum'.")
.optional(),
}),
z.object({
by_ideal: z.enum(["0", "1"], "Must be either '0' or '1'.").optional(),
}),
]),
z.object({
sort_by: z
.enum(["newest", "oldest"], "Must be either 'newest' or 'oldest'.")
.default("newest"),
}),
),
);
export const packageParamsSchema = z.object({