feat(cms): improve catalog, editorial recovery and operations
This commit is contained in:
1 parent
2fead134e6
commit
c389c3893d
122 files changed
+8137
-703
No files matched your search
@@ -0,0 +1,51 @@
|
||||
import "server-only";
|
||||
import { and, count, desc, eq, like, or } from "drizzle-orm";
|
||||
import { db, User, WebsiteArticles } from "@/lib/db";
|
||||
export async function loadArticleList(
|
||||
options: { status?: string; search?: string; page?: number } = {},
|
||||
) {
|
||||
const status = ["draft", "published", "scheduled"].includes(
|
||||
options.status ?? "",
|
||||
)
|
||||
? options.status
|
||||
: "all";
|
||||
const search = (options.search ?? "").trim().slice(0, 191);
|
||||
const where = and(
|
||||
status !== "all" ? eq(WebsiteArticles.status, status ?? "all") : undefined,
|
||||
search
|
||||
? or(
|
||||
like(WebsiteArticles.title, `%${search}%`),
|
||||
like(WebsiteArticles.shortStory, `%${search}%`),
|
||||
)
|
||||
: undefined,
|
||||
);
|
||||
const totals = await db
|
||||
.select({ value: count() })
|
||||
.from(WebsiteArticles)
|
||||
.where(where);
|
||||
const total = Number(totals[0]?.value ?? 0);
|
||||
const perPage = 24;
|
||||
const lastPage = Math.max(1, Math.ceil(total / perPage));
|
||||
const page = Math.min(
|
||||
lastPage,
|
||||
Number.isFinite(options.page)
|
||||
? Math.max(1, Math.trunc(options.page ?? 1))
|
||||
: 1,
|
||||
);
|
||||
const rows = await db
|
||||
.select({
|
||||
id: WebsiteArticles.id,
|
||||
title: WebsiteArticles.title,
|
||||
image: WebsiteArticles.image,
|
||||
createdAt: WebsiteArticles.createdAt,
|
||||
status: WebsiteArticles.status,
|
||||
author: User.username,
|
||||
})
|
||||
.from(WebsiteArticles)
|
||||
.leftJoin(User, eq(User.id, WebsiteArticles.userId))
|
||||
.where(where)
|
||||
.orderBy(desc(WebsiteArticles.createdAt), desc(WebsiteArticles.id))
|
||||
.limit(perPage)
|
||||
.offset((page - 1) * perPage);
|
||||
return { rows, page, perPage, total, lastPage, status, search };
|
||||
}
|
||||
Reference in new issue
Block a user