94 lines
2.3 KiB
TypeScript
94 lines
2.3 KiB
TypeScript
'use server';
|
|
|
|
import { Post, Prisma } from '@prisma/client';
|
|
import { isNil } from 'lodash';
|
|
|
|
import { revalidateTag } from 'next/cache';
|
|
|
|
import paginateExt from 'prisma-paginate';
|
|
|
|
import db from '@/lib/db/client';
|
|
import { PaginateOptions, PaginateReturn } from '@/lib/db/types';
|
|
import { paginateTransform } from '@/lib/db/utils';
|
|
import { redis } from '@/lib/redis/client';
|
|
/**
|
|
* 查询分页文章列表信息
|
|
* @param options
|
|
*/
|
|
export const queryPostPaginate = async (
|
|
options?: PaginateOptions,
|
|
): Promise<PaginateReturn<Post>> => {
|
|
// 此处使用倒序,以便新增的文章可以排在最前面
|
|
const posts = await db.$extends(paginateExt).post.paginate({
|
|
orderBy: { updatedAt: 'desc' },
|
|
page: 1,
|
|
limit: 8,
|
|
...options,
|
|
});
|
|
return paginateTransform(posts);
|
|
};
|
|
|
|
/**
|
|
* 根据查询条件获取文章总页数
|
|
* @param limit
|
|
*/
|
|
export const queryPostTotalPages = async (limit = 8): Promise<number> => {
|
|
const data = await queryPostPaginate({ page: 1, limit });
|
|
return data.meta.totalPages ?? 0;
|
|
};
|
|
|
|
/**
|
|
* 根据ID查询文章信息
|
|
* @param id
|
|
*/
|
|
export const queryPostItemByIdOrSlug = async (id: string): Promise<Post | null> => {
|
|
// throw new Error('数据加载错误,请稍后重试!');
|
|
const item = await db.post.findFirst({ where: { OR: [{ id }, { slug: id }] } });
|
|
return item;
|
|
};
|
|
|
|
/**
|
|
* 新增文章
|
|
* @param data
|
|
*/
|
|
export const createPostItem = async (data: Prisma.PostCreateInput): Promise<Post> => {
|
|
const item = await db.post.create({ data });
|
|
await redis.set(item.id, item.slug);
|
|
revalidateTag('posts');
|
|
return item;
|
|
};
|
|
|
|
/**
|
|
* 更新文章
|
|
* @param id
|
|
* @param data
|
|
*/
|
|
export const updatePostItem = async (
|
|
id: string,
|
|
data: Partial<Omit<Post, 'id'>>,
|
|
): Promise<Post> => {
|
|
await redis.set(id, data.slug);
|
|
const item = await db.post.update({ where: { id }, data });
|
|
revalidateTag('posts');
|
|
return item;
|
|
};
|
|
|
|
/**
|
|
* 删除文章
|
|
* @param id
|
|
*/
|
|
export const deletePostItem = async (id: string): Promise<null> => {
|
|
const item = await db.post.findUniqueOrThrow({ where: { id } });
|
|
if (isNil(item)) {
|
|
console.log('文章不存在');
|
|
|
|
return null;
|
|
}
|
|
await db.post.delete({ where: { id } });
|
|
await redis.del(id);
|
|
revalidateTag('posts');
|
|
console.log('文章删除成功');
|
|
|
|
return null;
|
|
};
|