feat: refactor route definitions and enhance metadata for app domain manager
- Updated route definitions in `src/route.ts` to utilize `toJSONSchema` and `pick` for cleaner route listing. - Enhanced the `app.domain.manager` routes in `src/routes/app-manager/domain/manager.ts`: - Changed path format to snake_case. - Added descriptions for each route. - Introduced Zod schema validation for request arguments in metadata.
This commit is contained in:
20
package.json
20
package.json
@@ -49,11 +49,11 @@
|
|||||||
"@kevisual/ai": "^0.0.24",
|
"@kevisual/ai": "^0.0.24",
|
||||||
"@kevisual/auth": "^2.0.3",
|
"@kevisual/auth": "^2.0.3",
|
||||||
"@kevisual/js-filter": "^0.0.5",
|
"@kevisual/js-filter": "^0.0.5",
|
||||||
"@kevisual/query": "^0.0.40",
|
"@kevisual/query": "^0.0.43",
|
||||||
"@types/busboy": "^1.5.4",
|
"@types/busboy": "^1.5.4",
|
||||||
"@types/send": "^1.2.1",
|
"@types/send": "^1.2.1",
|
||||||
"@types/ws": "^8.18.1",
|
"@types/ws": "^8.18.1",
|
||||||
"bullmq": "^5.67.3",
|
"bullmq": "^5.69.3",
|
||||||
"busboy": "^1.6.0",
|
"busboy": "^1.6.0",
|
||||||
"drizzle-kit": "^0.31.9",
|
"drizzle-kit": "^0.31.9",
|
||||||
"drizzle-orm": "^0.45.1",
|
"drizzle-orm": "^0.45.1",
|
||||||
@@ -66,18 +66,18 @@
|
|||||||
"xml2js": "^0.6.2"
|
"xml2js": "^0.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.986.0",
|
"@aws-sdk/client-s3": "^3.991.0",
|
||||||
"@kevisual/api": "^0.0.47",
|
"@kevisual/api": "^0.0.51",
|
||||||
"@kevisual/context": "^0.0.4",
|
"@kevisual/context": "^0.0.6",
|
||||||
"@kevisual/local-app-manager": "0.1.32",
|
"@kevisual/local-app-manager": "0.1.32",
|
||||||
"@kevisual/logger": "^0.0.4",
|
"@kevisual/logger": "^0.0.4",
|
||||||
"@kevisual/oss": "0.0.19",
|
"@kevisual/oss": "0.0.19",
|
||||||
"@kevisual/permission": "^0.0.4",
|
"@kevisual/permission": "^0.0.4",
|
||||||
"@kevisual/router": "0.0.70",
|
"@kevisual/router": "0.0.73",
|
||||||
"@kevisual/types": "^0.0.12",
|
"@kevisual/types": "^0.0.12",
|
||||||
"@kevisual/use-config": "^1.0.30",
|
"@kevisual/use-config": "^1.0.30",
|
||||||
"@types/archiver": "^7.0.0",
|
"@types/archiver": "^7.0.0",
|
||||||
"@types/bun": "^1.3.8",
|
"@types/bun": "^1.3.9",
|
||||||
"@types/crypto-js": "^4.2.2",
|
"@types/crypto-js": "^4.2.2",
|
||||||
"@types/jsonwebtoken": "^9.0.10",
|
"@types/jsonwebtoken": "^9.0.10",
|
||||||
"@types/node": "^25.2.3",
|
"@types/node": "^25.2.3",
|
||||||
@@ -87,9 +87,9 @@
|
|||||||
"archiver": "^7.0.1",
|
"archiver": "^7.0.1",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"dayjs": "^1.11.19",
|
"dayjs": "^1.11.19",
|
||||||
"dotenv": "^17.2.4",
|
"dotenv": "^17.3.1",
|
||||||
"es-toolkit": "^1.44.0",
|
"es-toolkit": "^1.44.0",
|
||||||
"ioredis": "^5.9.2",
|
"ioredis": "^5.9.3",
|
||||||
"jsonwebtoken": "^9.0.3",
|
"jsonwebtoken": "^9.0.3",
|
||||||
"nanoid": "^5.1.6",
|
"nanoid": "^5.1.6",
|
||||||
"p-queue": "^9.1.0",
|
"p-queue": "^9.1.0",
|
||||||
@@ -102,5 +102,5 @@
|
|||||||
"inflight": "latest",
|
"inflight": "latest",
|
||||||
"picomatch": "^4.0.2"
|
"picomatch": "^4.0.2"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.29.2"
|
"packageManager": "pnpm@10.30.0"
|
||||||
}
|
}
|
||||||
601
pnpm-lock.yaml
generated
601
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
19
src/route.ts
19
src/route.ts
@@ -4,6 +4,8 @@ import { app } from './app.ts';
|
|||||||
import type { App } from '@kevisual/router';
|
import type { App } from '@kevisual/router';
|
||||||
import { User } from './models/user.ts';
|
import { User } from './models/user.ts';
|
||||||
import { createCookie, getSomeInfoFromReq } from './routes/user/me.ts';
|
import { createCookie, getSomeInfoFromReq } from './routes/user/me.ts';
|
||||||
|
import { toJSONSchema } from '@kevisual/router';
|
||||||
|
import { pick } from 'es-toolkit';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加auth中间件, 用于验证token
|
* 添加auth中间件, 用于验证token
|
||||||
@@ -169,22 +171,17 @@ app
|
|||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
const tokenUser = ctx.state.tokenUser;
|
const tokenUser = ctx.state.tokenUser;
|
||||||
let isUser = !!tokenUser;
|
let isUser = !!tokenUser;
|
||||||
ctx.body = {
|
const routesList = app.router.routes.filter(item => {
|
||||||
list: app.router.routes.filter(item => {
|
|
||||||
if (item.id === 'auth' || item.id === 'auth-can' || item.id === 'check-auth-admin' || item.id === 'auth-admin') {
|
if (item.id === 'auth' || item.id === 'auth-can' || item.id === 'check-auth-admin' || item.id === 'auth-admin') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}).map((item) => {
|
}).map((item) => {
|
||||||
return {
|
const route = pick(item, ['id', 'path', 'key', 'description', 'middleware'] as const);
|
||||||
id: item.id,
|
return toJSONSchema(route);
|
||||||
path: item.path,
|
})
|
||||||
key: item.key,
|
ctx.body = {
|
||||||
description: item.description,
|
list: routesList,
|
||||||
middeleware: item.middleware,
|
|
||||||
metadata: item.metadata,
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
isUser
|
isUser
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,15 +1,23 @@
|
|||||||
import { app, db, schema } from '@/app.ts';
|
import { app, db, schema } from '@/app.ts';
|
||||||
import { AppDomain, AppDomainHelper } from '../module/app-domain-drizzle.ts';
|
import { AppDomain, AppDomainHelper } from '../module/app-domain-drizzle.ts';
|
||||||
import { App } from '../module/app-drizzle.ts';
|
import { eq } from 'drizzle-orm';
|
||||||
import { CustomError } from '@kevisual/router';
|
|
||||||
import { eq, or } from 'drizzle-orm';
|
|
||||||
import { randomUUID } from 'crypto';
|
import { randomUUID } from 'crypto';
|
||||||
|
import z from 'zod';
|
||||||
|
|
||||||
app
|
app
|
||||||
.route({
|
.route({
|
||||||
path: 'app.domain.manager',
|
path: 'app_domain_manager',
|
||||||
key: 'list',
|
key: 'list',
|
||||||
|
description: '获取域名列表,支持分页',
|
||||||
middleware: ['auth-admin'],
|
middleware: ['auth-admin'],
|
||||||
|
metadata: {
|
||||||
|
args: {
|
||||||
|
data: z.object({
|
||||||
|
page: z.number().optional(),
|
||||||
|
pageSize: z.number().optional(),
|
||||||
|
}).optional()
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
const { page = 1, pageSize = 999 } = ctx.query.data || {};
|
const { page = 1, pageSize = 999 } = ctx.query.data || {};
|
||||||
@@ -26,9 +34,21 @@ app
|
|||||||
|
|
||||||
app
|
app
|
||||||
.route({
|
.route({
|
||||||
path: 'app.domain.manager',
|
path: 'app_domain_manager',
|
||||||
key: 'update',
|
key: 'update',
|
||||||
|
description: '更新一个域名的信息',
|
||||||
middleware: ['auth-admin'],
|
middleware: ['auth-admin'],
|
||||||
|
metadata: {
|
||||||
|
args: {
|
||||||
|
data: z.object({
|
||||||
|
id: z.string().optional(),
|
||||||
|
domain: z.string(),
|
||||||
|
appId: z.string().optional(),
|
||||||
|
status: z.enum(['active', 'inactive']).optional(),
|
||||||
|
data: z.record(z.string(), z.any()).optional(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
const { domain, data, id, ...rest } = ctx.query.data || {};
|
const { domain, data, id, ...rest } = ctx.query.data || {};
|
||||||
@@ -95,9 +115,18 @@ app
|
|||||||
|
|
||||||
app
|
app
|
||||||
.route({
|
.route({
|
||||||
path: 'app.domain.manager',
|
path: 'app_domain_manager',
|
||||||
key: 'delete',
|
key: 'delete',
|
||||||
|
description: '删除一个域名',
|
||||||
middleware: ['auth-admin'],
|
middleware: ['auth-admin'],
|
||||||
|
metadata: {
|
||||||
|
args: {
|
||||||
|
data: z.object({
|
||||||
|
id: z.string().optional(),
|
||||||
|
domain: z.string().optional(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
const { id, domain } = ctx.query.data || {};
|
const { id, domain } = ctx.query.data || {};
|
||||||
@@ -117,9 +146,18 @@ app
|
|||||||
|
|
||||||
app
|
app
|
||||||
.route({
|
.route({
|
||||||
path: 'app.domain.manager',
|
path: 'app_domain_manager',
|
||||||
key: 'get',
|
key: 'get',
|
||||||
|
description: '获取域名信息,可以通过id或者domain进行查询',
|
||||||
middleware: ['auth-admin'],
|
middleware: ['auth-admin'],
|
||||||
|
metadata: {
|
||||||
|
args: {
|
||||||
|
data: z.object({
|
||||||
|
id: z.string().optional(),
|
||||||
|
domain: z.string().optional(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
const { id, domain } = ctx.query.data || {};
|
const { id, domain } = ctx.query.data || {};
|
||||||
|
|||||||
Reference in New Issue
Block a user