Files
query-awesome/query/query-proxy/router-api-proxy.ts

66 lines
2.1 KiB
TypeScript

import { Query } from "@kevisual/query";
import { RouterViewApi, RouterItem } from "./proxy.ts";
import { type App, type QueryRouterServer } from "@kevisual/router";
import { filter } from "@kevisual/js-filter";
import { isBrowser } from "es-toolkit";
export const initApi = async (opts: {
item?: RouterViewApi,
router: QueryRouterServer | App,
token?: string,
/**
* WHERE path = 'auth' OR path = 'router' OR path = 'call'
*/
exclude?: string;
}) => {
const router = opts?.router! as QueryRouterServer;
const item = opts?.item;
const token = opts?.token;
const query = item?.api?.query || new Query({ url: item?.api?.url || '/api/router' })
const res = await query.post<{ list: RouterItem[] }>({ path: "router", key: 'list', token: token });
if (item) {
item.routerStatus = res?.code === 200 ? 'active' : 'error';
}
if (res.code !== 200) {
return {
code: res.code,
message: `初始化路由失败: ${res.message}, url: ${query.url}`
}
}
let _list = res.data?.list || []
if (opts?.exclude) {
if (opts?.exclude) {
let excludeList = filter(_list, opts.exclude);
const excludeIds = excludeList.map(i => i.id);
_list = _list.filter(i => !excludeIds.includes(i.id!));
}
}
const _isBrowser = isBrowser();
for (const r of _list) {
if (r.path || r.id) {
_isBrowser && console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API');
let metadata = r.metadata || {};
metadata.viewItem = item;
metadata.url = query.url;
metadata.source = 'query-proxy-api';
router.route({
path: r.path,
key: r.key || '',
id: r.id,
description: r.description,
metadata: metadata,
}).define(async (ctx) => {
const msg = { ...ctx.query };
if (msg.token === undefined && token !== undefined && !_isBrowser) {
msg.token = token;
}
const res = await query.post<any>({ path: r.path, key: r.key, ...msg });
ctx.forward(res)
}).addTo(router);
}
}
return {
code: 200,
message: '初始化路由成功'
}
}