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, PackageDetailResponse,
PackageResponse, PackageResponse,
} from "@/modules/package/package.types"; } 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 { Router, type Request, type Response } from "express";
import slugify from "slugify"; import slugify from "slugify";
import { ulid } from "ulid"; import { ulid } from "ulid";
@@ -152,36 +156,39 @@ export class PackageController extends Controller {
const count = await orm.em.count(Package); const count = await orm.em.count(Package);
let packageQueryBuilder = orm.em const distinctOn: (keyof Package)[] = ["id"];
.createQueryBuilder(Package, "_package") const where: QBFilterQuery<Package> = {};
.select(["*"]) const orderBy: QBQueryOrderMap<Package> = {
.limit(query.per_page) id: "desc",
.offset((query.page - 1) * query.per_page) };
.leftJoinAndSelect("_package.partner", "_partner");
if ("class" in query && query.class) { 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") { if ("by_ideal" in query && query.by_ideal === "1") {
packageQueryBuilder = packageQueryBuilder.distinctOn(["class"]).orderBy({ distinctOn.push("class");
class: "ASC", orderBy.class = "ASC";
});
} }
switch (query.sort_by) { switch (query.sort_by) {
case "newest": case "newest":
packageQueryBuilder = packageQueryBuilder.orderBy({ orderBy.createdAt = "DESC";
createdAt: "DESC",
});
break; break;
case "oldest": case "oldest":
packageQueryBuilder = packageQueryBuilder.orderBy({ orderBy.createdAt = "ASC";
createdAt: "ASC",
});
break; 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({ return res.status(200).json({
data: packages.map(this.mapper.mapEntityToResponse.bind(this.mapper)), 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( export const packageQuerySchema = z.intersection(
paginationQuerySchema, paginationQuerySchema,
z.intersection(
z.union([
z.object({ z.object({
class: z class: z
.enum(PackageClass, "Must be either 'silver', 'gold', or 'platinum'.") .enum(PackageClass, "Must be either 'silver', 'gold', or 'platinum'.")
.optional(), .optional(),
}),
z.object({
by_ideal: z.enum(["0", "1"], "Must be either '0' or '1'.").optional(), by_ideal: z.enum(["0", "1"], "Must be either '0' or '1'.").optional(),
}),
]),
z.object({
sort_by: z sort_by: z
.enum(["newest", "oldest"], "Must be either 'newest' or 'oldest'.") .enum(["newest", "oldest"], "Must be either 'newest' or 'oldest'.")
.default("newest"), .default("newest"),
}), }),
),
); );
export const packageParamsSchema = z.object({ export const packageParamsSchema = z.object({