diff --git a/src/module/proxy/ai-proxy.ts b/src/module/proxy/ai-proxy.ts index feab520..ed1ec03 100644 --- a/src/module/proxy/ai-proxy.ts +++ b/src/module/proxy/ai-proxy.ts @@ -8,6 +8,7 @@ import busboy from 'busboy'; import { getContentType } from '../get-content-type.ts'; import { OssBase } from '@kevisual/oss'; import { parseSearchValue } from '@kevisual/router/browser'; +import { logger } from '../logger.ts'; // import { logger } from '@/module/logger.ts'; const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: ProxyOptions) => { const { createNotFoundPage } = opts; @@ -17,6 +18,7 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy const params = _u.searchParams; const password = params.get('p'); const hash = params.get('hash'); + const dir = !!params.get('dir'); let objectName = ''; let owner = ''; const { user, app } = getUserFromRequest(req); @@ -28,14 +30,44 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy objectName = pathname.replace(`/${user}/${app}/`, `${user}/`); // resources/root/ owner = user; } + logger.debug(`proxy request: ${objectName}`, dir); try { + const loginUser = await getLoginUser(req); + if (dir) { + if (loginUser?.tokenUser?.username !== owner) { + return createNotFoundPage('no permission'); + } + const list = await oss.listObjects(objectName, { recursive: true }); + res.writeHead(200, { 'content-type': 'application/json' }); + const host = req.headers['host'] || 'localhost'; + res.end( + JSON.stringify({ + code: 200, + data: list.map((item) => { + // @ts-ignore + item.path = item.name?.replace?.(objectName, ''); + // @ts-ignore + item.pathname = '/' + item.name; + if (app === 'ai') { + const [_user, _app, _version, ...rest] = item.name.split('/'); + // @ts-ignore + item.pathname = item.pathname.replace(`/${_user}/${_app}/${_version}/`, `/${_user}/${_app}/`); + // @ts-ignore + } + // @ts-ignore + item.url = new URL(item.pathname, `https://${host}`).toString(); + return item; + }), + }), + ); + return true; + } const stat = await oss.statObject(objectName); if (!stat) { createNotFoundPage('Invalid proxy url'); return true; } const permissionInstance = new UserPermission({ permission: stat.metaData as Permission, owner: owner }); - const loginUser = await getLoginUser(req); const checkPermission = permissionInstance.checkPermissionSuccess({ username: loginUser?.tokenUser?.username || '', password: password, @@ -45,7 +77,7 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy } if (hash && stat.etag === hash) { res.writeHead(304); // not modified - res.end('not modified') + res.end('not modified'); return true; } const filterMetaData = filterKeys(stat.metaData, ['size', 'etag', 'last-modified']); @@ -161,7 +193,7 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: }, { check: false, isStream: true }, ); - end({ success: true, name, info, meta: meta?.metaData, statMeta }, '上传成功', 200); + end({ success: true, name, info, isNew: true, hash, meta: meta?.metaData, statMeta }, '上传成功', 200); } catch (error) { end({ error: error }, '上传失败', 500); }