add delete ai proxy

This commit is contained in:
熊潇 2025-05-16 03:38:15 +08:00
parent d43bbba8ad
commit 46cb3d4e75
2 changed files with 59 additions and 29 deletions

View File

@ -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;

View File

@ -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<true>(objectName, { recursive: true });
const list = await oss.listObjects<true>(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<ReturnType<typeof getLoginUser>> = 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);
};