monorepo/apps/web2/src/app/actions/post.ts

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;
};