Documentation
¶
Index ¶
- Constants
- Variables
- func AdminBindSubscription(userId int, planId int, sourceNote string) (string, error)
- func AdminDeleteUserSubscription(userSubscriptionId int) (string, error)
- func AdminInvalidateUserSubscription(userSubscriptionId int) (string, error)
- func BatchDeleteChannels(ids []int) error
- func BatchDeleteTokens(ids []int, userId int) (int, error)
- func BatchInsertChannels(channels []Channel) error
- func BatchSetChannelTag(ids []int, tag *string) error
- func CacheUpdateChannel(channel *Channel)
- func CacheUpdateChannelStatus(id int, status int)
- func CheckSetup()
- func CheckUserExistOrDeleted(username string, email string) (bool, error)
- func CleanupChannelPollingLocks()
- func CleanupSubscriptionPreConsumeRecords(olderThanSeconds int64) (int64, error)
- func CloseDB() error
- func CompleteSubscriptionOrder(tradeNo string, providerPayload string) error
- func CountAllChannels() (int64, error)
- func CountAllTags() (int64, error)
- func CountAllTasks(queryParams TaskQueryParams) int64
- func CountAllUserTask(userId int, queryParams TaskQueryParams) int64
- func CountChannelsByType(channelType int) (int64, error)
- func CountChannelsGroupByType() (map[int64]int64, error)
- func CountUserSubscriptionsByPlan(userId int, planId int) (int64, error)
- func CountUserTokens(userId int) (int64, error)
- func CreateBackupCodes(userId int, codes []string) error
- func CreateCustomOAuthProvider(provider *CustomOAuthProvider) error
- func CreateUserOAuthBinding(binding *UserOAuthBinding) error
- func DecreaseTokenQuota(id int, key string, quota int) (err error)
- func DecreaseUserQuota(id int, quota int) (err error)
- func DeleteChannelByStatus(status int64) (int64, error)
- func DeleteCustomOAuthProvider(id int) error
- func DeleteDisabledChannel() (int64, error)
- func DeleteInvalidRedemptions() (int64, error)
- func DeleteOldLog(ctx context.Context, targetTimestamp int64, limit int) (int64, error)
- func DeletePasskeyByUserID(userID int) error
- func DeletePrefillGroupByID(id int) error
- func DeleteRedemptionById(id int) (err error)
- func DeleteTokenById(id int, userId int) (err error)
- func DeleteUserById(id int) (err error)
- func DeleteUserOAuthBinding(userId, providerId int) error
- func DeleteUserOAuthBindingsByUserId(userId int) error
- func DeltaUpdateUserQuota(id int, delta int) (err error)
- func DisableChannelByTag(tag string) error
- func DisableModelLimits(tokenId int) error
- func DisableTwoFA(userId int) error
- func EditChannelByTag(tag string, newTag *string, modelMapping *string, models *string, ...) error
- func EnableChannelByTag(tag string) error
- func ExpireDueSubscriptions(limit int) (int, error)
- func ExpireSubscriptionOrder(tradeNo string) error
- func FixAbility() (int, int, error)
- func GetBindingCountByProviderId(providerId int) (int64, error)
- func GetBoundChannelsByModelsMap(modelNames []string) (map[string][]BoundChannel, error)
- func GetChannelPollingLock(channelId int) *sync.Mutex
- func GetDBTimestamp() int64
- func GetEnabledModels() []string
- func GetGroupEnabledModels(group string) []string
- func GetMaxUserId() int
- func GetMissingModels() ([]string, error)
- func GetModelEnableGroups(modelName string) []string
- func GetModelQuotaTypes(modelName string) []int
- func GetModelSupportEndpointTypes(model string) []constant.EndpointType
- func GetPaginatedTags(offset int, limit int) ([]*string, error)
- func GetSupportedEndpointMap() map[string]common.EndpointInfo
- func GetTwoFAStats() (map[string]interface{}, error)
- func GetUnusedBackupCodeCount(userId int) (int, error)
- func GetUserCheckinStats(userId int, month string) (map[string]interface{}, error)
- func GetUserEmail(id int) (email string, err error)
- func GetUserGroup(id int, fromDB bool) (group string, err error)
- func GetUserIdByAffCode(affCode string) (int, error)
- func GetUserLanguage(userId int) string
- func GetUserQuota(id int, fromDB bool) (quota int, err error)
- func GetUserSetting(id int, fromDB bool) (settingMap dto.UserSetting, err error)
- func GetUserUsedQuota(id int) (quota int, err error)
- func GetUsernameById(id int, fromDB bool) (username string, err error)
- func GetVendorModelCounts() (map[int64]int64, error)
- func HardDeleteUserById(id int) error
- func HasActiveUserSubscription(userId int) (bool, error)
- func HasCheckedInToday(userId int) (bool, error)
- func IncreaseTokenQuota(id int, key string, quota int) (err error)
- func IncreaseUserQuota(id int, quota int, db bool) (err error)
- func InitBatchUpdater()
- func InitChannelCache()
- func InitDB() (err error)
- func InitLogDB() (err error)
- func InitOptionMap()
- func InvalidateSubscriptionPlanCache(planId int)
- func IsAdmin(userId int) bool
- func IsChannelEnabledForAnyGroupModel(groups []string, modelName string, channelID int) bool
- func IsChannelEnabledForGroupModel(group string, modelName string, channelID int) bool
- func IsDiscordIdAlreadyTaken(discordId string) bool
- func IsEmailAlreadyTaken(email string) bool
- func IsGitHubIdAlreadyTaken(githubId string) bool
- func IsLinuxDOIdAlreadyTaken(linuxDOId string) bool
- func IsModelNameDuplicated(id int, name string) (bool, error)
- func IsOidcIdAlreadyTaken(oidcId string) bool
- func IsPrefillGroupNameDuplicated(id int, name string) (bool, error)
- func IsProviderUserIdTaken(providerId int, providerUserId string) bool
- func IsSlugTaken(slug string, excludeId int) bool
- func IsTelegramIdAlreadyTaken(telegramId string) bool
- func IsTwoFAEnabled(userId int) bool
- func IsVendorNameDuplicated(id int, name string) (bool, error)
- func IsWeChatIdAlreadyTaken(wechatId string) bool
- func LogQuotaData(userId int, username string, modelName string, quota int, createdAt int64, ...)
- func ManualCompleteTopUp(tradeNo string) error
- func MjBulkUpdate(mjIds []string, params map[string]any) error
- func MjBulkUpdateByTaskIds(taskIDs []int, params map[string]any) error
- func NormalizeResetPeriod(period string) string
- func PingDB() error
- func PostConsumeUserSubscriptionDelta(userSubscriptionId int, delta int64) error
- func Recharge(referenceId string, customerId string) (err error)
- func RechargeCreem(referenceId string, customerEmail string, customerName string) (err error)
- func RecordConsumeLog(c *gin.Context, userId int, params RecordConsumeLogParams)
- func RecordErrorLog(c *gin.Context, userId int, channelId int, modelName string, tokenName string, ...)
- func RecordExist(err error) (bool, error)
- func RecordLog(userId int, logType int, content string)
- func Redeem(key string, userId int) (quota int, err error)
- func RefreshPricing()
- func RefundSubscriptionPreConsume(requestId string) error
- func ResetDueSubscriptions(limit int) (int, error)
- func ResetUserPasswordByEmail(email string, password string) error
- func RootUserExists() bool
- func SaveQuotaDataCache()
- func SearchTags(keyword string, group string, model string, idSort bool) ([]*string, error)
- func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelName string, ...) (token int)
- func SyncChannelCache(frequency int)
- func SyncOptions(frequency int)
- func TaskBulkUpdate(TaskIds []string, params map[string]any) error
- func TaskBulkUpdateByID(ids []int64, params map[string]any) error
- func TaskBulkUpdateByTaskIds(taskIDs []int64, params map[string]any) error
- func TaskCountAllTasks(queryParams SyncTaskQueryParams) int64
- func TaskCountAllUserTask(userId int, queryParams SyncTaskQueryParams) int64
- func TaskUpdateProgress(id int64, progress string) error
- func UpdateAbilityByTag(tag string, newTag *string, priority *int64, weight *uint) error
- func UpdateAbilityStatus(channelId int, status bool) error
- func UpdateAbilityStatusByTag(tag string, status bool) error
- func UpdateChannelStatus(channelId int, usingKey string, status int, reason string) bool
- func UpdateChannelUsedQuota(id int, quota int)
- func UpdateCustomOAuthProvider(provider *CustomOAuthProvider) error
- func UpdateOption(key string, value string) error
- func UpdateProgress(id int, progress string) error
- func UpdateQuotaData()
- func UpdateUserGroupCache(userId int, group string) error
- func UpdateUserOAuthBinding(userId, providerId int, newProviderUserId string) error
- func UpdateUserUsedQuotaAndRequestCount(id int, quota int)
- func UpsertPasskeyCredential(credential *PasskeyCredential) error
- func ValidateBackupCode(userId int, code string) (bool, error)
- type Ability
- type AbilityWithChannel
- type BoundChannel
- type Channel
- func CacheGetChannel(id int) (*Channel, error)
- func GetAllChannels(startIdx int, num int, selectAll bool, idSort bool) ([]*Channel, error)
- func GetChannel(group string, model string, retry int) (*Channel, error)
- func GetChannelById(id int, selectAll bool) (*Channel, error)
- func GetChannelsByIds(ids []int) ([]*Channel, error)
- func GetChannelsByTag(tag string, idSort bool, selectAll bool) ([]*Channel, error)
- func GetChannelsByType(startIdx int, num int, idSort bool, channelType int) ([]*Channel, error)
- func GetRandomSatisfiedChannel(group string, model string, retry int) (*Channel, error)
- func SearchChannels(keyword string, group string, model string, idSort bool) ([]*Channel, error)
- func (channel *Channel) AddAbilities(tx *gorm.DB) error
- func (channel *Channel) Delete() error
- func (channel *Channel) DeleteAbilities() error
- func (channel *Channel) GetAutoBan() bool
- func (channel *Channel) GetBaseURL() string
- func (channel *Channel) GetGroups() []string
- func (channel *Channel) GetHeaderOverride() map[string]interface{}
- func (channel *Channel) GetKeys() []string
- func (channel *Channel) GetModelMapping() string
- func (channel *Channel) GetModels() []string
- func (channel *Channel) GetNextEnabledKey() (string, int, *types.NewAPIError)
- func (channel *Channel) GetOtherInfo() map[string]interface{}
- func (channel *Channel) GetOtherSettings() dto.ChannelOtherSettings
- func (channel *Channel) GetParamOverride() map[string]interface{}
- func (channel *Channel) GetPriority() int64
- func (channel *Channel) GetSetting() dto.ChannelSettings
- func (channel *Channel) GetStatusCodeMapping() string
- func (channel *Channel) GetTag() string
- func (channel *Channel) GetWeight() int
- func (channel *Channel) Insert() error
- func (channel *Channel) Save() error
- func (channel *Channel) SaveChannelInfo() error
- func (channel *Channel) SaveWithoutKey() error
- func (channel *Channel) SetOtherInfo(otherInfo map[string]interface{})
- func (channel *Channel) SetOtherSettings(setting dto.ChannelOtherSettings)
- func (channel *Channel) SetSetting(setting dto.ChannelSettings)
- func (channel *Channel) SetTag(tag string)
- func (channel *Channel) Update() error
- func (channel *Channel) UpdateAbilities(tx *gorm.DB) error
- func (channel *Channel) UpdateBalance(balance float64)
- func (channel *Channel) UpdateResponseTime(responseTime int64)
- func (channel *Channel) ValidateSettings() error
- type ChannelInfo
- type Checkin
- type CheckinRecord
- type CustomOAuthProvider
- type JSONValue
- type Log
- func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName string, ...) (logs []*Log, total int64, err error)
- func GetLogByTokenId(tokenId int) (logs []*Log, err error)
- func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int64, ...) (logs []*Log, total int64, err error)
- type Midjourney
- func GetAllTasks(startIdx int, num int, queryParams TaskQueryParams) []*Midjourney
- func GetAllUnFinishTasks() []*Midjourney
- func GetAllUserTask(userId int, startIdx int, num int, queryParams TaskQueryParams) []*Midjourney
- func GetByMJId(userId int, mjId string) *Midjourney
- func GetByMJIds(userId int, mjIds []string) []*Midjourney
- func GetByOnlyMJId(mjId string) *Midjourney
- func GetMjByuId(id int) *Midjourney
- type Model
- type Option
- type PasskeyCredential
- func (p *PasskeyCredential) ApplyValidatedCredential(credential *webauthn.Credential)
- func (p *PasskeyCredential) SetTransports(list []protocol.AuthenticatorTransport)
- func (p *PasskeyCredential) ToWebAuthnCredential() webauthn.Credential
- func (p *PasskeyCredential) TransportList() []protocol.AuthenticatorTransport
- type PrefillGroup
- type Pricing
- type PricingVendor
- type Properties
- type QuotaData
- func GetAllQuotaDates(startTime int64, endTime int64, username string) (quotaData []*QuotaData, err error)
- func GetQuotaDataByUserId(userId int, startTime int64, endTime int64) (quotaData []*QuotaData, err error)
- func GetQuotaDataByUsername(username string, startTime int64, endTime int64) (quotaData []*QuotaData, err error)
- type RecordConsumeLogParams
- type Redemption
- type Setup
- type Stat
- type SubscriptionOrder
- type SubscriptionPlan
- type SubscriptionPlanInfo
- type SubscriptionPreConsumeRecord
- type SubscriptionPreConsumeResult
- type SubscriptionSummary
- type SyncTaskQueryParams
- type Task
- func GetAllUnFinishSyncTasks(limit int) []*Task
- func GetByOnlyTaskId(taskId string) (*Task, bool, error)
- func GetByTaskId(userId int, taskId string) (*Task, bool, error)
- func GetByTaskIds(userId int, taskIds []any) ([]*Task, error)
- func InitTask(platform constant.TaskPlatform, relayInfo *commonRelay.RelayInfo) *Task
- func TaskGetAllTasks(startIdx int, num int, queryParams SyncTaskQueryParams) []*Task
- func TaskGetAllUserTask(userId int, startIdx int, num int, queryParams SyncTaskQueryParams) []*Task
- type TaskPrivateData
- type TaskQueryParams
- type TaskQuotaUsage
- type TaskStatus
- type Token
- func GetAllUserTokens(userId int, startIdx int, num int) ([]*Token, error)
- func GetTokenById(id int) (*Token, error)
- func GetTokenByIds(id int, userId int) (*Token, error)
- func GetTokenByKey(key string, fromDB bool) (token *Token, err error)
- func SearchUserTokens(userId int, keyword string, token string, offset int, limit int) (tokens []*Token, total int64, err error)
- func ValidateUserToken(key string) (token *Token, err error)
- func (token *Token) Clean()
- func (token *Token) Delete() (err error)
- func (token *Token) GetIpLimits() []string
- func (token *Token) GetModelLimits() []string
- func (token *Token) GetModelLimitsMap() map[string]bool
- func (token *Token) Insert() error
- func (token *Token) IsModelLimitsEnabled() bool
- func (token *Token) SelectUpdate() (err error)
- func (token *Token) Update() (err error)
- type TopUp
- func GetAllTopUps(pageInfo *common.PageInfo) (topups []*TopUp, total int64, err error)
- func GetTopUpById(id int) *TopUp
- func GetTopUpByTradeNo(tradeNo string) *TopUp
- func GetUserTopUps(userId int, pageInfo *common.PageInfo) (topups []*TopUp, total int64, err error)
- func SearchAllTopUps(keyword string, pageInfo *common.PageInfo) (topups []*TopUp, total int64, err error)
- func SearchUserTopUps(userId int, keyword string, pageInfo *common.PageInfo) (topups []*TopUp, total int64, err error)
- type TwoFA
- func (t *TwoFA) Create() error
- func (t *TwoFA) Delete() error
- func (t *TwoFA) Enable() error
- func (t *TwoFA) IncrementFailedAttempts() error
- func (t *TwoFA) IsLocked() bool
- func (t *TwoFA) ResetFailedAttempts() error
- func (t *TwoFA) Update() error
- func (t *TwoFA) ValidateBackupCodeAndUpdateUsage(code string) (bool, error)
- func (t *TwoFA) ValidateTOTPAndUpdateUsage(code string) (bool, error)
- type TwoFABackupCode
- type User
- func GetAllUsers(pageInfo *common.PageInfo) (users []*User, total int64, err error)
- func GetRootUser() (user *User)
- func GetUserById(id int, selectAll bool) (*User, error)
- func GetUserByOAuthBinding(providerId int, providerUserId string) (*User, error)
- func SearchUsers(keyword string, group string, startIdx int, num int) ([]*User, int64, error)
- func ValidateAccessToken(token string) (user *User)
- func (user *User) Delete() error
- func (user *User) Edit(updatePassword bool) error
- func (user *User) FillUserByDiscordId() error
- func (user *User) FillUserByEmail() error
- func (user *User) FillUserByGitHubId() error
- func (user *User) FillUserById() error
- func (user *User) FillUserByLinuxDOId() error
- func (user *User) FillUserByOidcId() error
- func (user *User) FillUserByTelegramId() error
- func (user *User) FillUserByWeChatId() error
- func (user *User) GetAccessToken() string
- func (user *User) GetSetting() dto.UserSetting
- func (user *User) HardDelete() error
- func (user *User) Insert(inviterId int) error
- func (user *User) SetAccessToken(token string)
- func (user *User) SetSetting(setting dto.UserSetting)
- func (user *User) ToBaseUser() *UserBase
- func (user *User) TransferAffQuotaToQuota(quota int) error
- func (user *User) Update(updatePassword bool) error
- func (user *User) UpdateGitHubId(newGitHubId string) error
- func (user *User) ValidateAndFill() (err error)
- type UserBase
- type UserOAuthBinding
- type UserSubscription
- type Vendor
Constants ¶
const ( LogTypeUnknown = 0 LogTypeTopup = 1 LogTypeConsume = 2 LogTypeManage = 3 LogTypeSystem = 4 LogTypeError = 5 LogTypeRefund = 6 )
don't use iota, avoid change log type value
const ( NameRuleExact = iota NameRulePrefix NameRuleContains NameRuleSuffix )
const ( SubscriptionDurationYear = "year" SubscriptionDurationMonth = "month" SubscriptionDurationDay = "day" SubscriptionDurationHour = "hour" SubscriptionDurationCustom = "custom" )
Subscription duration units
const ( SubscriptionResetNever = "never" SubscriptionResetDaily = "daily" SubscriptionResetWeekly = "weekly" SubscriptionResetMonthly = "monthly" SubscriptionResetCustom = "custom" )
Subscription quota reset period
const ( TaskStatusNotStart TaskStatus = "NOT_START" TaskStatusSubmitted = "SUBMITTED" TaskStatusQueued = "QUEUED" TaskStatusInProgress = "IN_PROGRESS" TaskStatusFailure = "FAILURE" TaskStatusSuccess = "SUCCESS" TaskStatusUnknown = "UNKNOWN" )
const ( BatchUpdateTypeUserQuota = iota BatchUpdateTypeTokenQuota BatchUpdateTypeUsedQuota BatchUpdateTypeChannelUsedQuota BatchUpdateTypeRequestCount BatchUpdateTypeCount // if you add a new type, you need to add a new map and a new lock )
Variables ¶
var ( ErrPasskeyNotFound = errors.New("passkey credential not found") ErrFriendlyPasskeyNotFound = errors.New("Passkey 验证失败,请重试或联系管理员") )
var ( ErrSubscriptionOrderNotFound = errors.New("subscription order not found") ErrSubscriptionOrderStatusInvalid = errors.New("subscription order status invalid") )
var CacheQuotaData = make(map[string]*QuotaData)
var CacheQuotaDataLock = sync.Mutex{}
var DB *gorm.DB
var ErrRedeemFailed = errors.New("redeem.failed")
ErrRedeemFailed is returned when redemption fails due to database error
var ErrTwoFANotEnabled = errors.New("用户未启用2FA")
var LOG_DB *gorm.DB
Functions ¶
func AdminBindSubscription ¶ added in v0.10.8
Admin bind (no payment). Creates a UserSubscription from a plan.
func AdminDeleteUserSubscription ¶ added in v0.10.8
AdminDeleteUserSubscription hard-deletes a user subscription.
func AdminInvalidateUserSubscription ¶ added in v0.10.8
AdminInvalidateUserSubscription marks a user subscription as cancelled and ends it immediately.
func BatchDeleteChannels ¶
func BatchDeleteTokens ¶
BatchDeleteTokens 删除指定用户的一组令牌,返回成功删除数量
func BatchInsertChannels ¶
func BatchSetChannelTag ¶
func CacheUpdateChannel ¶
func CacheUpdateChannel(channel *Channel)
func CheckSetup ¶
func CheckSetup()
func CheckUserExistOrDeleted ¶
CheckUserExistOrDeleted check if user exist or deleted, if not exist, return false, nil, if deleted or exist, return true, nil
func CleanupChannelPollingLocks ¶
func CleanupChannelPollingLocks()
CleanupChannelPollingLocks removes locks for channels that no longer exist This is optional and can be called periodically to prevent memory leaks
func CleanupSubscriptionPreConsumeRecords ¶ added in v0.10.8
CleanupSubscriptionPreConsumeRecords removes old idempotency records to keep table small.
func CompleteSubscriptionOrder ¶ added in v0.10.8
Complete a subscription order (idempotent). Creates a UserSubscription snapshot from the plan.
func CountAllChannels ¶
CountAllChannels returns total channels in DB
func CountAllTags ¶
CountAllTags returns number of non-empty distinct tags
func CountAllTasks ¶
func CountAllTasks(queryParams TaskQueryParams) int64
CountAllTasks returns total midjourney tasks for admin query
func CountAllUserTask ¶
func CountAllUserTask(userId int, queryParams TaskQueryParams) int64
CountAllUserTask returns total midjourney tasks for user
func CountChannelsByType ¶
Count channels of specific type
func CountChannelsGroupByType ¶
Return map[type]count for all channels
func CountUserSubscriptionsByPlan ¶ added in v0.10.8
func CountUserTokens ¶
CountUserTokens returns total number of tokens for the given user, used for pagination
func CreateBackupCodes ¶
CreateBackupCodes 创建备用码
func CreateCustomOAuthProvider ¶ added in v0.10.8
func CreateCustomOAuthProvider(provider *CustomOAuthProvider) error
CreateCustomOAuthProvider creates a new custom OAuth provider
func CreateUserOAuthBinding ¶ added in v0.10.8
func CreateUserOAuthBinding(binding *UserOAuthBinding) error
CreateUserOAuthBinding creates a new OAuth binding
func DecreaseUserQuota ¶
func DeleteChannelByStatus ¶
func DeleteCustomOAuthProvider ¶ added in v0.10.8
DeleteCustomOAuthProvider deletes a custom OAuth provider by ID
func DeleteDisabledChannel ¶
func DeleteOldLog ¶
func DeletePasskeyByUserID ¶
func DeleteRedemptionById ¶
func DeleteTokenById ¶
func DeleteUserById ¶
func DeleteUserOAuthBinding ¶ added in v0.10.8
DeleteUserOAuthBinding deletes an OAuth binding
func DeleteUserOAuthBindingsByUserId ¶ added in v0.10.8
DeleteUserOAuthBindingsByUserId deletes all OAuth bindings for a user
func DeltaUpdateUserQuota ¶
func DisableChannelByTag ¶
func DisableModelLimits ¶
func EditChannelByTag ¶
func EnableChannelByTag ¶
func ExpireDueSubscriptions ¶ added in v0.10.8
ExpireDueSubscriptions marks expired subscriptions and handles group downgrade.
func ExpireSubscriptionOrder ¶ added in v0.10.8
func FixAbility ¶
func GetBindingCountByProviderId ¶ added in v0.10.8
GetBindingCountByProviderId returns the number of bindings for a provider
func GetBoundChannelsByModelsMap ¶
func GetBoundChannelsByModelsMap(modelNames []string) (map[string][]BoundChannel, error)
func GetChannelPollingLock ¶
GetChannelPollingLock returns or creates a mutex for the given channel ID
func GetDBTimestamp ¶ added in v0.10.8
func GetDBTimestamp() int64
GetDBTimestamp returns a UNIX timestamp from database time. Falls back to application time on error.
func GetEnabledModels ¶
func GetEnabledModels() []string
func GetGroupEnabledModels ¶
func GetMaxUserId ¶
func GetMaxUserId() int
func GetMissingModels ¶
GetMissingModels returns model names that are referenced in the system
func GetModelEnableGroups ¶
func GetModelQuotaTypes ¶
GetModelQuotaTypes 返回指定模型的计费类型集合(来自缓存)
func GetModelSupportEndpointTypes ¶
func GetModelSupportEndpointTypes(model string) []constant.EndpointType
func GetSupportedEndpointMap ¶
func GetSupportedEndpointMap() map[string]common.EndpointInfo
GetSupportedEndpointMap 返回全局端点到路径的映射
func GetTwoFAStats ¶
GetTwoFAStats 获取2FA统计信息(管理员使用)
func GetUnusedBackupCodeCount ¶
GetUnusedBackupCodeCount 获取未使用的备用码数量
func GetUserCheckinStats ¶
GetUserCheckinStats 获取用户签到统计信息
func GetUserEmail ¶
func GetUserGroup ¶
GetUserGroup gets group from Redis first, falls back to DB if needed
func GetUserIdByAffCode ¶
func GetUserLanguage ¶ added in v0.10.8
GetUserLanguage returns the user's language preference from cache Uses the existing GetUserCache mechanism for efficiency
func GetUserQuota ¶
GetUserQuota gets quota from Redis first, falls back to DB if needed
func GetUserSetting ¶
func GetUserSetting(id int, fromDB bool) (settingMap dto.UserSetting, err error)
GetUserSetting gets setting from Redis first, falls back to DB if needed
func GetUserUsedQuota ¶
func GetUsernameById ¶
GetUsernameById gets username from Redis first, falls back to DB if needed
func GetVendorModelCounts ¶
func HardDeleteUserById ¶
func HasActiveUserSubscription ¶ added in v0.10.8
HasActiveUserSubscription returns whether the user has any active subscription. This is a lightweight existence check to avoid heavy pre-consume transactions.
func HasCheckedInToday ¶
HasCheckedInToday 检查用户今天是否已签到
func InitBatchUpdater ¶
func InitBatchUpdater()
func InitChannelCache ¶
func InitChannelCache()
func InitOptionMap ¶
func InitOptionMap()
func InvalidateSubscriptionPlanCache ¶ added in v0.10.8
func InvalidateSubscriptionPlanCache(planId int)
func IsDiscordIdAlreadyTaken ¶
func IsEmailAlreadyTaken ¶
func IsGitHubIdAlreadyTaken ¶
func IsLinuxDOIdAlreadyTaken ¶
func IsOidcIdAlreadyTaken ¶
func IsPrefillGroupNameDuplicated ¶
IsPrefillGroupNameDuplicated 检查组名称是否重复(排除自身 ID)
func IsProviderUserIdTaken ¶ added in v0.10.8
IsProviderUserIdTaken checks if a provider user ID is already bound to any user
func IsSlugTaken ¶ added in v0.10.8
IsSlugTaken checks if a slug is already taken by another provider
func IsVendorNameDuplicated ¶
IsVendorNameDuplicated 检查供应商名称是否重复(排除自身 ID)
func IsWeChatIdAlreadyTaken ¶
func LogQuotaData ¶
func ManualCompleteTopUp ¶
ManualCompleteTopUp 管理员手动完成订单并给用户充值
func NormalizeResetPeriod ¶ added in v0.10.8
func PostConsumeUserSubscriptionDelta ¶ added in v0.10.8
Update subscription used amount by delta (positive consume more, negative refund).
func RechargeCreem ¶
func RecordConsumeLog ¶
func RecordConsumeLog(c *gin.Context, userId int, params RecordConsumeLogParams)
func RecordErrorLog ¶
func RecordExist ¶
func RefreshPricing ¶
func RefreshPricing()
RefreshPricing 强制立即重新计算与定价相关的缓存。 该方法用于需要最新数据的内部管理 API, 因此会绕过默认的 1 分钟延迟刷新。
func RefundSubscriptionPreConsume ¶ added in v0.10.8
RefundSubscriptionPreConsume is idempotent and refunds pre-consumed subscription quota by requestId.
func ResetDueSubscriptions ¶ added in v0.10.8
ResetDueSubscriptions resets subscriptions whose next_reset_time has passed.
func RootUserExists ¶
func RootUserExists() bool
func SaveQuotaDataCache ¶
func SaveQuotaDataCache()
func SearchTags ¶
func SumUsedToken ¶
func SyncChannelCache ¶
func SyncChannelCache(frequency int)
func SyncOptions ¶
func SyncOptions(frequency int)
func TaskBulkUpdateByTaskIds ¶
func TaskCountAllTasks ¶
func TaskCountAllTasks(queryParams SyncTaskQueryParams) int64
TaskCountAllTasks returns total tasks that match the given query params (admin usage)
func TaskCountAllUserTask ¶
func TaskCountAllUserTask(userId int, queryParams SyncTaskQueryParams) int64
TaskCountAllUserTask returns total tasks for given user
func TaskUpdateProgress ¶
func UpdateAbilityByTag ¶
func UpdateAbilityStatus ¶
func UpdateChannelStatus ¶
func UpdateChannelUsedQuota ¶
func UpdateCustomOAuthProvider ¶ added in v0.10.8
func UpdateCustomOAuthProvider(provider *CustomOAuthProvider) error
UpdateCustomOAuthProvider updates an existing custom OAuth provider
func UpdateOption ¶
func UpdateProgress ¶
func UpdateQuotaData ¶
func UpdateQuotaData()
func UpdateUserGroupCache ¶ added in v0.10.8
func UpdateUserOAuthBinding ¶ added in v0.10.8
UpdateUserOAuthBinding updates an existing OAuth binding (e.g., rebind to different OAuth account)
func UpsertPasskeyCredential ¶
func UpsertPasskeyCredential(credential *PasskeyCredential) error
Types ¶
type Ability ¶
type Ability struct {
Group string `json:"group" gorm:"type:varchar(64);primaryKey;autoIncrement:false"`
Model string `json:"model" gorm:"type:varchar(255);primaryKey;autoIncrement:false"`
ChannelId int `json:"channel_id" gorm:"primaryKey;autoIncrement:false;index"`
Enabled bool `json:"enabled"`
Priority *int64 `json:"priority" gorm:"bigint;default:0;index"`
Weight uint `json:"weight" gorm:"default:0;index"`
Tag *string `json:"tag" gorm:"index"`
}
func GetAllEnableAbilities ¶
func GetAllEnableAbilities() []Ability
type AbilityWithChannel ¶
func GetAllEnableAbilityWithChannels ¶
func GetAllEnableAbilityWithChannels() ([]AbilityWithChannel, error)
type BoundChannel ¶
type Channel ¶
type Channel struct {
Id int `json:"id"`
Type int `json:"type" gorm:"default:0"`
Key string `json:"key" gorm:"not null"`
OpenAIOrganization *string `json:"openai_organization"`
TestModel *string `json:"test_model"`
Status int `json:"status" gorm:"default:1"`
Name string `json:"name" gorm:"index"`
Weight *uint `json:"weight" gorm:"default:0"`
CreatedTime int64 `json:"created_time" gorm:"bigint"`
TestTime int64 `json:"test_time" gorm:"bigint"`
ResponseTime int `json:"response_time"` // in milliseconds
BaseURL *string `json:"base_url" gorm:"column:base_url;default:''"`
Other string `json:"other"`
Balance float64 `json:"balance"` // in USD
BalanceUpdatedTime int64 `json:"balance_updated_time" gorm:"bigint"`
Models string `json:"models"`
Group string `json:"group" gorm:"type:varchar(64);default:'default'"`
UsedQuota int64 `json:"used_quota" gorm:"bigint;default:0"`
ModelMapping *string `json:"model_mapping" gorm:"type:text"`
//MaxInputTokens *int `json:"max_input_tokens" gorm:"default:0"`
StatusCodeMapping *string `json:"status_code_mapping" gorm:"type:varchar(1024);default:''"`
Priority *int64 `json:"priority" gorm:"bigint;default:0"`
AutoBan *int `json:"auto_ban" gorm:"default:1"`
OtherInfo string `json:"other_info"`
Tag *string `json:"tag" gorm:"index"`
Setting *string `json:"setting" gorm:"type:text"` // 渠道额外设置
ParamOverride *string `json:"param_override" gorm:"type:text"`
HeaderOverride *string `json:"header_override" gorm:"type:text"`
Remark *string `json:"remark" gorm:"type:varchar(255)" validate:"max=255"`
// add after v0.8.5
ChannelInfo ChannelInfo `json:"channel_info" gorm:"type:json"`
OtherSettings string `json:"settings" gorm:"column:settings"` // 其他设置,存储azure版本等不需要检索的信息,详见dto.ChannelOtherSettings
// cache info
Keys []string `json:"-" gorm:"-"`
}
func CacheGetChannel ¶
func GetAllChannels ¶
func GetChannelsByIds ¶
func GetChannelsByTag ¶
func GetChannelsByType ¶
Get channels of specified type with pagination
func SearchChannels ¶
func (*Channel) DeleteAbilities ¶
func (*Channel) GetAutoBan ¶
func (*Channel) GetBaseURL ¶
func (*Channel) GetHeaderOverride ¶
func (*Channel) GetModelMapping ¶
func (*Channel) GetNextEnabledKey ¶
func (channel *Channel) GetNextEnabledKey() (string, int, *types.NewAPIError)
func (*Channel) GetOtherInfo ¶
func (*Channel) GetOtherSettings ¶
func (channel *Channel) GetOtherSettings() dto.ChannelOtherSettings
func (*Channel) GetParamOverride ¶
func (*Channel) GetPriority ¶
func (*Channel) GetSetting ¶
func (channel *Channel) GetSetting() dto.ChannelSettings
func (*Channel) GetStatusCodeMapping ¶
func (*Channel) SaveChannelInfo ¶
func (*Channel) SaveWithoutKey ¶
func (*Channel) SetOtherInfo ¶
func (*Channel) SetOtherSettings ¶
func (channel *Channel) SetOtherSettings(setting dto.ChannelOtherSettings)
func (*Channel) SetSetting ¶
func (channel *Channel) SetSetting(setting dto.ChannelSettings)
func (*Channel) UpdateAbilities ¶
UpdateAbilities updates abilities of this channel. Make sure the channel is completed before calling this function.
func (*Channel) UpdateBalance ¶
func (*Channel) UpdateResponseTime ¶
func (*Channel) ValidateSettings ¶
type ChannelInfo ¶
type ChannelInfo struct {
IsMultiKey bool `json:"is_multi_key"` // 是否多Key模式
MultiKeySize int `json:"multi_key_size"` // 多Key模式下的Key数量
MultiKeyStatusList map[int]int `json:"multi_key_status_list"` // key状态列表,key index -> status
MultiKeyDisabledReason map[int]string `json:"multi_key_disabled_reason,omitempty"` // key禁用原因列表,key index -> reason
MultiKeyDisabledTime map[int]int64 `json:"multi_key_disabled_time,omitempty"` // key禁用时间列表,key index -> time
MultiKeyPollingIndex int `json:"multi_key_polling_index"` // 多Key模式下轮询的key索引
MultiKeyMode constant.MultiKeyMode `json:"multi_key_mode"`
}
func CacheGetChannelInfo ¶
func CacheGetChannelInfo(id int) (*ChannelInfo, error)
func (*ChannelInfo) Scan ¶
func (c *ChannelInfo) Scan(value interface{}) error
Scan implements sql.Scanner interface
type Checkin ¶
type Checkin struct {
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
UserId int `json:"user_id" gorm:"not null;uniqueIndex:idx_user_checkin_date"`
CheckinDate string `json:"checkin_date" gorm:"type:varchar(10);not null;uniqueIndex:idx_user_checkin_date"` // 格式: YYYY-MM-DD
QuotaAwarded int `json:"quota_awarded" gorm:"not null"`
CreatedAt int64 `json:"created_at" gorm:"bigint"`
}
Checkin 签到记录
func GetUserCheckinRecords ¶
GetUserCheckinRecords 获取用户在指定日期范围内的签到记录
func UserCheckin ¶
UserCheckin 执行用户签到 MySQL 和 PostgreSQL 使用事务保证原子性 SQLite 不支持嵌套事务,使用顺序操作 + 手动回滚
type CheckinRecord ¶
type CheckinRecord struct {
CheckinDate string `json:"checkin_date"`
QuotaAwarded int `json:"quota_awarded"`
}
CheckinRecord 用于API返回的签到记录(不包含敏感字段)
type CustomOAuthProvider ¶ added in v0.10.8
type CustomOAuthProvider struct {
Id int `json:"id" gorm:"primaryKey"`
Name string `json:"name" gorm:"type:varchar(64);not null"` // Display name, e.g., "GitHub Enterprise"
Slug string `json:"slug" gorm:"type:varchar(64);uniqueIndex;not null"` // URL identifier, e.g., "github-enterprise"
Enabled bool `json:"enabled" gorm:"default:false"` // Whether this provider is enabled
ClientId string `json:"client_id" gorm:"type:varchar(256)"` // OAuth client ID
ClientSecret string `json:"-" gorm:"type:varchar(512)"` // OAuth client secret (not returned to frontend)
AuthorizationEndpoint string `json:"authorization_endpoint" gorm:"type:varchar(512)"` // Authorization URL
TokenEndpoint string `json:"token_endpoint" gorm:"type:varchar(512)"` // Token exchange URL
UserInfoEndpoint string `json:"user_info_endpoint" gorm:"type:varchar(512)"` // User info URL
Scopes string `json:"scopes" gorm:"type:varchar(256);default:'openid profile email'"` // OAuth scopes
// Field mapping configuration (supports JSONPath via gjson)
UserIdField string `json:"user_id_field" gorm:"type:varchar(128);default:'sub'"` // User ID field path, e.g., "sub", "id", "data.user.id"
UsernameField string `json:"username_field" gorm:"type:varchar(128);default:'preferred_username'"` // Username field path
DisplayNameField string `json:"display_name_field" gorm:"type:varchar(128);default:'name'"` // Display name field path
EmailField string `json:"email_field" gorm:"type:varchar(128);default:'email'"` // Email field path
// Advanced options
WellKnown string `json:"well_known" gorm:"type:varchar(512)"` // OIDC discovery endpoint (optional)
AuthStyle int `json:"auth_style" gorm:"default:0"` // 0=auto, 1=params, 2=header (Basic Auth)
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
CustomOAuthProvider stores configuration for custom OAuth providers
func GetAllCustomOAuthProviders ¶ added in v0.10.8
func GetAllCustomOAuthProviders() ([]*CustomOAuthProvider, error)
GetAllCustomOAuthProviders returns all custom OAuth providers
func GetCustomOAuthProviderById ¶ added in v0.10.8
func GetCustomOAuthProviderById(id int) (*CustomOAuthProvider, error)
GetCustomOAuthProviderById returns a custom OAuth provider by ID
func GetCustomOAuthProviderBySlug ¶ added in v0.10.8
func GetCustomOAuthProviderBySlug(slug string) (*CustomOAuthProvider, error)
GetCustomOAuthProviderBySlug returns a custom OAuth provider by slug
func GetEnabledCustomOAuthProviders ¶ added in v0.10.8
func GetEnabledCustomOAuthProviders() ([]*CustomOAuthProvider, error)
GetEnabledCustomOAuthProviders returns all enabled custom OAuth providers
func (CustomOAuthProvider) TableName ¶ added in v0.10.8
func (CustomOAuthProvider) TableName() string
type JSONValue ¶
type JSONValue json.RawMessage
JSONValue 基于 json.RawMessage 实现,支持从数据库的 []byte 和 string 两种类型读取
func (JSONValue) MarshalJSON ¶
MarshalJSON 确保在对外编码时与 json.RawMessage 行为一致
func (*JSONValue) UnmarshalJSON ¶
UnmarshalJSON 确保在对外解码时与 json.RawMessage 行为一致
type Log ¶
type Log struct {
Id int `json:"id" gorm:"index:idx_created_at_id,priority:1;index:idx_user_id_id,priority:2"`
UserId int `json:"user_id" gorm:"index;index:idx_user_id_id,priority:1"`
CreatedAt int64 `json:"created_at" gorm:"bigint;index:idx_created_at_id,priority:2;index:idx_created_at_type"`
Type int `json:"type" gorm:"index:idx_created_at_type"`
Content string `json:"content"`
Username string `json:"username" gorm:"index;index:index_username_model_name,priority:2;default:''"`
TokenName string `json:"token_name" gorm:"index;default:''"`
ModelName string `json:"model_name" gorm:"index;index:index_username_model_name,priority:1;default:''"`
Quota int `json:"quota" gorm:"default:0"`
PromptTokens int `json:"prompt_tokens" gorm:"default:0"`
CompletionTokens int `json:"completion_tokens" gorm:"default:0"`
UseTime int `json:"use_time" gorm:"default:0"`
IsStream bool `json:"is_stream"`
ChannelId int `json:"channel" gorm:"index"`
ChannelName string `json:"channel_name" gorm:"->"`
TokenId int `json:"token_id" gorm:"default:0;index"`
Group string `json:"group" gorm:"index"`
Ip string `json:"ip" gorm:"index;default:''"`
RequestId string `json:"request_id,omitempty" gorm:"type:varchar(64);index:idx_logs_request_id;default:''"`
Other string `json:"other"`
}
func GetAllLogs ¶
func GetLogByTokenId ¶ added in v0.10.8
type Midjourney ¶
type Midjourney struct {
Id int `json:"id"`
Code int `json:"code"`
UserId int `json:"user_id" gorm:"index"`
Action string `json:"action" gorm:"type:varchar(40);index"`
MjId string `json:"mj_id" gorm:"index"`
Prompt string `json:"prompt"`
PromptEn string `json:"prompt_en"`
Description string `json:"description"`
State string `json:"state"`
SubmitTime int64 `json:"submit_time" gorm:"index"`
StartTime int64 `json:"start_time" gorm:"index"`
FinishTime int64 `json:"finish_time" gorm:"index"`
ImageUrl string `json:"image_url"`
VideoUrl string `json:"video_url"`
VideoUrls string `json:"video_urls"`
Status string `json:"status" gorm:"type:varchar(20);index"`
Progress string `json:"progress" gorm:"type:varchar(30);index"`
FailReason string `json:"fail_reason"`
ChannelId int `json:"channel_id"`
Quota int `json:"quota"`
Buttons string `json:"buttons"`
Properties string `json:"properties"`
}
func GetAllTasks ¶
func GetAllTasks(startIdx int, num int, queryParams TaskQueryParams) []*Midjourney
func GetAllUnFinishTasks ¶
func GetAllUnFinishTasks() []*Midjourney
func GetAllUserTask ¶
func GetAllUserTask(userId int, startIdx int, num int, queryParams TaskQueryParams) []*Midjourney
func GetByMJId ¶
func GetByMJId(userId int, mjId string) *Midjourney
func GetByMJIds ¶
func GetByMJIds(userId int, mjIds []string) []*Midjourney
func GetByOnlyMJId ¶
func GetByOnlyMJId(mjId string) *Midjourney
func GetMjByuId ¶
func GetMjByuId(id int) *Midjourney
func (*Midjourney) Insert ¶
func (midjourney *Midjourney) Insert() error
func (*Midjourney) Update ¶
func (midjourney *Midjourney) Update() error
type Model ¶
type Model struct {
Id int `json:"id"`
ModelName string `json:"model_name" gorm:"size:128;not null;uniqueIndex:uk_model_name_delete_at,priority:1"`
Description string `json:"description,omitempty" gorm:"type:text"`
Icon string `json:"icon,omitempty" gorm:"type:varchar(128)"`
Tags string `json:"tags,omitempty" gorm:"type:varchar(255)"`
VendorID int `json:"vendor_id,omitempty" gorm:"index"`
Endpoints string `json:"endpoints,omitempty" gorm:"type:text"`
Status int `json:"status" gorm:"default:1"`
SyncOfficial int `json:"sync_official" gorm:"default:1"`
CreatedTime int64 `json:"created_time" gorm:"bigint"`
UpdatedTime int64 `json:"updated_time" gorm:"bigint"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_model_name_delete_at,priority:2"`
BoundChannels []BoundChannel `json:"bound_channels,omitempty" gorm:"-"`
EnableGroups []string `json:"enable_groups,omitempty" gorm:"-"`
QuotaTypes []int `json:"quota_types,omitempty" gorm:"-"`
NameRule int `json:"name_rule" gorm:"default:0"`
MatchedModels []string `json:"matched_models,omitempty" gorm:"-"`
MatchedCount int `json:"matched_count,omitempty" gorm:"-"`
}
func SearchModels ¶
type PasskeyCredential ¶
type PasskeyCredential struct {
ID int `json:"id" gorm:"primaryKey"`
UserID int `json:"user_id" gorm:"uniqueIndex;not null"`
CredentialID string `json:"credential_id" gorm:"type:varchar(512);uniqueIndex;not null"` // base64 encoded
PublicKey string `json:"public_key" gorm:"type:text;not null"` // base64 encoded
AttestationType string `json:"attestation_type" gorm:"type:varchar(255)"`
AAGUID string `json:"aaguid" gorm:"type:varchar(512)"` // base64 encoded
SignCount uint32 `json:"sign_count" gorm:"default:0"`
CloneWarning bool `json:"clone_warning"`
UserPresent bool `json:"user_present"`
UserVerified bool `json:"user_verified"`
BackupEligible bool `json:"backup_eligible"`
BackupState bool `json:"backup_state"`
Transports string `json:"transports" gorm:"type:text"`
Attachment string `json:"attachment" gorm:"type:varchar(32)"`
LastUsedAt *time.Time `json:"last_used_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func GetPasskeyByCredentialID ¶
func GetPasskeyByCredentialID(credentialID []byte) (*PasskeyCredential, error)
func GetPasskeyByUserID ¶
func GetPasskeyByUserID(userID int) (*PasskeyCredential, error)
func NewPasskeyCredentialFromWebAuthn ¶
func NewPasskeyCredentialFromWebAuthn(userID int, credential *webauthn.Credential) *PasskeyCredential
func (*PasskeyCredential) ApplyValidatedCredential ¶
func (p *PasskeyCredential) ApplyValidatedCredential(credential *webauthn.Credential)
func (*PasskeyCredential) SetTransports ¶
func (p *PasskeyCredential) SetTransports(list []protocol.AuthenticatorTransport)
func (*PasskeyCredential) ToWebAuthnCredential ¶
func (p *PasskeyCredential) ToWebAuthnCredential() webauthn.Credential
func (*PasskeyCredential) TransportList ¶
func (p *PasskeyCredential) TransportList() []protocol.AuthenticatorTransport
type PrefillGroup ¶
type PrefillGroup struct {
Id int `json:"id"`
Name string `json:"name" gorm:"size:64;not null;uniqueIndex:uk_prefill_name,where:deleted_at IS NULL"`
Type string `json:"type" gorm:"size:32;index;not null"`
Items JSONValue `json:"items" gorm:"type:json"`
Description string `json:"description,omitempty" gorm:"type:varchar(255)"`
CreatedTime int64 `json:"created_time" gorm:"bigint"`
UpdatedTime int64 `json:"updated_time" gorm:"bigint"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func GetAllPrefillGroups ¶
func GetAllPrefillGroups(groupType string) ([]*PrefillGroup, error)
GetAllPrefillGroups 获取全部组,可按类型过滤(为空则返回全部)
type Pricing ¶
type Pricing struct {
ModelName string `json:"model_name"`
Description string `json:"description,omitempty"`
Icon string `json:"icon,omitempty"`
Tags string `json:"tags,omitempty"`
VendorID int `json:"vendor_id,omitempty"`
QuotaType int `json:"quota_type"`
ModelRatio float64 `json:"model_ratio"`
ModelPrice float64 `json:"model_price"`
OwnerBy string `json:"owner_by"`
CompletionRatio float64 `json:"completion_ratio"`
EnableGroup []string `json:"enable_groups"`
SupportedEndpointTypes []constant.EndpointType `json:"supported_endpoint_types"`
}
func GetPricing ¶
func GetPricing() []Pricing
type PricingVendor ¶
type Properties ¶
type Properties struct {
Input string `json:"input"`
UpstreamModelName string `json:"upstream_model_name,omitempty"`
OriginModelName string `json:"origin_model_name,omitempty"`
}
func (*Properties) Scan ¶
func (m *Properties) Scan(val interface{}) error
type QuotaData ¶
type QuotaData struct {
Id int `json:"id"`
UserID int `json:"user_id" gorm:"index"`
Username string `json:"username" gorm:"index:idx_qdt_model_user_name,priority:2;size:64;default:''"`
ModelName string `json:"model_name" gorm:"index:idx_qdt_model_user_name,priority:1;size:64;default:''"`
CreatedAt int64 `json:"created_at" gorm:"bigint;index:idx_qdt_created_at,priority:2"`
TokenUsed int `json:"token_used" gorm:"default:0"`
Count int `json:"count" gorm:"default:0"`
Quota int `json:"quota" gorm:"default:0"`
}
QuotaData 柱状图数据
func GetAllQuotaDates ¶
func GetQuotaDataByUserId ¶
type RecordConsumeLogParams ¶
type RecordConsumeLogParams struct {
ChannelId int `json:"channel_id"`
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
ModelName string `json:"model_name"`
TokenName string `json:"token_name"`
Quota int `json:"quota"`
Content string `json:"content"`
TokenId int `json:"token_id"`
UseTimeSeconds int `json:"use_time_seconds"`
IsStream bool `json:"is_stream"`
Group string `json:"group"`
Other map[string]interface{} `json:"other"`
}
type Redemption ¶
type Redemption struct {
Id int `json:"id"`
UserId int `json:"user_id"`
Key string `json:"key" gorm:"type:char(32);uniqueIndex"`
Status int `json:"status" gorm:"default:1"`
Name string `json:"name" gorm:"index"`
Quota int `json:"quota" gorm:"default:100"`
CreatedTime int64 `json:"created_time" gorm:"bigint"`
RedeemedTime int64 `json:"redeemed_time" gorm:"bigint"`
Count int `json:"count" gorm:"-:all"` // only for api request
UsedUserId int `json:"used_user_id"`
DeletedAt gorm.DeletedAt `gorm:"index"`
ExpiredTime int64 `json:"expired_time" gorm:"bigint"` // 过期时间,0 表示不过期
}
func GetAllRedemptions ¶
func GetAllRedemptions(startIdx int, num int) (redemptions []*Redemption, total int64, err error)
func GetRedemptionById ¶
func GetRedemptionById(id int) (*Redemption, error)
func SearchRedemptions ¶
func (*Redemption) Delete ¶
func (redemption *Redemption) Delete() error
func (*Redemption) Insert ¶
func (redemption *Redemption) Insert() error
func (*Redemption) SelectUpdate ¶
func (redemption *Redemption) SelectUpdate() error
func (*Redemption) Update ¶
func (redemption *Redemption) Update() error
Update Make sure your token's fields is completed, because this will update non-zero values
type Setup ¶
type SubscriptionOrder ¶ added in v0.10.8
type SubscriptionOrder struct {
Id int `json:"id"`
UserId int `json:"user_id" gorm:"index"`
PlanId int `json:"plan_id" gorm:"index"`
Money float64 `json:"money"`
TradeNo string `json:"trade_no" gorm:"unique;type:varchar(255);index"`
PaymentMethod string `json:"payment_method" gorm:"type:varchar(50)"`
Status string `json:"status"`
CreateTime int64 `json:"create_time"`
CompleteTime int64 `json:"complete_time"`
ProviderPayload string `json:"provider_payload" gorm:"type:text"`
}
Subscription order (payment -> webhook -> create UserSubscription)
func GetSubscriptionOrderByTradeNo ¶ added in v0.10.8
func GetSubscriptionOrderByTradeNo(tradeNo string) *SubscriptionOrder
func (*SubscriptionOrder) Insert ¶ added in v0.10.8
func (o *SubscriptionOrder) Insert() error
func (*SubscriptionOrder) Update ¶ added in v0.10.8
func (o *SubscriptionOrder) Update() error
type SubscriptionPlan ¶ added in v0.10.8
type SubscriptionPlan struct {
Id int `json:"id"`
Title string `json:"title" gorm:"type:varchar(128);not null"`
Subtitle string `json:"subtitle" gorm:"type:varchar(255);default:''"`
// Display money amount (follow existing code style: float64 for money)
PriceAmount float64 `json:"price_amount" gorm:"type:decimal(10,6);not null;default:0"`
Currency string `json:"currency" gorm:"type:varchar(8);not null;default:'USD'"`
DurationUnit string `json:"duration_unit" gorm:"type:varchar(16);not null;default:'month'"`
DurationValue int `json:"duration_value" gorm:"type:int;not null;default:1"`
CustomSeconds int64 `json:"custom_seconds" gorm:"type:bigint;not null;default:0"`
Enabled bool `json:"enabled" gorm:"default:true"`
SortOrder int `json:"sort_order" gorm:"type:int;default:0"`
StripePriceId string `json:"stripe_price_id" gorm:"type:varchar(128);default:''"`
CreemProductId string `json:"creem_product_id" gorm:"type:varchar(128);default:''"`
// Max purchases per user (0 = unlimited)
MaxPurchasePerUser int `json:"max_purchase_per_user" gorm:"type:int;default:0"`
// Upgrade user group after purchase (empty = no change)
UpgradeGroup string `json:"upgrade_group" gorm:"type:varchar(64);default:''"`
// Total quota (amount in quota units, 0 = unlimited)
TotalAmount int64 `json:"total_amount" gorm:"type:bigint;not null;default:0"`
// Quota reset period for plan
QuotaResetPeriod string `json:"quota_reset_period" gorm:"type:varchar(16);default:'never'"`
QuotaResetCustomSeconds int64 `json:"quota_reset_custom_seconds" gorm:"type:bigint;default:0"`
CreatedAt int64 `json:"created_at" gorm:"bigint"`
UpdatedAt int64 `json:"updated_at" gorm:"bigint"`
}
Subscription plan
func GetSubscriptionPlanById ¶ added in v0.10.8
func GetSubscriptionPlanById(id int) (*SubscriptionPlan, error)
func (*SubscriptionPlan) BeforeCreate ¶ added in v0.10.8
func (p *SubscriptionPlan) BeforeCreate(tx *gorm.DB) error
func (*SubscriptionPlan) BeforeUpdate ¶ added in v0.10.8
func (p *SubscriptionPlan) BeforeUpdate(tx *gorm.DB) error
type SubscriptionPlanInfo ¶ added in v0.10.8
func GetSubscriptionPlanInfoByUserSubscriptionId ¶ added in v0.10.8
func GetSubscriptionPlanInfoByUserSubscriptionId(userSubscriptionId int) (*SubscriptionPlanInfo, error)
type SubscriptionPreConsumeRecord ¶ added in v0.10.8
type SubscriptionPreConsumeRecord struct {
Id int `json:"id"`
RequestId string `json:"request_id" gorm:"type:varchar(64);uniqueIndex"`
UserId int `json:"user_id" gorm:"index"`
UserSubscriptionId int `json:"user_subscription_id" gorm:"index"`
PreConsumed int64 `json:"pre_consumed" gorm:"type:bigint;not null;default:0"`
Status string `json:"status" gorm:"type:varchar(32);index"` // consumed/refunded
CreatedAt int64 `json:"created_at" gorm:"bigint"`
UpdatedAt int64 `json:"updated_at" gorm:"bigint;index"`
}
SubscriptionPreConsumeRecord stores idempotent pre-consume operations per request.
func (*SubscriptionPreConsumeRecord) BeforeCreate ¶ added in v0.10.8
func (r *SubscriptionPreConsumeRecord) BeforeCreate(tx *gorm.DB) error
func (*SubscriptionPreConsumeRecord) BeforeUpdate ¶ added in v0.10.8
func (r *SubscriptionPreConsumeRecord) BeforeUpdate(tx *gorm.DB) error
type SubscriptionPreConsumeResult ¶ added in v0.10.8
type SubscriptionPreConsumeResult struct {
UserSubscriptionId int
PreConsumed int64
AmountTotal int64
AmountUsedBefore int64
AmountUsedAfter int64
}
func PreConsumeUserSubscription ¶ added in v0.10.8
func PreConsumeUserSubscription(requestId string, userId int, modelName string, quotaType int, amount int64) (*SubscriptionPreConsumeResult, error)
PreConsumeUserSubscription pre-consumes from any active subscription total quota.
type SubscriptionSummary ¶ added in v0.10.8
type SubscriptionSummary struct {
Subscription *UserSubscription `json:"subscription"`
}
func GetAllActiveUserSubscriptions ¶ added in v0.10.8
func GetAllActiveUserSubscriptions(userId int) ([]SubscriptionSummary, error)
GetAllActiveUserSubscriptions returns all active subscriptions for a user.
func GetAllUserSubscriptions ¶ added in v0.10.8
func GetAllUserSubscriptions(userId int) ([]SubscriptionSummary, error)
GetAllUserSubscriptions returns all subscriptions (active and expired) for a user.
type SyncTaskQueryParams ¶
type SyncTaskQueryParams struct {
Platform constant.TaskPlatform
ChannelID string
TaskID string
UserID string
Action string
Status string
StartTimestamp int64
EndTimestamp int64
UserIDs []int
}
SyncTaskQueryParams 用于包含所有搜索条件的结构体,可以根据需求添加更多字段
type Task ¶
type Task struct {
ID int64 `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
CreatedAt int64 `json:"created_at" gorm:"index"`
UpdatedAt int64 `json:"updated_at"`
TaskID string `json:"task_id" gorm:"type:varchar(191);index"` // 第三方id,不一定有/ song id\ Task id
Platform constant.TaskPlatform `json:"platform" gorm:"type:varchar(30);index"` // 平台
UserId int `json:"user_id" gorm:"index"`
Group string `json:"group" gorm:"type:varchar(50)"` // 修正计费用
ChannelId int `json:"channel_id" gorm:"index"`
Quota int `json:"quota"`
Action string `json:"action" gorm:"type:varchar(40);index"` // 任务类型, song, lyrics, description-mode
Status TaskStatus `json:"status" gorm:"type:varchar(20);index"` // 任务状态
FailReason string `json:"fail_reason"`
SubmitTime int64 `json:"submit_time" gorm:"index"`
StartTime int64 `json:"start_time" gorm:"index"`
FinishTime int64 `json:"finish_time" gorm:"index"`
Progress string `json:"progress" gorm:"type:varchar(20);index"`
Properties Properties `json:"properties" gorm:"type:json"`
Username string `json:"username,omitempty" gorm:"-"`
// 禁止返回给用户,内部可能包含key等隐私信息
PrivateData TaskPrivateData `json:"-" gorm:"column:private_data;type:json"`
Data json.RawMessage `json:"data" gorm:"type:json"`
}
func GetAllUnFinishSyncTasks ¶
func InitTask ¶
func InitTask(platform constant.TaskPlatform, relayInfo *commonRelay.RelayInfo) *Task
func TaskGetAllTasks ¶
func TaskGetAllTasks(startIdx int, num int, queryParams SyncTaskQueryParams) []*Task
func TaskGetAllUserTask ¶
func TaskGetAllUserTask(userId int, startIdx int, num int, queryParams SyncTaskQueryParams) []*Task
func (*Task) ToOpenAIVideo ¶
func (t *Task) ToOpenAIVideo() *dto.OpenAIVideo
type TaskPrivateData ¶
type TaskPrivateData struct {
Key string `json:"key,omitempty"`
}
func (*TaskPrivateData) Scan ¶
func (p *TaskPrivateData) Scan(val interface{}) error
type TaskQueryParams ¶
type TaskQueryParams struct {
ChannelID string
MjID string
StartTimestamp string
EndTimestamp string
}
TaskQueryParams 用于包含所有搜索条件的结构体,可以根据需求添加更多字段
type TaskQuotaUsage ¶
func SumUsedTaskQuota ¶
func SumUsedTaskQuota(queryParams SyncTaskQueryParams) (stat []TaskQuotaUsage, err error)
type TaskStatus ¶
type TaskStatus string
func (TaskStatus) ToVideoStatus ¶
func (t TaskStatus) ToVideoStatus() string
type Token ¶
type Token struct {
Id int `json:"id"`
UserId int `json:"user_id" gorm:"index"`
Key string `json:"key" gorm:"type:char(48);uniqueIndex"`
Status int `json:"status" gorm:"default:1"`
Name string `json:"name" gorm:"index" `
CreatedTime int64 `json:"created_time" gorm:"bigint"`
AccessedTime int64 `json:"accessed_time" gorm:"bigint"`
ExpiredTime int64 `json:"expired_time" gorm:"bigint;default:-1"` // -1 means never expired
RemainQuota int `json:"remain_quota" gorm:"default:0"`
UnlimitedQuota bool `json:"unlimited_quota"`
ModelLimitsEnabled bool `json:"model_limits_enabled"`
ModelLimits string `json:"model_limits" gorm:"type:varchar(1024);default:''"`
AllowIps *string `json:"allow_ips" gorm:"default:''"`
UsedQuota int `json:"used_quota" gorm:"default:0"` // used quota
Group string `json:"group" gorm:"default:''"`
CrossGroupRetry bool `json:"cross_group_retry"` // 跨分组重试,仅auto分组有效
DeletedAt gorm.DeletedAt `gorm:"index"`
}
func GetTokenById ¶
func SearchUserTokens ¶
func ValidateUserToken ¶
func (*Token) GetIpLimits ¶
func (*Token) GetModelLimits ¶
func (*Token) GetModelLimitsMap ¶
func (*Token) IsModelLimitsEnabled ¶
func (*Token) SelectUpdate ¶
type TopUp ¶
type TopUp struct {
Id int `json:"id"`
UserId int `json:"user_id" gorm:"index"`
Amount int64 `json:"amount"`
Money float64 `json:"money"`
TradeNo string `json:"trade_no" gorm:"unique;type:varchar(255);index"`
PaymentMethod string `json:"payment_method" gorm:"type:varchar(50)"`
CreateTime int64 `json:"create_time"`
CompleteTime int64 `json:"complete_time"`
Status string `json:"status"`
}
func GetAllTopUps ¶
GetAllTopUps 获取全平台的充值记录(管理员使用)
func GetTopUpById ¶
func GetTopUpByTradeNo ¶
func GetUserTopUps ¶
func SearchAllTopUps ¶
func SearchAllTopUps(keyword string, pageInfo *common.PageInfo) (topups []*TopUp, total int64, err error)
SearchAllTopUps 按订单号搜索全平台充值记录(管理员使用)
type TwoFA ¶
type TwoFA struct {
Id int `json:"id" gorm:"primaryKey"`
UserId int `json:"user_id" gorm:"unique;not null;index"`
Secret string `json:"-" gorm:"type:varchar(255);not null"` // TOTP密钥,不返回给前端
IsEnabled bool `json:"is_enabled"`
FailedAttempts int `json:"failed_attempts" gorm:"default:0"`
LockedUntil *time.Time `json:"locked_until,omitempty"`
LastUsedAt *time.Time `json:"last_used_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
TwoFA 用户2FA设置表
func GetTwoFAByUserId ¶
GetTwoFAByUserId 根据用户ID获取2FA设置
func (*TwoFA) IncrementFailedAttempts ¶
IncrementFailedAttempts 增加失败尝试次数
func (*TwoFA) ResetFailedAttempts ¶
ResetFailedAttempts 重置失败尝试次数
func (*TwoFA) ValidateBackupCodeAndUpdateUsage ¶
ValidateBackupCodeAndUpdateUsage 验证备用码并更新使用记录
type TwoFABackupCode ¶
type TwoFABackupCode struct {
Id int `json:"id" gorm:"primaryKey"`
UserId int `json:"user_id" gorm:"not null;index"`
CodeHash string `json:"-" gorm:"type:varchar(255);not null"` // 备用码哈希
IsUsed bool `json:"is_used"`
UsedAt *time.Time `json:"used_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
TwoFABackupCode 备用码使用记录表
type User ¶
type User struct {
Id int `json:"id"`
Username string `json:"username" gorm:"unique;index" validate:"max=20"`
Password string `json:"password" gorm:"not null;" validate:"min=8,max=20"`
OriginalPassword string `json:"original_password" gorm:"-:all"` // this field is only for Password change verification, don't save it to database!
DisplayName string `json:"display_name" gorm:"index" validate:"max=20"`
Role int `json:"role" gorm:"type:int;default:1"` // admin, common
Status int `json:"status" gorm:"type:int;default:1"` // enabled, disabled
Email string `json:"email" gorm:"index" validate:"max=50"`
GitHubId string `json:"github_id" gorm:"column:github_id;index"`
DiscordId string `json:"discord_id" gorm:"column:discord_id;index"`
OidcId string `json:"oidc_id" gorm:"column:oidc_id;index"`
WeChatId string `json:"wechat_id" gorm:"column:wechat_id;index"`
TelegramId string `json:"telegram_id" gorm:"column:telegram_id;index"`
VerificationCode string `json:"verification_code" gorm:"-:all"` // this field is only for Email verification, don't save it to database!
AccessToken *string `json:"access_token" gorm:"type:char(32);column:access_token;uniqueIndex"` // this token is for system management
Quota int `json:"quota" gorm:"type:int;default:0"`
UsedQuota int `json:"used_quota" gorm:"type:int;default:0;column:used_quota"` // used quota
RequestCount int `json:"request_count" gorm:"type:int;default:0;"` // request number
Group string `json:"group" gorm:"type:varchar(64);default:'default'"`
AffCode string `json:"aff_code" gorm:"type:varchar(32);column:aff_code;uniqueIndex"`
AffCount int `json:"aff_count" gorm:"type:int;default:0;column:aff_count"`
AffQuota int `json:"aff_quota" gorm:"type:int;default:0;column:aff_quota"` // 邀请剩余额度
AffHistoryQuota int `json:"aff_history_quota" gorm:"type:int;default:0;column:aff_history"` // 邀请历史额度
InviterId int `json:"inviter_id" gorm:"type:int;column:inviter_id;index"`
DeletedAt gorm.DeletedAt `gorm:"index"`
LinuxDOId string `json:"linux_do_id" gorm:"column:linux_do_id;index"`
Setting string `json:"setting" gorm:"type:text;column:setting"`
Remark string `json:"remark,omitempty" gorm:"type:varchar(255)" validate:"max=255"`
StripeCustomer string `json:"stripe_customer" gorm:"type:varchar(64);column:stripe_customer;index"`
}
User if you add sensitive fields, don't forget to clean them in setupLogin function. Otherwise, the sensitive information will be saved on local storage in plain text!
func GetAllUsers ¶
func GetRootUser ¶
func GetRootUser() (user *User)
func GetUserByOAuthBinding ¶ added in v0.10.8
GetUserByOAuthBinding finds a user by provider ID and provider user ID
func SearchUsers ¶
func ValidateAccessToken ¶
func (*User) FillUserByDiscordId ¶
func (*User) FillUserByEmail ¶
func (*User) FillUserByGitHubId ¶
func (*User) FillUserById ¶
func (*User) FillUserByLinuxDOId ¶
func (*User) FillUserByOidcId ¶
func (*User) FillUserByTelegramId ¶
func (*User) FillUserByWeChatId ¶
func (*User) GetAccessToken ¶
func (*User) GetSetting ¶
func (user *User) GetSetting() dto.UserSetting
func (*User) HardDelete ¶
func (*User) SetAccessToken ¶
func (*User) SetSetting ¶
func (user *User) SetSetting(setting dto.UserSetting)
func (*User) ToBaseUser ¶
func (*User) TransferAffQuotaToQuota ¶
func (*User) UpdateGitHubId ¶ added in v0.10.8
UpdateGitHubId updates the user's GitHub ID (used for migration from login to numeric ID)
func (*User) ValidateAndFill ¶
ValidateAndFill check password & user status
type UserBase ¶
type UserBase struct {
Id int `json:"id"`
Group string `json:"group"`
Email string `json:"email"`
Quota int `json:"quota"`
Status int `json:"status"`
Username string `json:"username"`
Setting string `json:"setting"`
}
UserBase struct remains the same as it represents the cached data structure
func GetUserCache ¶
GetUserCache gets complete user cache from hash
func (*UserBase) GetSetting ¶
func (user *UserBase) GetSetting() dto.UserSetting
func (*UserBase) WriteContext ¶
type UserOAuthBinding ¶ added in v0.10.8
type UserOAuthBinding struct {
Id int `json:"id" gorm:"primaryKey"`
UserId int `json:"user_id" gorm:"index;not null"` // User ID
ProviderId int `json:"provider_id" gorm:"index;not null"` // Custom OAuth provider ID
ProviderUserId string `json:"provider_user_id" gorm:"type:varchar(256);not null"` // User ID from OAuth provider
CreatedAt time.Time `json:"created_at"`
}
UserOAuthBinding stores the binding relationship between users and custom OAuth providers
func GetUserOAuthBinding ¶ added in v0.10.8
func GetUserOAuthBinding(userId, providerId int) (*UserOAuthBinding, error)
GetUserOAuthBinding returns a specific binding for a user and provider
func GetUserOAuthBindingsByUserId ¶ added in v0.10.8
func GetUserOAuthBindingsByUserId(userId int) ([]*UserOAuthBinding, error)
GetUserOAuthBindingsByUserId returns all OAuth bindings for a user
func (UserOAuthBinding) TableName ¶ added in v0.10.8
func (UserOAuthBinding) TableName() string
type UserSubscription ¶ added in v0.10.8
type UserSubscription struct {
Id int `json:"id"`
UserId int `json:"user_id" gorm:"index;index:idx_user_sub_active,priority:1"`
PlanId int `json:"plan_id" gorm:"index"`
AmountTotal int64 `json:"amount_total" gorm:"type:bigint;not null;default:0"`
AmountUsed int64 `json:"amount_used" gorm:"type:bigint;not null;default:0"`
StartTime int64 `json:"start_time" gorm:"bigint"`
EndTime int64 `json:"end_time" gorm:"bigint;index;index:idx_user_sub_active,priority:3"`
Status string `json:"status" gorm:"type:varchar(32);index;index:idx_user_sub_active,priority:2"` // active/expired/cancelled
Source string `json:"source" gorm:"type:varchar(32);default:'order'"` // order/admin
LastResetTime int64 `json:"last_reset_time" gorm:"type:bigint;default:0"`
NextResetTime int64 `json:"next_reset_time" gorm:"type:bigint;default:0;index"`
UpgradeGroup string `json:"upgrade_group" gorm:"type:varchar(64);default:''"`
PrevUserGroup string `json:"prev_user_group" gorm:"type:varchar(64);default:''"`
CreatedAt int64 `json:"created_at" gorm:"bigint"`
UpdatedAt int64 `json:"updated_at" gorm:"bigint"`
}
User subscription instance
func CreateUserSubscriptionFromPlanTx ¶ added in v0.10.8
func CreateUserSubscriptionFromPlanTx(tx *gorm.DB, userId int, plan *SubscriptionPlan, source string) (*UserSubscription, error)
func (*UserSubscription) BeforeCreate ¶ added in v0.10.8
func (s *UserSubscription) BeforeCreate(tx *gorm.DB) error
func (*UserSubscription) BeforeUpdate ¶ added in v0.10.8
func (s *UserSubscription) BeforeUpdate(tx *gorm.DB) error
type Vendor ¶
type Vendor struct {
Id int `json:"id"`
Name string `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name_delete_at,priority:1"`
Description string `json:"description,omitempty" gorm:"type:text"`
Icon string `json:"icon,omitempty" gorm:"type:varchar(128)"`
Status int `json:"status" gorm:"default:1"`
CreatedTime int64 `json:"created_time" gorm:"bigint"`
UpdatedTime int64 `json:"updated_time" gorm:"bigint"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name_delete_at,priority:2"`
}
func GetAllVendors ¶
GetAllVendors 获取全部供应商(分页)
func SearchVendors ¶
SearchVendors 按关键字搜索供应商
Source Files
¶
- ability.go
- channel.go
- channel_cache.go
- channel_satisfy.go
- checkin.go
- custom_oauth_provider.go
- db_time.go
- log.go
- main.go
- midjourney.go
- missing_models.go
- model_extra.go
- model_meta.go
- option.go
- passkey.go
- prefill_group.go
- pricing.go
- pricing_default.go
- pricing_refresh.go
- redemption.go
- setup.go
- subscription.go
- task.go
- token.go
- token_cache.go
- topup.go
- twofa.go
- usedata.go
- user.go
- user_cache.go
- user_oauth_binding.go
- utils.go
- vendor_meta.go