Files
code-center/src/routes/app-manager/domain/manager.ts

175 lines
4.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { app, db, schema } from '@/app.ts';
import { AppDomain, AppDomainHelper } from '../module/app-domain-drizzle.ts';
import { eq } from 'drizzle-orm';
import z from 'zod';
app
.route({
path: 'app_domain_manager',
key: 'list',
description: '获取域名列表,支持分页',
middleware: ['auth-admin'],
metadata: {
args: {
data: z.object({
page: z.number().optional(),
pageSize: z.number().optional(),
}).optional()
}
}
})
.define(async (ctx) => {
const { page = 1, pageSize = 999 } = ctx.query.data || {};
const offset = (page - 1) * pageSize;
const rows = await db.select().from(schema.kvAppDomain)
.limit(pageSize)
.offset(offset);
const countResult = await db.select().from(schema.kvAppDomain);
const count = countResult.length;
ctx.body = { count, list: rows, pagination: { page, pageSize } };
return ctx;
})
.addTo(app);
app
.route({
path: 'app_domain_manager',
key: 'update',
description: '更新一个域名的信息',
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) => {
const { domain, data, id, ...rest } = ctx.query.data || {};
if (!domain) {
ctx.throw(400, 'domain is required');
}
let domainInfo: AppDomain | undefined;
if (id) {
const domains = await db.select().from(schema.kvAppDomain).where(eq(schema.kvAppDomain.id, id)).limit(1);
domainInfo = domains[0];
}
const checkAppId = async () => {
const isUUID = (id: string) => {
return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(id);
};
if (rest.appId) {
if (!isUUID(rest.appId)) {
ctx.throw(400, 'appId is not valid');
}
const apps = await db.select().from(schema.kvApp).where(eq(schema.kvApp.id, rest.appId)).limit(1);
const appInfo = apps[0];
if (!appInfo) {
ctx.throw(400, 'appId is not exist');
}
}
};
try {
if (!domainInfo) {
await checkAppId();
const newDomains = await db.insert(schema.kvAppDomain).values({ domain, data: {}, ...rest }).returning();
domainInfo = newDomains[0];
} else {
if (rest.status && domainInfo.status !== rest.status) {
await AppDomainHelper.clearCache(domainInfo.domain!);
}
await checkAppId();
const domainData = domainInfo.data as any;
const updateResult = await db.update(schema.kvAppDomain)
.set({
domain,
data: {
...domainData,
...data,
},
...rest,
updatedAt: new Date().toISOString()
})
.where(eq(schema.kvAppDomain.id, domainInfo.id))
.returning();
domainInfo = updateResult[0];
}
ctx.body = domainInfo;
} catch (error: any) {
if (error.code) {
ctx.throw(error.code, error.message);
}
console.error(error);
ctx.throw(500, 'update domain failed, please check the data');
}
return ctx;
})
.addTo(app);
app
.route({
path: 'app_domain_manager',
key: 'delete',
description: '删除一个域名',
middleware: ['auth-admin'],
metadata: {
args: {
data: z.object({
id: z.string().optional(),
domain: z.string().optional(),
})
}
}
})
.define(async (ctx) => {
const { id, domain } = ctx.query.data || {};
if (!id && !domain) {
ctx.throw(400, 'id or domain is required');
}
if (id) {
await db.delete(schema.kvAppDomain).where(eq(schema.kvAppDomain.id, id));
} else {
await db.delete(schema.kvAppDomain).where(eq(schema.kvAppDomain.domain, domain));
}
ctx.body = { message: 'delete domain success' };
return ctx;
})
.addTo(app);
app
.route({
path: 'app_domain_manager',
key: 'get',
description: '获取域名信息可以通过id或者domain进行查询',
middleware: ['auth-admin'],
metadata: {
args: {
data: z.object({
id: z.string().optional(),
domain: z.string().optional(),
})
}
}
})
.define(async (ctx) => {
const { id, domain } = ctx.query.data || {};
if (!id && !domain) {
ctx.throw(400, 'id or domain is required');
}
const domains = await db.select().from(schema.kvAppDomain).where(eq(schema.kvAppDomain.id, id)).limit(1);
const domainInfo = domains[0];
if (!domainInfo) {
ctx.throw(404, 'domain not found');
}
ctx.body = domainInfo;
return ctx;
})
.addTo(app);