From 1c8db69a5a400462726498c98de395ae8cba029f Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Mon, 22 May 2023 14:14:06 +0800 Subject: [PATCH] feat: limit export kb --- .../api/plugins/kb/data/exportModelData.ts | 27 +++++++++++++++++-- src/pages/kb/components/DataCard.tsx | 8 ++++-- src/service/models/user.ts | 12 ++++++--- src/types/mongoSchema.d.ts | 3 +++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/pages/api/plugins/kb/data/exportModelData.ts b/src/pages/api/plugins/kb/data/exportModelData.ts index 22f4dcdae..19527438b 100644 --- a/src/pages/api/plugins/kb/data/exportModelData.ts +++ b/src/pages/api/plugins/kb/data/exportModelData.ts @@ -1,6 +1,6 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; -import { connectToDatabase } from '@/service/mongo'; +import { connectToDatabase, User } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { PgClient } from '@/service/pg'; @@ -14,10 +14,28 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< throw new Error('缺少参数'); } + await connectToDatabase(); + // 凭证校验 const { userId } = await authUser({ req, authToken: true }); - await connectToDatabase(); + const thirtyMinutesAgo = new Date(Date.now() - 30 * 60 * 1000); + + // auth export times + const authTimes = await User.findOne( + { + _id: userId, + $or: [ + { 'limit.exportKbTime': { $exists: false } }, + { 'limit.exportKbTime': { $lte: thirtyMinutesAgo } } + ] + }, + '_id limit' + ); + + if (!authTimes) { + throw new Error('上次导出未到半小时,每半小时仅可导出一次。'); + } // 统计数据 const count = await PgClient.count('modelData', { @@ -36,6 +54,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< item.a.replace(/\n/g, '\\n') ]); + // update export time + await User.findByIdAndUpdate(userId, { + 'limit.exportKbTime': new Date() + }); + jsonRes(res, { data }); diff --git a/src/pages/kb/components/DataCard.tsx b/src/pages/kb/components/DataCard.tsx index de6bc46f3..6747c3f16 100644 --- a/src/pages/kb/components/DataCard.tsx +++ b/src/pages/kb/components/DataCard.tsx @@ -131,6 +131,10 @@ const DataCard = ({ kbId }: { kbId: string }) => { type: 'text/csv', filename: 'data.csv' }); + toast({ + title: '导出成功,下次导出需要半小时后', + status: 'success' + }); } catch (error) { error; } @@ -164,10 +168,10 @@ const DataCard = ({ kbId }: { kbId: string }) => { mr={2} size={'sm'} isLoading={isLoadingExport} - title={'换行数据导出时,会进行格式转换'} + title={'半小时仅能导出1次'} onClick={() => onclickExport()} > - 导出 + 导出csv diff --git a/src/service/models/user.ts b/src/service/models/user.ts index b40fa7aa2..8528ac6d4 100644 --- a/src/service/models/user.ts +++ b/src/service/models/user.ts @@ -16,6 +16,10 @@ const UserSchema = new Schema({ get: (val: string) => hashPassword(val), select: false }, + createTime: { + type: Date, + default: () => new Date() + }, avatar: { type: String, default: '/icon/human.png' @@ -41,9 +45,11 @@ const UserSchema = new Schema({ type: String, default: '' }, - createTime: { - type: Date, - default: () => new Date() + limit: { + exportKbTime: { + // Every half hour + type: Date + } } }); diff --git a/src/types/mongoSchema.d.ts b/src/types/mongoSchema.d.ts index 19623215b..85f0a3da9 100644 --- a/src/types/mongoSchema.d.ts +++ b/src/types/mongoSchema.d.ts @@ -22,6 +22,9 @@ export interface UserModelSchema { promotion: { rate: number; }; + limit: { + exportKbTime?: Date; + }; } export interface AuthCodeSchema {