Files
edgeKey/modules/catalog/queries.ts
2026-04-21 11:56:35 +08:00

124 lines
3.1 KiB
TypeScript

import type { PrismaClient } from "../../generated/prisma/client";
import { findProductRecordById, listAdminProductRecords, listCategoryRecords, listHomeCategoryRecords } from "./repository";
import type { AdminProductSummary, CategorySummary, ProductSummary } from "./types";
export async function listHomeProducts(prisma: PrismaClient): Promise<ProductSummary[]> {
const records = await prisma.product.findMany({
where: {
status: "ACTIVE",
},
include: {
category: true,
},
orderBy: [{ sort: "asc" }, { id: "desc" }],
take: 12,
});
return records.map((item) => ({
id: item.id,
categoryId: item.categoryId,
categoryName: item.category?.name ?? null,
name: item.name,
slug: item.slug,
coverImage: item.coverImage,
price: item.price,
}));
}
export async function listHomeCategories(prisma: PrismaClient): Promise<CategorySummary[]> {
const records = await listHomeCategoryRecords(prisma);
return records.map((item) => ({
id: item.id,
name: item.name,
slug: item.slug,
description: item.description,
sort: item.sort,
status: item.status,
}));
}
export async function listAdminCategories(prisma: PrismaClient): Promise<CategorySummary[]> {
const records = await listCategoryRecords(prisma);
return records.map((item) => ({
id: item.id,
name: item.name,
slug: item.slug,
description: item.description,
sort: item.sort,
status: item.status,
}));
}
export async function listAdminProducts(prisma: PrismaClient): Promise<AdminProductSummary[]> {
const records = await listAdminProductRecords(prisma);
return records.map((item) => ({
id: item.id,
name: item.name,
slug: item.slug,
subtitle: item.subtitle,
coverImage: item.coverImage,
price: item.price,
status: item.status,
minBuy: item.minBuy,
maxBuy: item.maxBuy,
sort: item.sort,
categoryId: item.categoryId,
categoryName: item.category?.name ?? null,
}));
}
export async function getAdminProductDetail(prisma: PrismaClient, id: number) {
const record = await findProductRecordById(prisma, id);
if (!record) {
return null;
}
return {
id: record.id,
categoryId: record.categoryId,
name: record.name,
slug: record.slug,
subtitle: record.subtitle,
coverImage: record.coverImage,
description: record.description,
price: record.price,
status: record.status,
minBuy: record.minBuy,
maxBuy: record.maxBuy,
sort: record.sort,
purchaseNote: record.purchaseNote,
};
}
export async function getProductDetailBySlug(prisma: PrismaClient, slug: string) {
const record = await prisma.product.findFirst({
where: {
slug,
status: "ACTIVE",
},
});
if (!record) {
return null;
}
return {
id: record.id,
categoryId: record.categoryId,
name: record.name,
slug: record.slug,
subtitle: record.subtitle,
coverImage: record.coverImage,
description: record.description,
price: record.price,
status: record.status,
minBuy: record.minBuy,
maxBuy: record.maxBuy,
sort: record.sort,
purchaseNote: record.purchaseNote,
};
}