Files
FastGPT/packages/service/support/wallet/sub/schema.ts
T
Archer aaa7d17ef1 V4.14.9 dev (#6555)
* feat: encapsulate logger (#6535)

* feat: encapsulate logger

* update engines

---------

Co-authored-by: archer <545436317@qq.com>

* next config

* dev shell

* Agent sandbox (#6532)

* docs: switch to docs layout and apply black theme (#6533)

* feat: add Gemini 3.1 models

- Add gemini-3.1-pro-preview (released February 19, 2026)
- Add gemini-3.1-flash-lite-preview (released March 3, 2026)

Both models support:
- 1M context window
- 64k max response
- Vision
- Tool choice

* docs: switch to docs layout and apply black theme

- Change layout from notebook to docs
- Update logo to icon + text format
- Apply fumadocs black theme
- Simplify global.css (keep only navbar and TOC styles)
- Fix icon components to properly accept className props
- Add mobile text overflow handling
- Update Node engine requirement to >=20.x

* doc

* doc

* lock

* fix: ts

* doc

* doc

---------

Co-authored-by: archer <archer@archerdeMac-mini.local>
Co-authored-by: archer <545436317@qq.com>

* Doc (#6493)

* cloud doc

* doc refactor

* doc move

* seo

* remove doc

* yml

* doc

* fix: tsconfig

* fix: tsconfig

* sandbox version (#6497)

* sandbox version

* add sandbox log

* update lock

* fix

* fix: sandbox

* doc

* add console

* i18n

* sandbxo in agent

* feat: agent sandbox

* lock

* feat: sandbox ui

* sandbox check exists

* env tempalte

* doc

* lock

* sandbox in chat window

* sandbox entry

* fix: test

* rename var

* sandbox config tip

* update sandbox lifecircle

* update prompt

* rename provider test

* sandbox logger

* yml

---------

Co-authored-by: Archer <archer@fastgpt.io>
Co-authored-by: archer <archer@archerdeMac-mini.local>

* perf: sandbox error tip

* Add sandbox limit and fix some issue (#6550)

* sandbox in plan

* fix: some issue

* fix: test

* editor default path

* fix: comment

* perf: sandbox worksapce

* doc

* perf: del sandbox

* sandbox build

* fix: test

* fix: pr comment

---------

Co-authored-by: Ryo <whoeverimf5@gmail.com>
Co-authored-by: Archer <archer@fastgpt.io>
Co-authored-by: archer <archer@archerdeMac-mini.local>
2026-03-16 17:09:25 +08:00

111 lines
2.7 KiB
TypeScript

/*
user sub plan
1. type=standard: There will only be 1, and each team will have one
2. type=extraDatasetSize/extraPoints: Can buy multiple
*/
import { connectionMongo, getMongoModel } from '../../../common/mongo';
const { Schema } = connectionMongo;
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
import {
StandardSubLevelEnum,
SubModeEnum,
SubTypeEnum
} from '@fastgpt/global/support/wallet/sub/constants';
import type { TeamSubSchemaType } from '@fastgpt/global/support/wallet/sub/type';
import { getLogger, LogCategories } from '../../../common/logger';
export const subCollectionName = 'team_subscriptions';
const SubSchema = new Schema({
teamId: {
type: Schema.Types.ObjectId,
ref: TeamCollectionName,
required: true
},
type: {
type: String,
enum: Object.values(SubTypeEnum),
required: true
},
startTime: {
type: Date,
default: () => new Date()
},
expiredTime: {
type: Date,
required: true
},
// standard sub
currentMode: {
type: String,
enum: Object.values(SubModeEnum)
},
nextMode: {
type: String,
enum: Object.values(SubModeEnum)
},
currentSubLevel: {
type: String,
enum: Object.values(StandardSubLevelEnum)
},
nextSubLevel: {
type: String,
enum: Object.values(StandardSubLevelEnum)
},
maxTeamMember: Number,
maxApp: Number,
maxDataset: Number,
// custom level configurations
requestsPerMinute: Number,
chatHistoryStoreDuration: Number,
maxDatasetSize: Number,
websiteSyncPerDataset: Number,
appRegistrationCount: Number,
auditLogStoreDuration: Number,
ticketResponseTime: Number,
customDomain: Number,
maxUploadFileSize: Number,
maxUploadFileCount: Number,
enableSandbox: Boolean, // 虚拟机
// stand sub and extra points sub. Plan total points
totalPoints: Number,
// plan surplus points
surplusPoints: Number,
// extra dataset size
currentExtraDatasetSize: Number
});
try {
// Get plan by expiredTime
SubSchema.index({ expiredTime: -1, currentSubLevel: 1 });
// Get team plan
SubSchema.index({ teamId: 1, type: 1, expiredTime: -1 });
// timer task. Get standard plan;Get free plan;Clear expired extract plan
SubSchema.index({ type: 1, expiredTime: -1, currentSubLevel: 1 });
// 修改后的唯一索引
SubSchema.index(
{
teamId: 1,
type: 1,
currentSubLevel: 1
},
{
unique: true,
partialFilterExpression: { type: SubTypeEnum.standard }
}
);
} catch (error) {
const logger = getLogger(LogCategories.INFRA.MONGO);
logger.error('Failed to build subscription indexes', { error });
}
export const MongoTeamSub = getMongoModel<TeamSubSchemaType>(subCollectionName, SubSchema);