Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
7b83d6e7
Commit
7b83d6e7
authored
Apr 05, 2026
by
陈曦
Browse files
Merge remote-tracking branch 'upstream/main'
parents
daa2e6df
dbb248df
Changes
106
Hide whitespace changes
Inline
Side-by-side
.github/audit-exceptions.yml
View file @
7b83d6e7
...
@@ -14,3 +14,17 @@ exceptions:
...
@@ -14,3 +14,17 @@ exceptions:
mitigation
:
"
Load
only
on
export;
restrict
export
permissions
and
data
scope"
mitigation
:
"
Load
only
on
export;
restrict
export
permissions
and
data
scope"
expires_on
:
"
2026-04-05"
expires_on
:
"
2026-04-05"
owner
:
"
security@your-domain"
owner
:
"
security@your-domain"
-
package
:
lodash
advisory
:
"
GHSA-r5fr-rjxr-66jc"
severity
:
high
reason
:
"
lodash
_.template
not
used
with
untrusted
input;
only
internal
admin
UI
templates"
mitigation
:
"
No
user-controlled
template
strings;
plan
to
migrate
to
lodash-es
tree-shaken
imports"
expires_on
:
"
2026-07-02"
owner
:
"
security@your-domain"
-
package
:
lodash-es
advisory
:
"
GHSA-r5fr-rjxr-66jc"
severity
:
high
reason
:
"
lodash-es
_.template
not
used
with
untrusted
input;
only
internal
admin
UI
templates"
mitigation
:
"
No
user-controlled
template
strings;
plan
to
migrate
to
native
JS
alternatives"
expires_on
:
"
2026-07-02"
owner
:
"
security@your-domain"
backend/cmd/server/VERSION
View file @
7b83d6e7
0.1.10
6
0.1.10
7
backend/cmd/server/wire_gen.go
View file @
7b83d6e7
...
@@ -49,6 +49,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
...
@@ -49,6 +49,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
refreshTokenCache
:=
repository
.
NewRefreshTokenCache
(
redisClient
)
refreshTokenCache
:=
repository
.
NewRefreshTokenCache
(
redisClient
)
settingRepository
:=
repository
.
NewSettingRepository
(
client
)
settingRepository
:=
repository
.
NewSettingRepository
(
client
)
groupRepository
:=
repository
.
NewGroupRepository
(
client
,
db
)
groupRepository
:=
repository
.
NewGroupRepository
(
client
,
db
)
channelRepository
:=
repository
.
NewChannelRepository
(
db
)
settingService
:=
service
.
ProvideSettingService
(
settingRepository
,
groupRepository
,
configConfig
)
settingService
:=
service
.
ProvideSettingService
(
settingRepository
,
groupRepository
,
configConfig
)
emailCache
:=
repository
.
NewEmailCache
(
redisClient
)
emailCache
:=
repository
.
NewEmailCache
(
redisClient
)
emailService
:=
service
.
NewEmailService
(
settingRepository
,
emailCache
)
emailService
:=
service
.
NewEmailService
(
settingRepository
,
emailCache
)
...
@@ -138,11 +139,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
...
@@ -138,11 +139,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
schedulerSnapshotService
:=
service
.
ProvideSchedulerSnapshotService
(
schedulerCache
,
schedulerOutboxRepository
,
accountRepository
,
groupRepository
,
configConfig
)
schedulerSnapshotService
:=
service
.
ProvideSchedulerSnapshotService
(
schedulerCache
,
schedulerOutboxRepository
,
accountRepository
,
groupRepository
,
configConfig
)
antigravityTokenProvider
:=
service
.
ProvideAntigravityTokenProvider
(
accountRepository
,
geminiTokenCache
,
antigravityOAuthService
,
oauthRefreshAPI
,
tempUnschedCache
)
antigravityTokenProvider
:=
service
.
ProvideAntigravityTokenProvider
(
accountRepository
,
geminiTokenCache
,
antigravityOAuthService
,
oauthRefreshAPI
,
tempUnschedCache
)
internal500CounterCache
:=
repository
.
NewInternal500CounterCache
(
redisClient
)
internal500CounterCache
:=
repository
.
NewInternal500CounterCache
(
redisClient
)
antigravityGatewayService
:=
service
.
NewAntigravityGatewayService
(
accountRepository
,
gatewayCache
,
schedulerSnapshotService
,
antigravityTokenProvider
,
rateLimitService
,
httpUpstream
,
settingService
,
internal500CounterCache
)
tlsFingerprintProfileRepository
:=
repository
.
NewTLSFingerprintProfileRepository
(
client
)
tlsFingerprintProfileRepository
:=
repository
.
NewTLSFingerprintProfileRepository
(
client
)
tlsFingerprintProfileCache
:=
repository
.
NewTLSFingerprintProfileCache
(
redisClient
)
tlsFingerprintProfileCache
:=
repository
.
NewTLSFingerprintProfileCache
(
redisClient
)
tlsFingerprintProfileService
:=
service
.
NewTLSFingerprintProfileService
(
tlsFingerprintProfileRepository
,
tlsFingerprintProfileCache
)
tlsFingerprintProfileService
:=
service
.
NewTLSFingerprintProfileService
(
tlsFingerprintProfileRepository
,
tlsFingerprintProfileCache
)
accountUsageService
:=
service
.
NewAccountUsageService
(
accountRepository
,
usageLogRepository
,
claudeUsageFetcher
,
geminiQuotaService
,
antigravityQuotaFetcher
,
usageCache
,
identityCache
,
tlsFingerprintProfileService
)
accountUsageService
:=
service
.
NewAccountUsageService
(
accountRepository
,
usageLogRepository
,
claudeUsageFetcher
,
geminiQuotaService
,
antigravityQuotaFetcher
,
usageCache
,
identityCache
,
tlsFingerprintProfileService
)
antigravityGatewayService
:=
service
.
NewAntigravityGatewayService
(
accountRepository
,
gatewayCache
,
schedulerSnapshotService
,
antigravityTokenProvider
,
rateLimitService
,
httpUpstream
,
settingService
,
internal500CounterCache
)
accountTestService
:=
service
.
NewAccountTestService
(
accountRepository
,
geminiTokenProvider
,
antigravityGatewayService
,
httpUpstream
,
configConfig
,
tlsFingerprintProfileService
)
accountTestService
:=
service
.
NewAccountTestService
(
accountRepository
,
geminiTokenProvider
,
antigravityGatewayService
,
httpUpstream
,
configConfig
,
tlsFingerprintProfileService
)
crsSyncService
:=
service
.
NewCRSSyncService
(
accountRepository
,
proxyRepository
,
oAuthService
,
openAIOAuthService
,
geminiOAuthService
,
configConfig
)
crsSyncService
:=
service
.
NewCRSSyncService
(
accountRepository
,
proxyRepository
,
oAuthService
,
openAIOAuthService
,
geminiOAuthService
,
configConfig
)
sessionLimitCache
:=
repository
.
ProvideSessionLimitCache
(
redisClient
,
configConfig
)
sessionLimitCache
:=
repository
.
ProvideSessionLimitCache
(
redisClient
,
configConfig
)
...
@@ -175,9 +176,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
...
@@ -175,9 +176,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
deferredService
:=
service
.
ProvideDeferredService
(
accountRepository
,
timingWheelService
)
deferredService
:=
service
.
ProvideDeferredService
(
accountRepository
,
timingWheelService
)
claudeTokenProvider
:=
service
.
ProvideClaudeTokenProvider
(
accountRepository
,
geminiTokenCache
,
oAuthService
,
oauthRefreshAPI
)
claudeTokenProvider
:=
service
.
ProvideClaudeTokenProvider
(
accountRepository
,
geminiTokenCache
,
oAuthService
,
oauthRefreshAPI
)
digestSessionStore
:=
service
.
NewDigestSessionStore
()
digestSessionStore
:=
service
.
NewDigestSessionStore
()
gatewayService
:=
service
.
NewGatewayService
(
accountRepository
,
groupRepository
,
usageLogRepository
,
usageBillingRepository
,
userRepository
,
userSubscriptionRepository
,
userGroupRateRepository
,
gatewayCache
,
configConfig
,
schedulerSnapshotService
,
concurrencyService
,
billingService
,
rateLimitService
,
billingCacheService
,
identityService
,
httpUpstream
,
deferredService
,
claudeTokenProvider
,
sessionLimitCache
,
rpmCache
,
digestSessionStore
,
settingService
,
tlsFingerprintProfileService
)
channelService
:=
service
.
NewChannelService
(
channelRepository
,
apiKeyAuthCacheInvalidator
)
modelPricingResolver
:=
service
.
NewModelPricingResolver
(
channelService
,
billingService
)
gatewayService
:=
service
.
NewGatewayService
(
accountRepository
,
groupRepository
,
usageLogRepository
,
usageBillingRepository
,
userRepository
,
userSubscriptionRepository
,
userGroupRateRepository
,
gatewayCache
,
configConfig
,
schedulerSnapshotService
,
concurrencyService
,
billingService
,
rateLimitService
,
billingCacheService
,
identityService
,
httpUpstream
,
deferredService
,
claudeTokenProvider
,
sessionLimitCache
,
rpmCache
,
digestSessionStore
,
settingService
,
tlsFingerprintProfileService
,
channelService
,
modelPricingResolver
)
openAITokenProvider
:=
service
.
ProvideOpenAITokenProvider
(
accountRepository
,
geminiTokenCache
,
openAIOAuthService
,
oauthRefreshAPI
)
openAITokenProvider
:=
service
.
ProvideOpenAITokenProvider
(
accountRepository
,
geminiTokenCache
,
openAIOAuthService
,
oauthRefreshAPI
)
openAIGatewayService
:=
service
.
NewOpenAIGatewayService
(
accountRepository
,
usageLogRepository
,
usageBillingRepository
,
userRepository
,
userSubscriptionRepository
,
userGroupRateRepository
,
gatewayCache
,
configConfig
,
schedulerSnapshotService
,
concurrencyService
,
billingService
,
rateLimitService
,
billingCacheService
,
httpUpstream
,
deferredService
,
openAITokenProvider
)
openAIGatewayService
:=
service
.
NewOpenAIGatewayService
(
accountRepository
,
usageLogRepository
,
usageBillingRepository
,
userRepository
,
userSubscriptionRepository
,
userGroupRateRepository
,
gatewayCache
,
configConfig
,
schedulerSnapshotService
,
concurrencyService
,
billingService
,
rateLimitService
,
billingCacheService
,
httpUpstream
,
deferredService
,
openAITokenProvider
,
modelPricingResolver
,
channelService
)
geminiMessagesCompatService
:=
service
.
NewGeminiMessagesCompatService
(
accountRepository
,
groupRepository
,
gatewayCache
,
schedulerSnapshotService
,
geminiTokenProvider
,
rateLimitService
,
httpUpstream
,
antigravityGatewayService
,
configConfig
)
geminiMessagesCompatService
:=
service
.
NewGeminiMessagesCompatService
(
accountRepository
,
groupRepository
,
gatewayCache
,
schedulerSnapshotService
,
geminiTokenProvider
,
rateLimitService
,
httpUpstream
,
antigravityGatewayService
,
configConfig
)
opsSystemLogSink
:=
service
.
ProvideOpsSystemLogSink
(
opsRepository
)
opsSystemLogSink
:=
service
.
ProvideOpsSystemLogSink
(
opsRepository
)
opsService
:=
service
.
NewOpsService
(
opsRepository
,
settingRepository
,
configConfig
,
accountRepository
,
userRepository
,
concurrencyService
,
gatewayService
,
openAIGatewayService
,
geminiMessagesCompatService
,
antigravityGatewayService
,
opsSystemLogSink
)
opsService
:=
service
.
NewOpsService
(
opsRepository
,
settingRepository
,
configConfig
,
accountRepository
,
userRepository
,
concurrencyService
,
gatewayService
,
openAIGatewayService
,
geminiMessagesCompatService
,
antigravityGatewayService
,
opsSystemLogSink
)
...
@@ -213,7 +216,8 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
...
@@ -213,7 +216,8 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
scheduledTestResultRepository
:=
repository
.
NewScheduledTestResultRepository
(
db
)
scheduledTestResultRepository
:=
repository
.
NewScheduledTestResultRepository
(
db
)
scheduledTestService
:=
service
.
ProvideScheduledTestService
(
scheduledTestPlanRepository
,
scheduledTestResultRepository
)
scheduledTestService
:=
service
.
ProvideScheduledTestService
(
scheduledTestPlanRepository
,
scheduledTestResultRepository
)
scheduledTestHandler
:=
admin
.
NewScheduledTestHandler
(
scheduledTestService
)
scheduledTestHandler
:=
admin
.
NewScheduledTestHandler
(
scheduledTestService
)
adminHandlers
:=
handler
.
ProvideAdminHandlers
(
dashboardHandler
,
adminUserHandler
,
groupHandler
,
accountHandler
,
adminAnnouncementHandler
,
dataManagementHandler
,
backupHandler
,
oAuthHandler
,
openAIOAuthHandler
,
geminiOAuthHandler
,
antigravityOAuthHandler
,
proxyHandler
,
adminRedeemHandler
,
promoHandler
,
settingHandler
,
opsHandler
,
systemHandler
,
adminSubscriptionHandler
,
adminUsageHandler
,
userAttributeHandler
,
errorPassthroughHandler
,
tlsFingerprintProfileHandler
,
adminAPIKeyHandler
,
scheduledTestHandler
)
channelHandler
:=
admin
.
NewChannelHandler
(
channelService
,
billingService
)
adminHandlers
:=
handler
.
ProvideAdminHandlers
(
dashboardHandler
,
adminUserHandler
,
groupHandler
,
accountHandler
,
adminAnnouncementHandler
,
dataManagementHandler
,
backupHandler
,
oAuthHandler
,
openAIOAuthHandler
,
geminiOAuthHandler
,
antigravityOAuthHandler
,
proxyHandler
,
adminRedeemHandler
,
promoHandler
,
settingHandler
,
opsHandler
,
systemHandler
,
adminSubscriptionHandler
,
adminUsageHandler
,
userAttributeHandler
,
errorPassthroughHandler
,
tlsFingerprintProfileHandler
,
adminAPIKeyHandler
,
scheduledTestHandler
,
channelHandler
)
usageRecordWorkerPool
:=
service
.
NewUsageRecordWorkerPool
(
configConfig
)
usageRecordWorkerPool
:=
service
.
NewUsageRecordWorkerPool
(
configConfig
)
userMsgQueueCache
:=
repository
.
NewUserMsgQueueCache
(
redisClient
)
userMsgQueueCache
:=
repository
.
NewUserMsgQueueCache
(
redisClient
)
userMessageQueueService
:=
service
.
ProvideUserMessageQueueService
(
userMsgQueueCache
,
rpmCache
,
configConfig
)
userMessageQueueService
:=
service
.
ProvideUserMessageQueueService
(
userMsgQueueCache
,
rpmCache
,
configConfig
)
...
...
backend/ent/migrate/schema.go
View file @
7b83d6e7
...
@@ -744,6 +744,10 @@ var (
...
@@ -744,6 +744,10 @@ var (
{
Name
:
"model"
,
Type
:
field
.
TypeString
,
Size
:
100
},
{
Name
:
"model"
,
Type
:
field
.
TypeString
,
Size
:
100
},
{
Name
:
"requested_model"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
100
},
{
Name
:
"requested_model"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
100
},
{
Name
:
"upstream_model"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
100
},
{
Name
:
"upstream_model"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
100
},
{
Name
:
"channel_id"
,
Type
:
field
.
TypeInt64
,
Nullable
:
true
},
{
Name
:
"model_mapping_chain"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
500
},
{
Name
:
"billing_tier"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
50
},
{
Name
:
"billing_mode"
,
Type
:
field
.
TypeString
,
Nullable
:
true
,
Size
:
20
},
{
Name
:
"input_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
{
Name
:
"input_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
{
Name
:
"output_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
{
Name
:
"output_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
{
Name
:
"cache_creation_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
{
Name
:
"cache_creation_tokens"
,
Type
:
field
.
TypeInt
,
Default
:
0
},
...
@@ -783,31 +787,31 @@ var (
...
@@ -783,31 +787,31 @@ var (
ForeignKeys
:
[]
*
schema
.
ForeignKey
{
ForeignKeys
:
[]
*
schema
.
ForeignKey
{
{
{
Symbol
:
"usage_logs_api_keys_usage_logs"
,
Symbol
:
"usage_logs_api_keys_usage_logs"
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
0
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
4
]},
RefColumns
:
[]
*
schema
.
Column
{
APIKeysColumns
[
0
]},
RefColumns
:
[]
*
schema
.
Column
{
APIKeysColumns
[
0
]},
OnDelete
:
schema
.
NoAction
,
OnDelete
:
schema
.
NoAction
,
},
},
{
{
Symbol
:
"usage_logs_accounts_usage_logs"
,
Symbol
:
"usage_logs_accounts_usage_logs"
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
1
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
5
]},
RefColumns
:
[]
*
schema
.
Column
{
AccountsColumns
[
0
]},
RefColumns
:
[]
*
schema
.
Column
{
AccountsColumns
[
0
]},
OnDelete
:
schema
.
NoAction
,
OnDelete
:
schema
.
NoAction
,
},
},
{
{
Symbol
:
"usage_logs_groups_usage_logs"
,
Symbol
:
"usage_logs_groups_usage_logs"
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
2
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
6
]},
RefColumns
:
[]
*
schema
.
Column
{
GroupsColumns
[
0
]},
RefColumns
:
[]
*
schema
.
Column
{
GroupsColumns
[
0
]},
OnDelete
:
schema
.
SetNull
,
OnDelete
:
schema
.
SetNull
,
},
},
{
{
Symbol
:
"usage_logs_users_usage_logs"
,
Symbol
:
"usage_logs_users_usage_logs"
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
3
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
7
]},
RefColumns
:
[]
*
schema
.
Column
{
UsersColumns
[
0
]},
RefColumns
:
[]
*
schema
.
Column
{
UsersColumns
[
0
]},
OnDelete
:
schema
.
NoAction
,
OnDelete
:
schema
.
NoAction
,
},
},
{
{
Symbol
:
"usage_logs_user_subscriptions_usage_logs"
,
Symbol
:
"usage_logs_user_subscriptions_usage_logs"
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
4
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
8
]},
RefColumns
:
[]
*
schema
.
Column
{
UserSubscriptionsColumns
[
0
]},
RefColumns
:
[]
*
schema
.
Column
{
UserSubscriptionsColumns
[
0
]},
OnDelete
:
schema
.
SetNull
,
OnDelete
:
schema
.
SetNull
,
},
},
...
@@ -816,32 +820,32 @@ var (
...
@@ -816,32 +820,32 @@ var (
{
{
Name
:
"usagelog_user_id"
,
Name
:
"usagelog_user_id"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
3
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
7
]},
},
},
{
{
Name
:
"usagelog_api_key_id"
,
Name
:
"usagelog_api_key_id"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
0
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
4
]},
},
},
{
{
Name
:
"usagelog_account_id"
,
Name
:
"usagelog_account_id"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
1
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
5
]},
},
},
{
{
Name
:
"usagelog_group_id"
,
Name
:
"usagelog_group_id"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
2
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
6
]},
},
},
{
{
Name
:
"usagelog_subscription_id"
,
Name
:
"usagelog_subscription_id"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
4
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
8
]},
},
},
{
{
Name
:
"usagelog_created_at"
,
Name
:
"usagelog_created_at"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
29
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
33
]},
},
},
{
{
Name
:
"usagelog_model"
,
Name
:
"usagelog_model"
,
...
@@ -861,17 +865,17 @@ var (
...
@@ -861,17 +865,17 @@ var (
{
{
Name
:
"usagelog_user_id_created_at"
,
Name
:
"usagelog_user_id_created_at"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
3
],
UsageLogsColumns
[
29
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
7
],
UsageLogsColumns
[
33
]},
},
},
{
{
Name
:
"usagelog_api_key_id_created_at"
,
Name
:
"usagelog_api_key_id_created_at"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
0
],
UsageLogsColumns
[
29
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
4
],
UsageLogsColumns
[
33
]},
},
},
{
{
Name
:
"usagelog_group_id_created_at"
,
Name
:
"usagelog_group_id_created_at"
,
Unique
:
false
,
Unique
:
false
,
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
2
],
UsageLogsColumns
[
29
]},
Columns
:
[]
*
schema
.
Column
{
UsageLogsColumns
[
3
6
],
UsageLogsColumns
[
33
]},
},
},
},
},
}
}
...
...
backend/ent/mutation.go
View file @
7b83d6e7
...
@@ -19725,6 +19725,11 @@ type UsageLogMutation struct {
...
@@ -19725,6 +19725,11 @@ type UsageLogMutation struct {
model *string
model *string
requested_model *string
requested_model *string
upstream_model *string
upstream_model *string
channel_id *int64
addchannel_id *int64
model_mapping_chain *string
billing_tier *string
billing_mode *string
input_tokens *int
input_tokens *int
addinput_tokens *int
addinput_tokens *int
output_tokens *int
output_tokens *int
...
@@ -20160,6 +20165,223 @@ func (m *UsageLogMutation) ResetUpstreamModel() {
...
@@ -20160,6 +20165,223 @@ func (m *UsageLogMutation) ResetUpstreamModel() {
delete(m.clearedFields, usagelog.FieldUpstreamModel)
delete(m.clearedFields, usagelog.FieldUpstreamModel)
}
}
// SetChannelID sets the "channel_id" field.
func (m *UsageLogMutation) SetChannelID(i int64) {
m.channel_id = &i
m.addchannel_id = nil
}
// ChannelID returns the value of the "channel_id" field in the mutation.
func (m *UsageLogMutation) ChannelID() (r int64, exists bool) {
v := m.channel_id
if v == nil {
return
}
return *v, true
}
// OldChannelID returns the old "channel_id" field's value of the UsageLog entity.
// If the UsageLog object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UsageLogMutation) OldChannelID(ctx context.Context) (v *int64, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldChannelID is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldChannelID requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldChannelID: %w", err)
}
return oldValue.ChannelID, nil
}
// AddChannelID adds i to the "channel_id" field.
func (m *UsageLogMutation) AddChannelID(i int64) {
if m.addchannel_id != nil {
*m.addchannel_id += i
} else {
m.addchannel_id = &i
}
}
// AddedChannelID returns the value that was added to the "channel_id" field in this mutation.
func (m *UsageLogMutation) AddedChannelID() (r int64, exists bool) {
v := m.addchannel_id
if v == nil {
return
}
return *v, true
}
// ClearChannelID clears the value of the "channel_id" field.
func (m *UsageLogMutation) ClearChannelID() {
m.channel_id = nil
m.addchannel_id = nil
m.clearedFields[usagelog.FieldChannelID] = struct{}{}
}
// ChannelIDCleared returns if the "channel_id" field was cleared in this mutation.
func (m *UsageLogMutation) ChannelIDCleared() bool {
_, ok := m.clearedFields[usagelog.FieldChannelID]
return ok
}
// ResetChannelID resets all changes to the "channel_id" field.
func (m *UsageLogMutation) ResetChannelID() {
m.channel_id = nil
m.addchannel_id = nil
delete(m.clearedFields, usagelog.FieldChannelID)
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func (m *UsageLogMutation) SetModelMappingChain(s string) {
m.model_mapping_chain = &s
}
// ModelMappingChain returns the value of the "model_mapping_chain" field in the mutation.
func (m *UsageLogMutation) ModelMappingChain() (r string, exists bool) {
v := m.model_mapping_chain
if v == nil {
return
}
return *v, true
}
// OldModelMappingChain returns the old "model_mapping_chain" field's value of the UsageLog entity.
// If the UsageLog object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UsageLogMutation) OldModelMappingChain(ctx context.Context) (v *string, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldModelMappingChain is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldModelMappingChain requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldModelMappingChain: %w", err)
}
return oldValue.ModelMappingChain, nil
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func (m *UsageLogMutation) ClearModelMappingChain() {
m.model_mapping_chain = nil
m.clearedFields[usagelog.FieldModelMappingChain] = struct{}{}
}
// ModelMappingChainCleared returns if the "model_mapping_chain" field was cleared in this mutation.
func (m *UsageLogMutation) ModelMappingChainCleared() bool {
_, ok := m.clearedFields[usagelog.FieldModelMappingChain]
return ok
}
// ResetModelMappingChain resets all changes to the "model_mapping_chain" field.
func (m *UsageLogMutation) ResetModelMappingChain() {
m.model_mapping_chain = nil
delete(m.clearedFields, usagelog.FieldModelMappingChain)
}
// SetBillingTier sets the "billing_tier" field.
func (m *UsageLogMutation) SetBillingTier(s string) {
m.billing_tier = &s
}
// BillingTier returns the value of the "billing_tier" field in the mutation.
func (m *UsageLogMutation) BillingTier() (r string, exists bool) {
v := m.billing_tier
if v == nil {
return
}
return *v, true
}
// OldBillingTier returns the old "billing_tier" field's value of the UsageLog entity.
// If the UsageLog object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UsageLogMutation) OldBillingTier(ctx context.Context) (v *string, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldBillingTier is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldBillingTier requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldBillingTier: %w", err)
}
return oldValue.BillingTier, nil
}
// ClearBillingTier clears the value of the "billing_tier" field.
func (m *UsageLogMutation) ClearBillingTier() {
m.billing_tier = nil
m.clearedFields[usagelog.FieldBillingTier] = struct{}{}
}
// BillingTierCleared returns if the "billing_tier" field was cleared in this mutation.
func (m *UsageLogMutation) BillingTierCleared() bool {
_, ok := m.clearedFields[usagelog.FieldBillingTier]
return ok
}
// ResetBillingTier resets all changes to the "billing_tier" field.
func (m *UsageLogMutation) ResetBillingTier() {
m.billing_tier = nil
delete(m.clearedFields, usagelog.FieldBillingTier)
}
// SetBillingMode sets the "billing_mode" field.
func (m *UsageLogMutation) SetBillingMode(s string) {
m.billing_mode = &s
}
// BillingMode returns the value of the "billing_mode" field in the mutation.
func (m *UsageLogMutation) BillingMode() (r string, exists bool) {
v := m.billing_mode
if v == nil {
return
}
return *v, true
}
// OldBillingMode returns the old "billing_mode" field's value of the UsageLog entity.
// If the UsageLog object wasn't provided to the builder, the object is fetched from the database.
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
func (m *UsageLogMutation) OldBillingMode(ctx context.Context) (v *string, err error) {
if !m.op.Is(OpUpdateOne) {
return v, errors.New("OldBillingMode is only allowed on UpdateOne operations")
}
if m.id == nil || m.oldValue == nil {
return v, errors.New("OldBillingMode requires an ID field in the mutation")
}
oldValue, err := m.oldValue(ctx)
if err != nil {
return v, fmt.Errorf("querying old value for OldBillingMode: %w", err)
}
return oldValue.BillingMode, nil
}
// ClearBillingMode clears the value of the "billing_mode" field.
func (m *UsageLogMutation) ClearBillingMode() {
m.billing_mode = nil
m.clearedFields[usagelog.FieldBillingMode] = struct{}{}
}
// BillingModeCleared returns if the "billing_mode" field was cleared in this mutation.
func (m *UsageLogMutation) BillingModeCleared() bool {
_, ok := m.clearedFields[usagelog.FieldBillingMode]
return ok
}
// ResetBillingMode resets all changes to the "billing_mode" field.
func (m *UsageLogMutation) ResetBillingMode() {
m.billing_mode = nil
delete(m.clearedFields, usagelog.FieldBillingMode)
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func (m *UsageLogMutation) SetGroupID(i int64) {
func (m *UsageLogMutation) SetGroupID(i int64) {
m.group = &i
m.group = &i
...
@@ -21781,7 +22003,7 @@ func (m *UsageLogMutation) Type() string {
...
@@ -21781,7 +22003,7 @@ func (m *UsageLogMutation) Type() string {
// order to get all numeric fields that were incremented/decremented, call
// order to get all numeric fields that were incremented/decremented, call
// AddedFields().
// AddedFields().
func (m *UsageLogMutation) Fields() []string {
func (m *UsageLogMutation) Fields() []string {
fields := make([]string, 0, 3
4
)
fields := make([]string, 0, 3
8
)
if m.user != nil {
if m.user != nil {
fields = append(fields, usagelog.FieldUserID)
fields = append(fields, usagelog.FieldUserID)
}
}
...
@@ -21803,6 +22025,18 @@ func (m *UsageLogMutation) Fields() []string {
...
@@ -21803,6 +22025,18 @@ func (m *UsageLogMutation) Fields() []string {
if m.upstream_model != nil {
if m.upstream_model != nil {
fields = append(fields, usagelog.FieldUpstreamModel)
fields = append(fields, usagelog.FieldUpstreamModel)
}
}
if m.channel_id != nil {
fields = append(fields, usagelog.FieldChannelID)
}
if m.model_mapping_chain != nil {
fields = append(fields, usagelog.FieldModelMappingChain)
}
if m.billing_tier != nil {
fields = append(fields, usagelog.FieldBillingTier)
}
if m.billing_mode != nil {
fields = append(fields, usagelog.FieldBillingMode)
}
if m.group != nil {
if m.group != nil {
fields = append(fields, usagelog.FieldGroupID)
fields = append(fields, usagelog.FieldGroupID)
}
}
...
@@ -21906,6 +22140,14 @@ func (m *UsageLogMutation) Field(name string) (ent.Value, bool) {
...
@@ -21906,6 +22140,14 @@ func (m *UsageLogMutation) Field(name string) (ent.Value, bool) {
return m.RequestedModel()
return m.RequestedModel()
case usagelog.FieldUpstreamModel:
case usagelog.FieldUpstreamModel:
return m.UpstreamModel()
return m.UpstreamModel()
case usagelog.FieldChannelID:
return m.ChannelID()
case usagelog.FieldModelMappingChain:
return m.ModelMappingChain()
case usagelog.FieldBillingTier:
return m.BillingTier()
case usagelog.FieldBillingMode:
return m.BillingMode()
case usagelog.FieldGroupID:
case usagelog.FieldGroupID:
return m.GroupID()
return m.GroupID()
case usagelog.FieldSubscriptionID:
case usagelog.FieldSubscriptionID:
...
@@ -21983,6 +22225,14 @@ func (m *UsageLogMutation) OldField(ctx context.Context, name string) (ent.Value
...
@@ -21983,6 +22225,14 @@ func (m *UsageLogMutation) OldField(ctx context.Context, name string) (ent.Value
return m.OldRequestedModel(ctx)
return m.OldRequestedModel(ctx)
case usagelog.FieldUpstreamModel:
case usagelog.FieldUpstreamModel:
return m.OldUpstreamModel(ctx)
return m.OldUpstreamModel(ctx)
case usagelog.FieldChannelID:
return m.OldChannelID(ctx)
case usagelog.FieldModelMappingChain:
return m.OldModelMappingChain(ctx)
case usagelog.FieldBillingTier:
return m.OldBillingTier(ctx)
case usagelog.FieldBillingMode:
return m.OldBillingMode(ctx)
case usagelog.FieldGroupID:
case usagelog.FieldGroupID:
return m.OldGroupID(ctx)
return m.OldGroupID(ctx)
case usagelog.FieldSubscriptionID:
case usagelog.FieldSubscriptionID:
...
@@ -22095,6 +22345,34 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error {
...
@@ -22095,6 +22345,34 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error {
}
}
m.SetUpstreamModel(v)
m.SetUpstreamModel(v)
return nil
return nil
case usagelog.FieldChannelID:
v, ok := value.(int64)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetChannelID(v)
return nil
case usagelog.FieldModelMappingChain:
v, ok := value.(string)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetModelMappingChain(v)
return nil
case usagelog.FieldBillingTier:
v, ok := value.(string)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetBillingTier(v)
return nil
case usagelog.FieldBillingMode:
v, ok := value.(string)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.SetBillingMode(v)
return nil
case usagelog.FieldGroupID:
case usagelog.FieldGroupID:
v, ok := value.(int64)
v, ok := value.(int64)
if !ok {
if !ok {
...
@@ -22292,6 +22570,9 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error {
...
@@ -22292,6 +22570,9 @@ func (m *UsageLogMutation) SetField(name string, value ent.Value) error {
// this mutation.
// this mutation.
func (m *UsageLogMutation) AddedFields() []string {
func (m *UsageLogMutation) AddedFields() []string {
var fields []string
var fields []string
if m.addchannel_id != nil {
fields = append(fields, usagelog.FieldChannelID)
}
if m.addinput_tokens != nil {
if m.addinput_tokens != nil {
fields = append(fields, usagelog.FieldInputTokens)
fields = append(fields, usagelog.FieldInputTokens)
}
}
...
@@ -22354,6 +22635,8 @@ func (m *UsageLogMutation) AddedFields() []string {
...
@@ -22354,6 +22635,8 @@ func (m *UsageLogMutation) AddedFields() []string {
// was not set, or was not defined in the schema.
// was not set, or was not defined in the schema.
func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) {
func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) {
switch name {
switch name {
case usagelog.FieldChannelID:
return m.AddedChannelID()
case usagelog.FieldInputTokens:
case usagelog.FieldInputTokens:
return m.AddedInputTokens()
return m.AddedInputTokens()
case usagelog.FieldOutputTokens:
case usagelog.FieldOutputTokens:
...
@@ -22399,6 +22682,13 @@ func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) {
...
@@ -22399,6 +22682,13 @@ func (m *UsageLogMutation) AddedField(name string) (ent.Value, bool) {
// type.
// type.
func (m *UsageLogMutation) AddField(name string, value ent.Value) error {
func (m *UsageLogMutation) AddField(name string, value ent.Value) error {
switch name {
switch name {
case usagelog.FieldChannelID:
v, ok := value.(int64)
if !ok {
return fmt.Errorf("unexpected type %T for field %s", value, name)
}
m.AddChannelID(v)
return nil
case usagelog.FieldInputTokens:
case usagelog.FieldInputTokens:
v, ok := value.(int)
v, ok := value.(int)
if !ok {
if !ok {
...
@@ -22539,6 +22829,18 @@ func (m *UsageLogMutation) ClearedFields() []string {
...
@@ -22539,6 +22829,18 @@ func (m *UsageLogMutation) ClearedFields() []string {
if m.FieldCleared(usagelog.FieldUpstreamModel) {
if m.FieldCleared(usagelog.FieldUpstreamModel) {
fields = append(fields, usagelog.FieldUpstreamModel)
fields = append(fields, usagelog.FieldUpstreamModel)
}
}
if m.FieldCleared(usagelog.FieldChannelID) {
fields = append(fields, usagelog.FieldChannelID)
}
if m.FieldCleared(usagelog.FieldModelMappingChain) {
fields = append(fields, usagelog.FieldModelMappingChain)
}
if m.FieldCleared(usagelog.FieldBillingTier) {
fields = append(fields, usagelog.FieldBillingTier)
}
if m.FieldCleared(usagelog.FieldBillingMode) {
fields = append(fields, usagelog.FieldBillingMode)
}
if m.FieldCleared(usagelog.FieldGroupID) {
if m.FieldCleared(usagelog.FieldGroupID) {
fields = append(fields, usagelog.FieldGroupID)
fields = append(fields, usagelog.FieldGroupID)
}
}
...
@@ -22586,6 +22888,18 @@ func (m *UsageLogMutation) ClearField(name string) error {
...
@@ -22586,6 +22888,18 @@ func (m *UsageLogMutation) ClearField(name string) error {
case usagelog.FieldUpstreamModel:
case usagelog.FieldUpstreamModel:
m.ClearUpstreamModel()
m.ClearUpstreamModel()
return nil
return nil
case usagelog.FieldChannelID:
m.ClearChannelID()
return nil
case usagelog.FieldModelMappingChain:
m.ClearModelMappingChain()
return nil
case usagelog.FieldBillingTier:
m.ClearBillingTier()
return nil
case usagelog.FieldBillingMode:
m.ClearBillingMode()
return nil
case usagelog.FieldGroupID:
case usagelog.FieldGroupID:
m.ClearGroupID()
m.ClearGroupID()
return nil
return nil
...
@@ -22642,6 +22956,18 @@ func (m *UsageLogMutation) ResetField(name string) error {
...
@@ -22642,6 +22956,18 @@ func (m *UsageLogMutation) ResetField(name string) error {
case usagelog.FieldUpstreamModel:
case usagelog.FieldUpstreamModel:
m.ResetUpstreamModel()
m.ResetUpstreamModel()
return nil
return nil
case usagelog.FieldChannelID:
m.ResetChannelID()
return nil
case usagelog.FieldModelMappingChain:
m.ResetModelMappingChain()
return nil
case usagelog.FieldBillingTier:
m.ResetBillingTier()
return nil
case usagelog.FieldBillingMode:
m.ResetBillingMode()
return nil
case usagelog.FieldGroupID:
case usagelog.FieldGroupID:
m.ResetGroupID()
m.ResetGroupID()
return nil
return nil
...
...
backend/ent/runtime/runtime.go
View file @
7b83d6e7
...
@@ -875,92 +875,104 @@ func init() {
...
@@ -875,92 +875,104 @@ func init() {
usagelogDescUpstreamModel
:=
usagelogFields
[
6
]
.
Descriptor
()
usagelogDescUpstreamModel
:=
usagelogFields
[
6
]
.
Descriptor
()
// usagelog.UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save.
// usagelog.UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save.
usagelog
.
UpstreamModelValidator
=
usagelogDescUpstreamModel
.
Validators
[
0
]
.
(
func
(
string
)
error
)
usagelog
.
UpstreamModelValidator
=
usagelogDescUpstreamModel
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescModelMappingChain is the schema descriptor for model_mapping_chain field.
usagelogDescModelMappingChain
:=
usagelogFields
[
8
]
.
Descriptor
()
// usagelog.ModelMappingChainValidator is a validator for the "model_mapping_chain" field. It is called by the builders before save.
usagelog
.
ModelMappingChainValidator
=
usagelogDescModelMappingChain
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescBillingTier is the schema descriptor for billing_tier field.
usagelogDescBillingTier
:=
usagelogFields
[
9
]
.
Descriptor
()
// usagelog.BillingTierValidator is a validator for the "billing_tier" field. It is called by the builders before save.
usagelog
.
BillingTierValidator
=
usagelogDescBillingTier
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescBillingMode is the schema descriptor for billing_mode field.
usagelogDescBillingMode
:=
usagelogFields
[
10
]
.
Descriptor
()
// usagelog.BillingModeValidator is a validator for the "billing_mode" field. It is called by the builders before save.
usagelog
.
BillingModeValidator
=
usagelogDescBillingMode
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescInputTokens is the schema descriptor for input_tokens field.
// usagelogDescInputTokens is the schema descriptor for input_tokens field.
usagelogDescInputTokens
:=
usagelogFields
[
9
]
.
Descriptor
()
usagelogDescInputTokens
:=
usagelogFields
[
13
]
.
Descriptor
()
// usagelog.DefaultInputTokens holds the default value on creation for the input_tokens field.
// usagelog.DefaultInputTokens holds the default value on creation for the input_tokens field.
usagelog
.
DefaultInputTokens
=
usagelogDescInputTokens
.
Default
.
(
int
)
usagelog
.
DefaultInputTokens
=
usagelogDescInputTokens
.
Default
.
(
int
)
// usagelogDescOutputTokens is the schema descriptor for output_tokens field.
// usagelogDescOutputTokens is the schema descriptor for output_tokens field.
usagelogDescOutputTokens
:=
usagelogFields
[
1
0
]
.
Descriptor
()
usagelogDescOutputTokens
:=
usagelogFields
[
1
4
]
.
Descriptor
()
// usagelog.DefaultOutputTokens holds the default value on creation for the output_tokens field.
// usagelog.DefaultOutputTokens holds the default value on creation for the output_tokens field.
usagelog
.
DefaultOutputTokens
=
usagelogDescOutputTokens
.
Default
.
(
int
)
usagelog
.
DefaultOutputTokens
=
usagelogDescOutputTokens
.
Default
.
(
int
)
// usagelogDescCacheCreationTokens is the schema descriptor for cache_creation_tokens field.
// usagelogDescCacheCreationTokens is the schema descriptor for cache_creation_tokens field.
usagelogDescCacheCreationTokens
:=
usagelogFields
[
1
1
]
.
Descriptor
()
usagelogDescCacheCreationTokens
:=
usagelogFields
[
1
5
]
.
Descriptor
()
// usagelog.DefaultCacheCreationTokens holds the default value on creation for the cache_creation_tokens field.
// usagelog.DefaultCacheCreationTokens holds the default value on creation for the cache_creation_tokens field.
usagelog
.
DefaultCacheCreationTokens
=
usagelogDescCacheCreationTokens
.
Default
.
(
int
)
usagelog
.
DefaultCacheCreationTokens
=
usagelogDescCacheCreationTokens
.
Default
.
(
int
)
// usagelogDescCacheReadTokens is the schema descriptor for cache_read_tokens field.
// usagelogDescCacheReadTokens is the schema descriptor for cache_read_tokens field.
usagelogDescCacheReadTokens
:=
usagelogFields
[
1
2
]
.
Descriptor
()
usagelogDescCacheReadTokens
:=
usagelogFields
[
1
6
]
.
Descriptor
()
// usagelog.DefaultCacheReadTokens holds the default value on creation for the cache_read_tokens field.
// usagelog.DefaultCacheReadTokens holds the default value on creation for the cache_read_tokens field.
usagelog
.
DefaultCacheReadTokens
=
usagelogDescCacheReadTokens
.
Default
.
(
int
)
usagelog
.
DefaultCacheReadTokens
=
usagelogDescCacheReadTokens
.
Default
.
(
int
)
// usagelogDescCacheCreation5mTokens is the schema descriptor for cache_creation_5m_tokens field.
// usagelogDescCacheCreation5mTokens is the schema descriptor for cache_creation_5m_tokens field.
usagelogDescCacheCreation5mTokens
:=
usagelogFields
[
1
3
]
.
Descriptor
()
usagelogDescCacheCreation5mTokens
:=
usagelogFields
[
1
7
]
.
Descriptor
()
// usagelog.DefaultCacheCreation5mTokens holds the default value on creation for the cache_creation_5m_tokens field.
// usagelog.DefaultCacheCreation5mTokens holds the default value on creation for the cache_creation_5m_tokens field.
usagelog
.
DefaultCacheCreation5mTokens
=
usagelogDescCacheCreation5mTokens
.
Default
.
(
int
)
usagelog
.
DefaultCacheCreation5mTokens
=
usagelogDescCacheCreation5mTokens
.
Default
.
(
int
)
// usagelogDescCacheCreation1hTokens is the schema descriptor for cache_creation_1h_tokens field.
// usagelogDescCacheCreation1hTokens is the schema descriptor for cache_creation_1h_tokens field.
usagelogDescCacheCreation1hTokens
:=
usagelogFields
[
1
4
]
.
Descriptor
()
usagelogDescCacheCreation1hTokens
:=
usagelogFields
[
1
8
]
.
Descriptor
()
// usagelog.DefaultCacheCreation1hTokens holds the default value on creation for the cache_creation_1h_tokens field.
// usagelog.DefaultCacheCreation1hTokens holds the default value on creation for the cache_creation_1h_tokens field.
usagelog
.
DefaultCacheCreation1hTokens
=
usagelogDescCacheCreation1hTokens
.
Default
.
(
int
)
usagelog
.
DefaultCacheCreation1hTokens
=
usagelogDescCacheCreation1hTokens
.
Default
.
(
int
)
// usagelogDescInputCost is the schema descriptor for input_cost field.
// usagelogDescInputCost is the schema descriptor for input_cost field.
usagelogDescInputCost
:=
usagelogFields
[
1
5
]
.
Descriptor
()
usagelogDescInputCost
:=
usagelogFields
[
1
9
]
.
Descriptor
()
// usagelog.DefaultInputCost holds the default value on creation for the input_cost field.
// usagelog.DefaultInputCost holds the default value on creation for the input_cost field.
usagelog
.
DefaultInputCost
=
usagelogDescInputCost
.
Default
.
(
float64
)
usagelog
.
DefaultInputCost
=
usagelogDescInputCost
.
Default
.
(
float64
)
// usagelogDescOutputCost is the schema descriptor for output_cost field.
// usagelogDescOutputCost is the schema descriptor for output_cost field.
usagelogDescOutputCost
:=
usagelogFields
[
16
]
.
Descriptor
()
usagelogDescOutputCost
:=
usagelogFields
[
20
]
.
Descriptor
()
// usagelog.DefaultOutputCost holds the default value on creation for the output_cost field.
// usagelog.DefaultOutputCost holds the default value on creation for the output_cost field.
usagelog
.
DefaultOutputCost
=
usagelogDescOutputCost
.
Default
.
(
float64
)
usagelog
.
DefaultOutputCost
=
usagelogDescOutputCost
.
Default
.
(
float64
)
// usagelogDescCacheCreationCost is the schema descriptor for cache_creation_cost field.
// usagelogDescCacheCreationCost is the schema descriptor for cache_creation_cost field.
usagelogDescCacheCreationCost
:=
usagelogFields
[
1
7
]
.
Descriptor
()
usagelogDescCacheCreationCost
:=
usagelogFields
[
2
1
]
.
Descriptor
()
// usagelog.DefaultCacheCreationCost holds the default value on creation for the cache_creation_cost field.
// usagelog.DefaultCacheCreationCost holds the default value on creation for the cache_creation_cost field.
usagelog
.
DefaultCacheCreationCost
=
usagelogDescCacheCreationCost
.
Default
.
(
float64
)
usagelog
.
DefaultCacheCreationCost
=
usagelogDescCacheCreationCost
.
Default
.
(
float64
)
// usagelogDescCacheReadCost is the schema descriptor for cache_read_cost field.
// usagelogDescCacheReadCost is the schema descriptor for cache_read_cost field.
usagelogDescCacheReadCost
:=
usagelogFields
[
18
]
.
Descriptor
()
usagelogDescCacheReadCost
:=
usagelogFields
[
22
]
.
Descriptor
()
// usagelog.DefaultCacheReadCost holds the default value on creation for the cache_read_cost field.
// usagelog.DefaultCacheReadCost holds the default value on creation for the cache_read_cost field.
usagelog
.
DefaultCacheReadCost
=
usagelogDescCacheReadCost
.
Default
.
(
float64
)
usagelog
.
DefaultCacheReadCost
=
usagelogDescCacheReadCost
.
Default
.
(
float64
)
// usagelogDescTotalCost is the schema descriptor for total_cost field.
// usagelogDescTotalCost is the schema descriptor for total_cost field.
usagelogDescTotalCost
:=
usagelogFields
[
19
]
.
Descriptor
()
usagelogDescTotalCost
:=
usagelogFields
[
23
]
.
Descriptor
()
// usagelog.DefaultTotalCost holds the default value on creation for the total_cost field.
// usagelog.DefaultTotalCost holds the default value on creation for the total_cost field.
usagelog
.
DefaultTotalCost
=
usagelogDescTotalCost
.
Default
.
(
float64
)
usagelog
.
DefaultTotalCost
=
usagelogDescTotalCost
.
Default
.
(
float64
)
// usagelogDescActualCost is the schema descriptor for actual_cost field.
// usagelogDescActualCost is the schema descriptor for actual_cost field.
usagelogDescActualCost
:=
usagelogFields
[
2
0
]
.
Descriptor
()
usagelogDescActualCost
:=
usagelogFields
[
2
4
]
.
Descriptor
()
// usagelog.DefaultActualCost holds the default value on creation for the actual_cost field.
// usagelog.DefaultActualCost holds the default value on creation for the actual_cost field.
usagelog
.
DefaultActualCost
=
usagelogDescActualCost
.
Default
.
(
float64
)
usagelog
.
DefaultActualCost
=
usagelogDescActualCost
.
Default
.
(
float64
)
// usagelogDescRateMultiplier is the schema descriptor for rate_multiplier field.
// usagelogDescRateMultiplier is the schema descriptor for rate_multiplier field.
usagelogDescRateMultiplier
:=
usagelogFields
[
2
1
]
.
Descriptor
()
usagelogDescRateMultiplier
:=
usagelogFields
[
2
5
]
.
Descriptor
()
// usagelog.DefaultRateMultiplier holds the default value on creation for the rate_multiplier field.
// usagelog.DefaultRateMultiplier holds the default value on creation for the rate_multiplier field.
usagelog
.
DefaultRateMultiplier
=
usagelogDescRateMultiplier
.
Default
.
(
float64
)
usagelog
.
DefaultRateMultiplier
=
usagelogDescRateMultiplier
.
Default
.
(
float64
)
// usagelogDescBillingType is the schema descriptor for billing_type field.
// usagelogDescBillingType is the schema descriptor for billing_type field.
usagelogDescBillingType
:=
usagelogFields
[
2
3
]
.
Descriptor
()
usagelogDescBillingType
:=
usagelogFields
[
2
7
]
.
Descriptor
()
// usagelog.DefaultBillingType holds the default value on creation for the billing_type field.
// usagelog.DefaultBillingType holds the default value on creation for the billing_type field.
usagelog
.
DefaultBillingType
=
usagelogDescBillingType
.
Default
.
(
int8
)
usagelog
.
DefaultBillingType
=
usagelogDescBillingType
.
Default
.
(
int8
)
// usagelogDescStream is the schema descriptor for stream field.
// usagelogDescStream is the schema descriptor for stream field.
usagelogDescStream
:=
usagelogFields
[
2
4
]
.
Descriptor
()
usagelogDescStream
:=
usagelogFields
[
2
8
]
.
Descriptor
()
// usagelog.DefaultStream holds the default value on creation for the stream field.
// usagelog.DefaultStream holds the default value on creation for the stream field.
usagelog
.
DefaultStream
=
usagelogDescStream
.
Default
.
(
bool
)
usagelog
.
DefaultStream
=
usagelogDescStream
.
Default
.
(
bool
)
// usagelogDescUserAgent is the schema descriptor for user_agent field.
// usagelogDescUserAgent is the schema descriptor for user_agent field.
usagelogDescUserAgent
:=
usagelogFields
[
27
]
.
Descriptor
()
usagelogDescUserAgent
:=
usagelogFields
[
31
]
.
Descriptor
()
// usagelog.UserAgentValidator is a validator for the "user_agent" field. It is called by the builders before save.
// usagelog.UserAgentValidator is a validator for the "user_agent" field. It is called by the builders before save.
usagelog
.
UserAgentValidator
=
usagelogDescUserAgent
.
Validators
[
0
]
.
(
func
(
string
)
error
)
usagelog
.
UserAgentValidator
=
usagelogDescUserAgent
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescIPAddress is the schema descriptor for ip_address field.
// usagelogDescIPAddress is the schema descriptor for ip_address field.
usagelogDescIPAddress
:=
usagelogFields
[
2
8
]
.
Descriptor
()
usagelogDescIPAddress
:=
usagelogFields
[
3
2
]
.
Descriptor
()
// usagelog.IPAddressValidator is a validator for the "ip_address" field. It is called by the builders before save.
// usagelog.IPAddressValidator is a validator for the "ip_address" field. It is called by the builders before save.
usagelog
.
IPAddressValidator
=
usagelogDescIPAddress
.
Validators
[
0
]
.
(
func
(
string
)
error
)
usagelog
.
IPAddressValidator
=
usagelogDescIPAddress
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescImageCount is the schema descriptor for image_count field.
// usagelogDescImageCount is the schema descriptor for image_count field.
usagelogDescImageCount
:=
usagelogFields
[
29
]
.
Descriptor
()
usagelogDescImageCount
:=
usagelogFields
[
33
]
.
Descriptor
()
// usagelog.DefaultImageCount holds the default value on creation for the image_count field.
// usagelog.DefaultImageCount holds the default value on creation for the image_count field.
usagelog
.
DefaultImageCount
=
usagelogDescImageCount
.
Default
.
(
int
)
usagelog
.
DefaultImageCount
=
usagelogDescImageCount
.
Default
.
(
int
)
// usagelogDescImageSize is the schema descriptor for image_size field.
// usagelogDescImageSize is the schema descriptor for image_size field.
usagelogDescImageSize
:=
usagelogFields
[
3
0
]
.
Descriptor
()
usagelogDescImageSize
:=
usagelogFields
[
3
4
]
.
Descriptor
()
// usagelog.ImageSizeValidator is a validator for the "image_size" field. It is called by the builders before save.
// usagelog.ImageSizeValidator is a validator for the "image_size" field. It is called by the builders before save.
usagelog
.
ImageSizeValidator
=
usagelogDescImageSize
.
Validators
[
0
]
.
(
func
(
string
)
error
)
usagelog
.
ImageSizeValidator
=
usagelogDescImageSize
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescMediaType is the schema descriptor for media_type field.
// usagelogDescMediaType is the schema descriptor for media_type field.
usagelogDescMediaType
:=
usagelogFields
[
3
1
]
.
Descriptor
()
usagelogDescMediaType
:=
usagelogFields
[
3
5
]
.
Descriptor
()
// usagelog.MediaTypeValidator is a validator for the "media_type" field. It is called by the builders before save.
// usagelog.MediaTypeValidator is a validator for the "media_type" field. It is called by the builders before save.
usagelog
.
MediaTypeValidator
=
usagelogDescMediaType
.
Validators
[
0
]
.
(
func
(
string
)
error
)
usagelog
.
MediaTypeValidator
=
usagelogDescMediaType
.
Validators
[
0
]
.
(
func
(
string
)
error
)
// usagelogDescCacheTTLOverridden is the schema descriptor for cache_ttl_overridden field.
// usagelogDescCacheTTLOverridden is the schema descriptor for cache_ttl_overridden field.
usagelogDescCacheTTLOverridden
:=
usagelogFields
[
3
2
]
.
Descriptor
()
usagelogDescCacheTTLOverridden
:=
usagelogFields
[
3
6
]
.
Descriptor
()
// usagelog.DefaultCacheTTLOverridden holds the default value on creation for the cache_ttl_overridden field.
// usagelog.DefaultCacheTTLOverridden holds the default value on creation for the cache_ttl_overridden field.
usagelog
.
DefaultCacheTTLOverridden
=
usagelogDescCacheTTLOverridden
.
Default
.
(
bool
)
usagelog
.
DefaultCacheTTLOverridden
=
usagelogDescCacheTTLOverridden
.
Default
.
(
bool
)
// usagelogDescCreatedAt is the schema descriptor for created_at field.
// usagelogDescCreatedAt is the schema descriptor for created_at field.
usagelogDescCreatedAt
:=
usagelogFields
[
3
3
]
.
Descriptor
()
usagelogDescCreatedAt
:=
usagelogFields
[
3
7
]
.
Descriptor
()
// usagelog.DefaultCreatedAt holds the default value on creation for the created_at field.
// usagelog.DefaultCreatedAt holds the default value on creation for the created_at field.
usagelog
.
DefaultCreatedAt
=
usagelogDescCreatedAt
.
Default
.
(
func
()
time
.
Time
)
usagelog
.
DefaultCreatedAt
=
usagelogDescCreatedAt
.
Default
.
(
func
()
time
.
Time
)
userMixin
:=
schema
.
User
{}
.
Mixin
()
userMixin
:=
schema
.
User
{}
.
Mixin
()
...
...
backend/ent/schema/usage_log.go
View file @
7b83d6e7
...
@@ -53,6 +53,10 @@ func (UsageLog) Fields() []ent.Field {
...
@@ -53,6 +53,10 @@ func (UsageLog) Fields() []ent.Field {
MaxLen
(
100
)
.
MaxLen
(
100
)
.
Optional
()
.
Optional
()
.
Nillable
(),
Nillable
(),
field
.
Int64
(
"channel_id"
)
.
Optional
()
.
Nillable
()
.
Comment
(
"渠道 ID"
),
field
.
String
(
"model_mapping_chain"
)
.
MaxLen
(
500
)
.
Optional
()
.
Nillable
()
.
Comment
(
"模型映射链"
),
field
.
String
(
"billing_tier"
)
.
MaxLen
(
50
)
.
Optional
()
.
Nillable
()
.
Comment
(
"计费层级标签"
),
field
.
String
(
"billing_mode"
)
.
MaxLen
(
20
)
.
Optional
()
.
Nillable
()
.
Comment
(
"计费模式:token/per_request/image"
),
field
.
Int64
(
"group_id"
)
.
field
.
Int64
(
"group_id"
)
.
Optional
()
.
Optional
()
.
Nillable
(),
Nillable
(),
...
...
backend/ent/usagelog.go
View file @
7b83d6e7
...
@@ -36,6 +36,14 @@ type UsageLog struct {
...
@@ -36,6 +36,14 @@ type UsageLog struct {
RequestedModel
*
string
`json:"requested_model,omitempty"`
RequestedModel
*
string
`json:"requested_model,omitempty"`
// UpstreamModel holds the value of the "upstream_model" field.
// UpstreamModel holds the value of the "upstream_model" field.
UpstreamModel
*
string
`json:"upstream_model,omitempty"`
UpstreamModel
*
string
`json:"upstream_model,omitempty"`
// 渠道 ID
ChannelID
*
int64
`json:"channel_id,omitempty"`
// 模型映射链
ModelMappingChain
*
string
`json:"model_mapping_chain,omitempty"`
// 计费层级标签
BillingTier
*
string
`json:"billing_tier,omitempty"`
// 计费模式:token/per_request/image
BillingMode
*
string
`json:"billing_mode,omitempty"`
// GroupID holds the value of the "group_id" field.
// GroupID holds the value of the "group_id" field.
GroupID
*
int64
`json:"group_id,omitempty"`
GroupID
*
int64
`json:"group_id,omitempty"`
// SubscriptionID holds the value of the "subscription_id" field.
// SubscriptionID holds the value of the "subscription_id" field.
...
@@ -177,9 +185,9 @@ func (*UsageLog) scanValues(columns []string) ([]any, error) {
...
@@ -177,9 +185,9 @@ func (*UsageLog) scanValues(columns []string) ([]any, error) {
values
[
i
]
=
new
(
sql
.
NullBool
)
values
[
i
]
=
new
(
sql
.
NullBool
)
case
usagelog
.
FieldInputCost
,
usagelog
.
FieldOutputCost
,
usagelog
.
FieldCacheCreationCost
,
usagelog
.
FieldCacheReadCost
,
usagelog
.
FieldTotalCost
,
usagelog
.
FieldActualCost
,
usagelog
.
FieldRateMultiplier
,
usagelog
.
FieldAccountRateMultiplier
:
case
usagelog
.
FieldInputCost
,
usagelog
.
FieldOutputCost
,
usagelog
.
FieldCacheCreationCost
,
usagelog
.
FieldCacheReadCost
,
usagelog
.
FieldTotalCost
,
usagelog
.
FieldActualCost
,
usagelog
.
FieldRateMultiplier
,
usagelog
.
FieldAccountRateMultiplier
:
values
[
i
]
=
new
(
sql
.
NullFloat64
)
values
[
i
]
=
new
(
sql
.
NullFloat64
)
case
usagelog
.
FieldID
,
usagelog
.
FieldUserID
,
usagelog
.
FieldAPIKeyID
,
usagelog
.
FieldAccountID
,
usagelog
.
FieldGroupID
,
usagelog
.
FieldSubscriptionID
,
usagelog
.
FieldInputTokens
,
usagelog
.
FieldOutputTokens
,
usagelog
.
FieldCacheCreationTokens
,
usagelog
.
FieldCacheReadTokens
,
usagelog
.
FieldCacheCreation5mTokens
,
usagelog
.
FieldCacheCreation1hTokens
,
usagelog
.
FieldBillingType
,
usagelog
.
FieldDurationMs
,
usagelog
.
FieldFirstTokenMs
,
usagelog
.
FieldImageCount
:
case
usagelog
.
FieldID
,
usagelog
.
FieldUserID
,
usagelog
.
FieldAPIKeyID
,
usagelog
.
FieldAccountID
,
usagelog
.
FieldChannelID
,
usagelog
.
FieldGroupID
,
usagelog
.
FieldSubscriptionID
,
usagelog
.
FieldInputTokens
,
usagelog
.
FieldOutputTokens
,
usagelog
.
FieldCacheCreationTokens
,
usagelog
.
FieldCacheReadTokens
,
usagelog
.
FieldCacheCreation5mTokens
,
usagelog
.
FieldCacheCreation1hTokens
,
usagelog
.
FieldBillingType
,
usagelog
.
FieldDurationMs
,
usagelog
.
FieldFirstTokenMs
,
usagelog
.
FieldImageCount
:
values
[
i
]
=
new
(
sql
.
NullInt64
)
values
[
i
]
=
new
(
sql
.
NullInt64
)
case
usagelog
.
FieldRequestID
,
usagelog
.
FieldModel
,
usagelog
.
FieldRequestedModel
,
usagelog
.
FieldUpstreamModel
,
usagelog
.
FieldUserAgent
,
usagelog
.
FieldIPAddress
,
usagelog
.
FieldImageSize
,
usagelog
.
FieldMediaType
:
case
usagelog
.
FieldRequestID
,
usagelog
.
FieldModel
,
usagelog
.
FieldRequestedModel
,
usagelog
.
FieldUpstreamModel
,
usagelog
.
FieldModelMappingChain
,
usagelog
.
FieldBillingTier
,
usagelog
.
FieldBillingMode
,
usagelog
.
FieldUserAgent
,
usagelog
.
FieldIPAddress
,
usagelog
.
FieldImageSize
,
usagelog
.
FieldMediaType
:
values
[
i
]
=
new
(
sql
.
NullString
)
values
[
i
]
=
new
(
sql
.
NullString
)
case
usagelog
.
FieldCreatedAt
:
case
usagelog
.
FieldCreatedAt
:
values
[
i
]
=
new
(
sql
.
NullTime
)
values
[
i
]
=
new
(
sql
.
NullTime
)
...
@@ -248,6 +256,34 @@ func (_m *UsageLog) assignValues(columns []string, values []any) error {
...
@@ -248,6 +256,34 @@ func (_m *UsageLog) assignValues(columns []string, values []any) error {
_m
.
UpstreamModel
=
new
(
string
)
_m
.
UpstreamModel
=
new
(
string
)
*
_m
.
UpstreamModel
=
value
.
String
*
_m
.
UpstreamModel
=
value
.
String
}
}
case
usagelog
.
FieldChannelID
:
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullInt64
);
!
ok
{
return
fmt
.
Errorf
(
"unexpected type %T for field channel_id"
,
values
[
i
])
}
else
if
value
.
Valid
{
_m
.
ChannelID
=
new
(
int64
)
*
_m
.
ChannelID
=
value
.
Int64
}
case
usagelog
.
FieldModelMappingChain
:
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullString
);
!
ok
{
return
fmt
.
Errorf
(
"unexpected type %T for field model_mapping_chain"
,
values
[
i
])
}
else
if
value
.
Valid
{
_m
.
ModelMappingChain
=
new
(
string
)
*
_m
.
ModelMappingChain
=
value
.
String
}
case
usagelog
.
FieldBillingTier
:
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullString
);
!
ok
{
return
fmt
.
Errorf
(
"unexpected type %T for field billing_tier"
,
values
[
i
])
}
else
if
value
.
Valid
{
_m
.
BillingTier
=
new
(
string
)
*
_m
.
BillingTier
=
value
.
String
}
case
usagelog
.
FieldBillingMode
:
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullString
);
!
ok
{
return
fmt
.
Errorf
(
"unexpected type %T for field billing_mode"
,
values
[
i
])
}
else
if
value
.
Valid
{
_m
.
BillingMode
=
new
(
string
)
*
_m
.
BillingMode
=
value
.
String
}
case
usagelog
.
FieldGroupID
:
case
usagelog
.
FieldGroupID
:
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullInt64
);
!
ok
{
if
value
,
ok
:=
values
[
i
]
.
(
*
sql
.
NullInt64
);
!
ok
{
return
fmt
.
Errorf
(
"unexpected type %T for field group_id"
,
values
[
i
])
return
fmt
.
Errorf
(
"unexpected type %T for field group_id"
,
values
[
i
])
...
@@ -505,6 +541,26 @@ func (_m *UsageLog) String() string {
...
@@ -505,6 +541,26 @@ func (_m *UsageLog) String() string {
builder
.
WriteString
(
*
v
)
builder
.
WriteString
(
*
v
)
}
}
builder
.
WriteString
(
", "
)
builder
.
WriteString
(
", "
)
if
v
:=
_m
.
ChannelID
;
v
!=
nil
{
builder
.
WriteString
(
"channel_id="
)
builder
.
WriteString
(
fmt
.
Sprintf
(
"%v"
,
*
v
))
}
builder
.
WriteString
(
", "
)
if
v
:=
_m
.
ModelMappingChain
;
v
!=
nil
{
builder
.
WriteString
(
"model_mapping_chain="
)
builder
.
WriteString
(
*
v
)
}
builder
.
WriteString
(
", "
)
if
v
:=
_m
.
BillingTier
;
v
!=
nil
{
builder
.
WriteString
(
"billing_tier="
)
builder
.
WriteString
(
*
v
)
}
builder
.
WriteString
(
", "
)
if
v
:=
_m
.
BillingMode
;
v
!=
nil
{
builder
.
WriteString
(
"billing_mode="
)
builder
.
WriteString
(
*
v
)
}
builder
.
WriteString
(
", "
)
if
v
:=
_m
.
GroupID
;
v
!=
nil
{
if
v
:=
_m
.
GroupID
;
v
!=
nil
{
builder
.
WriteString
(
"group_id="
)
builder
.
WriteString
(
"group_id="
)
builder
.
WriteString
(
fmt
.
Sprintf
(
"%v"
,
*
v
))
builder
.
WriteString
(
fmt
.
Sprintf
(
"%v"
,
*
v
))
...
...
backend/ent/usagelog/usagelog.go
View file @
7b83d6e7
...
@@ -28,6 +28,14 @@ const (
...
@@ -28,6 +28,14 @@ const (
FieldRequestedModel
=
"requested_model"
FieldRequestedModel
=
"requested_model"
// FieldUpstreamModel holds the string denoting the upstream_model field in the database.
// FieldUpstreamModel holds the string denoting the upstream_model field in the database.
FieldUpstreamModel
=
"upstream_model"
FieldUpstreamModel
=
"upstream_model"
// FieldChannelID holds the string denoting the channel_id field in the database.
FieldChannelID
=
"channel_id"
// FieldModelMappingChain holds the string denoting the model_mapping_chain field in the database.
FieldModelMappingChain
=
"model_mapping_chain"
// FieldBillingTier holds the string denoting the billing_tier field in the database.
FieldBillingTier
=
"billing_tier"
// FieldBillingMode holds the string denoting the billing_mode field in the database.
FieldBillingMode
=
"billing_mode"
// FieldGroupID holds the string denoting the group_id field in the database.
// FieldGroupID holds the string denoting the group_id field in the database.
FieldGroupID
=
"group_id"
FieldGroupID
=
"group_id"
// FieldSubscriptionID holds the string denoting the subscription_id field in the database.
// FieldSubscriptionID holds the string denoting the subscription_id field in the database.
...
@@ -141,6 +149,10 @@ var Columns = []string{
...
@@ -141,6 +149,10 @@ var Columns = []string{
FieldModel
,
FieldModel
,
FieldRequestedModel
,
FieldRequestedModel
,
FieldUpstreamModel
,
FieldUpstreamModel
,
FieldChannelID
,
FieldModelMappingChain
,
FieldBillingTier
,
FieldBillingMode
,
FieldGroupID
,
FieldGroupID
,
FieldSubscriptionID
,
FieldSubscriptionID
,
FieldInputTokens
,
FieldInputTokens
,
...
@@ -189,6 +201,12 @@ var (
...
@@ -189,6 +201,12 @@ var (
RequestedModelValidator
func
(
string
)
error
RequestedModelValidator
func
(
string
)
error
// UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save.
// UpstreamModelValidator is a validator for the "upstream_model" field. It is called by the builders before save.
UpstreamModelValidator
func
(
string
)
error
UpstreamModelValidator
func
(
string
)
error
// ModelMappingChainValidator is a validator for the "model_mapping_chain" field. It is called by the builders before save.
ModelMappingChainValidator
func
(
string
)
error
// BillingTierValidator is a validator for the "billing_tier" field. It is called by the builders before save.
BillingTierValidator
func
(
string
)
error
// BillingModeValidator is a validator for the "billing_mode" field. It is called by the builders before save.
BillingModeValidator
func
(
string
)
error
// DefaultInputTokens holds the default value on creation for the "input_tokens" field.
// DefaultInputTokens holds the default value on creation for the "input_tokens" field.
DefaultInputTokens
int
DefaultInputTokens
int
// DefaultOutputTokens holds the default value on creation for the "output_tokens" field.
// DefaultOutputTokens holds the default value on creation for the "output_tokens" field.
...
@@ -278,6 +296,26 @@ func ByUpstreamModel(opts ...sql.OrderTermOption) OrderOption {
...
@@ -278,6 +296,26 @@ func ByUpstreamModel(opts ...sql.OrderTermOption) OrderOption {
return
sql
.
OrderByField
(
FieldUpstreamModel
,
opts
...
)
.
ToFunc
()
return
sql
.
OrderByField
(
FieldUpstreamModel
,
opts
...
)
.
ToFunc
()
}
}
// ByChannelID orders the results by the channel_id field.
func
ByChannelID
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
return
sql
.
OrderByField
(
FieldChannelID
,
opts
...
)
.
ToFunc
()
}
// ByModelMappingChain orders the results by the model_mapping_chain field.
func
ByModelMappingChain
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
return
sql
.
OrderByField
(
FieldModelMappingChain
,
opts
...
)
.
ToFunc
()
}
// ByBillingTier orders the results by the billing_tier field.
func
ByBillingTier
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
return
sql
.
OrderByField
(
FieldBillingTier
,
opts
...
)
.
ToFunc
()
}
// ByBillingMode orders the results by the billing_mode field.
func
ByBillingMode
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
return
sql
.
OrderByField
(
FieldBillingMode
,
opts
...
)
.
ToFunc
()
}
// ByGroupID orders the results by the group_id field.
// ByGroupID orders the results by the group_id field.
func
ByGroupID
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
func
ByGroupID
(
opts
...
sql
.
OrderTermOption
)
OrderOption
{
return
sql
.
OrderByField
(
FieldGroupID
,
opts
...
)
.
ToFunc
()
return
sql
.
OrderByField
(
FieldGroupID
,
opts
...
)
.
ToFunc
()
...
...
backend/ent/usagelog/where.go
View file @
7b83d6e7
...
@@ -90,6 +90,26 @@ func UpstreamModel(v string) predicate.UsageLog {
...
@@ -90,6 +90,26 @@ func UpstreamModel(v string) predicate.UsageLog {
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldUpstreamModel
,
v
))
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldUpstreamModel
,
v
))
}
}
// ChannelID applies equality check predicate on the "channel_id" field. It's identical to ChannelIDEQ.
func
ChannelID
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldChannelID
,
v
))
}
// ModelMappingChain applies equality check predicate on the "model_mapping_chain" field. It's identical to ModelMappingChainEQ.
func
ModelMappingChain
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldModelMappingChain
,
v
))
}
// BillingTier applies equality check predicate on the "billing_tier" field. It's identical to BillingTierEQ.
func
BillingTier
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldBillingTier
,
v
))
}
// BillingMode applies equality check predicate on the "billing_mode" field. It's identical to BillingModeEQ.
func
BillingMode
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldBillingMode
,
v
))
}
// GroupID applies equality check predicate on the "group_id" field. It's identical to GroupIDEQ.
// GroupID applies equality check predicate on the "group_id" field. It's identical to GroupIDEQ.
func
GroupID
(
v
int64
)
predicate
.
UsageLog
{
func
GroupID
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldGroupID
,
v
))
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldGroupID
,
v
))
...
@@ -565,6 +585,281 @@ func UpstreamModelContainsFold(v string) predicate.UsageLog {
...
@@ -565,6 +585,281 @@ func UpstreamModelContainsFold(v string) predicate.UsageLog {
return
predicate
.
UsageLog
(
sql
.
FieldContainsFold
(
FieldUpstreamModel
,
v
))
return
predicate
.
UsageLog
(
sql
.
FieldContainsFold
(
FieldUpstreamModel
,
v
))
}
}
// ChannelIDEQ applies the EQ predicate on the "channel_id" field.
func
ChannelIDEQ
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldChannelID
,
v
))
}
// ChannelIDNEQ applies the NEQ predicate on the "channel_id" field.
func
ChannelIDNEQ
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNEQ
(
FieldChannelID
,
v
))
}
// ChannelIDIn applies the In predicate on the "channel_id" field.
func
ChannelIDIn
(
vs
...
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIn
(
FieldChannelID
,
vs
...
))
}
// ChannelIDNotIn applies the NotIn predicate on the "channel_id" field.
func
ChannelIDNotIn
(
vs
...
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotIn
(
FieldChannelID
,
vs
...
))
}
// ChannelIDGT applies the GT predicate on the "channel_id" field.
func
ChannelIDGT
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGT
(
FieldChannelID
,
v
))
}
// ChannelIDGTE applies the GTE predicate on the "channel_id" field.
func
ChannelIDGTE
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGTE
(
FieldChannelID
,
v
))
}
// ChannelIDLT applies the LT predicate on the "channel_id" field.
func
ChannelIDLT
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLT
(
FieldChannelID
,
v
))
}
// ChannelIDLTE applies the LTE predicate on the "channel_id" field.
func
ChannelIDLTE
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLTE
(
FieldChannelID
,
v
))
}
// ChannelIDIsNil applies the IsNil predicate on the "channel_id" field.
func
ChannelIDIsNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIsNull
(
FieldChannelID
))
}
// ChannelIDNotNil applies the NotNil predicate on the "channel_id" field.
func
ChannelIDNotNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotNull
(
FieldChannelID
))
}
// ModelMappingChainEQ applies the EQ predicate on the "model_mapping_chain" field.
func
ModelMappingChainEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainNEQ applies the NEQ predicate on the "model_mapping_chain" field.
func
ModelMappingChainNEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNEQ
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainIn applies the In predicate on the "model_mapping_chain" field.
func
ModelMappingChainIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIn
(
FieldModelMappingChain
,
vs
...
))
}
// ModelMappingChainNotIn applies the NotIn predicate on the "model_mapping_chain" field.
func
ModelMappingChainNotIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotIn
(
FieldModelMappingChain
,
vs
...
))
}
// ModelMappingChainGT applies the GT predicate on the "model_mapping_chain" field.
func
ModelMappingChainGT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGT
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainGTE applies the GTE predicate on the "model_mapping_chain" field.
func
ModelMappingChainGTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGTE
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainLT applies the LT predicate on the "model_mapping_chain" field.
func
ModelMappingChainLT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLT
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainLTE applies the LTE predicate on the "model_mapping_chain" field.
func
ModelMappingChainLTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLTE
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainContains applies the Contains predicate on the "model_mapping_chain" field.
func
ModelMappingChainContains
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContains
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainHasPrefix applies the HasPrefix predicate on the "model_mapping_chain" field.
func
ModelMappingChainHasPrefix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasPrefix
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainHasSuffix applies the HasSuffix predicate on the "model_mapping_chain" field.
func
ModelMappingChainHasSuffix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasSuffix
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainIsNil applies the IsNil predicate on the "model_mapping_chain" field.
func
ModelMappingChainIsNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIsNull
(
FieldModelMappingChain
))
}
// ModelMappingChainNotNil applies the NotNil predicate on the "model_mapping_chain" field.
func
ModelMappingChainNotNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotNull
(
FieldModelMappingChain
))
}
// ModelMappingChainEqualFold applies the EqualFold predicate on the "model_mapping_chain" field.
func
ModelMappingChainEqualFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEqualFold
(
FieldModelMappingChain
,
v
))
}
// ModelMappingChainContainsFold applies the ContainsFold predicate on the "model_mapping_chain" field.
func
ModelMappingChainContainsFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContainsFold
(
FieldModelMappingChain
,
v
))
}
// BillingTierEQ applies the EQ predicate on the "billing_tier" field.
func
BillingTierEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldBillingTier
,
v
))
}
// BillingTierNEQ applies the NEQ predicate on the "billing_tier" field.
func
BillingTierNEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNEQ
(
FieldBillingTier
,
v
))
}
// BillingTierIn applies the In predicate on the "billing_tier" field.
func
BillingTierIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIn
(
FieldBillingTier
,
vs
...
))
}
// BillingTierNotIn applies the NotIn predicate on the "billing_tier" field.
func
BillingTierNotIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotIn
(
FieldBillingTier
,
vs
...
))
}
// BillingTierGT applies the GT predicate on the "billing_tier" field.
func
BillingTierGT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGT
(
FieldBillingTier
,
v
))
}
// BillingTierGTE applies the GTE predicate on the "billing_tier" field.
func
BillingTierGTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGTE
(
FieldBillingTier
,
v
))
}
// BillingTierLT applies the LT predicate on the "billing_tier" field.
func
BillingTierLT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLT
(
FieldBillingTier
,
v
))
}
// BillingTierLTE applies the LTE predicate on the "billing_tier" field.
func
BillingTierLTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLTE
(
FieldBillingTier
,
v
))
}
// BillingTierContains applies the Contains predicate on the "billing_tier" field.
func
BillingTierContains
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContains
(
FieldBillingTier
,
v
))
}
// BillingTierHasPrefix applies the HasPrefix predicate on the "billing_tier" field.
func
BillingTierHasPrefix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasPrefix
(
FieldBillingTier
,
v
))
}
// BillingTierHasSuffix applies the HasSuffix predicate on the "billing_tier" field.
func
BillingTierHasSuffix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasSuffix
(
FieldBillingTier
,
v
))
}
// BillingTierIsNil applies the IsNil predicate on the "billing_tier" field.
func
BillingTierIsNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIsNull
(
FieldBillingTier
))
}
// BillingTierNotNil applies the NotNil predicate on the "billing_tier" field.
func
BillingTierNotNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotNull
(
FieldBillingTier
))
}
// BillingTierEqualFold applies the EqualFold predicate on the "billing_tier" field.
func
BillingTierEqualFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEqualFold
(
FieldBillingTier
,
v
))
}
// BillingTierContainsFold applies the ContainsFold predicate on the "billing_tier" field.
func
BillingTierContainsFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContainsFold
(
FieldBillingTier
,
v
))
}
// BillingModeEQ applies the EQ predicate on the "billing_mode" field.
func
BillingModeEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldBillingMode
,
v
))
}
// BillingModeNEQ applies the NEQ predicate on the "billing_mode" field.
func
BillingModeNEQ
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNEQ
(
FieldBillingMode
,
v
))
}
// BillingModeIn applies the In predicate on the "billing_mode" field.
func
BillingModeIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIn
(
FieldBillingMode
,
vs
...
))
}
// BillingModeNotIn applies the NotIn predicate on the "billing_mode" field.
func
BillingModeNotIn
(
vs
...
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotIn
(
FieldBillingMode
,
vs
...
))
}
// BillingModeGT applies the GT predicate on the "billing_mode" field.
func
BillingModeGT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGT
(
FieldBillingMode
,
v
))
}
// BillingModeGTE applies the GTE predicate on the "billing_mode" field.
func
BillingModeGTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldGTE
(
FieldBillingMode
,
v
))
}
// BillingModeLT applies the LT predicate on the "billing_mode" field.
func
BillingModeLT
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLT
(
FieldBillingMode
,
v
))
}
// BillingModeLTE applies the LTE predicate on the "billing_mode" field.
func
BillingModeLTE
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldLTE
(
FieldBillingMode
,
v
))
}
// BillingModeContains applies the Contains predicate on the "billing_mode" field.
func
BillingModeContains
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContains
(
FieldBillingMode
,
v
))
}
// BillingModeHasPrefix applies the HasPrefix predicate on the "billing_mode" field.
func
BillingModeHasPrefix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasPrefix
(
FieldBillingMode
,
v
))
}
// BillingModeHasSuffix applies the HasSuffix predicate on the "billing_mode" field.
func
BillingModeHasSuffix
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldHasSuffix
(
FieldBillingMode
,
v
))
}
// BillingModeIsNil applies the IsNil predicate on the "billing_mode" field.
func
BillingModeIsNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldIsNull
(
FieldBillingMode
))
}
// BillingModeNotNil applies the NotNil predicate on the "billing_mode" field.
func
BillingModeNotNil
()
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldNotNull
(
FieldBillingMode
))
}
// BillingModeEqualFold applies the EqualFold predicate on the "billing_mode" field.
func
BillingModeEqualFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEqualFold
(
FieldBillingMode
,
v
))
}
// BillingModeContainsFold applies the ContainsFold predicate on the "billing_mode" field.
func
BillingModeContainsFold
(
v
string
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldContainsFold
(
FieldBillingMode
,
v
))
}
// GroupIDEQ applies the EQ predicate on the "group_id" field.
// GroupIDEQ applies the EQ predicate on the "group_id" field.
func
GroupIDEQ
(
v
int64
)
predicate
.
UsageLog
{
func
GroupIDEQ
(
v
int64
)
predicate
.
UsageLog
{
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldGroupID
,
v
))
return
predicate
.
UsageLog
(
sql
.
FieldEQ
(
FieldGroupID
,
v
))
...
...
backend/ent/usagelog_create.go
View file @
7b83d6e7
...
@@ -85,6 +85,62 @@ func (_c *UsageLogCreate) SetNillableUpstreamModel(v *string) *UsageLogCreate {
...
@@ -85,6 +85,62 @@ func (_c *UsageLogCreate) SetNillableUpstreamModel(v *string) *UsageLogCreate {
return
_c
return
_c
}
}
// SetChannelID sets the "channel_id" field.
func
(
_c
*
UsageLogCreate
)
SetChannelID
(
v
int64
)
*
UsageLogCreate
{
_c
.
mutation
.
SetChannelID
(
v
)
return
_c
}
// SetNillableChannelID sets the "channel_id" field if the given value is not nil.
func
(
_c
*
UsageLogCreate
)
SetNillableChannelID
(
v
*
int64
)
*
UsageLogCreate
{
if
v
!=
nil
{
_c
.
SetChannelID
(
*
v
)
}
return
_c
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
_c
*
UsageLogCreate
)
SetModelMappingChain
(
v
string
)
*
UsageLogCreate
{
_c
.
mutation
.
SetModelMappingChain
(
v
)
return
_c
}
// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil.
func
(
_c
*
UsageLogCreate
)
SetNillableModelMappingChain
(
v
*
string
)
*
UsageLogCreate
{
if
v
!=
nil
{
_c
.
SetModelMappingChain
(
*
v
)
}
return
_c
}
// SetBillingTier sets the "billing_tier" field.
func
(
_c
*
UsageLogCreate
)
SetBillingTier
(
v
string
)
*
UsageLogCreate
{
_c
.
mutation
.
SetBillingTier
(
v
)
return
_c
}
// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil.
func
(
_c
*
UsageLogCreate
)
SetNillableBillingTier
(
v
*
string
)
*
UsageLogCreate
{
if
v
!=
nil
{
_c
.
SetBillingTier
(
*
v
)
}
return
_c
}
// SetBillingMode sets the "billing_mode" field.
func
(
_c
*
UsageLogCreate
)
SetBillingMode
(
v
string
)
*
UsageLogCreate
{
_c
.
mutation
.
SetBillingMode
(
v
)
return
_c
}
// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil.
func
(
_c
*
UsageLogCreate
)
SetNillableBillingMode
(
v
*
string
)
*
UsageLogCreate
{
if
v
!=
nil
{
_c
.
SetBillingMode
(
*
v
)
}
return
_c
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
_c
*
UsageLogCreate
)
SetGroupID
(
v
int64
)
*
UsageLogCreate
{
func
(
_c
*
UsageLogCreate
)
SetGroupID
(
v
int64
)
*
UsageLogCreate
{
_c
.
mutation
.
SetGroupID
(
v
)
_c
.
mutation
.
SetGroupID
(
v
)
...
@@ -634,6 +690,21 @@ func (_c *UsageLogCreate) check() error {
...
@@ -634,6 +690,21 @@ func (_c *UsageLogCreate) check() error {
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
}
}
}
}
if
v
,
ok
:=
_c
.
mutation
.
ModelMappingChain
();
ok
{
if
err
:=
usagelog
.
ModelMappingChainValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"model_mapping_chain"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.model_mapping_chain": %w`
,
err
)}
}
}
if
v
,
ok
:=
_c
.
mutation
.
BillingTier
();
ok
{
if
err
:=
usagelog
.
BillingTierValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_tier"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_tier": %w`
,
err
)}
}
}
if
v
,
ok
:=
_c
.
mutation
.
BillingMode
();
ok
{
if
err
:=
usagelog
.
BillingModeValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_mode"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_mode": %w`
,
err
)}
}
}
if
_
,
ok
:=
_c
.
mutation
.
InputTokens
();
!
ok
{
if
_
,
ok
:=
_c
.
mutation
.
InputTokens
();
!
ok
{
return
&
ValidationError
{
Name
:
"input_tokens"
,
err
:
errors
.
New
(
`ent: missing required field "UsageLog.input_tokens"`
)}
return
&
ValidationError
{
Name
:
"input_tokens"
,
err
:
errors
.
New
(
`ent: missing required field "UsageLog.input_tokens"`
)}
}
}
...
@@ -760,6 +831,22 @@ func (_c *UsageLogCreate) createSpec() (*UsageLog, *sqlgraph.CreateSpec) {
...
@@ -760,6 +831,22 @@ func (_c *UsageLogCreate) createSpec() (*UsageLog, *sqlgraph.CreateSpec) {
_spec
.
SetField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
,
value
)
_spec
.
SetField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
,
value
)
_node
.
UpstreamModel
=
&
value
_node
.
UpstreamModel
=
&
value
}
}
if
value
,
ok
:=
_c
.
mutation
.
ChannelID
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
,
value
)
_node
.
ChannelID
=
&
value
}
if
value
,
ok
:=
_c
.
mutation
.
ModelMappingChain
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldModelMappingChain
,
field
.
TypeString
,
value
)
_node
.
ModelMappingChain
=
&
value
}
if
value
,
ok
:=
_c
.
mutation
.
BillingTier
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingTier
,
field
.
TypeString
,
value
)
_node
.
BillingTier
=
&
value
}
if
value
,
ok
:=
_c
.
mutation
.
BillingMode
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingMode
,
field
.
TypeString
,
value
)
_node
.
BillingMode
=
&
value
}
if
value
,
ok
:=
_c
.
mutation
.
InputTokens
();
ok
{
if
value
,
ok
:=
_c
.
mutation
.
InputTokens
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
_node
.
InputTokens
=
value
_node
.
InputTokens
=
value
...
@@ -1093,6 +1180,84 @@ func (u *UsageLogUpsert) ClearUpstreamModel() *UsageLogUpsert {
...
@@ -1093,6 +1180,84 @@ func (u *UsageLogUpsert) ClearUpstreamModel() *UsageLogUpsert {
return
u
return
u
}
}
// SetChannelID sets the "channel_id" field.
func
(
u
*
UsageLogUpsert
)
SetChannelID
(
v
int64
)
*
UsageLogUpsert
{
u
.
Set
(
usagelog
.
FieldChannelID
,
v
)
return
u
}
// UpdateChannelID sets the "channel_id" field to the value that was provided on create.
func
(
u
*
UsageLogUpsert
)
UpdateChannelID
()
*
UsageLogUpsert
{
u
.
SetExcluded
(
usagelog
.
FieldChannelID
)
return
u
}
// AddChannelID adds v to the "channel_id" field.
func
(
u
*
UsageLogUpsert
)
AddChannelID
(
v
int64
)
*
UsageLogUpsert
{
u
.
Add
(
usagelog
.
FieldChannelID
,
v
)
return
u
}
// ClearChannelID clears the value of the "channel_id" field.
func
(
u
*
UsageLogUpsert
)
ClearChannelID
()
*
UsageLogUpsert
{
u
.
SetNull
(
usagelog
.
FieldChannelID
)
return
u
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsert
)
SetModelMappingChain
(
v
string
)
*
UsageLogUpsert
{
u
.
Set
(
usagelog
.
FieldModelMappingChain
,
v
)
return
u
}
// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create.
func
(
u
*
UsageLogUpsert
)
UpdateModelMappingChain
()
*
UsageLogUpsert
{
u
.
SetExcluded
(
usagelog
.
FieldModelMappingChain
)
return
u
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsert
)
ClearModelMappingChain
()
*
UsageLogUpsert
{
u
.
SetNull
(
usagelog
.
FieldModelMappingChain
)
return
u
}
// SetBillingTier sets the "billing_tier" field.
func
(
u
*
UsageLogUpsert
)
SetBillingTier
(
v
string
)
*
UsageLogUpsert
{
u
.
Set
(
usagelog
.
FieldBillingTier
,
v
)
return
u
}
// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create.
func
(
u
*
UsageLogUpsert
)
UpdateBillingTier
()
*
UsageLogUpsert
{
u
.
SetExcluded
(
usagelog
.
FieldBillingTier
)
return
u
}
// ClearBillingTier clears the value of the "billing_tier" field.
func
(
u
*
UsageLogUpsert
)
ClearBillingTier
()
*
UsageLogUpsert
{
u
.
SetNull
(
usagelog
.
FieldBillingTier
)
return
u
}
// SetBillingMode sets the "billing_mode" field.
func
(
u
*
UsageLogUpsert
)
SetBillingMode
(
v
string
)
*
UsageLogUpsert
{
u
.
Set
(
usagelog
.
FieldBillingMode
,
v
)
return
u
}
// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create.
func
(
u
*
UsageLogUpsert
)
UpdateBillingMode
()
*
UsageLogUpsert
{
u
.
SetExcluded
(
usagelog
.
FieldBillingMode
)
return
u
}
// ClearBillingMode clears the value of the "billing_mode" field.
func
(
u
*
UsageLogUpsert
)
ClearBillingMode
()
*
UsageLogUpsert
{
u
.
SetNull
(
usagelog
.
FieldBillingMode
)
return
u
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
u
*
UsageLogUpsert
)
SetGroupID
(
v
int64
)
*
UsageLogUpsert
{
func
(
u
*
UsageLogUpsert
)
SetGroupID
(
v
int64
)
*
UsageLogUpsert
{
u
.
Set
(
usagelog
.
FieldGroupID
,
v
)
u
.
Set
(
usagelog
.
FieldGroupID
,
v
)
...
@@ -1724,6 +1889,97 @@ func (u *UsageLogUpsertOne) ClearUpstreamModel() *UsageLogUpsertOne {
...
@@ -1724,6 +1889,97 @@ func (u *UsageLogUpsertOne) ClearUpstreamModel() *UsageLogUpsertOne {
})
})
}
}
// SetChannelID sets the "channel_id" field.
func
(
u
*
UsageLogUpsertOne
)
SetChannelID
(
v
int64
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetChannelID
(
v
)
})
}
// AddChannelID adds v to the "channel_id" field.
func
(
u
*
UsageLogUpsertOne
)
AddChannelID
(
v
int64
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
AddChannelID
(
v
)
})
}
// UpdateChannelID sets the "channel_id" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertOne
)
UpdateChannelID
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateChannelID
()
})
}
// ClearChannelID clears the value of the "channel_id" field.
func
(
u
*
UsageLogUpsertOne
)
ClearChannelID
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearChannelID
()
})
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsertOne
)
SetModelMappingChain
(
v
string
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetModelMappingChain
(
v
)
})
}
// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertOne
)
UpdateModelMappingChain
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateModelMappingChain
()
})
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsertOne
)
ClearModelMappingChain
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearModelMappingChain
()
})
}
// SetBillingTier sets the "billing_tier" field.
func
(
u
*
UsageLogUpsertOne
)
SetBillingTier
(
v
string
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetBillingTier
(
v
)
})
}
// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertOne
)
UpdateBillingTier
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateBillingTier
()
})
}
// ClearBillingTier clears the value of the "billing_tier" field.
func
(
u
*
UsageLogUpsertOne
)
ClearBillingTier
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearBillingTier
()
})
}
// SetBillingMode sets the "billing_mode" field.
func
(
u
*
UsageLogUpsertOne
)
SetBillingMode
(
v
string
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetBillingMode
(
v
)
})
}
// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertOne
)
UpdateBillingMode
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateBillingMode
()
})
}
// ClearBillingMode clears the value of the "billing_mode" field.
func
(
u
*
UsageLogUpsertOne
)
ClearBillingMode
()
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearBillingMode
()
})
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
u
*
UsageLogUpsertOne
)
SetGroupID
(
v
int64
)
*
UsageLogUpsertOne
{
func
(
u
*
UsageLogUpsertOne
)
SetGroupID
(
v
int64
)
*
UsageLogUpsertOne
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
...
@@ -2600,6 +2856,97 @@ func (u *UsageLogUpsertBulk) ClearUpstreamModel() *UsageLogUpsertBulk {
...
@@ -2600,6 +2856,97 @@ func (u *UsageLogUpsertBulk) ClearUpstreamModel() *UsageLogUpsertBulk {
})
})
}
}
// SetChannelID sets the "channel_id" field.
func
(
u
*
UsageLogUpsertBulk
)
SetChannelID
(
v
int64
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetChannelID
(
v
)
})
}
// AddChannelID adds v to the "channel_id" field.
func
(
u
*
UsageLogUpsertBulk
)
AddChannelID
(
v
int64
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
AddChannelID
(
v
)
})
}
// UpdateChannelID sets the "channel_id" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertBulk
)
UpdateChannelID
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateChannelID
()
})
}
// ClearChannelID clears the value of the "channel_id" field.
func
(
u
*
UsageLogUpsertBulk
)
ClearChannelID
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearChannelID
()
})
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsertBulk
)
SetModelMappingChain
(
v
string
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetModelMappingChain
(
v
)
})
}
// UpdateModelMappingChain sets the "model_mapping_chain" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertBulk
)
UpdateModelMappingChain
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateModelMappingChain
()
})
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func
(
u
*
UsageLogUpsertBulk
)
ClearModelMappingChain
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearModelMappingChain
()
})
}
// SetBillingTier sets the "billing_tier" field.
func
(
u
*
UsageLogUpsertBulk
)
SetBillingTier
(
v
string
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetBillingTier
(
v
)
})
}
// UpdateBillingTier sets the "billing_tier" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertBulk
)
UpdateBillingTier
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateBillingTier
()
})
}
// ClearBillingTier clears the value of the "billing_tier" field.
func
(
u
*
UsageLogUpsertBulk
)
ClearBillingTier
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearBillingTier
()
})
}
// SetBillingMode sets the "billing_mode" field.
func
(
u
*
UsageLogUpsertBulk
)
SetBillingMode
(
v
string
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
SetBillingMode
(
v
)
})
}
// UpdateBillingMode sets the "billing_mode" field to the value that was provided on create.
func
(
u
*
UsageLogUpsertBulk
)
UpdateBillingMode
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
UpdateBillingMode
()
})
}
// ClearBillingMode clears the value of the "billing_mode" field.
func
(
u
*
UsageLogUpsertBulk
)
ClearBillingMode
()
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
s
.
ClearBillingMode
()
})
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
u
*
UsageLogUpsertBulk
)
SetGroupID
(
v
int64
)
*
UsageLogUpsertBulk
{
func
(
u
*
UsageLogUpsertBulk
)
SetGroupID
(
v
int64
)
*
UsageLogUpsertBulk
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
return
u
.
Update
(
func
(
s
*
UsageLogUpsert
)
{
...
...
backend/ent/usagelog_update.go
View file @
7b83d6e7
...
@@ -142,6 +142,93 @@ func (_u *UsageLogUpdate) ClearUpstreamModel() *UsageLogUpdate {
...
@@ -142,6 +142,93 @@ func (_u *UsageLogUpdate) ClearUpstreamModel() *UsageLogUpdate {
return
_u
return
_u
}
}
// SetChannelID sets the "channel_id" field.
func
(
_u
*
UsageLogUpdate
)
SetChannelID
(
v
int64
)
*
UsageLogUpdate
{
_u
.
mutation
.
ResetChannelID
()
_u
.
mutation
.
SetChannelID
(
v
)
return
_u
}
// SetNillableChannelID sets the "channel_id" field if the given value is not nil.
func
(
_u
*
UsageLogUpdate
)
SetNillableChannelID
(
v
*
int64
)
*
UsageLogUpdate
{
if
v
!=
nil
{
_u
.
SetChannelID
(
*
v
)
}
return
_u
}
// AddChannelID adds value to the "channel_id" field.
func
(
_u
*
UsageLogUpdate
)
AddChannelID
(
v
int64
)
*
UsageLogUpdate
{
_u
.
mutation
.
AddChannelID
(
v
)
return
_u
}
// ClearChannelID clears the value of the "channel_id" field.
func
(
_u
*
UsageLogUpdate
)
ClearChannelID
()
*
UsageLogUpdate
{
_u
.
mutation
.
ClearChannelID
()
return
_u
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
_u
*
UsageLogUpdate
)
SetModelMappingChain
(
v
string
)
*
UsageLogUpdate
{
_u
.
mutation
.
SetModelMappingChain
(
v
)
return
_u
}
// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil.
func
(
_u
*
UsageLogUpdate
)
SetNillableModelMappingChain
(
v
*
string
)
*
UsageLogUpdate
{
if
v
!=
nil
{
_u
.
SetModelMappingChain
(
*
v
)
}
return
_u
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func
(
_u
*
UsageLogUpdate
)
ClearModelMappingChain
()
*
UsageLogUpdate
{
_u
.
mutation
.
ClearModelMappingChain
()
return
_u
}
// SetBillingTier sets the "billing_tier" field.
func
(
_u
*
UsageLogUpdate
)
SetBillingTier
(
v
string
)
*
UsageLogUpdate
{
_u
.
mutation
.
SetBillingTier
(
v
)
return
_u
}
// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil.
func
(
_u
*
UsageLogUpdate
)
SetNillableBillingTier
(
v
*
string
)
*
UsageLogUpdate
{
if
v
!=
nil
{
_u
.
SetBillingTier
(
*
v
)
}
return
_u
}
// ClearBillingTier clears the value of the "billing_tier" field.
func
(
_u
*
UsageLogUpdate
)
ClearBillingTier
()
*
UsageLogUpdate
{
_u
.
mutation
.
ClearBillingTier
()
return
_u
}
// SetBillingMode sets the "billing_mode" field.
func
(
_u
*
UsageLogUpdate
)
SetBillingMode
(
v
string
)
*
UsageLogUpdate
{
_u
.
mutation
.
SetBillingMode
(
v
)
return
_u
}
// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil.
func
(
_u
*
UsageLogUpdate
)
SetNillableBillingMode
(
v
*
string
)
*
UsageLogUpdate
{
if
v
!=
nil
{
_u
.
SetBillingMode
(
*
v
)
}
return
_u
}
// ClearBillingMode clears the value of the "billing_mode" field.
func
(
_u
*
UsageLogUpdate
)
ClearBillingMode
()
*
UsageLogUpdate
{
_u
.
mutation
.
ClearBillingMode
()
return
_u
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
_u
*
UsageLogUpdate
)
SetGroupID
(
v
int64
)
*
UsageLogUpdate
{
func
(
_u
*
UsageLogUpdate
)
SetGroupID
(
v
int64
)
*
UsageLogUpdate
{
_u
.
mutation
.
SetGroupID
(
v
)
_u
.
mutation
.
SetGroupID
(
v
)
...
@@ -795,6 +882,21 @@ func (_u *UsageLogUpdate) check() error {
...
@@ -795,6 +882,21 @@ func (_u *UsageLogUpdate) check() error {
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
}
}
}
}
if
v
,
ok
:=
_u
.
mutation
.
ModelMappingChain
();
ok
{
if
err
:=
usagelog
.
ModelMappingChainValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"model_mapping_chain"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.model_mapping_chain": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
BillingTier
();
ok
{
if
err
:=
usagelog
.
BillingTierValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_tier"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_tier": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
BillingMode
();
ok
{
if
err
:=
usagelog
.
BillingModeValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_mode"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_mode": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
UserAgent
();
ok
{
if
v
,
ok
:=
_u
.
mutation
.
UserAgent
();
ok
{
if
err
:=
usagelog
.
UserAgentValidator
(
v
);
err
!=
nil
{
if
err
:=
usagelog
.
UserAgentValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"user_agent"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.user_agent": %w`
,
err
)}
return
&
ValidationError
{
Name
:
"user_agent"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.user_agent": %w`
,
err
)}
...
@@ -857,6 +959,33 @@ func (_u *UsageLogUpdate) sqlSave(ctx context.Context) (_node int, err error) {
...
@@ -857,6 +959,33 @@ func (_u *UsageLogUpdate) sqlSave(ctx context.Context) (_node int, err error) {
if
_u
.
mutation
.
UpstreamModelCleared
()
{
if
_u
.
mutation
.
UpstreamModelCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
)
_spec
.
ClearField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
)
}
}
if
value
,
ok
:=
_u
.
mutation
.
ChannelID
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
,
value
)
}
if
value
,
ok
:=
_u
.
mutation
.
AddedChannelID
();
ok
{
_spec
.
AddField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
,
value
)
}
if
_u
.
mutation
.
ChannelIDCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
)
}
if
value
,
ok
:=
_u
.
mutation
.
ModelMappingChain
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldModelMappingChain
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
ModelMappingChainCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldModelMappingChain
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
BillingTier
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingTier
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
BillingTierCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldBillingTier
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
BillingMode
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingMode
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
BillingModeCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldBillingMode
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
InputTokens
();
ok
{
if
value
,
ok
:=
_u
.
mutation
.
InputTokens
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
}
}
...
@@ -1279,6 +1408,93 @@ func (_u *UsageLogUpdateOne) ClearUpstreamModel() *UsageLogUpdateOne {
...
@@ -1279,6 +1408,93 @@ func (_u *UsageLogUpdateOne) ClearUpstreamModel() *UsageLogUpdateOne {
return
_u
return
_u
}
}
// SetChannelID sets the "channel_id" field.
func
(
_u
*
UsageLogUpdateOne
)
SetChannelID
(
v
int64
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
ResetChannelID
()
_u
.
mutation
.
SetChannelID
(
v
)
return
_u
}
// SetNillableChannelID sets the "channel_id" field if the given value is not nil.
func
(
_u
*
UsageLogUpdateOne
)
SetNillableChannelID
(
v
*
int64
)
*
UsageLogUpdateOne
{
if
v
!=
nil
{
_u
.
SetChannelID
(
*
v
)
}
return
_u
}
// AddChannelID adds value to the "channel_id" field.
func
(
_u
*
UsageLogUpdateOne
)
AddChannelID
(
v
int64
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
AddChannelID
(
v
)
return
_u
}
// ClearChannelID clears the value of the "channel_id" field.
func
(
_u
*
UsageLogUpdateOne
)
ClearChannelID
()
*
UsageLogUpdateOne
{
_u
.
mutation
.
ClearChannelID
()
return
_u
}
// SetModelMappingChain sets the "model_mapping_chain" field.
func
(
_u
*
UsageLogUpdateOne
)
SetModelMappingChain
(
v
string
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
SetModelMappingChain
(
v
)
return
_u
}
// SetNillableModelMappingChain sets the "model_mapping_chain" field if the given value is not nil.
func
(
_u
*
UsageLogUpdateOne
)
SetNillableModelMappingChain
(
v
*
string
)
*
UsageLogUpdateOne
{
if
v
!=
nil
{
_u
.
SetModelMappingChain
(
*
v
)
}
return
_u
}
// ClearModelMappingChain clears the value of the "model_mapping_chain" field.
func
(
_u
*
UsageLogUpdateOne
)
ClearModelMappingChain
()
*
UsageLogUpdateOne
{
_u
.
mutation
.
ClearModelMappingChain
()
return
_u
}
// SetBillingTier sets the "billing_tier" field.
func
(
_u
*
UsageLogUpdateOne
)
SetBillingTier
(
v
string
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
SetBillingTier
(
v
)
return
_u
}
// SetNillableBillingTier sets the "billing_tier" field if the given value is not nil.
func
(
_u
*
UsageLogUpdateOne
)
SetNillableBillingTier
(
v
*
string
)
*
UsageLogUpdateOne
{
if
v
!=
nil
{
_u
.
SetBillingTier
(
*
v
)
}
return
_u
}
// ClearBillingTier clears the value of the "billing_tier" field.
func
(
_u
*
UsageLogUpdateOne
)
ClearBillingTier
()
*
UsageLogUpdateOne
{
_u
.
mutation
.
ClearBillingTier
()
return
_u
}
// SetBillingMode sets the "billing_mode" field.
func
(
_u
*
UsageLogUpdateOne
)
SetBillingMode
(
v
string
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
SetBillingMode
(
v
)
return
_u
}
// SetNillableBillingMode sets the "billing_mode" field if the given value is not nil.
func
(
_u
*
UsageLogUpdateOne
)
SetNillableBillingMode
(
v
*
string
)
*
UsageLogUpdateOne
{
if
v
!=
nil
{
_u
.
SetBillingMode
(
*
v
)
}
return
_u
}
// ClearBillingMode clears the value of the "billing_mode" field.
func
(
_u
*
UsageLogUpdateOne
)
ClearBillingMode
()
*
UsageLogUpdateOne
{
_u
.
mutation
.
ClearBillingMode
()
return
_u
}
// SetGroupID sets the "group_id" field.
// SetGroupID sets the "group_id" field.
func
(
_u
*
UsageLogUpdateOne
)
SetGroupID
(
v
int64
)
*
UsageLogUpdateOne
{
func
(
_u
*
UsageLogUpdateOne
)
SetGroupID
(
v
int64
)
*
UsageLogUpdateOne
{
_u
.
mutation
.
SetGroupID
(
v
)
_u
.
mutation
.
SetGroupID
(
v
)
...
@@ -1945,6 +2161,21 @@ func (_u *UsageLogUpdateOne) check() error {
...
@@ -1945,6 +2161,21 @@ func (_u *UsageLogUpdateOne) check() error {
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
return
&
ValidationError
{
Name
:
"upstream_model"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.upstream_model": %w`
,
err
)}
}
}
}
}
if
v
,
ok
:=
_u
.
mutation
.
ModelMappingChain
();
ok
{
if
err
:=
usagelog
.
ModelMappingChainValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"model_mapping_chain"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.model_mapping_chain": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
BillingTier
();
ok
{
if
err
:=
usagelog
.
BillingTierValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_tier"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_tier": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
BillingMode
();
ok
{
if
err
:=
usagelog
.
BillingModeValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"billing_mode"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.billing_mode": %w`
,
err
)}
}
}
if
v
,
ok
:=
_u
.
mutation
.
UserAgent
();
ok
{
if
v
,
ok
:=
_u
.
mutation
.
UserAgent
();
ok
{
if
err
:=
usagelog
.
UserAgentValidator
(
v
);
err
!=
nil
{
if
err
:=
usagelog
.
UserAgentValidator
(
v
);
err
!=
nil
{
return
&
ValidationError
{
Name
:
"user_agent"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.user_agent": %w`
,
err
)}
return
&
ValidationError
{
Name
:
"user_agent"
,
err
:
fmt
.
Errorf
(
`ent: validator failed for field "UsageLog.user_agent": %w`
,
err
)}
...
@@ -2024,6 +2255,33 @@ func (_u *UsageLogUpdateOne) sqlSave(ctx context.Context) (_node *UsageLog, err
...
@@ -2024,6 +2255,33 @@ func (_u *UsageLogUpdateOne) sqlSave(ctx context.Context) (_node *UsageLog, err
if
_u
.
mutation
.
UpstreamModelCleared
()
{
if
_u
.
mutation
.
UpstreamModelCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
)
_spec
.
ClearField
(
usagelog
.
FieldUpstreamModel
,
field
.
TypeString
)
}
}
if
value
,
ok
:=
_u
.
mutation
.
ChannelID
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
,
value
)
}
if
value
,
ok
:=
_u
.
mutation
.
AddedChannelID
();
ok
{
_spec
.
AddField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
,
value
)
}
if
_u
.
mutation
.
ChannelIDCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldChannelID
,
field
.
TypeInt64
)
}
if
value
,
ok
:=
_u
.
mutation
.
ModelMappingChain
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldModelMappingChain
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
ModelMappingChainCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldModelMappingChain
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
BillingTier
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingTier
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
BillingTierCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldBillingTier
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
BillingMode
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldBillingMode
,
field
.
TypeString
,
value
)
}
if
_u
.
mutation
.
BillingModeCleared
()
{
_spec
.
ClearField
(
usagelog
.
FieldBillingMode
,
field
.
TypeString
)
}
if
value
,
ok
:=
_u
.
mutation
.
InputTokens
();
ok
{
if
value
,
ok
:=
_u
.
mutation
.
InputTokens
();
ok
{
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
_spec
.
SetField
(
usagelog
.
FieldInputTokens
,
field
.
TypeInt
,
value
)
}
}
...
...
backend/internal/handler/admin/channel_handler.go
0 → 100644
View file @
7b83d6e7
package
admin
import
(
"errors"
"fmt"
"strconv"
"strings"
infraerrors
"github.com/Wei-Shaw/sub2api/internal/pkg/errors"
"github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
"github.com/Wei-Shaw/sub2api/internal/pkg/response"
"github.com/Wei-Shaw/sub2api/internal/service"
"github.com/gin-gonic/gin"
)
// ChannelHandler handles admin channel management
type
ChannelHandler
struct
{
channelService
*
service
.
ChannelService
billingService
*
service
.
BillingService
}
// NewChannelHandler creates a new admin channel handler
func
NewChannelHandler
(
channelService
*
service
.
ChannelService
,
billingService
*
service
.
BillingService
)
*
ChannelHandler
{
return
&
ChannelHandler
{
channelService
:
channelService
,
billingService
:
billingService
}
}
// --- Request / Response types ---
type
createChannelRequest
struct
{
Name
string
`json:"name" binding:"required,max=100"`
Description
string
`json:"description"`
GroupIDs
[]
int64
`json:"group_ids"`
ModelPricing
[]
channelModelPricingRequest
`json:"model_pricing"`
ModelMapping
map
[
string
]
map
[
string
]
string
`json:"model_mapping"`
BillingModelSource
string
`json:"billing_model_source" binding:"omitempty,oneof=requested upstream channel_mapped"`
RestrictModels
bool
`json:"restrict_models"`
}
type
updateChannelRequest
struct
{
Name
string
`json:"name" binding:"omitempty,max=100"`
Description
*
string
`json:"description"`
Status
string
`json:"status" binding:"omitempty,oneof=active disabled"`
GroupIDs
*
[]
int64
`json:"group_ids"`
ModelPricing
*
[]
channelModelPricingRequest
`json:"model_pricing"`
ModelMapping
map
[
string
]
map
[
string
]
string
`json:"model_mapping"`
BillingModelSource
string
`json:"billing_model_source" binding:"omitempty,oneof=requested upstream channel_mapped"`
RestrictModels
*
bool
`json:"restrict_models"`
}
type
channelModelPricingRequest
struct
{
Platform
string
`json:"platform" binding:"omitempty,max=50"`
Models
[]
string
`json:"models" binding:"required,min=1,max=100"`
BillingMode
string
`json:"billing_mode" binding:"omitempty,oneof=token per_request image"`
InputPrice
*
float64
`json:"input_price" binding:"omitempty,min=0"`
OutputPrice
*
float64
`json:"output_price" binding:"omitempty,min=0"`
CacheWritePrice
*
float64
`json:"cache_write_price" binding:"omitempty,min=0"`
CacheReadPrice
*
float64
`json:"cache_read_price" binding:"omitempty,min=0"`
ImageOutputPrice
*
float64
`json:"image_output_price" binding:"omitempty,min=0"`
PerRequestPrice
*
float64
`json:"per_request_price" binding:"omitempty,min=0"`
Intervals
[]
pricingIntervalRequest
`json:"intervals"`
}
type
pricingIntervalRequest
struct
{
MinTokens
int
`json:"min_tokens"`
MaxTokens
*
int
`json:"max_tokens"`
TierLabel
string
`json:"tier_label"`
InputPrice
*
float64
`json:"input_price"`
OutputPrice
*
float64
`json:"output_price"`
CacheWritePrice
*
float64
`json:"cache_write_price"`
CacheReadPrice
*
float64
`json:"cache_read_price"`
PerRequestPrice
*
float64
`json:"per_request_price"`
SortOrder
int
`json:"sort_order"`
}
type
channelResponse
struct
{
ID
int64
`json:"id"`
Name
string
`json:"name"`
Description
string
`json:"description"`
Status
string
`json:"status"`
BillingModelSource
string
`json:"billing_model_source"`
RestrictModels
bool
`json:"restrict_models"`
GroupIDs
[]
int64
`json:"group_ids"`
ModelPricing
[]
channelModelPricingResponse
`json:"model_pricing"`
ModelMapping
map
[
string
]
map
[
string
]
string
`json:"model_mapping"`
CreatedAt
string
`json:"created_at"`
UpdatedAt
string
`json:"updated_at"`
}
type
channelModelPricingResponse
struct
{
ID
int64
`json:"id"`
Platform
string
`json:"platform"`
Models
[]
string
`json:"models"`
BillingMode
string
`json:"billing_mode"`
InputPrice
*
float64
`json:"input_price"`
OutputPrice
*
float64
`json:"output_price"`
CacheWritePrice
*
float64
`json:"cache_write_price"`
CacheReadPrice
*
float64
`json:"cache_read_price"`
ImageOutputPrice
*
float64
`json:"image_output_price"`
PerRequestPrice
*
float64
`json:"per_request_price"`
Intervals
[]
pricingIntervalResponse
`json:"intervals"`
}
type
pricingIntervalResponse
struct
{
ID
int64
`json:"id"`
MinTokens
int
`json:"min_tokens"`
MaxTokens
*
int
`json:"max_tokens"`
TierLabel
string
`json:"tier_label,omitempty"`
InputPrice
*
float64
`json:"input_price"`
OutputPrice
*
float64
`json:"output_price"`
CacheWritePrice
*
float64
`json:"cache_write_price"`
CacheReadPrice
*
float64
`json:"cache_read_price"`
PerRequestPrice
*
float64
`json:"per_request_price"`
SortOrder
int
`json:"sort_order"`
}
func
channelToResponse
(
ch
*
service
.
Channel
)
*
channelResponse
{
if
ch
==
nil
{
return
nil
}
resp
:=
&
channelResponse
{
ID
:
ch
.
ID
,
Name
:
ch
.
Name
,
Description
:
ch
.
Description
,
Status
:
ch
.
Status
,
RestrictModels
:
ch
.
RestrictModels
,
GroupIDs
:
ch
.
GroupIDs
,
ModelMapping
:
ch
.
ModelMapping
,
CreatedAt
:
ch
.
CreatedAt
.
Format
(
"2006-01-02T15:04:05Z"
),
UpdatedAt
:
ch
.
UpdatedAt
.
Format
(
"2006-01-02T15:04:05Z"
),
}
resp
.
BillingModelSource
=
ch
.
BillingModelSource
if
resp
.
BillingModelSource
==
""
{
resp
.
BillingModelSource
=
service
.
BillingModelSourceChannelMapped
}
if
resp
.
GroupIDs
==
nil
{
resp
.
GroupIDs
=
[]
int64
{}
}
if
resp
.
ModelMapping
==
nil
{
resp
.
ModelMapping
=
map
[
string
]
map
[
string
]
string
{}
}
resp
.
ModelPricing
=
make
([]
channelModelPricingResponse
,
0
,
len
(
ch
.
ModelPricing
))
for
_
,
p
:=
range
ch
.
ModelPricing
{
resp
.
ModelPricing
=
append
(
resp
.
ModelPricing
,
pricingToResponse
(
&
p
))
}
return
resp
}
func
pricingToResponse
(
p
*
service
.
ChannelModelPricing
)
channelModelPricingResponse
{
models
:=
p
.
Models
if
models
==
nil
{
models
=
[]
string
{}
}
billingMode
:=
string
(
p
.
BillingMode
)
if
billingMode
==
""
{
billingMode
=
string
(
service
.
BillingModeToken
)
}
platform
:=
p
.
Platform
if
platform
==
""
{
platform
=
service
.
PlatformAnthropic
}
intervals
:=
make
([]
pricingIntervalResponse
,
0
,
len
(
p
.
Intervals
))
for
_
,
iv
:=
range
p
.
Intervals
{
intervals
=
append
(
intervals
,
intervalToResponse
(
iv
))
}
return
channelModelPricingResponse
{
ID
:
p
.
ID
,
Platform
:
platform
,
Models
:
models
,
BillingMode
:
billingMode
,
InputPrice
:
p
.
InputPrice
,
OutputPrice
:
p
.
OutputPrice
,
CacheWritePrice
:
p
.
CacheWritePrice
,
CacheReadPrice
:
p
.
CacheReadPrice
,
ImageOutputPrice
:
p
.
ImageOutputPrice
,
PerRequestPrice
:
p
.
PerRequestPrice
,
Intervals
:
intervals
,
}
}
func
intervalToResponse
(
iv
service
.
PricingInterval
)
pricingIntervalResponse
{
return
pricingIntervalResponse
{
ID
:
iv
.
ID
,
MinTokens
:
iv
.
MinTokens
,
MaxTokens
:
iv
.
MaxTokens
,
TierLabel
:
iv
.
TierLabel
,
InputPrice
:
iv
.
InputPrice
,
OutputPrice
:
iv
.
OutputPrice
,
CacheWritePrice
:
iv
.
CacheWritePrice
,
CacheReadPrice
:
iv
.
CacheReadPrice
,
PerRequestPrice
:
iv
.
PerRequestPrice
,
SortOrder
:
iv
.
SortOrder
,
}
}
func
pricingRequestToService
(
reqs
[]
channelModelPricingRequest
)
[]
service
.
ChannelModelPricing
{
result
:=
make
([]
service
.
ChannelModelPricing
,
0
,
len
(
reqs
))
for
_
,
r
:=
range
reqs
{
billingMode
:=
service
.
BillingMode
(
r
.
BillingMode
)
if
billingMode
==
""
{
billingMode
=
service
.
BillingModeToken
}
platform
:=
r
.
Platform
if
platform
==
""
{
platform
=
service
.
PlatformAnthropic
}
intervals
:=
make
([]
service
.
PricingInterval
,
0
,
len
(
r
.
Intervals
))
for
_
,
iv
:=
range
r
.
Intervals
{
intervals
=
append
(
intervals
,
service
.
PricingInterval
{
MinTokens
:
iv
.
MinTokens
,
MaxTokens
:
iv
.
MaxTokens
,
TierLabel
:
iv
.
TierLabel
,
InputPrice
:
iv
.
InputPrice
,
OutputPrice
:
iv
.
OutputPrice
,
CacheWritePrice
:
iv
.
CacheWritePrice
,
CacheReadPrice
:
iv
.
CacheReadPrice
,
PerRequestPrice
:
iv
.
PerRequestPrice
,
SortOrder
:
iv
.
SortOrder
,
})
}
result
=
append
(
result
,
service
.
ChannelModelPricing
{
Platform
:
platform
,
Models
:
r
.
Models
,
BillingMode
:
billingMode
,
InputPrice
:
r
.
InputPrice
,
OutputPrice
:
r
.
OutputPrice
,
CacheWritePrice
:
r
.
CacheWritePrice
,
CacheReadPrice
:
r
.
CacheReadPrice
,
ImageOutputPrice
:
r
.
ImageOutputPrice
,
PerRequestPrice
:
r
.
PerRequestPrice
,
Intervals
:
intervals
,
})
}
return
result
}
// validatePricingBillingMode 校验计费配置
func
validatePricingBillingMode
(
pricing
[]
service
.
ChannelModelPricing
)
error
{
for
_
,
p
:=
range
pricing
{
// 按次/图片模式必须配置默认价格或区间
if
p
.
BillingMode
==
service
.
BillingModePerRequest
||
p
.
BillingMode
==
service
.
BillingModeImage
{
if
p
.
PerRequestPrice
==
nil
&&
len
(
p
.
Intervals
)
==
0
{
return
errors
.
New
(
"per-request price or intervals required for per_request/image billing mode"
)
}
}
// 校验价格不能为负
if
err
:=
validatePriceNotNegative
(
"input_price"
,
p
.
InputPrice
);
err
!=
nil
{
return
err
}
if
err
:=
validatePriceNotNegative
(
"output_price"
,
p
.
OutputPrice
);
err
!=
nil
{
return
err
}
if
err
:=
validatePriceNotNegative
(
"cache_write_price"
,
p
.
CacheWritePrice
);
err
!=
nil
{
return
err
}
if
err
:=
validatePriceNotNegative
(
"cache_read_price"
,
p
.
CacheReadPrice
);
err
!=
nil
{
return
err
}
if
err
:=
validatePriceNotNegative
(
"image_output_price"
,
p
.
ImageOutputPrice
);
err
!=
nil
{
return
err
}
if
err
:=
validatePriceNotNegative
(
"per_request_price"
,
p
.
PerRequestPrice
);
err
!=
nil
{
return
err
}
// 校验 interval:至少有一个价格字段非空
for
_
,
iv
:=
range
p
.
Intervals
{
if
iv
.
InputPrice
==
nil
&&
iv
.
OutputPrice
==
nil
&&
iv
.
CacheWritePrice
==
nil
&&
iv
.
CacheReadPrice
==
nil
&&
iv
.
PerRequestPrice
==
nil
{
return
fmt
.
Errorf
(
"interval [%d, %s] has no price fields set for model %v"
,
iv
.
MinTokens
,
formatMaxTokens
(
iv
.
MaxTokens
),
p
.
Models
)
}
}
}
return
nil
}
func
validatePriceNotNegative
(
field
string
,
val
*
float64
)
error
{
if
val
!=
nil
&&
*
val
<
0
{
return
fmt
.
Errorf
(
"%s must be >= 0"
,
field
)
}
return
nil
}
func
formatMaxTokens
(
max
*
int
)
string
{
if
max
==
nil
{
return
"∞"
}
return
fmt
.
Sprintf
(
"%d"
,
*
max
)
}
// --- Handlers ---
// List handles listing channels with pagination
// GET /api/v1/admin/channels
func
(
h
*
ChannelHandler
)
List
(
c
*
gin
.
Context
)
{
page
,
pageSize
:=
response
.
ParsePagination
(
c
)
status
:=
c
.
Query
(
"status"
)
search
:=
strings
.
TrimSpace
(
c
.
Query
(
"search"
))
if
len
(
search
)
>
100
{
search
=
search
[
:
100
]
}
channels
,
pag
,
err
:=
h
.
channelService
.
List
(
c
.
Request
.
Context
(),
pagination
.
PaginationParams
{
Page
:
page
,
PageSize
:
pageSize
},
status
,
search
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
out
:=
make
([]
*
channelResponse
,
0
,
len
(
channels
))
for
i
:=
range
channels
{
out
=
append
(
out
,
channelToResponse
(
&
channels
[
i
]))
}
response
.
Paginated
(
c
,
out
,
pag
.
Total
,
page
,
pageSize
)
}
// GetByID handles getting a channel by ID
// GET /api/v1/admin/channels/:id
func
(
h
*
ChannelHandler
)
GetByID
(
c
*
gin
.
Context
)
{
id
,
err
:=
strconv
.
ParseInt
(
c
.
Param
(
"id"
),
10
,
64
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"INVALID_CHANNEL_ID"
,
"Invalid channel ID"
))
return
}
channel
,
err
:=
h
.
channelService
.
GetByID
(
c
.
Request
.
Context
(),
id
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
response
.
Success
(
c
,
channelToResponse
(
channel
))
}
// Create handles creating a new channel
// POST /api/v1/admin/channels
func
(
h
*
ChannelHandler
)
Create
(
c
*
gin
.
Context
)
{
var
req
createChannelRequest
if
err
:=
c
.
ShouldBindJSON
(
&
req
);
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"VALIDATION_ERROR"
,
err
.
Error
()))
return
}
pricing
:=
pricingRequestToService
(
req
.
ModelPricing
)
if
err
:=
validatePricingBillingMode
(
pricing
);
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"VALIDATION_ERROR"
,
err
.
Error
()))
return
}
channel
,
err
:=
h
.
channelService
.
Create
(
c
.
Request
.
Context
(),
&
service
.
CreateChannelInput
{
Name
:
req
.
Name
,
Description
:
req
.
Description
,
GroupIDs
:
req
.
GroupIDs
,
ModelPricing
:
pricing
,
ModelMapping
:
req
.
ModelMapping
,
BillingModelSource
:
req
.
BillingModelSource
,
RestrictModels
:
req
.
RestrictModels
,
})
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
response
.
Success
(
c
,
channelToResponse
(
channel
))
}
// Update handles updating a channel
// PUT /api/v1/admin/channels/:id
func
(
h
*
ChannelHandler
)
Update
(
c
*
gin
.
Context
)
{
id
,
err
:=
strconv
.
ParseInt
(
c
.
Param
(
"id"
),
10
,
64
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"INVALID_CHANNEL_ID"
,
"Invalid channel ID"
))
return
}
var
req
updateChannelRequest
if
err
:=
c
.
ShouldBindJSON
(
&
req
);
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"VALIDATION_ERROR"
,
err
.
Error
()))
return
}
input
:=
&
service
.
UpdateChannelInput
{
Name
:
req
.
Name
,
Description
:
req
.
Description
,
Status
:
req
.
Status
,
GroupIDs
:
req
.
GroupIDs
,
ModelMapping
:
req
.
ModelMapping
,
BillingModelSource
:
req
.
BillingModelSource
,
RestrictModels
:
req
.
RestrictModels
,
}
if
req
.
ModelPricing
!=
nil
{
pricing
:=
pricingRequestToService
(
*
req
.
ModelPricing
)
if
err
:=
validatePricingBillingMode
(
pricing
);
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"VALIDATION_ERROR"
,
err
.
Error
()))
return
}
input
.
ModelPricing
=
&
pricing
}
channel
,
err
:=
h
.
channelService
.
Update
(
c
.
Request
.
Context
(),
id
,
input
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
response
.
Success
(
c
,
channelToResponse
(
channel
))
}
// Delete handles deleting a channel
// DELETE /api/v1/admin/channels/:id
func
(
h
*
ChannelHandler
)
Delete
(
c
*
gin
.
Context
)
{
id
,
err
:=
strconv
.
ParseInt
(
c
.
Param
(
"id"
),
10
,
64
)
if
err
!=
nil
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"INVALID_CHANNEL_ID"
,
"Invalid channel ID"
))
return
}
if
err
:=
h
.
channelService
.
Delete
(
c
.
Request
.
Context
(),
id
);
err
!=
nil
{
response
.
ErrorFrom
(
c
,
err
)
return
}
response
.
Success
(
c
,
gin
.
H
{
"message"
:
"Channel deleted successfully"
})
}
// GetModelDefaultPricing 获取模型的默认定价(用于前端自动填充)
// GET /api/v1/admin/channels/model-pricing?model=claude-sonnet-4
func
(
h
*
ChannelHandler
)
GetModelDefaultPricing
(
c
*
gin
.
Context
)
{
model
:=
strings
.
TrimSpace
(
c
.
Query
(
"model"
))
if
model
==
""
{
response
.
ErrorFrom
(
c
,
infraerrors
.
BadRequest
(
"MISSING_PARAMETER"
,
"model parameter is required"
)
.
WithMetadata
(
map
[
string
]
string
{
"param"
:
"model"
}))
return
}
pricing
,
err
:=
h
.
billingService
.
GetModelPricing
(
model
)
if
err
!=
nil
{
// 模型不在定价列表中
response
.
Success
(
c
,
gin
.
H
{
"found"
:
false
})
return
}
response
.
Success
(
c
,
gin
.
H
{
"found"
:
true
,
"input_price"
:
pricing
.
InputPricePerToken
,
"output_price"
:
pricing
.
OutputPricePerToken
,
"cache_write_price"
:
pricing
.
CacheCreationPricePerToken
,
"cache_read_price"
:
pricing
.
CacheReadPricePerToken
,
"image_output_price"
:
pricing
.
ImageOutputPricePerToken
,
})
}
backend/internal/handler/admin/channel_handler_test.go
0 → 100644
View file @
7b83d6e7
//go:build unit
package
admin
import
(
"testing"
"time"
"github.com/Wei-Shaw/sub2api/internal/service"
"github.com/stretchr/testify/require"
)
// ---------------------------------------------------------------------------
// helpers
// ---------------------------------------------------------------------------
func
float64Ptr
(
v
float64
)
*
float64
{
return
&
v
}
func
intPtr
(
v
int
)
*
int
{
return
&
v
}
// ---------------------------------------------------------------------------
// 1. channelToResponse
// ---------------------------------------------------------------------------
func
TestChannelToResponse_NilInput
(
t
*
testing
.
T
)
{
require
.
Nil
(
t
,
channelToResponse
(
nil
))
}
func
TestChannelToResponse_FullChannel
(
t
*
testing
.
T
)
{
now
:=
time
.
Date
(
2025
,
6
,
1
,
12
,
0
,
0
,
0
,
time
.
UTC
)
ch
:=
&
service
.
Channel
{
ID
:
42
,
Name
:
"test-channel"
,
Description
:
"desc"
,
Status
:
"active"
,
BillingModelSource
:
"upstream"
,
RestrictModels
:
true
,
CreatedAt
:
now
,
UpdatedAt
:
now
.
Add
(
time
.
Hour
),
GroupIDs
:
[]
int64
{
1
,
2
,
3
},
ModelPricing
:
[]
service
.
ChannelModelPricing
{
{
ID
:
10
,
Platform
:
"openai"
,
Models
:
[]
string
{
"gpt-4"
},
BillingMode
:
service
.
BillingModeToken
,
InputPrice
:
float64Ptr
(
0.01
),
OutputPrice
:
float64Ptr
(
0.03
),
CacheWritePrice
:
float64Ptr
(
0.005
),
CacheReadPrice
:
float64Ptr
(
0.002
),
PerRequestPrice
:
float64Ptr
(
0.5
),
},
},
ModelMapping
:
map
[
string
]
map
[
string
]
string
{
"anthropic"
:
{
"claude-3-haiku"
:
"claude-haiku-3"
},
},
}
resp
:=
channelToResponse
(
ch
)
require
.
NotNil
(
t
,
resp
)
require
.
Equal
(
t
,
int64
(
42
),
resp
.
ID
)
require
.
Equal
(
t
,
"test-channel"
,
resp
.
Name
)
require
.
Equal
(
t
,
"desc"
,
resp
.
Description
)
require
.
Equal
(
t
,
"active"
,
resp
.
Status
)
require
.
Equal
(
t
,
"upstream"
,
resp
.
BillingModelSource
)
require
.
True
(
t
,
resp
.
RestrictModels
)
require
.
Equal
(
t
,
[]
int64
{
1
,
2
,
3
},
resp
.
GroupIDs
)
require
.
Equal
(
t
,
"2025-06-01T12:00:00Z"
,
resp
.
CreatedAt
)
require
.
Equal
(
t
,
"2025-06-01T13:00:00Z"
,
resp
.
UpdatedAt
)
// model mapping
require
.
Len
(
t
,
resp
.
ModelMapping
,
1
)
require
.
Equal
(
t
,
"claude-haiku-3"
,
resp
.
ModelMapping
[
"anthropic"
][
"claude-3-haiku"
])
// pricing
require
.
Len
(
t
,
resp
.
ModelPricing
,
1
)
p
:=
resp
.
ModelPricing
[
0
]
require
.
Equal
(
t
,
int64
(
10
),
p
.
ID
)
require
.
Equal
(
t
,
"openai"
,
p
.
Platform
)
require
.
Equal
(
t
,
[]
string
{
"gpt-4"
},
p
.
Models
)
require
.
Equal
(
t
,
"token"
,
p
.
BillingMode
)
require
.
Equal
(
t
,
float64Ptr
(
0.01
),
p
.
InputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.03
),
p
.
OutputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.005
),
p
.
CacheWritePrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.002
),
p
.
CacheReadPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.5
),
p
.
PerRequestPrice
)
require
.
Empty
(
t
,
p
.
Intervals
)
}
func
TestChannelToResponse_EmptyDefaults
(
t
*
testing
.
T
)
{
now
:=
time
.
Date
(
2025
,
1
,
1
,
0
,
0
,
0
,
0
,
time
.
UTC
)
ch
:=
&
service
.
Channel
{
ID
:
1
,
Name
:
"ch"
,
BillingModelSource
:
""
,
CreatedAt
:
now
,
UpdatedAt
:
now
,
GroupIDs
:
nil
,
ModelMapping
:
nil
,
ModelPricing
:
[]
service
.
ChannelModelPricing
{
{
Platform
:
""
,
BillingMode
:
""
,
Models
:
[]
string
{
"m1"
},
},
},
}
resp
:=
channelToResponse
(
ch
)
require
.
Equal
(
t
,
"channel_mapped"
,
resp
.
BillingModelSource
)
require
.
NotNil
(
t
,
resp
.
GroupIDs
)
require
.
Empty
(
t
,
resp
.
GroupIDs
)
require
.
NotNil
(
t
,
resp
.
ModelMapping
)
require
.
Empty
(
t
,
resp
.
ModelMapping
)
require
.
Len
(
t
,
resp
.
ModelPricing
,
1
)
require
.
Equal
(
t
,
"anthropic"
,
resp
.
ModelPricing
[
0
]
.
Platform
)
require
.
Equal
(
t
,
"token"
,
resp
.
ModelPricing
[
0
]
.
BillingMode
)
}
func
TestChannelToResponse_NilModels
(
t
*
testing
.
T
)
{
now
:=
time
.
Now
()
ch
:=
&
service
.
Channel
{
ID
:
1
,
Name
:
"ch"
,
CreatedAt
:
now
,
UpdatedAt
:
now
,
ModelPricing
:
[]
service
.
ChannelModelPricing
{
{
Models
:
nil
,
},
},
}
resp
:=
channelToResponse
(
ch
)
require
.
Len
(
t
,
resp
.
ModelPricing
,
1
)
require
.
NotNil
(
t
,
resp
.
ModelPricing
[
0
]
.
Models
)
require
.
Empty
(
t
,
resp
.
ModelPricing
[
0
]
.
Models
)
}
func
TestChannelToResponse_WithIntervals
(
t
*
testing
.
T
)
{
now
:=
time
.
Now
()
ch
:=
&
service
.
Channel
{
ID
:
1
,
Name
:
"ch"
,
CreatedAt
:
now
,
UpdatedAt
:
now
,
ModelPricing
:
[]
service
.
ChannelModelPricing
{
{
Models
:
[]
string
{
"m1"
},
BillingMode
:
service
.
BillingModePerRequest
,
Intervals
:
[]
service
.
PricingInterval
{
{
ID
:
100
,
MinTokens
:
0
,
MaxTokens
:
intPtr
(
1000
),
TierLabel
:
"1K"
,
InputPrice
:
float64Ptr
(
0.01
),
OutputPrice
:
float64Ptr
(
0.02
),
CacheWritePrice
:
float64Ptr
(
0.003
),
CacheReadPrice
:
float64Ptr
(
0.001
),
PerRequestPrice
:
float64Ptr
(
0.1
),
SortOrder
:
1
,
},
{
ID
:
101
,
MinTokens
:
1000
,
MaxTokens
:
nil
,
TierLabel
:
"unlimited"
,
SortOrder
:
2
,
},
},
},
},
}
resp
:=
channelToResponse
(
ch
)
require
.
Len
(
t
,
resp
.
ModelPricing
,
1
)
intervals
:=
resp
.
ModelPricing
[
0
]
.
Intervals
require
.
Len
(
t
,
intervals
,
2
)
iv0
:=
intervals
[
0
]
require
.
Equal
(
t
,
int64
(
100
),
iv0
.
ID
)
require
.
Equal
(
t
,
0
,
iv0
.
MinTokens
)
require
.
Equal
(
t
,
intPtr
(
1000
),
iv0
.
MaxTokens
)
require
.
Equal
(
t
,
"1K"
,
iv0
.
TierLabel
)
require
.
Equal
(
t
,
float64Ptr
(
0.01
),
iv0
.
InputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.02
),
iv0
.
OutputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.003
),
iv0
.
CacheWritePrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.001
),
iv0
.
CacheReadPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.1
),
iv0
.
PerRequestPrice
)
require
.
Equal
(
t
,
1
,
iv0
.
SortOrder
)
iv1
:=
intervals
[
1
]
require
.
Equal
(
t
,
int64
(
101
),
iv1
.
ID
)
require
.
Equal
(
t
,
1000
,
iv1
.
MinTokens
)
require
.
Nil
(
t
,
iv1
.
MaxTokens
)
require
.
Equal
(
t
,
"unlimited"
,
iv1
.
TierLabel
)
require
.
Equal
(
t
,
2
,
iv1
.
SortOrder
)
}
func
TestChannelToResponse_MultipleEntries
(
t
*
testing
.
T
)
{
now
:=
time
.
Now
()
ch
:=
&
service
.
Channel
{
ID
:
1
,
Name
:
"multi"
,
CreatedAt
:
now
,
UpdatedAt
:
now
,
ModelPricing
:
[]
service
.
ChannelModelPricing
{
{
ID
:
1
,
Platform
:
"anthropic"
,
Models
:
[]
string
{
"claude-sonnet-4"
},
BillingMode
:
service
.
BillingModeToken
,
InputPrice
:
float64Ptr
(
0.003
),
OutputPrice
:
float64Ptr
(
0.015
),
},
{
ID
:
2
,
Platform
:
"openai"
,
Models
:
[]
string
{
"gpt-4"
,
"gpt-4o"
},
BillingMode
:
service
.
BillingModePerRequest
,
PerRequestPrice
:
float64Ptr
(
1.0
),
},
{
ID
:
3
,
Platform
:
"gemini"
,
Models
:
[]
string
{
"gemini-2.5-pro"
},
BillingMode
:
service
.
BillingModeImage
,
ImageOutputPrice
:
float64Ptr
(
0.05
),
PerRequestPrice
:
float64Ptr
(
0.2
),
},
},
}
resp
:=
channelToResponse
(
ch
)
require
.
Len
(
t
,
resp
.
ModelPricing
,
3
)
require
.
Equal
(
t
,
int64
(
1
),
resp
.
ModelPricing
[
0
]
.
ID
)
require
.
Equal
(
t
,
"anthropic"
,
resp
.
ModelPricing
[
0
]
.
Platform
)
require
.
Equal
(
t
,
[]
string
{
"claude-sonnet-4"
},
resp
.
ModelPricing
[
0
]
.
Models
)
require
.
Equal
(
t
,
"token"
,
resp
.
ModelPricing
[
0
]
.
BillingMode
)
require
.
Equal
(
t
,
int64
(
2
),
resp
.
ModelPricing
[
1
]
.
ID
)
require
.
Equal
(
t
,
"openai"
,
resp
.
ModelPricing
[
1
]
.
Platform
)
require
.
Equal
(
t
,
[]
string
{
"gpt-4"
,
"gpt-4o"
},
resp
.
ModelPricing
[
1
]
.
Models
)
require
.
Equal
(
t
,
"per_request"
,
resp
.
ModelPricing
[
1
]
.
BillingMode
)
require
.
Equal
(
t
,
int64
(
3
),
resp
.
ModelPricing
[
2
]
.
ID
)
require
.
Equal
(
t
,
"gemini"
,
resp
.
ModelPricing
[
2
]
.
Platform
)
require
.
Equal
(
t
,
[]
string
{
"gemini-2.5-pro"
},
resp
.
ModelPricing
[
2
]
.
Models
)
require
.
Equal
(
t
,
"image"
,
resp
.
ModelPricing
[
2
]
.
BillingMode
)
require
.
Equal
(
t
,
float64Ptr
(
0.05
),
resp
.
ModelPricing
[
2
]
.
ImageOutputPrice
)
}
// ---------------------------------------------------------------------------
// 2. pricingRequestToService
// ---------------------------------------------------------------------------
func
TestPricingRequestToService_Defaults
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
name
string
req
channelModelPricingRequest
wantField
string
// which default field to check
wantValue
string
}{
{
name
:
"empty billing mode defaults to token"
,
req
:
channelModelPricingRequest
{
Models
:
[]
string
{
"m1"
},
BillingMode
:
""
,
},
wantField
:
"BillingMode"
,
wantValue
:
string
(
service
.
BillingModeToken
),
},
{
name
:
"empty platform defaults to anthropic"
,
req
:
channelModelPricingRequest
{
Models
:
[]
string
{
"m1"
},
Platform
:
""
,
},
wantField
:
"Platform"
,
wantValue
:
"anthropic"
,
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
result
:=
pricingRequestToService
([]
channelModelPricingRequest
{
tt
.
req
})
require
.
Len
(
t
,
result
,
1
)
switch
tt
.
wantField
{
case
"BillingMode"
:
require
.
Equal
(
t
,
service
.
BillingMode
(
tt
.
wantValue
),
result
[
0
]
.
BillingMode
)
case
"Platform"
:
require
.
Equal
(
t
,
tt
.
wantValue
,
result
[
0
]
.
Platform
)
}
})
}
}
func
TestPricingRequestToService_WithAllFields
(
t
*
testing
.
T
)
{
reqs
:=
[]
channelModelPricingRequest
{
{
Platform
:
"openai"
,
Models
:
[]
string
{
"gpt-4"
,
"gpt-4o"
},
BillingMode
:
"per_request"
,
InputPrice
:
float64Ptr
(
0.01
),
OutputPrice
:
float64Ptr
(
0.03
),
CacheWritePrice
:
float64Ptr
(
0.005
),
CacheReadPrice
:
float64Ptr
(
0.002
),
ImageOutputPrice
:
float64Ptr
(
0.04
),
PerRequestPrice
:
float64Ptr
(
0.5
),
},
}
result
:=
pricingRequestToService
(
reqs
)
require
.
Len
(
t
,
result
,
1
)
r
:=
result
[
0
]
require
.
Equal
(
t
,
"openai"
,
r
.
Platform
)
require
.
Equal
(
t
,
[]
string
{
"gpt-4"
,
"gpt-4o"
},
r
.
Models
)
require
.
Equal
(
t
,
service
.
BillingModePerRequest
,
r
.
BillingMode
)
require
.
Equal
(
t
,
float64Ptr
(
0.01
),
r
.
InputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.03
),
r
.
OutputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.005
),
r
.
CacheWritePrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.002
),
r
.
CacheReadPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.04
),
r
.
ImageOutputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.5
),
r
.
PerRequestPrice
)
}
func
TestPricingRequestToService_WithIntervals
(
t
*
testing
.
T
)
{
reqs
:=
[]
channelModelPricingRequest
{
{
Models
:
[]
string
{
"m1"
},
BillingMode
:
"per_request"
,
Intervals
:
[]
pricingIntervalRequest
{
{
MinTokens
:
0
,
MaxTokens
:
intPtr
(
2000
),
TierLabel
:
"small"
,
InputPrice
:
float64Ptr
(
0.01
),
OutputPrice
:
float64Ptr
(
0.02
),
CacheWritePrice
:
float64Ptr
(
0.003
),
CacheReadPrice
:
float64Ptr
(
0.001
),
PerRequestPrice
:
float64Ptr
(
0.1
),
SortOrder
:
1
,
},
{
MinTokens
:
2000
,
MaxTokens
:
nil
,
TierLabel
:
"large"
,
SortOrder
:
2
,
},
},
},
}
result
:=
pricingRequestToService
(
reqs
)
require
.
Len
(
t
,
result
,
1
)
require
.
Len
(
t
,
result
[
0
]
.
Intervals
,
2
)
iv0
:=
result
[
0
]
.
Intervals
[
0
]
require
.
Equal
(
t
,
0
,
iv0
.
MinTokens
)
require
.
Equal
(
t
,
intPtr
(
2000
),
iv0
.
MaxTokens
)
require
.
Equal
(
t
,
"small"
,
iv0
.
TierLabel
)
require
.
Equal
(
t
,
float64Ptr
(
0.01
),
iv0
.
InputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.02
),
iv0
.
OutputPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.003
),
iv0
.
CacheWritePrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.001
),
iv0
.
CacheReadPrice
)
require
.
Equal
(
t
,
float64Ptr
(
0.1
),
iv0
.
PerRequestPrice
)
require
.
Equal
(
t
,
1
,
iv0
.
SortOrder
)
iv1
:=
result
[
0
]
.
Intervals
[
1
]
require
.
Equal
(
t
,
2000
,
iv1
.
MinTokens
)
require
.
Nil
(
t
,
iv1
.
MaxTokens
)
require
.
Equal
(
t
,
"large"
,
iv1
.
TierLabel
)
require
.
Equal
(
t
,
2
,
iv1
.
SortOrder
)
}
func
TestPricingRequestToService_EmptySlice
(
t
*
testing
.
T
)
{
result
:=
pricingRequestToService
([]
channelModelPricingRequest
{})
require
.
NotNil
(
t
,
result
)
require
.
Empty
(
t
,
result
)
}
func
TestPricingRequestToService_NilPriceFields
(
t
*
testing
.
T
)
{
reqs
:=
[]
channelModelPricingRequest
{
{
Models
:
[]
string
{
"m1"
},
BillingMode
:
"token"
,
// all price fields are nil by default
},
}
result
:=
pricingRequestToService
(
reqs
)
require
.
Len
(
t
,
result
,
1
)
r
:=
result
[
0
]
require
.
Nil
(
t
,
r
.
InputPrice
)
require
.
Nil
(
t
,
r
.
OutputPrice
)
require
.
Nil
(
t
,
r
.
CacheWritePrice
)
require
.
Nil
(
t
,
r
.
CacheReadPrice
)
require
.
Nil
(
t
,
r
.
ImageOutputPrice
)
require
.
Nil
(
t
,
r
.
PerRequestPrice
)
}
// ---------------------------------------------------------------------------
// 3. validatePricingBillingMode
// ---------------------------------------------------------------------------
func
TestValidatePricingBillingMode
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
name
string
pricing
[]
service
.
ChannelModelPricing
wantErr
bool
}{
{
name
:
"token mode - valid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModeToken
},
},
wantErr
:
false
,
},
{
name
:
"per_request with price - valid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModePerRequest
,
PerRequestPrice
:
float64Ptr
(
0.5
),
},
},
wantErr
:
false
,
},
{
name
:
"per_request with intervals - valid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModePerRequest
,
Intervals
:
[]
service
.
PricingInterval
{
{
MinTokens
:
0
,
MaxTokens
:
intPtr
(
1000
),
PerRequestPrice
:
float64Ptr
(
0.1
)},
},
},
},
wantErr
:
false
,
},
{
name
:
"per_request no price no intervals - invalid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModePerRequest
},
},
wantErr
:
true
,
},
{
name
:
"image with price - valid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModeImage
,
PerRequestPrice
:
float64Ptr
(
0.2
),
},
},
wantErr
:
false
,
},
{
name
:
"image no price no intervals - invalid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModeImage
},
},
wantErr
:
true
,
},
{
name
:
"empty list - valid"
,
pricing
:
[]
service
.
ChannelModelPricing
{},
wantErr
:
false
,
},
{
name
:
"mixed modes with invalid image - invalid"
,
pricing
:
[]
service
.
ChannelModelPricing
{
{
BillingMode
:
service
.
BillingModeToken
,
InputPrice
:
float64Ptr
(
0.01
),
},
{
BillingMode
:
service
.
BillingModePerRequest
,
PerRequestPrice
:
float64Ptr
(
0.5
),
},
{
BillingMode
:
service
.
BillingModeImage
,
},
},
wantErr
:
true
,
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
err
:=
validatePricingBillingMode
(
tt
.
pricing
)
if
tt
.
wantErr
{
require
.
Error
(
t
,
err
)
require
.
Contains
(
t
,
err
.
Error
(),
"per-request price or intervals required"
)
}
else
{
require
.
NoError
(
t
,
err
)
}
})
}
}
backend/internal/handler/admin/dashboard_handler.go
View file @
7b83d6e7
...
@@ -636,6 +636,40 @@ func (h *DashboardHandler) GetUserBreakdown(c *gin.Context) {
...
@@ -636,6 +636,40 @@ func (h *DashboardHandler) GetUserBreakdown(c *gin.Context) {
dim
.
Endpoint
=
c
.
Query
(
"endpoint"
)
dim
.
Endpoint
=
c
.
Query
(
"endpoint"
)
dim
.
EndpointType
=
c
.
DefaultQuery
(
"endpoint_type"
,
"inbound"
)
dim
.
EndpointType
=
c
.
DefaultQuery
(
"endpoint_type"
,
"inbound"
)
// Additional filter conditions
if
v
:=
c
.
Query
(
"user_id"
);
v
!=
""
{
if
id
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
64
);
err
==
nil
{
dim
.
UserID
=
id
}
}
if
v
:=
c
.
Query
(
"api_key_id"
);
v
!=
""
{
if
id
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
64
);
err
==
nil
{
dim
.
APIKeyID
=
id
}
}
if
v
:=
c
.
Query
(
"account_id"
);
v
!=
""
{
if
id
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
64
);
err
==
nil
{
dim
.
AccountID
=
id
}
}
if
v
:=
c
.
Query
(
"request_type"
);
v
!=
""
{
if
rt
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
16
);
err
==
nil
{
rtVal
:=
int16
(
rt
)
dim
.
RequestType
=
&
rtVal
}
}
if
v
:=
c
.
Query
(
"stream"
);
v
!=
""
{
if
s
,
err
:=
strconv
.
ParseBool
(
v
);
err
==
nil
{
dim
.
Stream
=
&
s
}
}
if
v
:=
c
.
Query
(
"billing_type"
);
v
!=
""
{
if
bt
,
err
:=
strconv
.
ParseInt
(
v
,
10
,
8
);
err
==
nil
{
btVal
:=
int8
(
bt
)
dim
.
BillingType
=
&
btVal
}
}
limit
:=
50
limit
:=
50
if
v
:=
c
.
Query
(
"limit"
);
v
!=
""
{
if
v
:=
c
.
Query
(
"limit"
);
v
!=
""
{
if
n
,
err
:=
strconv
.
Atoi
(
v
);
err
==
nil
&&
n
>
0
&&
n
<=
200
{
if
n
,
err
:=
strconv
.
Atoi
(
v
);
err
==
nil
&&
n
>
0
&&
n
<=
200
{
...
...
backend/internal/handler/admin/redeem_handler.go
View file @
7b83d6e7
...
@@ -35,9 +35,9 @@ func NewRedeemHandler(adminService service.AdminService, redeemService *service.
...
@@ -35,9 +35,9 @@ func NewRedeemHandler(adminService service.AdminService, redeemService *service.
type
GenerateRedeemCodesRequest
struct
{
type
GenerateRedeemCodesRequest
struct
{
Count
int
`json:"count" binding:"required,min=1,max=100"`
Count
int
`json:"count" binding:"required,min=1,max=100"`
Type
string
`json:"type" binding:"required,oneof=balance concurrency subscription invitation"`
Type
string
`json:"type" binding:"required,oneof=balance concurrency subscription invitation"`
Value
float64
`json:"value"
binding:"min=0"
`
Value
float64
`json:"value"`
GroupID
*
int64
`json:"group_id"`
// 订阅类型必填
GroupID
*
int64
`json:"group_id"`
// 订阅类型必填
ValidityDays
int
`json:"validity_days"
binding:"omitempty,max=36500"`
// 订阅类型使用,默认30天,最大100年
ValidityDays
int
`json:"validity_days"
`
// 订阅类型使用,正数增加/负数退款扣减
}
}
// CreateAndRedeemCodeRequest represents creating a fixed code and redeeming it for a target user.
// CreateAndRedeemCodeRequest represents creating a fixed code and redeeming it for a target user.
...
@@ -45,10 +45,10 @@ type GenerateRedeemCodesRequest struct {
...
@@ -45,10 +45,10 @@ type GenerateRedeemCodesRequest struct {
type
CreateAndRedeemCodeRequest
struct
{
type
CreateAndRedeemCodeRequest
struct
{
Code
string
`json:"code" binding:"required,min=3,max=128"`
Code
string
`json:"code" binding:"required,min=3,max=128"`
Type
string
`json:"type" binding:"omitempty,oneof=balance concurrency subscription invitation"`
// 不传时默认 balance(向后兼容)
Type
string
`json:"type" binding:"omitempty,oneof=balance concurrency subscription invitation"`
// 不传时默认 balance(向后兼容)
Value
float64
`json:"value" binding:"required
,gt=0
"`
Value
float64
`json:"value" binding:"required"`
UserID
int64
`json:"user_id" binding:"required,gt=0"`
UserID
int64
`json:"user_id" binding:"required,gt=0"`
GroupID
*
int64
`json:"group_id"`
// subscription 类型必填
GroupID
*
int64
`json:"group_id"`
// subscription 类型必填
ValidityDays
int
`json:"validity_days"
binding:"omitempty,max=36500"
`
// subscription 类型
必填,>0
ValidityDays
int
`json:"validity_days"`
// subscription 类型
:正数增加,负数退款扣减
Notes
string
`json:"notes"`
Notes
string
`json:"notes"`
}
}
...
@@ -150,8 +150,8 @@ func (h *RedeemHandler) CreateAndRedeem(c *gin.Context) {
...
@@ -150,8 +150,8 @@ func (h *RedeemHandler) CreateAndRedeem(c *gin.Context) {
response
.
BadRequest
(
c
,
"group_id is required for subscription type"
)
response
.
BadRequest
(
c
,
"group_id is required for subscription type"
)
return
return
}
}
if
req
.
ValidityDays
<
=
0
{
if
req
.
ValidityDays
=
=
0
{
response
.
BadRequest
(
c
,
"validity_days must
be greater than 0
for subscription type"
)
response
.
BadRequest
(
c
,
"validity_days must
not be zero
for subscription type"
)
return
return
}
}
}
}
...
...
backend/internal/handler/admin/redeem_handler_test.go
View file @
7b83d6e7
...
@@ -76,32 +76,38 @@ func TestCreateAndRedeem_SubscriptionRequiresGroupID(t *testing.T) {
...
@@ -76,32 +76,38 @@ func TestCreateAndRedeem_SubscriptionRequiresGroupID(t *testing.T) {
assert
.
Equal
(
t
,
http
.
StatusBadRequest
,
code
)
assert
.
Equal
(
t
,
http
.
StatusBadRequest
,
code
)
}
}
func
TestCreateAndRedeem_SubscriptionRequires
Positive
ValidityDays
(
t
*
testing
.
T
)
{
func
TestCreateAndRedeem_SubscriptionRequires
NonZero
ValidityDays
(
t
*
testing
.
T
)
{
groupID
:=
int64
(
5
)
groupID
:=
int64
(
5
)
h
:=
newCreateAndRedeemHandler
()
h
:=
newCreateAndRedeemHandler
()
cases
:=
[]
struct
{
// zero should be rejected
name
string
t
.
Run
(
"zero"
,
func
(
t
*
testing
.
T
)
{
validityDays
int
code
:=
postCreateAndRedeemValidation
(
t
,
h
,
map
[
string
]
any
{
}{
"code"
:
"test-sub-bad-days-zero"
,
{
"zero"
,
0
},
"type"
:
"subscription"
,
{
"negative"
,
-
1
},
"value"
:
29.9
,
}
"user_id"
:
1
,
"group_id"
:
groupID
,
"validity_days"
:
0
,
})
assert
.
Equal
(
t
,
http
.
StatusBadRequest
,
code
)
})
for
_
,
tc
:=
range
cases
{
// negative should pass validation (used for refund/reduction)
t
.
Run
(
tc
.
name
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"negative_passes_validation"
,
func
(
t
*
testing
.
T
)
{
code
:=
postCreateAndRedeemValidation
(
t
,
h
,
map
[
string
]
any
{
code
:=
postCreateAndRedeemValidation
(
t
,
h
,
map
[
string
]
any
{
"code"
:
"test-sub-bad-days-"
+
tc
.
name
,
"code"
:
"test-sub-negative-days"
,
"type"
:
"subscription"
,
"type"
:
"subscription"
,
"value"
:
29.9
,
"value"
:
29.9
,
"user_id"
:
1
,
"user_id"
:
1
,
"group_id"
:
groupID
,
"group_id"
:
groupID
,
"validity_days"
:
tc
.
validityDays
,
"validity_days"
:
-
7
,
})
assert
.
Equal
(
t
,
http
.
StatusBadRequest
,
code
)
})
})
}
assert
.
NotEqual
(
t
,
http
.
StatusBadRequest
,
code
,
"negative validity_days should pass validation for refund"
)
})
}
}
func
TestCreateAndRedeem_SubscriptionValidParamsPassValidation
(
t
*
testing
.
T
)
{
func
TestCreateAndRedeem_SubscriptionValidParamsPassValidation
(
t
*
testing
.
T
)
{
...
...
backend/internal/handler/admin/usage_handler.go
View file @
7b83d6e7
...
@@ -110,6 +110,7 @@ func (h *UsageHandler) List(c *gin.Context) {
...
@@ -110,6 +110,7 @@ func (h *UsageHandler) List(c *gin.Context) {
}
}
model
:=
c
.
Query
(
"model"
)
model
:=
c
.
Query
(
"model"
)
billingMode
:=
strings
.
TrimSpace
(
c
.
Query
(
"billing_mode"
))
var
requestType
*
int16
var
requestType
*
int16
var
stream
*
bool
var
stream
*
bool
...
@@ -174,6 +175,7 @@ func (h *UsageHandler) List(c *gin.Context) {
...
@@ -174,6 +175,7 @@ func (h *UsageHandler) List(c *gin.Context) {
RequestType
:
requestType
,
RequestType
:
requestType
,
Stream
:
stream
,
Stream
:
stream
,
BillingType
:
billingType
,
BillingType
:
billingType
,
BillingMode
:
billingMode
,
StartTime
:
startTime
,
StartTime
:
startTime
,
EndTime
:
endTime
,
EndTime
:
endTime
,
ExactTotal
:
exactTotal
,
ExactTotal
:
exactTotal
,
...
@@ -234,6 +236,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
...
@@ -234,6 +236,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
}
}
model
:=
c
.
Query
(
"model"
)
model
:=
c
.
Query
(
"model"
)
billingMode
:=
strings
.
TrimSpace
(
c
.
Query
(
"billing_mode"
))
var
requestType
*
int16
var
requestType
*
int16
var
stream
*
bool
var
stream
*
bool
...
@@ -312,6 +315,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
...
@@ -312,6 +315,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
RequestType
:
requestType
,
RequestType
:
requestType
,
Stream
:
stream
,
Stream
:
stream
,
BillingType
:
billingType
,
BillingType
:
billingType
,
BillingMode
:
billingMode
,
StartTime
:
&
startTime
,
StartTime
:
&
startTime
,
EndTime
:
&
endTime
,
EndTime
:
&
endTime
,
}
}
...
...
backend/internal/handler/dto/mappers.go
View file @
7b83d6e7
...
@@ -577,6 +577,7 @@ func usageLogFromServiceUser(l *service.UsageLog) UsageLog {
...
@@ -577,6 +577,7 @@ func usageLogFromServiceUser(l *service.UsageLog) UsageLog {
MediaType
:
l
.
MediaType
,
MediaType
:
l
.
MediaType
,
UserAgent
:
l
.
UserAgent
,
UserAgent
:
l
.
UserAgent
,
CacheTTLOverridden
:
l
.
CacheTTLOverridden
,
CacheTTLOverridden
:
l
.
CacheTTLOverridden
,
BillingMode
:
l
.
BillingMode
,
CreatedAt
:
l
.
CreatedAt
,
CreatedAt
:
l
.
CreatedAt
,
User
:
UserFromServiceShallow
(
l
.
User
),
User
:
UserFromServiceShallow
(
l
.
User
),
APIKey
:
APIKeyFromService
(
l
.
APIKey
),
APIKey
:
APIKeyFromService
(
l
.
APIKey
),
...
@@ -604,6 +605,9 @@ func UsageLogFromServiceAdmin(l *service.UsageLog) *AdminUsageLog {
...
@@ -604,6 +605,9 @@ func UsageLogFromServiceAdmin(l *service.UsageLog) *AdminUsageLog {
return
&
AdminUsageLog
{
return
&
AdminUsageLog
{
UsageLog
:
usageLogFromServiceUser
(
l
),
UsageLog
:
usageLogFromServiceUser
(
l
),
UpstreamModel
:
l
.
UpstreamModel
,
UpstreamModel
:
l
.
UpstreamModel
,
ChannelID
:
l
.
ChannelID
,
ModelMappingChain
:
l
.
ModelMappingChain
,
BillingTier
:
l
.
BillingTier
,
AccountRateMultiplier
:
l
.
AccountRateMultiplier
,
AccountRateMultiplier
:
l
.
AccountRateMultiplier
,
IPAddress
:
l
.
IPAddress
,
IPAddress
:
l
.
IPAddress
,
Account
:
AccountSummaryFromService
(
l
.
Account
),
Account
:
AccountSummaryFromService
(
l
.
Account
),
...
...
backend/internal/handler/dto/types.go
View file @
7b83d6e7
...
@@ -390,6 +390,9 @@ type UsageLog struct {
...
@@ -390,6 +390,9 @@ type UsageLog struct {
// Cache TTL Override 标记
// Cache TTL Override 标记
CacheTTLOverridden
bool
`json:"cache_ttl_overridden"`
CacheTTLOverridden
bool
`json:"cache_ttl_overridden"`
// BillingMode 计费模式:token/image
BillingMode
*
string
`json:"billing_mode,omitempty"`
CreatedAt
time
.
Time
`json:"created_at"`
CreatedAt
time
.
Time
`json:"created_at"`
User
*
User
`json:"user,omitempty"`
User
*
User
`json:"user,omitempty"`
...
@@ -406,6 +409,13 @@ type AdminUsageLog struct {
...
@@ -406,6 +409,13 @@ type AdminUsageLog struct {
// Omitted when no mapping was applied (requested model was used as-is).
// Omitted when no mapping was applied (requested model was used as-is).
UpstreamModel
*
string
`json:"upstream_model,omitempty"`
UpstreamModel
*
string
`json:"upstream_model,omitempty"`
// ChannelID 渠道 ID
ChannelID
*
int64
`json:"channel_id,omitempty"`
// ModelMappingChain 模型映射链,如 "a→b→c"
ModelMappingChain
*
string
`json:"model_mapping_chain,omitempty"`
// BillingTier 计费层级标签(per_request/image 模式)
BillingTier
*
string
`json:"billing_tier,omitempty"`
// AccountRateMultiplier 账号计费倍率快照(nil 表示按 1.0 处理)
// AccountRateMultiplier 账号计费倍率快照(nil 表示按 1.0 处理)
AccountRateMultiplier
*
float64
`json:"account_rate_multiplier"`
AccountRateMultiplier
*
float64
`json:"account_rate_multiplier"`
...
...
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment