feat: add dir list
This commit is contained in:
parent
30589e3347
commit
d43bbba8ad
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user