fix package list query
This commit is contained in:
@@ -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)),
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
Reference in New Issue
Block a user