184 lines
5.0 KiB
TypeScript
184 lines
5.0 KiB
TypeScript
import { eq, desc, and, like, or } from 'drizzle-orm';
|
||
import { CustomError } from '@kevisual/router';
|
||
import { app, db, schema } from '../../app.ts';
|
||
import { filter } from '@kevisual/js-filter'
|
||
import { z } from 'zod';
|
||
app
|
||
.route({
|
||
path: 'light-code',
|
||
key: 'list',
|
||
description: `获取轻代码列表,参数
|
||
type: 代码类型light-code, ts`,
|
||
middleware: ['auth'],
|
||
metadata: {
|
||
args: {
|
||
type: z.string().optional().describe('代码类型light-code, ts'),
|
||
search: z.string().optional().describe('搜索关键词,匹配标题和描述'),
|
||
filter: z
|
||
.string()
|
||
.optional()
|
||
.describe(
|
||
'过滤条件,SQL like格式字符串,例如:WHERE tags LIKE \'%tag1%\' AND tags LIKE \'%tag2%\'',
|
||
),
|
||
}
|
||
}
|
||
})
|
||
.define(async (ctx) => {
|
||
const tokenUser = ctx.state.tokenUser;
|
||
const { type, search, filter: filterQuery } = ctx.query || {};
|
||
const conditions = [eq(schema.kvContainer.uid, tokenUser.id)];
|
||
if (type) {
|
||
conditions.push(eq(schema.kvContainer.type, type as string));
|
||
}
|
||
if (search) {
|
||
const searchTerm = `%${search}%`;
|
||
conditions.push(
|
||
or(
|
||
like(schema.kvContainer.title, searchTerm),
|
||
like(schema.kvContainer.description, searchTerm),
|
||
),
|
||
);
|
||
}
|
||
const list = await db
|
||
.select({
|
||
id: schema.kvContainer.id,
|
||
title: schema.kvContainer.title,
|
||
description: schema.kvContainer.description,
|
||
type: schema.kvContainer.type,
|
||
tags: schema.kvContainer.tags,
|
||
data: schema.kvContainer.data,
|
||
code: schema.kvContainer.code,
|
||
uid: schema.kvContainer.uid,
|
||
createdAt: schema.kvContainer.createdAt,
|
||
updatedAt: schema.kvContainer.updatedAt,
|
||
hash: schema.kvContainer.hash,
|
||
})
|
||
.from(schema.kvContainer)
|
||
.where(and(...conditions))
|
||
.orderBy(desc(schema.kvContainer.updatedAt));
|
||
if (filterQuery) {
|
||
const filteredList = filter(list, filterQuery);
|
||
ctx.body = { list: filteredList }
|
||
} else {
|
||
ctx.body = { list };
|
||
}
|
||
return ctx;
|
||
})
|
||
.addTo(app);
|
||
|
||
app
|
||
.route({
|
||
path: 'light-code',
|
||
key: 'get',
|
||
description: '获取轻代码详情',
|
||
middleware: ['auth'],
|
||
})
|
||
.define(async (ctx) => {
|
||
const tokenUser = ctx.state.tokenUser;
|
||
const id = ctx.query.id;
|
||
if (!id) {
|
||
throw new CustomError('id is required');
|
||
}
|
||
const result = await db
|
||
.select()
|
||
.from(schema.kvContainer)
|
||
.where(eq(schema.kvContainer.id, id))
|
||
.limit(1);
|
||
const container = result[0];
|
||
if (!container) {
|
||
ctx.throw('未发现该代码内容');
|
||
}
|
||
if (container.uid !== tokenUser.id) {
|
||
ctx.throw('没有权限访问该代码内容');
|
||
}
|
||
ctx.body = container;
|
||
})
|
||
.addTo(app);
|
||
|
||
app
|
||
.route({
|
||
path: 'light-code',
|
||
key: 'update',
|
||
middleware: ['auth'],
|
||
isDebug: true,
|
||
})
|
||
.define(async (ctx) => {
|
||
const tokenUser = ctx.state.tokenUser;
|
||
const data = ctx.query.data;
|
||
const { id, ...container } = data;
|
||
if (id) {
|
||
const result = await db
|
||
.select()
|
||
.from(schema.kvContainer)
|
||
.where(eq(schema.kvContainer.id, id))
|
||
.limit(1);
|
||
const existing = result[0];
|
||
if (existing) {
|
||
await db
|
||
.update(schema.kvContainer)
|
||
.set({
|
||
...container,
|
||
updatedAt: new Date().toISOString(),
|
||
})
|
||
.where(eq(schema.kvContainer.id, id));
|
||
const updated = await db
|
||
.select()
|
||
.from(schema.kvContainer)
|
||
.where(eq(schema.kvContainer.id, id))
|
||
.limit(1);
|
||
ctx.body = updated[0];
|
||
} else {
|
||
ctx.body = null;
|
||
}
|
||
} else {
|
||
try {
|
||
|
||
console.log('created', container, 'userId', tokenUser.id);
|
||
const [created] = await db
|
||
.insert(schema.kvContainer)
|
||
.values({
|
||
title: container.title || '',
|
||
description: container.description || '',
|
||
type: container.type || 'light-code',
|
||
code: container.code || '',
|
||
data: container.data || {},
|
||
tags: container.tags || [],
|
||
hash: container.hash || '',
|
||
uid: tokenUser.id,
|
||
})
|
||
.returning();
|
||
ctx.body = created;
|
||
} catch (error) {
|
||
console.error('Error creating container:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
})
|
||
.addTo(app);
|
||
|
||
app
|
||
.route({
|
||
path: 'light-code',
|
||
key: 'delete',
|
||
middleware: ['auth'],
|
||
})
|
||
.define(async (ctx) => {
|
||
const tokenUser = ctx.state.tokenUser;
|
||
const id = ctx.query.id;
|
||
const result = await db
|
||
.select()
|
||
.from(schema.kvContainer)
|
||
.where(eq(schema.kvContainer.id, id))
|
||
.limit(1);
|
||
const container = result[0];
|
||
if (!container) {
|
||
ctx.throw('未发现该容器');
|
||
}
|
||
if (container.uid !== tokenUser.id) {
|
||
ctx.throw('没有权限访问该容器');
|
||
}
|
||
await db.delete(schema.kvContainer).where(eq(schema.kvContainer.id, id));
|
||
ctx.body = container;
|
||
})
|
||
.addTo(app);
|