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 { getContentType } from '../get-content-type.ts';
|
||||||
import { OssBase } from '@kevisual/oss';
|
import { OssBase } from '@kevisual/oss';
|
||||||
import { parseSearchValue } from '@kevisual/router/browser';
|
import { parseSearchValue } from '@kevisual/router/browser';
|
||||||
|
import { logger } from '../logger.ts';
|
||||||
// import { logger } from '@/module/logger.ts';
|
// import { logger } from '@/module/logger.ts';
|
||||||
const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: ProxyOptions) => {
|
const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: ProxyOptions) => {
|
||||||
const { createNotFoundPage } = opts;
|
const { createNotFoundPage } = opts;
|
||||||
@ -17,6 +18,7 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy
|
|||||||
const params = _u.searchParams;
|
const params = _u.searchParams;
|
||||||
const password = params.get('p');
|
const password = params.get('p');
|
||||||
const hash = params.get('hash');
|
const hash = params.get('hash');
|
||||||
|
const dir = !!params.get('dir');
|
||||||
let objectName = '';
|
let objectName = '';
|
||||||
let owner = '';
|
let owner = '';
|
||||||
const { user, app } = getUserFromRequest(req);
|
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/
|
objectName = pathname.replace(`/${user}/${app}/`, `${user}/`); // resources/root/
|
||||||
owner = user;
|
owner = user;
|
||||||
}
|
}
|
||||||
|
logger.debug(`proxy request: ${objectName}`, dir);
|
||||||
try {
|
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);
|
const stat = await oss.statObject(objectName);
|
||||||
if (!stat) {
|
if (!stat) {
|
||||||
createNotFoundPage('Invalid proxy url');
|
createNotFoundPage('Invalid proxy url');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const permissionInstance = new UserPermission({ permission: stat.metaData as Permission, owner: owner });
|
const permissionInstance = new UserPermission({ permission: stat.metaData as Permission, owner: owner });
|
||||||
const loginUser = await getLoginUser(req);
|
|
||||||
const checkPermission = permissionInstance.checkPermissionSuccess({
|
const checkPermission = permissionInstance.checkPermissionSuccess({
|
||||||
username: loginUser?.tokenUser?.username || '',
|
username: loginUser?.tokenUser?.username || '',
|
||||||
password: password,
|
password: password,
|
||||||
@ -45,7 +77,7 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy
|
|||||||
}
|
}
|
||||||
if (hash && stat.etag === hash) {
|
if (hash && stat.etag === hash) {
|
||||||
res.writeHead(304); // not modified
|
res.writeHead(304); // not modified
|
||||||
res.end('not modified')
|
res.end('not modified');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const filterMetaData = filterKeys(stat.metaData, ['size', 'etag', 'last-modified']);
|
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 },
|
{ 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) {
|
} catch (error) {
|
||||||
end({ error: error }, '上传失败', 500);
|
end({ error: error }, '上传失败', 500);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user