Files

4.1 KiB
Raw Permalink Blame History

name, description
name description
create-routes 创建路由例子模板代码

创建路由例子模板代码

app是自定义@kevisual/router的一个APP

  1. 一般来说修改path和对应的schema表就可以快速创建对应的增删改查接口。
  2. 根据需要,每一个功能需要添加对应的描述
  3. 根据需要对应schema表的字段进行修改代码

示例:

import { desc, eq, count, or, like, and } from 'drizzle-orm';
import { schema, app, db } from '@/app.ts'


app.route({
  path: 'prompts',
  key: 'list',
  middleware: ['auth'],
  description: '获取提示词列表',
}).define(async (ctx) => {
  const tokenUser = ctx.state.tokenUser;
  const uid = tokenUser.id;
  const { page = 1, pageSize = 20, search, sort = 'DESC' } = ctx.query || {};

  const offset = (page - 1) * pageSize;
  const orderByField = sort === 'ASC' ? schema.prompts.updatedAt : desc(schema.prompts.updatedAt);

  let whereCondition = eq(schema.prompts.uid, uid);
  if (search) {
    whereCondition = and(
      eq(schema.prompts.uid, uid),
      or(
        like(schema.prompts.title, `%${search}%`),
        like(schema.prompts.summary, `%${search}%`)
      )
    );
  }

  const [list, totalCount] = await Promise.all([
    db.select()
      .from(schema.prompts)
      .where(whereCondition)
      .limit(pageSize)
      .offset(offset)
      .orderBy(orderByField),
    db.select({ count: count() })
      .from(schema.prompts)
      .where(whereCondition)
  ]);

  ctx.body = {
    list,
    pagination: {
      page,
      current: page,
      pageSize,
      total: totalCount[0]?.count || 0,
    },
  };
  return ctx;
}).addTo(app);

const promptUpdate = `创建或更新一个提示词, 参数定义:
title: 提示词标题, 必填
description: 描述, 选填
summary: 摘要, 选填
tags: 标签, 数组, 选填
link: 链接, 选填
data: 数据, 对象, 选填
parents: 父级ID数组, 选填
`;
app.route({
  path: 'prompts',
  key: 'update',
  middleware: ['auth'],
  description: promptUpdate,
}).define(async (ctx) => {
  const { id, uid, updatedAt, ...rest } = ctx.query.data || {};
  const tokenUser = ctx.state.tokenUser;
  let prompt;
  if (!id) {
    prompt = await db.insert(schema.prompts).values({
      title: rest.title,
      description: rest.description,
      ...rest,
      uid: tokenUser.id,
    }).returning();
  } else {
    const existing = await db.select().from(schema.prompts).where(eq(schema.prompts.id, id)).limit(1);
    if (existing.length === 0) {
      ctx.throw(404, '没有找到对应的提示词');
    }
    if (existing[0].uid !== tokenUser.id) {
      ctx.throw(403, '没有权限更新该提示词');
    }
    prompt = await db.update(schema.prompts).set({
      ...rest,
    }).where(eq(schema.prompts.id, id)).returning();
  }
  ctx.body = prompt;
}).addTo(app);


app.route({
  path: 'prompts',
  key: 'delete',
  middleware: ['auth'],
  description: '删除提示词, 参数: id 提示词ID',
}).define(async (ctx) => {
  const tokenUser = ctx.state.tokenUser;
  const { id } = ctx.query.data || {};
  if (!id) {
    ctx.throw(400, 'id 参数缺失');
  }
  const existing = await db.select().from(schema.prompts).where(eq(schema.prompts.id, id)).limit(1);
  if (existing.length === 0) {
    ctx.throw(404, '没有找到对应的提示词');
  }
  if (existing[0].uid !== tokenUser.id) {
    ctx.throw(403, '没有权限删除该提示词');
  }
  await db.delete(schema.prompts).where(eq(schema.prompts.id, id));
  ctx.body = { success: true };
}).addTo(app);

app.route({
  path: 'prompts',
  key: 'get',
  middleware: ['auth'],
  description: '获取单个提示词, 参数: id 提示词ID',
}).define(async (ctx) => {
  const tokenUser = ctx.state.tokenUser;
  const { id } = ctx.query.data || {};
  if (!id) {
    ctx.throw(400, 'id 参数缺失');
  }
  const existing = await db.select().from(schema.prompts).where(eq(schema.prompts.id, id)).limit(1);
  if (existing.length === 0) {
    ctx.throw(404, '没有找到对应的提示词');
  }
  if (existing[0].uid !== tokenUser.id) {
    ctx.throw(403, '没有权限查看该提示词');
  }
  ctx.body = existing[0];
}).addTo(app);