You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.4 KiB
38 lines
1.4 KiB
import { listOrphanCandidatesForUser } from "#server/service/media";
|
|
|
|
type OrphanFilter = "all" | "deletable" | "cooling";
|
|
|
|
function parseFilter(raw: string | undefined): OrphanFilter {
|
|
const v = raw === undefined || raw === "" ? "all" : raw;
|
|
if (v === "all" || v === "deletable" || v === "cooling") {
|
|
return v;
|
|
}
|
|
throw createError({ statusCode: 400, statusMessage: "filter 须为 all、deletable 或 cooling" });
|
|
}
|
|
|
|
function parsePositiveInt(raw: string | undefined, fallback: number, label: string): number {
|
|
if (raw === undefined || raw === "") {
|
|
return fallback;
|
|
}
|
|
const n = Number(raw);
|
|
if (!Number.isInteger(n) || n < 1) {
|
|
throw createError({ statusCode: 400, statusMessage: `${label} 须为正整数` });
|
|
}
|
|
return n;
|
|
}
|
|
|
|
export default defineWrappedResponseHandler(async (event) => {
|
|
const user = await event.context.auth.requireUser();
|
|
const q = getQuery(event);
|
|
const filter = parseFilter(typeof q.filter === "string" ? q.filter : undefined);
|
|
const page = parsePositiveInt(typeof q.page === "string" ? q.page : undefined, 1, "page");
|
|
const pageSizeRaw = parsePositiveInt(
|
|
typeof q.pageSize === "string" ? q.pageSize : undefined,
|
|
20,
|
|
"pageSize",
|
|
);
|
|
const pageSize = Math.min(pageSizeRaw, 100);
|
|
|
|
const { items, total } = await listOrphanCandidatesForUser(user.id, filter, page, pageSize);
|
|
return R.success({ items, total });
|
|
});
|
|
|