mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-23 21:13:50 +00:00
feat: crud file
This commit is contained in:
30
client/src/pages/api/plugins/file/delete.ts
Normal file
30
client/src/pages/api/plugins/file/delete.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { jsonRes } from '@/service/response';
|
||||||
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
|
import { authUser } from '@/service/utils/auth';
|
||||||
|
import { GridFSStorage } from '@/service/lib/gridfs';
|
||||||
|
|
||||||
|
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
||||||
|
try {
|
||||||
|
await connectToDatabase();
|
||||||
|
|
||||||
|
const { fileId } = req.query as { fileId: string };
|
||||||
|
|
||||||
|
if (!fileId) {
|
||||||
|
throw new Error('fileId is empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { userId } = await authUser({ req });
|
||||||
|
|
||||||
|
const gridFs = new GridFSStorage('dataset', userId);
|
||||||
|
|
||||||
|
await gridFs.delete(fileId);
|
||||||
|
|
||||||
|
jsonRes(res);
|
||||||
|
} catch (error) {
|
||||||
|
jsonRes(res, {
|
||||||
|
code: 500,
|
||||||
|
error
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -1,20 +1,16 @@
|
|||||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
import { jsonRes } from '@/service/response';
|
import { jsonRes } from '@/service/response';
|
||||||
import { connectToDatabase } from '@/service/mongo';
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
import { authUser } from '@/service/utils/auth';
|
|
||||||
import { GridFSStorage } from '@/service/lib/gridfs';
|
import { GridFSStorage } from '@/service/lib/gridfs';
|
||||||
|
import { authFileToken } from './readUrl';
|
||||||
|
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
||||||
try {
|
try {
|
||||||
await connectToDatabase();
|
await connectToDatabase();
|
||||||
|
|
||||||
const { fileId } = req.query as { fileId: string };
|
const { token } = req.query as { token: string };
|
||||||
|
|
||||||
if (!fileId) {
|
const { fileId, userId } = await authFileToken(token);
|
||||||
throw new Error('fileId is empty');
|
|
||||||
}
|
|
||||||
|
|
||||||
const { userId } = await authUser({ req });
|
|
||||||
|
|
||||||
const gridFs = new GridFSStorage('dataset', userId);
|
const gridFs = new GridFSStorage('dataset', userId);
|
||||||
|
|
||||||
@@ -25,6 +21,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
|
|||||||
|
|
||||||
res.setHeader('encoding', file.encoding);
|
res.setHeader('encoding', file.encoding);
|
||||||
res.setHeader('Content-Type', file.contentType);
|
res.setHeader('Content-Type', file.contentType);
|
||||||
|
res.setHeader('Cache-Control', 'public, max-age=3600');
|
||||||
|
|
||||||
res.end(buffer);
|
res.end(buffer);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
70
client/src/pages/api/plugins/file/readUrl.ts
Normal file
70
client/src/pages/api/plugins/file/readUrl.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { jsonRes } from '@/service/response';
|
||||||
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
|
import { authUser } from '@/service/utils/auth';
|
||||||
|
import jwt from 'jsonwebtoken';
|
||||||
|
import { ERROR_ENUM } from '@/service/errorCode';
|
||||||
|
|
||||||
|
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
||||||
|
try {
|
||||||
|
await connectToDatabase();
|
||||||
|
|
||||||
|
const { fileId } = req.query as { fileId: string };
|
||||||
|
|
||||||
|
if (!fileId) {
|
||||||
|
throw new Error('fileId is empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { userId } = await authUser({ req });
|
||||||
|
|
||||||
|
const token = await createFileToken({
|
||||||
|
userId,
|
||||||
|
fileId
|
||||||
|
});
|
||||||
|
|
||||||
|
jsonRes(res, {
|
||||||
|
data: `/api/plugins/file/read?token=${token}`
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
jsonRes(res, {
|
||||||
|
code: 500,
|
||||||
|
error
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createFileToken = (data: { userId: string; fileId: string }) => {
|
||||||
|
if (!process.env.FILE_TOKEN_KEY) {
|
||||||
|
return Promise.reject('System unset FILE_TOKEN_KEY');
|
||||||
|
}
|
||||||
|
const expiredTime = Math.floor(Date.now() / 1000) + 60 * 30;
|
||||||
|
|
||||||
|
const key = process.env.FILE_TOKEN_KEY as string;
|
||||||
|
const token = jwt.sign(
|
||||||
|
{
|
||||||
|
...data,
|
||||||
|
exp: expiredTime
|
||||||
|
},
|
||||||
|
key
|
||||||
|
);
|
||||||
|
return Promise.resolve(token);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const authFileToken = (token?: string) =>
|
||||||
|
new Promise<{ userId: string; fileId: string }>((resolve, reject) => {
|
||||||
|
if (!token) {
|
||||||
|
return reject(ERROR_ENUM.unAuthFile);
|
||||||
|
}
|
||||||
|
const key = process.env.FILE_TOKEN_KEY as string;
|
||||||
|
|
||||||
|
jwt.verify(token, key, function (err, decoded: any) {
|
||||||
|
if (err || !decoded?.userId || !decoded?.fileId) {
|
||||||
|
reject(ERROR_ENUM.unAuthFile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve({
|
||||||
|
userId: decoded.userId,
|
||||||
|
fileId: decoded.fileId
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Reference in New Issue
Block a user