usageLimit.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.usageLimitMiddleware = usageLimitMiddleware;
  4. exports.checkWordLimit = checkWordLimit;
  5. const models_1 = require("../models");
  6. const errorHandler_1 = require("./errorHandler");
  7. const types_1 = require("../types");
  8. // 检查使用次数限制
  9. async function usageLimitMiddleware(ctx, next) {
  10. const userId = ctx.state.user?.userId;
  11. // 测试模式:无需登录即可使用
  12. if (!userId) {
  13. ctx.state.userQuota = { dailyLimit: -1, wordLimit: -1 };
  14. await next();
  15. return;
  16. }
  17. const user = await models_1.prisma.user.findUnique({ where: { id: parseInt(userId) } });
  18. if (!user) {
  19. throw new errorHandler_1.ForbiddenError('用户不存在');
  20. }
  21. const today = new Date().toISOString().slice(0, 10);
  22. const memberLevel = user.memberLevel;
  23. const quota = types_1.MEMBER_QUOTA[memberLevel];
  24. // 重置每日使用次数
  25. if (user.lastUsageDate !== today) {
  26. await models_1.prisma.user.update({
  27. where: { id: parseInt(userId) },
  28. data: {
  29. dailyUsage: 0,
  30. lastUsageDate: today,
  31. },
  32. });
  33. user.dailyUsage = 0;
  34. user.lastUsageDate = today;
  35. }
  36. // 检查次数限制 (-1 表示无限制)
  37. if (quota.dailyLimit !== -1 && user.dailyUsage >= quota.dailyLimit) {
  38. throw new errorHandler_1.QuotaExceededError(`今日使用次数已达上限(${quota.dailyLimit}次),请升级会员`);
  39. }
  40. // 将用户信息和配额存入 state
  41. ctx.state.userQuota = quota;
  42. ctx.state.userInfo = user;
  43. await next();
  44. }
  45. // 检查字数限制
  46. function checkWordLimit(wordCount) {
  47. return async (ctx, next) => {
  48. const quota = ctx.state.userQuota;
  49. if (!quota) {
  50. throw new errorHandler_1.ForbiddenError('请先检查使用限制');
  51. }
  52. // -1 表示无限制
  53. if (quota.wordLimit !== -1 && wordCount > quota.wordLimit) {
  54. throw new errorHandler_1.QuotaExceededError(`文本字数超出限制(${quota.wordLimit}字),请升级会员或缩短文本`);
  55. }
  56. await next();
  57. };
  58. }