feat: add dir list

This commit is contained in:
熊潇 2025-05-15 23:52:47 +08:00
parent 30589e3347
commit d43bbba8ad

View File

@ -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<true>(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);
}