From 46cb3d4e75a4247dbc969b3774bc890996ea9df1 Mon Sep 17 00:00:00 2001 From: xion Date: Fri, 16 May 2025 03:38:15 +0800 Subject: [PATCH] add delete ai proxy --- src/module/index.ts | 2 +- src/module/proxy/ai-proxy.ts | 86 ++++++++++++++++++++++++------------ 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/src/module/index.ts b/src/module/index.ts index 54bd429..f5127bd 100644 --- a/src/module/index.ts +++ b/src/module/index.ts @@ -135,7 +135,7 @@ export const handleRequest = async (req: http.IncomingMessage, res: http.ServerR ) { res.setHeader('Access-Control-Allow-Origin', '*'); } - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE, PUT'); let user, app; let domainApp = false; diff --git a/src/module/proxy/ai-proxy.ts b/src/module/proxy/ai-proxy.ts index ed1ec03..409f8f2 100644 --- a/src/module/proxy/ai-proxy.ts +++ b/src/module/proxy/ai-proxy.ts @@ -14,30 +14,20 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy const { createNotFoundPage } = opts; const _u = new URL(req.url, 'http://localhost'); const oss = opts.oss; - const pathname = _u.pathname; 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); - if (app === 'ai') { - const version = params.get('version') || '1.0.0'; // root/ai - objectName = pathname.replace(`/${user}/${app}/`, `${user}/${app}/${version}/`); - owner = user; - } else { - objectName = pathname.replace(`/${user}/${app}/`, `${user}/`); // resources/root/ - owner = user; - } + const recursive = !!params.get('recursive'); + const { objectName, app, owner, loginUser, isOwner } = await getObjectName(req); + logger.debug(`proxy request: ${objectName}`, dir); try { - const loginUser = await getLoginUser(req); if (dir) { - if (loginUser?.tokenUser?.username !== owner) { + if (!isOwner) { return createNotFoundPage('no permission'); } - const list = await oss.listObjects(objectName, { recursive: true }); + const list = await oss.listObjects(objectName, { recursive: recursive }); res.writeHead(200, { 'content-type': 'application/json' }); const host = req.headers['host'] || 'localhost'; res.end( @@ -137,19 +127,8 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: if (!hash && !force) { return opts?.createNotFoundPage?.('no hash'); } - let objectName = ''; - let owner = ''; - const { user, app } = getUserFromRequest(req); - if (app === 'ai') { - const version = params.get('version') || '1.0.0'; // root/ai - objectName = pathname.replace(`/${user}/${app}/`, `${user}/${app}/${version}/`); - owner = user; - } else { - objectName = pathname.replace(`/${user}/${app}/`, `${user}/`); // resources/root/ - owner = user; - } - const loginUser = await getLoginUser(req); - if (loginUser?.tokenUser?.username !== owner) { + const { objectName, isOwner } = await getObjectName(req); + if (!isOwner) { return opts?.createNotFoundPage?.('no permission'); } const end = (data: any, message?: string, code = 200) => { @@ -212,6 +191,54 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: req.pipe(bb); }; +export const getObjectName = async (req: IncomingMessage, opts?: { checkOwner?: boolean }) => { + const _u = new URL(req.url, 'http://localhost'); + const pathname = _u.pathname; + const params = _u.searchParams; + const { user, app } = getUserFromRequest(req); + const checkOwner = opts?.checkOwner ?? true; + let objectName = ''; + let owner = ''; + if (app === 'ai') { + const version = params.get('version') || '1.0.0'; // root/ai + objectName = pathname.replace(`/${user}/${app}/`, `${user}/${app}/${version}/`); + owner = user; + } else { + objectName = pathname.replace(`/${user}/${app}/`, `${user}/`); // resources/root/ + owner = user; + } + let isOwner = undefined; + let loginUser: Awaited> = null; + if (checkOwner) { + const loginUser = await getLoginUser(req); + isOwner = loginUser?.tokenUser?.username === owner; + } + return { + objectName, + loginUser, + owner, + isOwner, + app, + user, + }; +}; +export const deleteProxy = async (req: IncomingMessage, res: ServerResponse, opts: ProxyOptions) => { + const { objectName, isOwner } = await getObjectName(req); + let oss = opts.oss; + if (!isOwner) { + return opts?.createNotFoundPage?.('no permission'); + } + try { + await oss.deleteObject(objectName); + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ success: true, message: 'delete success', objectName })); + } catch (error) { + logger.error('deleteProxy error', error); + res.writeHead(500, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ success: false, error: error })); + } +}; + type ProxyOptions = { createNotFoundPage: (msg?: string) => any; oss?: OssBase; @@ -224,6 +251,9 @@ export const aiProxy = async (req: IncomingMessage, res: ServerResponse, opts: P if (req.method === 'POST') { return postProxy(req, res, opts); } + if (req.method === 'DELETE') { + return deleteProxy(req, res, opts); + } return getAiProxy(req, res, opts); };