chore: 更新依赖、配置和代码生成

主要更新:
- 更新 go.mod/go.sum 依赖
- 重新生成 Ent ORM 代码
- 更新 Wire 依赖注入配置
- 添加 docker-compose.override.yml 到 .gitignore
- 更新 README 文档(Simple Mode 说明和已知问题)
- 清理调试日志
- 其他代码优化和格式修复
This commit is contained in:
ianshaw
2026-01-03 06:37:08 -08:00
parent b1702de522
commit 112a2d0866
121 changed files with 3058 additions and 2948 deletions

4
.gitignore vendored
View File

@@ -48,6 +48,7 @@ pnpm-debug.log*
.env.*.local .env.*.local
*.env *.env
!.env.example !.env.example
docker-compose.override.yml
# =================== # ===================
# IDE / 编辑器 # IDE / 编辑器
@@ -78,8 +79,6 @@ temp/
*.log *.log
*.bak *.bak
.cache/ .cache/
.gemini-clipboard/
migrations/
# =================== # ===================
# 构建产物 # 构建产物
@@ -121,3 +120,4 @@ code-reviews/
AGENTS.md AGENTS.md
backend/cmd/server/server backend/cmd/server/server
deploy/docker-compose.override.yml deploy/docker-compose.override.yml
.gocache/

View File

@@ -297,6 +297,16 @@ go generate ./cmd/server
--- ---
## Simple Mode
Simple Mode is designed for individual developers or internal teams who want quick access without full SaaS features.
- Enable: Set environment variable `RUN_MODE=simple`
- Difference: Hides SaaS-related features and skips billing process
- Security note: In production, you must also set `SIMPLE_MODE_CONFIRM=true` to allow startup
---
## Antigravity Support ## Antigravity Support
Sub2API supports [Antigravity](https://antigravity.so/) accounts. After authorization, dedicated endpoints are available for Claude and Gemini models. Sub2API supports [Antigravity](https://antigravity.so/) accounts. After authorization, dedicated endpoints are available for Claude and Gemini models.
@@ -321,6 +331,12 @@ Antigravity accounts support optional **hybrid scheduling**. When enabled, the g
> **⚠️ Warning**: Anthropic Claude and Antigravity Claude **cannot be mixed within the same conversation context**. Use groups to isolate them properly. > **⚠️ Warning**: Anthropic Claude and Antigravity Claude **cannot be mixed within the same conversation context**. Use groups to isolate them properly.
### Known Issues
In Claude Code, Plan Mode cannot exit automatically. (Normally when using the native Claude API, after planning is complete, Claude Code will pop up options for users to approve or reject the plan.)
**Workaround**: Press `Shift + Tab` to manually exit Plan Mode, then type your response to approve or reject the plan.
--- ---
## Project Structure ## Project Structure

View File

@@ -331,6 +331,10 @@ Antigravity 账户支持可选的**混合调度**功能。开启后,通用端
> **⚠️ 注意**Anthropic Claude 和 Antigravity Claude **不能在同一上下文中混合使用**,请通过分组功能做好隔离。 > **⚠️ 注意**Anthropic Claude 和 Antigravity Claude **不能在同一上下文中混合使用**,请通过分组功能做好隔离。
### 已知问题
在 Claude Code 中无法自动退出Plan Mode。正常使用原生Claude Api时Plan 完成后Claude Code会弹出弹出选项让用户同意或拒绝Plan。
解决办法shift + Tab手动退出Plan mode然后输入内容 告诉 Claude Code 同意或拒绝 Plan
--- ---
## 项目结构 ## 项目结构

0
backend/__tmp_test Normal file
View File

View File

@@ -70,13 +70,7 @@ func provideCleanup(
openaiOAuth *service.OpenAIOAuthService, openaiOAuth *service.OpenAIOAuthService,
geminiOAuth *service.GeminiOAuthService, geminiOAuth *service.GeminiOAuthService,
antigravityOAuth *service.AntigravityOAuthService, antigravityOAuth *service.AntigravityOAuthService,
antigravityQuota *service.AntigravityQuotaRefresher,
opsMetricsCollector *service.OpsMetricsCollector,
opsAlertService *service.OpsAlertService,
) func() { ) func() {
if opsAlertService != nil {
opsAlertService.Start()
}
return func() { return func() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() defer cancel()
@@ -86,14 +80,6 @@ func provideCleanup(
name string name string
fn func() error fn func() error
}{ }{
{"OpsMetricsCollector", func() error {
opsMetricsCollector.Stop()
return nil
}},
{"OpsAlertService", func() error {
opsAlertService.Stop()
return nil
}},
{"TokenRefreshService", func() error { {"TokenRefreshService", func() error {
tokenRefresh.Stop() tokenRefresh.Stop()
return nil return nil
@@ -126,10 +112,6 @@ func provideCleanup(
antigravityOAuth.Stop() antigravityOAuth.Stop()
return nil return nil
}}, }},
{"AntigravityQuotaRefresher", func() error {
antigravityQuota.Stop()
return nil
}},
{"Redis", func() error { {"Redis", func() error {
return rdb.Close() return rdb.Close()
}}, }},

View File

@@ -55,11 +55,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
userService := service.NewUserService(userRepository) userService := service.NewUserService(userRepository)
authHandler := handler.NewAuthHandler(configConfig, authService, userService) authHandler := handler.NewAuthHandler(configConfig, authService, userService)
userHandler := handler.NewUserHandler(userService) userHandler := handler.NewUserHandler(userService)
apiKeyRepository := repository.NewAPIKeyRepository(client) apiKeyRepository := repository.NewApiKeyRepository(client)
groupRepository := repository.NewGroupRepository(client, db) groupRepository := repository.NewGroupRepository(client, db)
userSubscriptionRepository := repository.NewUserSubscriptionRepository(client) userSubscriptionRepository := repository.NewUserSubscriptionRepository(client)
apiKeyCache := repository.NewAPIKeyCache(redisClient) apiKeyCache := repository.NewApiKeyCache(redisClient)
apiKeyService := service.NewAPIKeyService(apiKeyRepository, userRepository, groupRepository, userSubscriptionRepository, apiKeyCache, configConfig) apiKeyService := service.NewApiKeyService(apiKeyRepository, userRepository, groupRepository, userSubscriptionRepository, apiKeyCache, configConfig)
apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService) apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService)
usageLogRepository := repository.NewUsageLogRepository(client, db) usageLogRepository := repository.NewUsageLogRepository(client, db)
usageService := service.NewUsageService(usageLogRepository, userRepository) usageService := service.NewUsageService(usageLogRepository, userRepository)
@@ -74,9 +74,6 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
subscriptionHandler := handler.NewSubscriptionHandler(subscriptionService) subscriptionHandler := handler.NewSubscriptionHandler(subscriptionService)
dashboardService := service.NewDashboardService(usageLogRepository) dashboardService := service.NewDashboardService(usageLogRepository)
dashboardHandler := admin.NewDashboardHandler(dashboardService) dashboardHandler := admin.NewDashboardHandler(dashboardService)
opsRepository := repository.NewOpsRepository(client, db, redisClient)
opsService := service.NewOpsService(opsRepository, db)
opsHandler := admin.NewOpsHandler(opsService)
accountRepository := repository.NewAccountRepository(client, db) accountRepository := repository.NewAccountRepository(client, db)
proxyRepository := repository.NewProxyRepository(client, db) proxyRepository := repository.NewProxyRepository(client, db)
proxyExitInfoProber := repository.NewProxyExitInfoProber() proxyExitInfoProber := repository.NewProxyExitInfoProber()
@@ -91,16 +88,19 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
geminiCliCodeAssistClient := repository.NewGeminiCliCodeAssistClient() geminiCliCodeAssistClient := repository.NewGeminiCliCodeAssistClient()
geminiOAuthService := service.NewGeminiOAuthService(proxyRepository, geminiOAuthClient, geminiCliCodeAssistClient, configConfig) geminiOAuthService := service.NewGeminiOAuthService(proxyRepository, geminiOAuthClient, geminiCliCodeAssistClient, configConfig)
geminiQuotaService := service.NewGeminiQuotaService(configConfig, settingRepository) geminiQuotaService := service.NewGeminiQuotaService(configConfig, settingRepository)
rateLimitService := service.NewRateLimitService(accountRepository, usageLogRepository, configConfig, geminiQuotaService) tempUnschedCache := repository.NewTempUnschedCache(redisClient)
rateLimitService := service.NewRateLimitService(accountRepository, usageLogRepository, configConfig, geminiQuotaService, tempUnschedCache)
claudeUsageFetcher := repository.NewClaudeUsageFetcher() claudeUsageFetcher := repository.NewClaudeUsageFetcher()
accountUsageService := service.NewAccountUsageService(accountRepository, usageLogRepository, claudeUsageFetcher, geminiQuotaService) antigravityQuotaFetcher := service.NewAntigravityQuotaFetcher(proxyRepository)
usageCache := service.NewUsageCache()
accountUsageService := service.NewAccountUsageService(accountRepository, usageLogRepository, claudeUsageFetcher, geminiQuotaService, antigravityQuotaFetcher, usageCache)
geminiTokenCache := repository.NewGeminiTokenCache(redisClient) geminiTokenCache := repository.NewGeminiTokenCache(redisClient)
geminiTokenProvider := service.NewGeminiTokenProvider(accountRepository, geminiTokenCache, geminiOAuthService) geminiTokenProvider := service.NewGeminiTokenProvider(accountRepository, geminiTokenCache, geminiOAuthService)
gatewayCache := repository.NewGatewayCache(redisClient) gatewayCache := repository.NewGatewayCache(redisClient)
antigravityOAuthService := service.NewAntigravityOAuthService(proxyRepository) antigravityOAuthService := service.NewAntigravityOAuthService(proxyRepository)
antigravityTokenProvider := service.NewAntigravityTokenProvider(accountRepository, geminiTokenCache, antigravityOAuthService) antigravityTokenProvider := service.NewAntigravityTokenProvider(accountRepository, geminiTokenCache, antigravityOAuthService)
httpUpstream := repository.NewHTTPUpstream(configConfig) httpUpstream := repository.NewHTTPUpstream(configConfig)
antigravityGatewayService := service.NewAntigravityGatewayService(accountRepository, gatewayCache, antigravityTokenProvider, rateLimitService, httpUpstream) antigravityGatewayService := service.NewAntigravityGatewayService(accountRepository, gatewayCache, antigravityTokenProvider, rateLimitService, httpUpstream, settingService)
accountTestService := service.NewAccountTestService(accountRepository, oAuthService, openAIOAuthService, geminiTokenProvider, antigravityGatewayService, httpUpstream) accountTestService := service.NewAccountTestService(accountRepository, oAuthService, openAIOAuthService, geminiTokenProvider, antigravityGatewayService, httpUpstream)
concurrencyCache := repository.ProvideConcurrencyCache(redisClient, configConfig) concurrencyCache := repository.ProvideConcurrencyCache(redisClient, configConfig)
concurrencyService := service.ProvideConcurrencyService(concurrencyCache, accountRepository, configConfig) concurrencyService := service.ProvideConcurrencyService(concurrencyCache, accountRepository, configConfig)
@@ -124,24 +124,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
userAttributeValueRepository := repository.NewUserAttributeValueRepository(client) userAttributeValueRepository := repository.NewUserAttributeValueRepository(client)
userAttributeService := service.NewUserAttributeService(userAttributeDefinitionRepository, userAttributeValueRepository) userAttributeService := service.NewUserAttributeService(userAttributeDefinitionRepository, userAttributeValueRepository)
userAttributeHandler := admin.NewUserAttributeHandler(userAttributeService) userAttributeHandler := admin.NewUserAttributeHandler(userAttributeService)
adminHandlers := handler.ProvideAdminHandlers( adminHandlers := handler.ProvideAdminHandlers(dashboardHandler, adminUserHandler, groupHandler, accountHandler, oAuthHandler, openAIOAuthHandler, geminiOAuthHandler, antigravityOAuthHandler, proxyHandler, adminRedeemHandler, settingHandler, systemHandler, adminSubscriptionHandler, adminUsageHandler, userAttributeHandler)
dashboardHandler,
opsHandler,
adminUserHandler,
groupHandler,
accountHandler,
oAuthHandler,
openAIOAuthHandler,
geminiOAuthHandler,
antigravityOAuthHandler,
proxyHandler,
adminRedeemHandler,
settingHandler,
systemHandler,
adminSubscriptionHandler,
adminUsageHandler,
userAttributeHandler,
)
pricingRemoteClient := repository.NewPricingRemoteClient() pricingRemoteClient := repository.NewPricingRemoteClient()
pricingService, err := service.ProvidePricingService(configConfig, pricingRemoteClient) pricingService, err := service.ProvidePricingService(configConfig, pricingRemoteClient)
if err != nil { if err != nil {
@@ -154,21 +137,18 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
deferredService := service.ProvideDeferredService(accountRepository, timingWheelService) deferredService := service.ProvideDeferredService(accountRepository, timingWheelService)
gatewayService := service.NewGatewayService(accountRepository, groupRepository, usageLogRepository, userRepository, userSubscriptionRepository, gatewayCache, configConfig, concurrencyService, billingService, rateLimitService, billingCacheService, identityService, httpUpstream, deferredService) gatewayService := service.NewGatewayService(accountRepository, groupRepository, usageLogRepository, userRepository, userSubscriptionRepository, gatewayCache, configConfig, concurrencyService, billingService, rateLimitService, billingCacheService, identityService, httpUpstream, deferredService)
geminiMessagesCompatService := service.NewGeminiMessagesCompatService(accountRepository, groupRepository, gatewayCache, geminiTokenProvider, rateLimitService, httpUpstream, antigravityGatewayService) geminiMessagesCompatService := service.NewGeminiMessagesCompatService(accountRepository, groupRepository, gatewayCache, geminiTokenProvider, rateLimitService, httpUpstream, antigravityGatewayService)
gatewayHandler := handler.NewGatewayHandler(gatewayService, geminiMessagesCompatService, antigravityGatewayService, userService, concurrencyService, billingCacheService, opsService) gatewayHandler := handler.NewGatewayHandler(gatewayService, geminiMessagesCompatService, antigravityGatewayService, userService, concurrencyService, billingCacheService)
openAIGatewayService := service.NewOpenAIGatewayService(accountRepository, usageLogRepository, userRepository, userSubscriptionRepository, gatewayCache, configConfig, concurrencyService, billingService, rateLimitService, billingCacheService, httpUpstream, deferredService) openAIGatewayService := service.NewOpenAIGatewayService(accountRepository, usageLogRepository, userRepository, userSubscriptionRepository, gatewayCache, configConfig, concurrencyService, billingService, rateLimitService, billingCacheService, httpUpstream, deferredService)
openAIGatewayHandler := handler.NewOpenAIGatewayHandler(openAIGatewayService, concurrencyService, billingCacheService, opsService) openAIGatewayHandler := handler.NewOpenAIGatewayHandler(openAIGatewayService, concurrencyService, billingCacheService)
handlerSettingHandler := handler.ProvideSettingHandler(settingService, buildInfo) handlerSettingHandler := handler.ProvideSettingHandler(settingService, buildInfo)
handlers := handler.ProvideHandlers(authHandler, userHandler, apiKeyHandler, usageHandler, redeemHandler, subscriptionHandler, adminHandlers, gatewayHandler, openAIGatewayHandler, handlerSettingHandler) handlers := handler.ProvideHandlers(authHandler, userHandler, apiKeyHandler, usageHandler, redeemHandler, subscriptionHandler, adminHandlers, gatewayHandler, openAIGatewayHandler, handlerSettingHandler)
jwtAuthMiddleware := middleware.NewJWTAuthMiddleware(authService, userService) jwtAuthMiddleware := middleware.NewJWTAuthMiddleware(authService, userService)
adminAuthMiddleware := middleware.NewAdminAuthMiddleware(authService, userService, settingService) adminAuthMiddleware := middleware.NewAdminAuthMiddleware(authService, userService, settingService)
apiKeyAuthMiddleware := middleware.NewAPIKeyAuthMiddleware(apiKeyService, subscriptionService, configConfig, opsService) apiKeyAuthMiddleware := middleware.NewApiKeyAuthMiddleware(apiKeyService, subscriptionService, configConfig)
engine := server.ProvideRouter(configConfig, handlers, jwtAuthMiddleware, adminAuthMiddleware, apiKeyAuthMiddleware, apiKeyService, subscriptionService) engine := server.ProvideRouter(configConfig, handlers, jwtAuthMiddleware, adminAuthMiddleware, apiKeyAuthMiddleware, apiKeyService, subscriptionService)
httpServer := server.ProvideHTTPServer(configConfig, engine) httpServer := server.ProvideHTTPServer(configConfig, engine)
tokenRefreshService := service.ProvideTokenRefreshService(accountRepository, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, configConfig) tokenRefreshService := service.ProvideTokenRefreshService(accountRepository, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, configConfig)
antigravityQuotaRefresher := service.ProvideAntigravityQuotaRefresher(accountRepository, proxyRepository, antigravityOAuthService, configConfig) v := provideCleanup(client, redisClient, tokenRefreshService, pricingService, emailQueueService, billingCacheService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService)
opsAlertService := service.ProvideOpsAlertService(opsService, userService, emailService)
opsMetricsCollector := service.ProvideOpsMetricsCollector(opsService, concurrencyService)
v := provideCleanup(client, redisClient, tokenRefreshService, pricingService, emailQueueService, billingCacheService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, antigravityQuotaRefresher, opsMetricsCollector, opsAlertService)
application := &Application{ application := &Application{
Server: httpServer, Server: httpServer,
Cleanup: v, Cleanup: v,
@@ -201,13 +181,7 @@ func provideCleanup(
openaiOAuth *service.OpenAIOAuthService, openaiOAuth *service.OpenAIOAuthService,
geminiOAuth *service.GeminiOAuthService, geminiOAuth *service.GeminiOAuthService,
antigravityOAuth *service.AntigravityOAuthService, antigravityOAuth *service.AntigravityOAuthService,
antigravityQuota *service.AntigravityQuotaRefresher,
opsMetricsCollector *service.OpsMetricsCollector,
opsAlertService *service.OpsAlertService,
) func() { ) func() {
if opsAlertService != nil {
opsAlertService.Start()
}
return func() { return func() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() defer cancel()
@@ -216,14 +190,6 @@ func provideCleanup(
name string name string
fn func() error fn func() error
}{ }{
{"OpsMetricsCollector", func() error {
opsMetricsCollector.Stop()
return nil
}},
{"OpsAlertService", func() error {
opsAlertService.Stop()
return nil
}},
{"TokenRefreshService", func() error { {"TokenRefreshService", func() error {
tokenRefresh.Stop() tokenRefresh.Stop()
return nil return nil
@@ -256,10 +222,6 @@ func provideCleanup(
antigravityOAuth.Stop() antigravityOAuth.Stop()
return nil return nil
}}, }},
{"AntigravityQuotaRefresher", func() error {
antigravityQuota.Stop()
return nil
}},
{"Redis", func() error { {"Redis", func() error {
return rdb.Close() return rdb.Close()
}}, }},

View File

@@ -14,8 +14,8 @@ import (
"github.com/Wei-Shaw/sub2api/ent/user" "github.com/Wei-Shaw/sub2api/ent/user"
) )
// APIKey is the model entity for the APIKey schema. // ApiKey is the model entity for the ApiKey schema.
type APIKey struct { type ApiKey struct {
config `json:"-"` config `json:"-"`
// ID of the ent. // ID of the ent.
ID int64 `json:"id,omitempty"` ID int64 `json:"id,omitempty"`
@@ -36,13 +36,13 @@ type APIKey struct {
// Status holds the value of the "status" field. // Status holds the value of the "status" field.
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
// Edges holds the relations/edges for other nodes in the graph. // Edges holds the relations/edges for other nodes in the graph.
// The values are being populated by the APIKeyQuery when eager-loading is set. // The values are being populated by the ApiKeyQuery when eager-loading is set.
Edges APIKeyEdges `json:"edges"` Edges ApiKeyEdges `json:"edges"`
selectValues sql.SelectValues selectValues sql.SelectValues
} }
// APIKeyEdges holds the relations/edges for other nodes in the graph. // ApiKeyEdges holds the relations/edges for other nodes in the graph.
type APIKeyEdges struct { type ApiKeyEdges struct {
// User holds the value of the user edge. // User holds the value of the user edge.
User *User `json:"user,omitempty"` User *User `json:"user,omitempty"`
// Group holds the value of the group edge. // Group holds the value of the group edge.
@@ -56,7 +56,7 @@ type APIKeyEdges struct {
// UserOrErr returns the User value or an error if the edge // UserOrErr returns the User value or an error if the edge
// was not loaded in eager-loading, or loaded but was not found. // was not loaded in eager-loading, or loaded but was not found.
func (e APIKeyEdges) UserOrErr() (*User, error) { func (e ApiKeyEdges) UserOrErr() (*User, error) {
if e.User != nil { if e.User != nil {
return e.User, nil return e.User, nil
} else if e.loadedTypes[0] { } else if e.loadedTypes[0] {
@@ -67,7 +67,7 @@ func (e APIKeyEdges) UserOrErr() (*User, error) {
// GroupOrErr returns the Group value or an error if the edge // GroupOrErr returns the Group value or an error if the edge
// was not loaded in eager-loading, or loaded but was not found. // was not loaded in eager-loading, or loaded but was not found.
func (e APIKeyEdges) GroupOrErr() (*Group, error) { func (e ApiKeyEdges) GroupOrErr() (*Group, error) {
if e.Group != nil { if e.Group != nil {
return e.Group, nil return e.Group, nil
} else if e.loadedTypes[1] { } else if e.loadedTypes[1] {
@@ -78,7 +78,7 @@ func (e APIKeyEdges) GroupOrErr() (*Group, error) {
// UsageLogsOrErr returns the UsageLogs value or an error if the edge // UsageLogsOrErr returns the UsageLogs value or an error if the edge
// was not loaded in eager-loading. // was not loaded in eager-loading.
func (e APIKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) { func (e ApiKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) {
if e.loadedTypes[2] { if e.loadedTypes[2] {
return e.UsageLogs, nil return e.UsageLogs, nil
} }
@@ -86,7 +86,7 @@ func (e APIKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) {
} }
// scanValues returns the types for scanning values from sql.Rows. // scanValues returns the types for scanning values from sql.Rows.
func (*APIKey) scanValues(columns []string) ([]any, error) { func (*ApiKey) scanValues(columns []string) ([]any, error) {
values := make([]any, len(columns)) values := make([]any, len(columns))
for i := range columns { for i := range columns {
switch columns[i] { switch columns[i] {
@@ -104,8 +104,8 @@ func (*APIKey) scanValues(columns []string) ([]any, error) {
} }
// assignValues assigns the values that were returned from sql.Rows (after scanning) // assignValues assigns the values that were returned from sql.Rows (after scanning)
// to the APIKey fields. // to the ApiKey fields.
func (_m *APIKey) assignValues(columns []string, values []any) error { func (_m *ApiKey) assignValues(columns []string, values []any) error {
if m, n := len(values), len(columns); m < n { if m, n := len(values), len(columns); m < n {
return fmt.Errorf("mismatch number of scan values: %d != %d", m, n) return fmt.Errorf("mismatch number of scan values: %d != %d", m, n)
} }
@@ -174,49 +174,49 @@ func (_m *APIKey) assignValues(columns []string, values []any) error {
return nil return nil
} }
// Value returns the ent.Value that was dynamically selected and assigned to the APIKey. // Value returns the ent.Value that was dynamically selected and assigned to the ApiKey.
// This includes values selected through modifiers, order, etc. // This includes values selected through modifiers, order, etc.
func (_m *APIKey) Value(name string) (ent.Value, error) { func (_m *ApiKey) Value(name string) (ent.Value, error) {
return _m.selectValues.Get(name) return _m.selectValues.Get(name)
} }
// QueryUser queries the "user" edge of the APIKey entity. // QueryUser queries the "user" edge of the ApiKey entity.
func (_m *APIKey) QueryUser() *UserQuery { func (_m *ApiKey) QueryUser() *UserQuery {
return NewAPIKeyClient(_m.config).QueryUser(_m) return NewApiKeyClient(_m.config).QueryUser(_m)
} }
// QueryGroup queries the "group" edge of the APIKey entity. // QueryGroup queries the "group" edge of the ApiKey entity.
func (_m *APIKey) QueryGroup() *GroupQuery { func (_m *ApiKey) QueryGroup() *GroupQuery {
return NewAPIKeyClient(_m.config).QueryGroup(_m) return NewApiKeyClient(_m.config).QueryGroup(_m)
} }
// QueryUsageLogs queries the "usage_logs" edge of the APIKey entity. // QueryUsageLogs queries the "usage_logs" edge of the ApiKey entity.
func (_m *APIKey) QueryUsageLogs() *UsageLogQuery { func (_m *ApiKey) QueryUsageLogs() *UsageLogQuery {
return NewAPIKeyClient(_m.config).QueryUsageLogs(_m) return NewApiKeyClient(_m.config).QueryUsageLogs(_m)
} }
// Update returns a builder for updating this APIKey. // Update returns a builder for updating this ApiKey.
// Note that you need to call APIKey.Unwrap() before calling this method if this APIKey // Note that you need to call ApiKey.Unwrap() before calling this method if this ApiKey
// was returned from a transaction, and the transaction was committed or rolled back. // was returned from a transaction, and the transaction was committed or rolled back.
func (_m *APIKey) Update() *APIKeyUpdateOne { func (_m *ApiKey) Update() *ApiKeyUpdateOne {
return NewAPIKeyClient(_m.config).UpdateOne(_m) return NewApiKeyClient(_m.config).UpdateOne(_m)
} }
// Unwrap unwraps the APIKey entity that was returned from a transaction after it was closed, // Unwrap unwraps the ApiKey entity that was returned from a transaction after it was closed,
// so that all future queries will be executed through the driver which created the transaction. // so that all future queries will be executed through the driver which created the transaction.
func (_m *APIKey) Unwrap() *APIKey { func (_m *ApiKey) Unwrap() *ApiKey {
_tx, ok := _m.config.driver.(*txDriver) _tx, ok := _m.config.driver.(*txDriver)
if !ok { if !ok {
panic("ent: APIKey is not a transactional entity") panic("ent: ApiKey is not a transactional entity")
} }
_m.config.driver = _tx.drv _m.config.driver = _tx.drv
return _m return _m
} }
// String implements the fmt.Stringer. // String implements the fmt.Stringer.
func (_m *APIKey) String() string { func (_m *ApiKey) String() string {
var builder strings.Builder var builder strings.Builder
builder.WriteString("APIKey(") builder.WriteString("ApiKey(")
builder.WriteString(fmt.Sprintf("id=%v, ", _m.ID)) builder.WriteString(fmt.Sprintf("id=%v, ", _m.ID))
builder.WriteString("created_at=") builder.WriteString("created_at=")
builder.WriteString(_m.CreatedAt.Format(time.ANSIC)) builder.WriteString(_m.CreatedAt.Format(time.ANSIC))
@@ -249,5 +249,5 @@ func (_m *APIKey) String() string {
return builder.String() return builder.String()
} }
// APIKeys is a parsable slice of APIKey. // ApiKeys is a parsable slice of ApiKey.
type APIKeys []*APIKey type ApiKeys []*ApiKey

View File

@@ -109,7 +109,7 @@ var (
StatusValidator func(string) error StatusValidator func(string) error
) )
// OrderOption defines the ordering options for the APIKey queries. // OrderOption defines the ordering options for the ApiKey queries.
type OrderOption func(*sql.Selector) type OrderOption func(*sql.Selector)
// ByID orders the results by the id field. // ByID orders the results by the id field.

View File

@@ -11,468 +11,468 @@ import (
) )
// ID filters vertices based on their ID field. // ID filters vertices based on their ID field.
func ID(id int64) predicate.APIKey { func ID(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldID, id)) return predicate.ApiKey(sql.FieldEQ(FieldID, id))
} }
// IDEQ applies the EQ predicate on the ID field. // IDEQ applies the EQ predicate on the ID field.
func IDEQ(id int64) predicate.APIKey { func IDEQ(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldID, id)) return predicate.ApiKey(sql.FieldEQ(FieldID, id))
} }
// IDNEQ applies the NEQ predicate on the ID field. // IDNEQ applies the NEQ predicate on the ID field.
func IDNEQ(id int64) predicate.APIKey { func IDNEQ(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldID, id)) return predicate.ApiKey(sql.FieldNEQ(FieldID, id))
} }
// IDIn applies the In predicate on the ID field. // IDIn applies the In predicate on the ID field.
func IDIn(ids ...int64) predicate.APIKey { func IDIn(ids ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldID, ids...)) return predicate.ApiKey(sql.FieldIn(FieldID, ids...))
} }
// IDNotIn applies the NotIn predicate on the ID field. // IDNotIn applies the NotIn predicate on the ID field.
func IDNotIn(ids ...int64) predicate.APIKey { func IDNotIn(ids ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldID, ids...)) return predicate.ApiKey(sql.FieldNotIn(FieldID, ids...))
} }
// IDGT applies the GT predicate on the ID field. // IDGT applies the GT predicate on the ID field.
func IDGT(id int64) predicate.APIKey { func IDGT(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldID, id)) return predicate.ApiKey(sql.FieldGT(FieldID, id))
} }
// IDGTE applies the GTE predicate on the ID field. // IDGTE applies the GTE predicate on the ID field.
func IDGTE(id int64) predicate.APIKey { func IDGTE(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldID, id)) return predicate.ApiKey(sql.FieldGTE(FieldID, id))
} }
// IDLT applies the LT predicate on the ID field. // IDLT applies the LT predicate on the ID field.
func IDLT(id int64) predicate.APIKey { func IDLT(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldID, id)) return predicate.ApiKey(sql.FieldLT(FieldID, id))
} }
// IDLTE applies the LTE predicate on the ID field. // IDLTE applies the LTE predicate on the ID field.
func IDLTE(id int64) predicate.APIKey { func IDLTE(id int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldID, id)) return predicate.ApiKey(sql.FieldLTE(FieldID, id))
} }
// CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. // CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ.
func CreatedAt(v time.Time) predicate.APIKey { func CreatedAt(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldCreatedAt, v))
} }
// UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ. // UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ.
func UpdatedAt(v time.Time) predicate.APIKey { func UpdatedAt(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldUpdatedAt, v))
} }
// DeletedAt applies equality check predicate on the "deleted_at" field. It's identical to DeletedAtEQ. // DeletedAt applies equality check predicate on the "deleted_at" field. It's identical to DeletedAtEQ.
func DeletedAt(v time.Time) predicate.APIKey { func DeletedAt(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldDeletedAt, v))
} }
// UserID applies equality check predicate on the "user_id" field. It's identical to UserIDEQ. // UserID applies equality check predicate on the "user_id" field. It's identical to UserIDEQ.
func UserID(v int64) predicate.APIKey { func UserID(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldUserID, v)) return predicate.ApiKey(sql.FieldEQ(FieldUserID, v))
} }
// Key applies equality check predicate on the "key" field. It's identical to KeyEQ. // Key applies equality check predicate on the "key" field. It's identical to KeyEQ.
func Key(v string) predicate.APIKey { func Key(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldKey, v)) return predicate.ApiKey(sql.FieldEQ(FieldKey, v))
} }
// Name applies equality check predicate on the "name" field. It's identical to NameEQ. // Name applies equality check predicate on the "name" field. It's identical to NameEQ.
func Name(v string) predicate.APIKey { func Name(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldName, v)) return predicate.ApiKey(sql.FieldEQ(FieldName, 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.APIKey { func GroupID(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldGroupID, v)) return predicate.ApiKey(sql.FieldEQ(FieldGroupID, v))
} }
// Status applies equality check predicate on the "status" field. It's identical to StatusEQ. // Status applies equality check predicate on the "status" field. It's identical to StatusEQ.
func Status(v string) predicate.APIKey { func Status(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldStatus, v)) return predicate.ApiKey(sql.FieldEQ(FieldStatus, v))
} }
// CreatedAtEQ applies the EQ predicate on the "created_at" field. // CreatedAtEQ applies the EQ predicate on the "created_at" field.
func CreatedAtEQ(v time.Time) predicate.APIKey { func CreatedAtEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldCreatedAt, v))
} }
// CreatedAtNEQ applies the NEQ predicate on the "created_at" field. // CreatedAtNEQ applies the NEQ predicate on the "created_at" field.
func CreatedAtNEQ(v time.Time) predicate.APIKey { func CreatedAtNEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldNEQ(FieldCreatedAt, v))
} }
// CreatedAtIn applies the In predicate on the "created_at" field. // CreatedAtIn applies the In predicate on the "created_at" field.
func CreatedAtIn(vs ...time.Time) predicate.APIKey { func CreatedAtIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldCreatedAt, vs...)) return predicate.ApiKey(sql.FieldIn(FieldCreatedAt, vs...))
} }
// CreatedAtNotIn applies the NotIn predicate on the "created_at" field. // CreatedAtNotIn applies the NotIn predicate on the "created_at" field.
func CreatedAtNotIn(vs ...time.Time) predicate.APIKey { func CreatedAtNotIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldCreatedAt, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldCreatedAt, vs...))
} }
// CreatedAtGT applies the GT predicate on the "created_at" field. // CreatedAtGT applies the GT predicate on the "created_at" field.
func CreatedAtGT(v time.Time) predicate.APIKey { func CreatedAtGT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldGT(FieldCreatedAt, v))
} }
// CreatedAtGTE applies the GTE predicate on the "created_at" field. // CreatedAtGTE applies the GTE predicate on the "created_at" field.
func CreatedAtGTE(v time.Time) predicate.APIKey { func CreatedAtGTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldGTE(FieldCreatedAt, v))
} }
// CreatedAtLT applies the LT predicate on the "created_at" field. // CreatedAtLT applies the LT predicate on the "created_at" field.
func CreatedAtLT(v time.Time) predicate.APIKey { func CreatedAtLT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldLT(FieldCreatedAt, v))
} }
// CreatedAtLTE applies the LTE predicate on the "created_at" field. // CreatedAtLTE applies the LTE predicate on the "created_at" field.
func CreatedAtLTE(v time.Time) predicate.APIKey { func CreatedAtLTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldCreatedAt, v)) return predicate.ApiKey(sql.FieldLTE(FieldCreatedAt, v))
} }
// UpdatedAtEQ applies the EQ predicate on the "updated_at" field. // UpdatedAtEQ applies the EQ predicate on the "updated_at" field.
func UpdatedAtEQ(v time.Time) predicate.APIKey { func UpdatedAtEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldUpdatedAt, v))
} }
// UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field. // UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field.
func UpdatedAtNEQ(v time.Time) predicate.APIKey { func UpdatedAtNEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldNEQ(FieldUpdatedAt, v))
} }
// UpdatedAtIn applies the In predicate on the "updated_at" field. // UpdatedAtIn applies the In predicate on the "updated_at" field.
func UpdatedAtIn(vs ...time.Time) predicate.APIKey { func UpdatedAtIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldUpdatedAt, vs...)) return predicate.ApiKey(sql.FieldIn(FieldUpdatedAt, vs...))
} }
// UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field. // UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field.
func UpdatedAtNotIn(vs ...time.Time) predicate.APIKey { func UpdatedAtNotIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldUpdatedAt, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldUpdatedAt, vs...))
} }
// UpdatedAtGT applies the GT predicate on the "updated_at" field. // UpdatedAtGT applies the GT predicate on the "updated_at" field.
func UpdatedAtGT(v time.Time) predicate.APIKey { func UpdatedAtGT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldGT(FieldUpdatedAt, v))
} }
// UpdatedAtGTE applies the GTE predicate on the "updated_at" field. // UpdatedAtGTE applies the GTE predicate on the "updated_at" field.
func UpdatedAtGTE(v time.Time) predicate.APIKey { func UpdatedAtGTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldGTE(FieldUpdatedAt, v))
} }
// UpdatedAtLT applies the LT predicate on the "updated_at" field. // UpdatedAtLT applies the LT predicate on the "updated_at" field.
func UpdatedAtLT(v time.Time) predicate.APIKey { func UpdatedAtLT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldLT(FieldUpdatedAt, v))
} }
// UpdatedAtLTE applies the LTE predicate on the "updated_at" field. // UpdatedAtLTE applies the LTE predicate on the "updated_at" field.
func UpdatedAtLTE(v time.Time) predicate.APIKey { func UpdatedAtLTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldUpdatedAt, v)) return predicate.ApiKey(sql.FieldLTE(FieldUpdatedAt, v))
} }
// DeletedAtEQ applies the EQ predicate on the "deleted_at" field. // DeletedAtEQ applies the EQ predicate on the "deleted_at" field.
func DeletedAtEQ(v time.Time) predicate.APIKey { func DeletedAtEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldEQ(FieldDeletedAt, v))
} }
// DeletedAtNEQ applies the NEQ predicate on the "deleted_at" field. // DeletedAtNEQ applies the NEQ predicate on the "deleted_at" field.
func DeletedAtNEQ(v time.Time) predicate.APIKey { func DeletedAtNEQ(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldNEQ(FieldDeletedAt, v))
} }
// DeletedAtIn applies the In predicate on the "deleted_at" field. // DeletedAtIn applies the In predicate on the "deleted_at" field.
func DeletedAtIn(vs ...time.Time) predicate.APIKey { func DeletedAtIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldDeletedAt, vs...)) return predicate.ApiKey(sql.FieldIn(FieldDeletedAt, vs...))
} }
// DeletedAtNotIn applies the NotIn predicate on the "deleted_at" field. // DeletedAtNotIn applies the NotIn predicate on the "deleted_at" field.
func DeletedAtNotIn(vs ...time.Time) predicate.APIKey { func DeletedAtNotIn(vs ...time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldDeletedAt, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldDeletedAt, vs...))
} }
// DeletedAtGT applies the GT predicate on the "deleted_at" field. // DeletedAtGT applies the GT predicate on the "deleted_at" field.
func DeletedAtGT(v time.Time) predicate.APIKey { func DeletedAtGT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldGT(FieldDeletedAt, v))
} }
// DeletedAtGTE applies the GTE predicate on the "deleted_at" field. // DeletedAtGTE applies the GTE predicate on the "deleted_at" field.
func DeletedAtGTE(v time.Time) predicate.APIKey { func DeletedAtGTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldGTE(FieldDeletedAt, v))
} }
// DeletedAtLT applies the LT predicate on the "deleted_at" field. // DeletedAtLT applies the LT predicate on the "deleted_at" field.
func DeletedAtLT(v time.Time) predicate.APIKey { func DeletedAtLT(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldLT(FieldDeletedAt, v))
} }
// DeletedAtLTE applies the LTE predicate on the "deleted_at" field. // DeletedAtLTE applies the LTE predicate on the "deleted_at" field.
func DeletedAtLTE(v time.Time) predicate.APIKey { func DeletedAtLTE(v time.Time) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldDeletedAt, v)) return predicate.ApiKey(sql.FieldLTE(FieldDeletedAt, v))
} }
// DeletedAtIsNil applies the IsNil predicate on the "deleted_at" field. // DeletedAtIsNil applies the IsNil predicate on the "deleted_at" field.
func DeletedAtIsNil() predicate.APIKey { func DeletedAtIsNil() predicate.ApiKey {
return predicate.APIKey(sql.FieldIsNull(FieldDeletedAt)) return predicate.ApiKey(sql.FieldIsNull(FieldDeletedAt))
} }
// DeletedAtNotNil applies the NotNil predicate on the "deleted_at" field. // DeletedAtNotNil applies the NotNil predicate on the "deleted_at" field.
func DeletedAtNotNil() predicate.APIKey { func DeletedAtNotNil() predicate.ApiKey {
return predicate.APIKey(sql.FieldNotNull(FieldDeletedAt)) return predicate.ApiKey(sql.FieldNotNull(FieldDeletedAt))
} }
// UserIDEQ applies the EQ predicate on the "user_id" field. // UserIDEQ applies the EQ predicate on the "user_id" field.
func UserIDEQ(v int64) predicate.APIKey { func UserIDEQ(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldUserID, v)) return predicate.ApiKey(sql.FieldEQ(FieldUserID, v))
} }
// UserIDNEQ applies the NEQ predicate on the "user_id" field. // UserIDNEQ applies the NEQ predicate on the "user_id" field.
func UserIDNEQ(v int64) predicate.APIKey { func UserIDNEQ(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldUserID, v)) return predicate.ApiKey(sql.FieldNEQ(FieldUserID, v))
} }
// UserIDIn applies the In predicate on the "user_id" field. // UserIDIn applies the In predicate on the "user_id" field.
func UserIDIn(vs ...int64) predicate.APIKey { func UserIDIn(vs ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldUserID, vs...)) return predicate.ApiKey(sql.FieldIn(FieldUserID, vs...))
} }
// UserIDNotIn applies the NotIn predicate on the "user_id" field. // UserIDNotIn applies the NotIn predicate on the "user_id" field.
func UserIDNotIn(vs ...int64) predicate.APIKey { func UserIDNotIn(vs ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldUserID, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldUserID, vs...))
} }
// KeyEQ applies the EQ predicate on the "key" field. // KeyEQ applies the EQ predicate on the "key" field.
func KeyEQ(v string) predicate.APIKey { func KeyEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldKey, v)) return predicate.ApiKey(sql.FieldEQ(FieldKey, v))
} }
// KeyNEQ applies the NEQ predicate on the "key" field. // KeyNEQ applies the NEQ predicate on the "key" field.
func KeyNEQ(v string) predicate.APIKey { func KeyNEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldKey, v)) return predicate.ApiKey(sql.FieldNEQ(FieldKey, v))
} }
// KeyIn applies the In predicate on the "key" field. // KeyIn applies the In predicate on the "key" field.
func KeyIn(vs ...string) predicate.APIKey { func KeyIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldKey, vs...)) return predicate.ApiKey(sql.FieldIn(FieldKey, vs...))
} }
// KeyNotIn applies the NotIn predicate on the "key" field. // KeyNotIn applies the NotIn predicate on the "key" field.
func KeyNotIn(vs ...string) predicate.APIKey { func KeyNotIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldKey, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldKey, vs...))
} }
// KeyGT applies the GT predicate on the "key" field. // KeyGT applies the GT predicate on the "key" field.
func KeyGT(v string) predicate.APIKey { func KeyGT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldKey, v)) return predicate.ApiKey(sql.FieldGT(FieldKey, v))
} }
// KeyGTE applies the GTE predicate on the "key" field. // KeyGTE applies the GTE predicate on the "key" field.
func KeyGTE(v string) predicate.APIKey { func KeyGTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldKey, v)) return predicate.ApiKey(sql.FieldGTE(FieldKey, v))
} }
// KeyLT applies the LT predicate on the "key" field. // KeyLT applies the LT predicate on the "key" field.
func KeyLT(v string) predicate.APIKey { func KeyLT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldKey, v)) return predicate.ApiKey(sql.FieldLT(FieldKey, v))
} }
// KeyLTE applies the LTE predicate on the "key" field. // KeyLTE applies the LTE predicate on the "key" field.
func KeyLTE(v string) predicate.APIKey { func KeyLTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldKey, v)) return predicate.ApiKey(sql.FieldLTE(FieldKey, v))
} }
// KeyContains applies the Contains predicate on the "key" field. // KeyContains applies the Contains predicate on the "key" field.
func KeyContains(v string) predicate.APIKey { func KeyContains(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContains(FieldKey, v)) return predicate.ApiKey(sql.FieldContains(FieldKey, v))
} }
// KeyHasPrefix applies the HasPrefix predicate on the "key" field. // KeyHasPrefix applies the HasPrefix predicate on the "key" field.
func KeyHasPrefix(v string) predicate.APIKey { func KeyHasPrefix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasPrefix(FieldKey, v)) return predicate.ApiKey(sql.FieldHasPrefix(FieldKey, v))
} }
// KeyHasSuffix applies the HasSuffix predicate on the "key" field. // KeyHasSuffix applies the HasSuffix predicate on the "key" field.
func KeyHasSuffix(v string) predicate.APIKey { func KeyHasSuffix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasSuffix(FieldKey, v)) return predicate.ApiKey(sql.FieldHasSuffix(FieldKey, v))
} }
// KeyEqualFold applies the EqualFold predicate on the "key" field. // KeyEqualFold applies the EqualFold predicate on the "key" field.
func KeyEqualFold(v string) predicate.APIKey { func KeyEqualFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEqualFold(FieldKey, v)) return predicate.ApiKey(sql.FieldEqualFold(FieldKey, v))
} }
// KeyContainsFold applies the ContainsFold predicate on the "key" field. // KeyContainsFold applies the ContainsFold predicate on the "key" field.
func KeyContainsFold(v string) predicate.APIKey { func KeyContainsFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContainsFold(FieldKey, v)) return predicate.ApiKey(sql.FieldContainsFold(FieldKey, v))
} }
// NameEQ applies the EQ predicate on the "name" field. // NameEQ applies the EQ predicate on the "name" field.
func NameEQ(v string) predicate.APIKey { func NameEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldName, v)) return predicate.ApiKey(sql.FieldEQ(FieldName, v))
} }
// NameNEQ applies the NEQ predicate on the "name" field. // NameNEQ applies the NEQ predicate on the "name" field.
func NameNEQ(v string) predicate.APIKey { func NameNEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldName, v)) return predicate.ApiKey(sql.FieldNEQ(FieldName, v))
} }
// NameIn applies the In predicate on the "name" field. // NameIn applies the In predicate on the "name" field.
func NameIn(vs ...string) predicate.APIKey { func NameIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldName, vs...)) return predicate.ApiKey(sql.FieldIn(FieldName, vs...))
} }
// NameNotIn applies the NotIn predicate on the "name" field. // NameNotIn applies the NotIn predicate on the "name" field.
func NameNotIn(vs ...string) predicate.APIKey { func NameNotIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldName, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldName, vs...))
} }
// NameGT applies the GT predicate on the "name" field. // NameGT applies the GT predicate on the "name" field.
func NameGT(v string) predicate.APIKey { func NameGT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldName, v)) return predicate.ApiKey(sql.FieldGT(FieldName, v))
} }
// NameGTE applies the GTE predicate on the "name" field. // NameGTE applies the GTE predicate on the "name" field.
func NameGTE(v string) predicate.APIKey { func NameGTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldName, v)) return predicate.ApiKey(sql.FieldGTE(FieldName, v))
} }
// NameLT applies the LT predicate on the "name" field. // NameLT applies the LT predicate on the "name" field.
func NameLT(v string) predicate.APIKey { func NameLT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldName, v)) return predicate.ApiKey(sql.FieldLT(FieldName, v))
} }
// NameLTE applies the LTE predicate on the "name" field. // NameLTE applies the LTE predicate on the "name" field.
func NameLTE(v string) predicate.APIKey { func NameLTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldName, v)) return predicate.ApiKey(sql.FieldLTE(FieldName, v))
} }
// NameContains applies the Contains predicate on the "name" field. // NameContains applies the Contains predicate on the "name" field.
func NameContains(v string) predicate.APIKey { func NameContains(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContains(FieldName, v)) return predicate.ApiKey(sql.FieldContains(FieldName, v))
} }
// NameHasPrefix applies the HasPrefix predicate on the "name" field. // NameHasPrefix applies the HasPrefix predicate on the "name" field.
func NameHasPrefix(v string) predicate.APIKey { func NameHasPrefix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasPrefix(FieldName, v)) return predicate.ApiKey(sql.FieldHasPrefix(FieldName, v))
} }
// NameHasSuffix applies the HasSuffix predicate on the "name" field. // NameHasSuffix applies the HasSuffix predicate on the "name" field.
func NameHasSuffix(v string) predicate.APIKey { func NameHasSuffix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasSuffix(FieldName, v)) return predicate.ApiKey(sql.FieldHasSuffix(FieldName, v))
} }
// NameEqualFold applies the EqualFold predicate on the "name" field. // NameEqualFold applies the EqualFold predicate on the "name" field.
func NameEqualFold(v string) predicate.APIKey { func NameEqualFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEqualFold(FieldName, v)) return predicate.ApiKey(sql.FieldEqualFold(FieldName, v))
} }
// NameContainsFold applies the ContainsFold predicate on the "name" field. // NameContainsFold applies the ContainsFold predicate on the "name" field.
func NameContainsFold(v string) predicate.APIKey { func NameContainsFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContainsFold(FieldName, v)) return predicate.ApiKey(sql.FieldContainsFold(FieldName, 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.APIKey { func GroupIDEQ(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldGroupID, v)) return predicate.ApiKey(sql.FieldEQ(FieldGroupID, v))
} }
// GroupIDNEQ applies the NEQ predicate on the "group_id" field. // GroupIDNEQ applies the NEQ predicate on the "group_id" field.
func GroupIDNEQ(v int64) predicate.APIKey { func GroupIDNEQ(v int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldGroupID, v)) return predicate.ApiKey(sql.FieldNEQ(FieldGroupID, v))
} }
// GroupIDIn applies the In predicate on the "group_id" field. // GroupIDIn applies the In predicate on the "group_id" field.
func GroupIDIn(vs ...int64) predicate.APIKey { func GroupIDIn(vs ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldGroupID, vs...)) return predicate.ApiKey(sql.FieldIn(FieldGroupID, vs...))
} }
// GroupIDNotIn applies the NotIn predicate on the "group_id" field. // GroupIDNotIn applies the NotIn predicate on the "group_id" field.
func GroupIDNotIn(vs ...int64) predicate.APIKey { func GroupIDNotIn(vs ...int64) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldGroupID, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldGroupID, vs...))
} }
// GroupIDIsNil applies the IsNil predicate on the "group_id" field. // GroupIDIsNil applies the IsNil predicate on the "group_id" field.
func GroupIDIsNil() predicate.APIKey { func GroupIDIsNil() predicate.ApiKey {
return predicate.APIKey(sql.FieldIsNull(FieldGroupID)) return predicate.ApiKey(sql.FieldIsNull(FieldGroupID))
} }
// GroupIDNotNil applies the NotNil predicate on the "group_id" field. // GroupIDNotNil applies the NotNil predicate on the "group_id" field.
func GroupIDNotNil() predicate.APIKey { func GroupIDNotNil() predicate.ApiKey {
return predicate.APIKey(sql.FieldNotNull(FieldGroupID)) return predicate.ApiKey(sql.FieldNotNull(FieldGroupID))
} }
// StatusEQ applies the EQ predicate on the "status" field. // StatusEQ applies the EQ predicate on the "status" field.
func StatusEQ(v string) predicate.APIKey { func StatusEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEQ(FieldStatus, v)) return predicate.ApiKey(sql.FieldEQ(FieldStatus, v))
} }
// StatusNEQ applies the NEQ predicate on the "status" field. // StatusNEQ applies the NEQ predicate on the "status" field.
func StatusNEQ(v string) predicate.APIKey { func StatusNEQ(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNEQ(FieldStatus, v)) return predicate.ApiKey(sql.FieldNEQ(FieldStatus, v))
} }
// StatusIn applies the In predicate on the "status" field. // StatusIn applies the In predicate on the "status" field.
func StatusIn(vs ...string) predicate.APIKey { func StatusIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldIn(FieldStatus, vs...)) return predicate.ApiKey(sql.FieldIn(FieldStatus, vs...))
} }
// StatusNotIn applies the NotIn predicate on the "status" field. // StatusNotIn applies the NotIn predicate on the "status" field.
func StatusNotIn(vs ...string) predicate.APIKey { func StatusNotIn(vs ...string) predicate.ApiKey {
return predicate.APIKey(sql.FieldNotIn(FieldStatus, vs...)) return predicate.ApiKey(sql.FieldNotIn(FieldStatus, vs...))
} }
// StatusGT applies the GT predicate on the "status" field. // StatusGT applies the GT predicate on the "status" field.
func StatusGT(v string) predicate.APIKey { func StatusGT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGT(FieldStatus, v)) return predicate.ApiKey(sql.FieldGT(FieldStatus, v))
} }
// StatusGTE applies the GTE predicate on the "status" field. // StatusGTE applies the GTE predicate on the "status" field.
func StatusGTE(v string) predicate.APIKey { func StatusGTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldGTE(FieldStatus, v)) return predicate.ApiKey(sql.FieldGTE(FieldStatus, v))
} }
// StatusLT applies the LT predicate on the "status" field. // StatusLT applies the LT predicate on the "status" field.
func StatusLT(v string) predicate.APIKey { func StatusLT(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLT(FieldStatus, v)) return predicate.ApiKey(sql.FieldLT(FieldStatus, v))
} }
// StatusLTE applies the LTE predicate on the "status" field. // StatusLTE applies the LTE predicate on the "status" field.
func StatusLTE(v string) predicate.APIKey { func StatusLTE(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldLTE(FieldStatus, v)) return predicate.ApiKey(sql.FieldLTE(FieldStatus, v))
} }
// StatusContains applies the Contains predicate on the "status" field. // StatusContains applies the Contains predicate on the "status" field.
func StatusContains(v string) predicate.APIKey { func StatusContains(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContains(FieldStatus, v)) return predicate.ApiKey(sql.FieldContains(FieldStatus, v))
} }
// StatusHasPrefix applies the HasPrefix predicate on the "status" field. // StatusHasPrefix applies the HasPrefix predicate on the "status" field.
func StatusHasPrefix(v string) predicate.APIKey { func StatusHasPrefix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasPrefix(FieldStatus, v)) return predicate.ApiKey(sql.FieldHasPrefix(FieldStatus, v))
} }
// StatusHasSuffix applies the HasSuffix predicate on the "status" field. // StatusHasSuffix applies the HasSuffix predicate on the "status" field.
func StatusHasSuffix(v string) predicate.APIKey { func StatusHasSuffix(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldHasSuffix(FieldStatus, v)) return predicate.ApiKey(sql.FieldHasSuffix(FieldStatus, v))
} }
// StatusEqualFold applies the EqualFold predicate on the "status" field. // StatusEqualFold applies the EqualFold predicate on the "status" field.
func StatusEqualFold(v string) predicate.APIKey { func StatusEqualFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldEqualFold(FieldStatus, v)) return predicate.ApiKey(sql.FieldEqualFold(FieldStatus, v))
} }
// StatusContainsFold applies the ContainsFold predicate on the "status" field. // StatusContainsFold applies the ContainsFold predicate on the "status" field.
func StatusContainsFold(v string) predicate.APIKey { func StatusContainsFold(v string) predicate.ApiKey {
return predicate.APIKey(sql.FieldContainsFold(FieldStatus, v)) return predicate.ApiKey(sql.FieldContainsFold(FieldStatus, v))
} }
// HasUser applies the HasEdge predicate on the "user" edge. // HasUser applies the HasEdge predicate on the "user" edge.
func HasUser() predicate.APIKey { func HasUser() predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
sqlgraph.From(Table, FieldID), sqlgraph.From(Table, FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, UserTable, UserColumn), sqlgraph.Edge(sqlgraph.M2O, true, UserTable, UserColumn),
@@ -482,8 +482,8 @@ func HasUser() predicate.APIKey {
} }
// HasUserWith applies the HasEdge predicate on the "user" edge with a given conditions (other predicates). // HasUserWith applies the HasEdge predicate on the "user" edge with a given conditions (other predicates).
func HasUserWith(preds ...predicate.User) predicate.APIKey { func HasUserWith(preds ...predicate.User) predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := newUserStep() step := newUserStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
for _, p := range preds { for _, p := range preds {
@@ -494,8 +494,8 @@ func HasUserWith(preds ...predicate.User) predicate.APIKey {
} }
// HasGroup applies the HasEdge predicate on the "group" edge. // HasGroup applies the HasEdge predicate on the "group" edge.
func HasGroup() predicate.APIKey { func HasGroup() predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
sqlgraph.From(Table, FieldID), sqlgraph.From(Table, FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, GroupTable, GroupColumn), sqlgraph.Edge(sqlgraph.M2O, true, GroupTable, GroupColumn),
@@ -505,8 +505,8 @@ func HasGroup() predicate.APIKey {
} }
// HasGroupWith applies the HasEdge predicate on the "group" edge with a given conditions (other predicates). // HasGroupWith applies the HasEdge predicate on the "group" edge with a given conditions (other predicates).
func HasGroupWith(preds ...predicate.Group) predicate.APIKey { func HasGroupWith(preds ...predicate.Group) predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := newGroupStep() step := newGroupStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
for _, p := range preds { for _, p := range preds {
@@ -517,8 +517,8 @@ func HasGroupWith(preds ...predicate.Group) predicate.APIKey {
} }
// HasUsageLogs applies the HasEdge predicate on the "usage_logs" edge. // HasUsageLogs applies the HasEdge predicate on the "usage_logs" edge.
func HasUsageLogs() predicate.APIKey { func HasUsageLogs() predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
sqlgraph.From(Table, FieldID), sqlgraph.From(Table, FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, UsageLogsTable, UsageLogsColumn), sqlgraph.Edge(sqlgraph.O2M, false, UsageLogsTable, UsageLogsColumn),
@@ -528,8 +528,8 @@ func HasUsageLogs() predicate.APIKey {
} }
// HasUsageLogsWith applies the HasEdge predicate on the "usage_logs" edge with a given conditions (other predicates). // HasUsageLogsWith applies the HasEdge predicate on the "usage_logs" edge with a given conditions (other predicates).
func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.APIKey { func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.ApiKey {
return predicate.APIKey(func(s *sql.Selector) { return predicate.ApiKey(func(s *sql.Selector) {
step := newUsageLogsStep() step := newUsageLogsStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
for _, p := range preds { for _, p := range preds {
@@ -540,16 +540,16 @@ func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.APIKey {
} }
// And groups predicates with the AND operator between them. // And groups predicates with the AND operator between them.
func And(predicates ...predicate.APIKey) predicate.APIKey { func And(predicates ...predicate.ApiKey) predicate.ApiKey {
return predicate.APIKey(sql.AndPredicates(predicates...)) return predicate.ApiKey(sql.AndPredicates(predicates...))
} }
// Or groups predicates with the OR operator between them. // Or groups predicates with the OR operator between them.
func Or(predicates ...predicate.APIKey) predicate.APIKey { func Or(predicates ...predicate.ApiKey) predicate.ApiKey {
return predicate.APIKey(sql.OrPredicates(predicates...)) return predicate.ApiKey(sql.OrPredicates(predicates...))
} }
// Not applies the not operator on the given predicate. // Not applies the not operator on the given predicate.
func Not(p predicate.APIKey) predicate.APIKey { func Not(p predicate.ApiKey) predicate.ApiKey {
return predicate.APIKey(sql.NotPredicates(p)) return predicate.ApiKey(sql.NotPredicates(p))
} }

View File

@@ -17,22 +17,22 @@ import (
"github.com/Wei-Shaw/sub2api/ent/user" "github.com/Wei-Shaw/sub2api/ent/user"
) )
// APIKeyCreate is the builder for creating a APIKey entity. // ApiKeyCreate is the builder for creating a ApiKey entity.
type APIKeyCreate struct { type ApiKeyCreate struct {
config config
mutation *APIKeyMutation mutation *ApiKeyMutation
hooks []Hook hooks []Hook
conflict []sql.ConflictOption conflict []sql.ConflictOption
} }
// SetCreatedAt sets the "created_at" field. // SetCreatedAt sets the "created_at" field.
func (_c *APIKeyCreate) SetCreatedAt(v time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetCreatedAt(v time.Time) *ApiKeyCreate {
_c.mutation.SetCreatedAt(v) _c.mutation.SetCreatedAt(v)
return _c return _c
} }
// SetNillableCreatedAt sets the "created_at" field if the given value is not nil. // SetNillableCreatedAt sets the "created_at" field if the given value is not nil.
func (_c *APIKeyCreate) SetNillableCreatedAt(v *time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetNillableCreatedAt(v *time.Time) *ApiKeyCreate {
if v != nil { if v != nil {
_c.SetCreatedAt(*v) _c.SetCreatedAt(*v)
} }
@@ -40,13 +40,13 @@ func (_c *APIKeyCreate) SetNillableCreatedAt(v *time.Time) *APIKeyCreate {
} }
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (_c *APIKeyCreate) SetUpdatedAt(v time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetUpdatedAt(v time.Time) *ApiKeyCreate {
_c.mutation.SetUpdatedAt(v) _c.mutation.SetUpdatedAt(v)
return _c return _c
} }
// SetNillableUpdatedAt sets the "updated_at" field if the given value is not nil. // SetNillableUpdatedAt sets the "updated_at" field if the given value is not nil.
func (_c *APIKeyCreate) SetNillableUpdatedAt(v *time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetNillableUpdatedAt(v *time.Time) *ApiKeyCreate {
if v != nil { if v != nil {
_c.SetUpdatedAt(*v) _c.SetUpdatedAt(*v)
} }
@@ -54,13 +54,13 @@ func (_c *APIKeyCreate) SetNillableUpdatedAt(v *time.Time) *APIKeyCreate {
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (_c *APIKeyCreate) SetDeletedAt(v time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetDeletedAt(v time.Time) *ApiKeyCreate {
_c.mutation.SetDeletedAt(v) _c.mutation.SetDeletedAt(v)
return _c return _c
} }
// SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil. // SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil.
func (_c *APIKeyCreate) SetNillableDeletedAt(v *time.Time) *APIKeyCreate { func (_c *ApiKeyCreate) SetNillableDeletedAt(v *time.Time) *ApiKeyCreate {
if v != nil { if v != nil {
_c.SetDeletedAt(*v) _c.SetDeletedAt(*v)
} }
@@ -68,31 +68,31 @@ func (_c *APIKeyCreate) SetNillableDeletedAt(v *time.Time) *APIKeyCreate {
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (_c *APIKeyCreate) SetUserID(v int64) *APIKeyCreate { func (_c *ApiKeyCreate) SetUserID(v int64) *ApiKeyCreate {
_c.mutation.SetUserID(v) _c.mutation.SetUserID(v)
return _c return _c
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (_c *APIKeyCreate) SetKey(v string) *APIKeyCreate { func (_c *ApiKeyCreate) SetKey(v string) *ApiKeyCreate {
_c.mutation.SetKey(v) _c.mutation.SetKey(v)
return _c return _c
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (_c *APIKeyCreate) SetName(v string) *APIKeyCreate { func (_c *ApiKeyCreate) SetName(v string) *ApiKeyCreate {
_c.mutation.SetName(v) _c.mutation.SetName(v)
return _c return _c
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (_c *APIKeyCreate) SetGroupID(v int64) *APIKeyCreate { func (_c *ApiKeyCreate) SetGroupID(v int64) *ApiKeyCreate {
_c.mutation.SetGroupID(v) _c.mutation.SetGroupID(v)
return _c return _c
} }
// SetNillableGroupID sets the "group_id" field if the given value is not nil. // SetNillableGroupID sets the "group_id" field if the given value is not nil.
func (_c *APIKeyCreate) SetNillableGroupID(v *int64) *APIKeyCreate { func (_c *ApiKeyCreate) SetNillableGroupID(v *int64) *ApiKeyCreate {
if v != nil { if v != nil {
_c.SetGroupID(*v) _c.SetGroupID(*v)
} }
@@ -100,13 +100,13 @@ func (_c *APIKeyCreate) SetNillableGroupID(v *int64) *APIKeyCreate {
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (_c *APIKeyCreate) SetStatus(v string) *APIKeyCreate { func (_c *ApiKeyCreate) SetStatus(v string) *ApiKeyCreate {
_c.mutation.SetStatus(v) _c.mutation.SetStatus(v)
return _c return _c
} }
// SetNillableStatus sets the "status" field if the given value is not nil. // SetNillableStatus sets the "status" field if the given value is not nil.
func (_c *APIKeyCreate) SetNillableStatus(v *string) *APIKeyCreate { func (_c *ApiKeyCreate) SetNillableStatus(v *string) *ApiKeyCreate {
if v != nil { if v != nil {
_c.SetStatus(*v) _c.SetStatus(*v)
} }
@@ -114,23 +114,23 @@ func (_c *APIKeyCreate) SetNillableStatus(v *string) *APIKeyCreate {
} }
// SetUser sets the "user" edge to the User entity. // SetUser sets the "user" edge to the User entity.
func (_c *APIKeyCreate) SetUser(v *User) *APIKeyCreate { func (_c *ApiKeyCreate) SetUser(v *User) *ApiKeyCreate {
return _c.SetUserID(v.ID) return _c.SetUserID(v.ID)
} }
// SetGroup sets the "group" edge to the Group entity. // SetGroup sets the "group" edge to the Group entity.
func (_c *APIKeyCreate) SetGroup(v *Group) *APIKeyCreate { func (_c *ApiKeyCreate) SetGroup(v *Group) *ApiKeyCreate {
return _c.SetGroupID(v.ID) return _c.SetGroupID(v.ID)
} }
// AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs. // AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs.
func (_c *APIKeyCreate) AddUsageLogIDs(ids ...int64) *APIKeyCreate { func (_c *ApiKeyCreate) AddUsageLogIDs(ids ...int64) *ApiKeyCreate {
_c.mutation.AddUsageLogIDs(ids...) _c.mutation.AddUsageLogIDs(ids...)
return _c return _c
} }
// AddUsageLogs adds the "usage_logs" edges to the UsageLog entity. // AddUsageLogs adds the "usage_logs" edges to the UsageLog entity.
func (_c *APIKeyCreate) AddUsageLogs(v ...*UsageLog) *APIKeyCreate { func (_c *ApiKeyCreate) AddUsageLogs(v ...*UsageLog) *ApiKeyCreate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -138,13 +138,13 @@ func (_c *APIKeyCreate) AddUsageLogs(v ...*UsageLog) *APIKeyCreate {
return _c.AddUsageLogIDs(ids...) return _c.AddUsageLogIDs(ids...)
} }
// Mutation returns the APIKeyMutation object of the builder. // Mutation returns the ApiKeyMutation object of the builder.
func (_c *APIKeyCreate) Mutation() *APIKeyMutation { func (_c *ApiKeyCreate) Mutation() *ApiKeyMutation {
return _c.mutation return _c.mutation
} }
// Save creates the APIKey in the database. // Save creates the ApiKey in the database.
func (_c *APIKeyCreate) Save(ctx context.Context) (*APIKey, error) { func (_c *ApiKeyCreate) Save(ctx context.Context) (*ApiKey, error) {
if err := _c.defaults(); err != nil { if err := _c.defaults(); err != nil {
return nil, err return nil, err
} }
@@ -152,7 +152,7 @@ func (_c *APIKeyCreate) Save(ctx context.Context) (*APIKey, error) {
} }
// SaveX calls Save and panics if Save returns an error. // SaveX calls Save and panics if Save returns an error.
func (_c *APIKeyCreate) SaveX(ctx context.Context) *APIKey { func (_c *ApiKeyCreate) SaveX(ctx context.Context) *ApiKey {
v, err := _c.Save(ctx) v, err := _c.Save(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -161,20 +161,20 @@ func (_c *APIKeyCreate) SaveX(ctx context.Context) *APIKey {
} }
// Exec executes the query. // Exec executes the query.
func (_c *APIKeyCreate) Exec(ctx context.Context) error { func (_c *ApiKeyCreate) Exec(ctx context.Context) error {
_, err := _c.Save(ctx) _, err := _c.Save(ctx)
return err return err
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_c *APIKeyCreate) ExecX(ctx context.Context) { func (_c *ApiKeyCreate) ExecX(ctx context.Context) {
if err := _c.Exec(ctx); err != nil { if err := _c.Exec(ctx); err != nil {
panic(err) panic(err)
} }
} }
// defaults sets the default values of the builder before save. // defaults sets the default values of the builder before save.
func (_c *APIKeyCreate) defaults() error { func (_c *ApiKeyCreate) defaults() error {
if _, ok := _c.mutation.CreatedAt(); !ok { if _, ok := _c.mutation.CreatedAt(); !ok {
if apikey.DefaultCreatedAt == nil { if apikey.DefaultCreatedAt == nil {
return fmt.Errorf("ent: uninitialized apikey.DefaultCreatedAt (forgotten import ent/runtime?)") return fmt.Errorf("ent: uninitialized apikey.DefaultCreatedAt (forgotten import ent/runtime?)")
@@ -197,47 +197,47 @@ func (_c *APIKeyCreate) defaults() error {
} }
// check runs all checks and user-defined validators on the builder. // check runs all checks and user-defined validators on the builder.
func (_c *APIKeyCreate) check() error { func (_c *ApiKeyCreate) check() error {
if _, ok := _c.mutation.CreatedAt(); !ok { if _, ok := _c.mutation.CreatedAt(); !ok {
return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "APIKey.created_at"`)} return &ValidationError{Name: "created_at", err: errors.New(`ent: missing required field "ApiKey.created_at"`)}
} }
if _, ok := _c.mutation.UpdatedAt(); !ok { if _, ok := _c.mutation.UpdatedAt(); !ok {
return &ValidationError{Name: "updated_at", err: errors.New(`ent: missing required field "APIKey.updated_at"`)} return &ValidationError{Name: "updated_at", err: errors.New(`ent: missing required field "ApiKey.updated_at"`)}
} }
if _, ok := _c.mutation.UserID(); !ok { if _, ok := _c.mutation.UserID(); !ok {
return &ValidationError{Name: "user_id", err: errors.New(`ent: missing required field "APIKey.user_id"`)} return &ValidationError{Name: "user_id", err: errors.New(`ent: missing required field "ApiKey.user_id"`)}
} }
if _, ok := _c.mutation.Key(); !ok { if _, ok := _c.mutation.Key(); !ok {
return &ValidationError{Name: "key", err: errors.New(`ent: missing required field "APIKey.key"`)} return &ValidationError{Name: "key", err: errors.New(`ent: missing required field "ApiKey.key"`)}
} }
if v, ok := _c.mutation.Key(); ok { if v, ok := _c.mutation.Key(); ok {
if err := apikey.KeyValidator(v); err != nil { if err := apikey.KeyValidator(v); err != nil {
return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "APIKey.key": %w`, err)} return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "ApiKey.key": %w`, err)}
} }
} }
if _, ok := _c.mutation.Name(); !ok { if _, ok := _c.mutation.Name(); !ok {
return &ValidationError{Name: "name", err: errors.New(`ent: missing required field "APIKey.name"`)} return &ValidationError{Name: "name", err: errors.New(`ent: missing required field "ApiKey.name"`)}
} }
if v, ok := _c.mutation.Name(); ok { if v, ok := _c.mutation.Name(); ok {
if err := apikey.NameValidator(v); err != nil { if err := apikey.NameValidator(v); err != nil {
return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "APIKey.name": %w`, err)} return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ApiKey.name": %w`, err)}
} }
} }
if _, ok := _c.mutation.Status(); !ok { if _, ok := _c.mutation.Status(); !ok {
return &ValidationError{Name: "status", err: errors.New(`ent: missing required field "APIKey.status"`)} return &ValidationError{Name: "status", err: errors.New(`ent: missing required field "ApiKey.status"`)}
} }
if v, ok := _c.mutation.Status(); ok { if v, ok := _c.mutation.Status(); ok {
if err := apikey.StatusValidator(v); err != nil { if err := apikey.StatusValidator(v); err != nil {
return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "APIKey.status": %w`, err)} return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "ApiKey.status": %w`, err)}
} }
} }
if len(_c.mutation.UserIDs()) == 0 { if len(_c.mutation.UserIDs()) == 0 {
return &ValidationError{Name: "user", err: errors.New(`ent: missing required edge "APIKey.user"`)} return &ValidationError{Name: "user", err: errors.New(`ent: missing required edge "ApiKey.user"`)}
} }
return nil return nil
} }
func (_c *APIKeyCreate) sqlSave(ctx context.Context) (*APIKey, error) { func (_c *ApiKeyCreate) sqlSave(ctx context.Context) (*ApiKey, error) {
if err := _c.check(); err != nil { if err := _c.check(); err != nil {
return nil, err return nil, err
} }
@@ -255,9 +255,9 @@ func (_c *APIKeyCreate) sqlSave(ctx context.Context) (*APIKey, error) {
return _node, nil return _node, nil
} }
func (_c *APIKeyCreate) createSpec() (*APIKey, *sqlgraph.CreateSpec) { func (_c *ApiKeyCreate) createSpec() (*ApiKey, *sqlgraph.CreateSpec) {
var ( var (
_node = &APIKey{config: _c.config} _node = &ApiKey{config: _c.config}
_spec = sqlgraph.NewCreateSpec(apikey.Table, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) _spec = sqlgraph.NewCreateSpec(apikey.Table, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64))
) )
_spec.OnConflict = _c.conflict _spec.OnConflict = _c.conflict
@@ -341,7 +341,7 @@ func (_c *APIKeyCreate) createSpec() (*APIKey, *sqlgraph.CreateSpec) {
// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause // OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause
// of the `INSERT` statement. For example: // of the `INSERT` statement. For example:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// SetCreatedAt(v). // SetCreatedAt(v).
// OnConflict( // OnConflict(
// // Update the row with the new values // // Update the row with the new values
@@ -350,13 +350,13 @@ func (_c *APIKeyCreate) createSpec() (*APIKey, *sqlgraph.CreateSpec) {
// ). // ).
// // Override some of the fields with custom // // Override some of the fields with custom
// // update values. // // update values.
// Update(func(u *ent.APIKeyUpsert) { // Update(func(u *ent.ApiKeyUpsert) {
// SetCreatedAt(v+v). // SetCreatedAt(v+v).
// }). // }).
// Exec(ctx) // Exec(ctx)
func (_c *APIKeyCreate) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsertOne { func (_c *ApiKeyCreate) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsertOne {
_c.conflict = opts _c.conflict = opts
return &APIKeyUpsertOne{ return &ApiKeyUpsertOne{
create: _c, create: _c,
} }
} }
@@ -364,121 +364,121 @@ func (_c *APIKeyCreate) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsertOne
// OnConflictColumns calls `OnConflict` and configures the columns // OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using: // as conflict target. Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict(sql.ConflictColumns(columns...)). // OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx) // Exec(ctx)
func (_c *APIKeyCreate) OnConflictColumns(columns ...string) *APIKeyUpsertOne { func (_c *ApiKeyCreate) OnConflictColumns(columns ...string) *ApiKeyUpsertOne {
_c.conflict = append(_c.conflict, sql.ConflictColumns(columns...)) _c.conflict = append(_c.conflict, sql.ConflictColumns(columns...))
return &APIKeyUpsertOne{ return &ApiKeyUpsertOne{
create: _c, create: _c,
} }
} }
type ( type (
// APIKeyUpsertOne is the builder for "upsert"-ing // ApiKeyUpsertOne is the builder for "upsert"-ing
// one APIKey node. // one ApiKey node.
APIKeyUpsertOne struct { ApiKeyUpsertOne struct {
create *APIKeyCreate create *ApiKeyCreate
} }
// APIKeyUpsert is the "OnConflict" setter. // ApiKeyUpsert is the "OnConflict" setter.
APIKeyUpsert struct { ApiKeyUpsert struct {
*sql.UpdateSet *sql.UpdateSet
} }
) )
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (u *APIKeyUpsert) SetUpdatedAt(v time.Time) *APIKeyUpsert { func (u *ApiKeyUpsert) SetUpdatedAt(v time.Time) *ApiKeyUpsert {
u.Set(apikey.FieldUpdatedAt, v) u.Set(apikey.FieldUpdatedAt, v)
return u return u
} }
// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. // UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateUpdatedAt() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateUpdatedAt() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldUpdatedAt) u.SetExcluded(apikey.FieldUpdatedAt)
return u return u
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (u *APIKeyUpsert) SetDeletedAt(v time.Time) *APIKeyUpsert { func (u *ApiKeyUpsert) SetDeletedAt(v time.Time) *ApiKeyUpsert {
u.Set(apikey.FieldDeletedAt, v) u.Set(apikey.FieldDeletedAt, v)
return u return u
} }
// UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create. // UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateDeletedAt() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateDeletedAt() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldDeletedAt) u.SetExcluded(apikey.FieldDeletedAt)
return u return u
} }
// ClearDeletedAt clears the value of the "deleted_at" field. // ClearDeletedAt clears the value of the "deleted_at" field.
func (u *APIKeyUpsert) ClearDeletedAt() *APIKeyUpsert { func (u *ApiKeyUpsert) ClearDeletedAt() *ApiKeyUpsert {
u.SetNull(apikey.FieldDeletedAt) u.SetNull(apikey.FieldDeletedAt)
return u return u
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (u *APIKeyUpsert) SetUserID(v int64) *APIKeyUpsert { func (u *ApiKeyUpsert) SetUserID(v int64) *ApiKeyUpsert {
u.Set(apikey.FieldUserID, v) u.Set(apikey.FieldUserID, v)
return u return u
} }
// UpdateUserID sets the "user_id" field to the value that was provided on create. // UpdateUserID sets the "user_id" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateUserID() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateUserID() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldUserID) u.SetExcluded(apikey.FieldUserID)
return u return u
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (u *APIKeyUpsert) SetKey(v string) *APIKeyUpsert { func (u *ApiKeyUpsert) SetKey(v string) *ApiKeyUpsert {
u.Set(apikey.FieldKey, v) u.Set(apikey.FieldKey, v)
return u return u
} }
// UpdateKey sets the "key" field to the value that was provided on create. // UpdateKey sets the "key" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateKey() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateKey() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldKey) u.SetExcluded(apikey.FieldKey)
return u return u
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (u *APIKeyUpsert) SetName(v string) *APIKeyUpsert { func (u *ApiKeyUpsert) SetName(v string) *ApiKeyUpsert {
u.Set(apikey.FieldName, v) u.Set(apikey.FieldName, v)
return u return u
} }
// UpdateName sets the "name" field to the value that was provided on create. // UpdateName sets the "name" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateName() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateName() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldName) u.SetExcluded(apikey.FieldName)
return u return u
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (u *APIKeyUpsert) SetGroupID(v int64) *APIKeyUpsert { func (u *ApiKeyUpsert) SetGroupID(v int64) *ApiKeyUpsert {
u.Set(apikey.FieldGroupID, v) u.Set(apikey.FieldGroupID, v)
return u return u
} }
// UpdateGroupID sets the "group_id" field to the value that was provided on create. // UpdateGroupID sets the "group_id" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateGroupID() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateGroupID() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldGroupID) u.SetExcluded(apikey.FieldGroupID)
return u return u
} }
// ClearGroupID clears the value of the "group_id" field. // ClearGroupID clears the value of the "group_id" field.
func (u *APIKeyUpsert) ClearGroupID() *APIKeyUpsert { func (u *ApiKeyUpsert) ClearGroupID() *ApiKeyUpsert {
u.SetNull(apikey.FieldGroupID) u.SetNull(apikey.FieldGroupID)
return u return u
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (u *APIKeyUpsert) SetStatus(v string) *APIKeyUpsert { func (u *ApiKeyUpsert) SetStatus(v string) *ApiKeyUpsert {
u.Set(apikey.FieldStatus, v) u.Set(apikey.FieldStatus, v)
return u return u
} }
// UpdateStatus sets the "status" field to the value that was provided on create. // UpdateStatus sets the "status" field to the value that was provided on create.
func (u *APIKeyUpsert) UpdateStatus() *APIKeyUpsert { func (u *ApiKeyUpsert) UpdateStatus() *ApiKeyUpsert {
u.SetExcluded(apikey.FieldStatus) u.SetExcluded(apikey.FieldStatus)
return u return u
} }
@@ -486,12 +486,12 @@ func (u *APIKeyUpsert) UpdateStatus() *APIKeyUpsert {
// UpdateNewValues updates the mutable fields using the new values that were set on create. // UpdateNewValues updates the mutable fields using the new values that were set on create.
// Using this option is equivalent to using: // Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict( // OnConflict(
// sql.ResolveWithNewValues(), // sql.ResolveWithNewValues(),
// ). // ).
// Exec(ctx) // Exec(ctx)
func (u *APIKeyUpsertOne) UpdateNewValues() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateNewValues() *ApiKeyUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues())
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) {
if _, exists := u.create.mutation.CreatedAt(); exists { if _, exists := u.create.mutation.CreatedAt(); exists {
@@ -504,159 +504,159 @@ func (u *APIKeyUpsertOne) UpdateNewValues() *APIKeyUpsertOne {
// Ignore sets each column to itself in case of conflict. // Ignore sets each column to itself in case of conflict.
// Using this option is equivalent to using: // Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict(sql.ResolveWithIgnore()). // OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx) // Exec(ctx)
func (u *APIKeyUpsertOne) Ignore() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) Ignore() *ApiKeyUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore())
return u return u
} }
// DoNothing configures the conflict_action to `DO NOTHING`. // DoNothing configures the conflict_action to `DO NOTHING`.
// Supported only by SQLite and PostgreSQL. // Supported only by SQLite and PostgreSQL.
func (u *APIKeyUpsertOne) DoNothing() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) DoNothing() *ApiKeyUpsertOne {
u.create.conflict = append(u.create.conflict, sql.DoNothing()) u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u return u
} }
// Update allows overriding fields `UPDATE` values. See the APIKeyCreate.OnConflict // Update allows overriding fields `UPDATE` values. See the ApiKeyCreate.OnConflict
// documentation for more info. // documentation for more info.
func (u *APIKeyUpsertOne) Update(set func(*APIKeyUpsert)) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) Update(set func(*ApiKeyUpsert)) *ApiKeyUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&APIKeyUpsert{UpdateSet: update}) set(&ApiKeyUpsert{UpdateSet: update})
})) }))
return u return u
} }
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (u *APIKeyUpsertOne) SetUpdatedAt(v time.Time) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetUpdatedAt(v time.Time) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetUpdatedAt(v) s.SetUpdatedAt(v)
}) })
} }
// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. // UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateUpdatedAt() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateUpdatedAt() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateUpdatedAt() s.UpdateUpdatedAt()
}) })
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (u *APIKeyUpsertOne) SetDeletedAt(v time.Time) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetDeletedAt(v time.Time) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetDeletedAt(v) s.SetDeletedAt(v)
}) })
} }
// UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create. // UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateDeletedAt() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateDeletedAt() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateDeletedAt() s.UpdateDeletedAt()
}) })
} }
// ClearDeletedAt clears the value of the "deleted_at" field. // ClearDeletedAt clears the value of the "deleted_at" field.
func (u *APIKeyUpsertOne) ClearDeletedAt() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) ClearDeletedAt() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.ClearDeletedAt() s.ClearDeletedAt()
}) })
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (u *APIKeyUpsertOne) SetUserID(v int64) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetUserID(v int64) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetUserID(v) s.SetUserID(v)
}) })
} }
// UpdateUserID sets the "user_id" field to the value that was provided on create. // UpdateUserID sets the "user_id" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateUserID() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateUserID() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateUserID() s.UpdateUserID()
}) })
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (u *APIKeyUpsertOne) SetKey(v string) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetKey(v string) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetKey(v) s.SetKey(v)
}) })
} }
// UpdateKey sets the "key" field to the value that was provided on create. // UpdateKey sets the "key" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateKey() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateKey() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateKey() s.UpdateKey()
}) })
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (u *APIKeyUpsertOne) SetName(v string) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetName(v string) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetName(v) s.SetName(v)
}) })
} }
// UpdateName sets the "name" field to the value that was provided on create. // UpdateName sets the "name" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateName() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateName() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateName() s.UpdateName()
}) })
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (u *APIKeyUpsertOne) SetGroupID(v int64) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetGroupID(v int64) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetGroupID(v) s.SetGroupID(v)
}) })
} }
// UpdateGroupID sets the "group_id" field to the value that was provided on create. // UpdateGroupID sets the "group_id" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateGroupID() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateGroupID() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateGroupID() s.UpdateGroupID()
}) })
} }
// ClearGroupID clears the value of the "group_id" field. // ClearGroupID clears the value of the "group_id" field.
func (u *APIKeyUpsertOne) ClearGroupID() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) ClearGroupID() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.ClearGroupID() s.ClearGroupID()
}) })
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (u *APIKeyUpsertOne) SetStatus(v string) *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) SetStatus(v string) *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetStatus(v) s.SetStatus(v)
}) })
} }
// UpdateStatus sets the "status" field to the value that was provided on create. // UpdateStatus sets the "status" field to the value that was provided on create.
func (u *APIKeyUpsertOne) UpdateStatus() *APIKeyUpsertOne { func (u *ApiKeyUpsertOne) UpdateStatus() *ApiKeyUpsertOne {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateStatus() s.UpdateStatus()
}) })
} }
// Exec executes the query. // Exec executes the query.
func (u *APIKeyUpsertOne) Exec(ctx context.Context) error { func (u *ApiKeyUpsertOne) Exec(ctx context.Context) error {
if len(u.create.conflict) == 0 { if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for APIKeyCreate.OnConflict") return errors.New("ent: missing options for ApiKeyCreate.OnConflict")
} }
return u.create.Exec(ctx) return u.create.Exec(ctx)
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (u *APIKeyUpsertOne) ExecX(ctx context.Context) { func (u *ApiKeyUpsertOne) ExecX(ctx context.Context) {
if err := u.create.Exec(ctx); err != nil { if err := u.create.Exec(ctx); err != nil {
panic(err) panic(err)
} }
} }
// Exec executes the UPSERT query and returns the inserted/updated ID. // Exec executes the UPSERT query and returns the inserted/updated ID.
func (u *APIKeyUpsertOne) ID(ctx context.Context) (id int64, err error) { func (u *ApiKeyUpsertOne) ID(ctx context.Context) (id int64, err error) {
node, err := u.create.Save(ctx) node, err := u.create.Save(ctx)
if err != nil { if err != nil {
return id, err return id, err
@@ -665,7 +665,7 @@ func (u *APIKeyUpsertOne) ID(ctx context.Context) (id int64, err error) {
} }
// IDX is like ID, but panics if an error occurs. // IDX is like ID, but panics if an error occurs.
func (u *APIKeyUpsertOne) IDX(ctx context.Context) int64 { func (u *ApiKeyUpsertOne) IDX(ctx context.Context) int64 {
id, err := u.ID(ctx) id, err := u.ID(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -673,28 +673,28 @@ func (u *APIKeyUpsertOne) IDX(ctx context.Context) int64 {
return id return id
} }
// APIKeyCreateBulk is the builder for creating many APIKey entities in bulk. // ApiKeyCreateBulk is the builder for creating many ApiKey entities in bulk.
type APIKeyCreateBulk struct { type ApiKeyCreateBulk struct {
config config
err error err error
builders []*APIKeyCreate builders []*ApiKeyCreate
conflict []sql.ConflictOption conflict []sql.ConflictOption
} }
// Save creates the APIKey entities in the database. // Save creates the ApiKey entities in the database.
func (_c *APIKeyCreateBulk) Save(ctx context.Context) ([]*APIKey, error) { func (_c *ApiKeyCreateBulk) Save(ctx context.Context) ([]*ApiKey, error) {
if _c.err != nil { if _c.err != nil {
return nil, _c.err return nil, _c.err
} }
specs := make([]*sqlgraph.CreateSpec, len(_c.builders)) specs := make([]*sqlgraph.CreateSpec, len(_c.builders))
nodes := make([]*APIKey, len(_c.builders)) nodes := make([]*ApiKey, len(_c.builders))
mutators := make([]Mutator, len(_c.builders)) mutators := make([]Mutator, len(_c.builders))
for i := range _c.builders { for i := range _c.builders {
func(i int, root context.Context) { func(i int, root context.Context) {
builder := _c.builders[i] builder := _c.builders[i]
builder.defaults() builder.defaults()
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) { var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*APIKeyMutation) mutation, ok := m.(*ApiKeyMutation)
if !ok { if !ok {
return nil, fmt.Errorf("unexpected mutation type %T", m) return nil, fmt.Errorf("unexpected mutation type %T", m)
} }
@@ -742,7 +742,7 @@ func (_c *APIKeyCreateBulk) Save(ctx context.Context) ([]*APIKey, error) {
} }
// SaveX is like Save, but panics if an error occurs. // SaveX is like Save, but panics if an error occurs.
func (_c *APIKeyCreateBulk) SaveX(ctx context.Context) []*APIKey { func (_c *ApiKeyCreateBulk) SaveX(ctx context.Context) []*ApiKey {
v, err := _c.Save(ctx) v, err := _c.Save(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -751,13 +751,13 @@ func (_c *APIKeyCreateBulk) SaveX(ctx context.Context) []*APIKey {
} }
// Exec executes the query. // Exec executes the query.
func (_c *APIKeyCreateBulk) Exec(ctx context.Context) error { func (_c *ApiKeyCreateBulk) Exec(ctx context.Context) error {
_, err := _c.Save(ctx) _, err := _c.Save(ctx)
return err return err
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_c *APIKeyCreateBulk) ExecX(ctx context.Context) { func (_c *ApiKeyCreateBulk) ExecX(ctx context.Context) {
if err := _c.Exec(ctx); err != nil { if err := _c.Exec(ctx); err != nil {
panic(err) panic(err)
} }
@@ -766,7 +766,7 @@ func (_c *APIKeyCreateBulk) ExecX(ctx context.Context) {
// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause // OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause
// of the `INSERT` statement. For example: // of the `INSERT` statement. For example:
// //
// client.APIKey.CreateBulk(builders...). // client.ApiKey.CreateBulk(builders...).
// OnConflict( // OnConflict(
// // Update the row with the new values // // Update the row with the new values
// // the was proposed for insertion. // // the was proposed for insertion.
@@ -774,13 +774,13 @@ func (_c *APIKeyCreateBulk) ExecX(ctx context.Context) {
// ). // ).
// // Override some of the fields with custom // // Override some of the fields with custom
// // update values. // // update values.
// Update(func(u *ent.APIKeyUpsert) { // Update(func(u *ent.ApiKeyUpsert) {
// SetCreatedAt(v+v). // SetCreatedAt(v+v).
// }). // }).
// Exec(ctx) // Exec(ctx)
func (_c *APIKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsertBulk { func (_c *ApiKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsertBulk {
_c.conflict = opts _c.conflict = opts
return &APIKeyUpsertBulk{ return &ApiKeyUpsertBulk{
create: _c, create: _c,
} }
} }
@@ -788,31 +788,31 @@ func (_c *APIKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsert
// OnConflictColumns calls `OnConflict` and configures the columns // OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using: // as conflict target. Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict(sql.ConflictColumns(columns...)). // OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx) // Exec(ctx)
func (_c *APIKeyCreateBulk) OnConflictColumns(columns ...string) *APIKeyUpsertBulk { func (_c *ApiKeyCreateBulk) OnConflictColumns(columns ...string) *ApiKeyUpsertBulk {
_c.conflict = append(_c.conflict, sql.ConflictColumns(columns...)) _c.conflict = append(_c.conflict, sql.ConflictColumns(columns...))
return &APIKeyUpsertBulk{ return &ApiKeyUpsertBulk{
create: _c, create: _c,
} }
} }
// APIKeyUpsertBulk is the builder for "upsert"-ing // ApiKeyUpsertBulk is the builder for "upsert"-ing
// a bulk of APIKey nodes. // a bulk of ApiKey nodes.
type APIKeyUpsertBulk struct { type ApiKeyUpsertBulk struct {
create *APIKeyCreateBulk create *ApiKeyCreateBulk
} }
// UpdateNewValues updates the mutable fields using the new values that // UpdateNewValues updates the mutable fields using the new values that
// were set on create. Using this option is equivalent to using: // were set on create. Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict( // OnConflict(
// sql.ResolveWithNewValues(), // sql.ResolveWithNewValues(),
// ). // ).
// Exec(ctx) // Exec(ctx)
func (u *APIKeyUpsertBulk) UpdateNewValues() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateNewValues() *ApiKeyUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues()) u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues())
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) { u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(s *sql.UpdateSet) {
for _, b := range u.create.builders { for _, b := range u.create.builders {
@@ -827,160 +827,160 @@ func (u *APIKeyUpsertBulk) UpdateNewValues() *APIKeyUpsertBulk {
// Ignore sets each column to itself in case of conflict. // Ignore sets each column to itself in case of conflict.
// Using this option is equivalent to using: // Using this option is equivalent to using:
// //
// client.APIKey.Create(). // client.ApiKey.Create().
// OnConflict(sql.ResolveWithIgnore()). // OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx) // Exec(ctx)
func (u *APIKeyUpsertBulk) Ignore() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) Ignore() *ApiKeyUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore())
return u return u
} }
// DoNothing configures the conflict_action to `DO NOTHING`. // DoNothing configures the conflict_action to `DO NOTHING`.
// Supported only by SQLite and PostgreSQL. // Supported only by SQLite and PostgreSQL.
func (u *APIKeyUpsertBulk) DoNothing() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) DoNothing() *ApiKeyUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.DoNothing()) u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u return u
} }
// Update allows overriding fields `UPDATE` values. See the APIKeyCreateBulk.OnConflict // Update allows overriding fields `UPDATE` values. See the ApiKeyCreateBulk.OnConflict
// documentation for more info. // documentation for more info.
func (u *APIKeyUpsertBulk) Update(set func(*APIKeyUpsert)) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) Update(set func(*ApiKeyUpsert)) *ApiKeyUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) { u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&APIKeyUpsert{UpdateSet: update}) set(&ApiKeyUpsert{UpdateSet: update})
})) }))
return u return u
} }
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (u *APIKeyUpsertBulk) SetUpdatedAt(v time.Time) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetUpdatedAt(v time.Time) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetUpdatedAt(v) s.SetUpdatedAt(v)
}) })
} }
// UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. // UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateUpdatedAt() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateUpdatedAt() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateUpdatedAt() s.UpdateUpdatedAt()
}) })
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (u *APIKeyUpsertBulk) SetDeletedAt(v time.Time) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetDeletedAt(v time.Time) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetDeletedAt(v) s.SetDeletedAt(v)
}) })
} }
// UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create. // UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateDeletedAt() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateDeletedAt() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateDeletedAt() s.UpdateDeletedAt()
}) })
} }
// ClearDeletedAt clears the value of the "deleted_at" field. // ClearDeletedAt clears the value of the "deleted_at" field.
func (u *APIKeyUpsertBulk) ClearDeletedAt() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) ClearDeletedAt() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.ClearDeletedAt() s.ClearDeletedAt()
}) })
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (u *APIKeyUpsertBulk) SetUserID(v int64) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetUserID(v int64) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetUserID(v) s.SetUserID(v)
}) })
} }
// UpdateUserID sets the "user_id" field to the value that was provided on create. // UpdateUserID sets the "user_id" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateUserID() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateUserID() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateUserID() s.UpdateUserID()
}) })
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (u *APIKeyUpsertBulk) SetKey(v string) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetKey(v string) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetKey(v) s.SetKey(v)
}) })
} }
// UpdateKey sets the "key" field to the value that was provided on create. // UpdateKey sets the "key" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateKey() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateKey() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateKey() s.UpdateKey()
}) })
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (u *APIKeyUpsertBulk) SetName(v string) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetName(v string) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetName(v) s.SetName(v)
}) })
} }
// UpdateName sets the "name" field to the value that was provided on create. // UpdateName sets the "name" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateName() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateName() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateName() s.UpdateName()
}) })
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (u *APIKeyUpsertBulk) SetGroupID(v int64) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetGroupID(v int64) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetGroupID(v) s.SetGroupID(v)
}) })
} }
// UpdateGroupID sets the "group_id" field to the value that was provided on create. // UpdateGroupID sets the "group_id" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateGroupID() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateGroupID() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateGroupID() s.UpdateGroupID()
}) })
} }
// ClearGroupID clears the value of the "group_id" field. // ClearGroupID clears the value of the "group_id" field.
func (u *APIKeyUpsertBulk) ClearGroupID() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) ClearGroupID() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.ClearGroupID() s.ClearGroupID()
}) })
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (u *APIKeyUpsertBulk) SetStatus(v string) *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) SetStatus(v string) *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.SetStatus(v) s.SetStatus(v)
}) })
} }
// UpdateStatus sets the "status" field to the value that was provided on create. // UpdateStatus sets the "status" field to the value that was provided on create.
func (u *APIKeyUpsertBulk) UpdateStatus() *APIKeyUpsertBulk { func (u *ApiKeyUpsertBulk) UpdateStatus() *ApiKeyUpsertBulk {
return u.Update(func(s *APIKeyUpsert) { return u.Update(func(s *ApiKeyUpsert) {
s.UpdateStatus() s.UpdateStatus()
}) })
} }
// Exec executes the query. // Exec executes the query.
func (u *APIKeyUpsertBulk) Exec(ctx context.Context) error { func (u *ApiKeyUpsertBulk) Exec(ctx context.Context) error {
if u.create.err != nil { if u.create.err != nil {
return u.create.err return u.create.err
} }
for i, b := range u.create.builders { for i, b := range u.create.builders {
if len(b.conflict) != 0 { if len(b.conflict) != 0 {
return fmt.Errorf("ent: OnConflict was set for builder %d. Set it on the APIKeyCreateBulk instead", i) return fmt.Errorf("ent: OnConflict was set for builder %d. Set it on the ApiKeyCreateBulk instead", i)
} }
} }
if len(u.create.conflict) == 0 { if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for APIKeyCreateBulk.OnConflict") return errors.New("ent: missing options for ApiKeyCreateBulk.OnConflict")
} }
return u.create.Exec(ctx) return u.create.Exec(ctx)
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (u *APIKeyUpsertBulk) ExecX(ctx context.Context) { func (u *ApiKeyUpsertBulk) ExecX(ctx context.Context) {
if err := u.create.Exec(ctx); err != nil { if err := u.create.Exec(ctx); err != nil {
panic(err) panic(err)
} }

View File

@@ -12,26 +12,26 @@ import (
"github.com/Wei-Shaw/sub2api/ent/predicate" "github.com/Wei-Shaw/sub2api/ent/predicate"
) )
// APIKeyDelete is the builder for deleting a APIKey entity. // ApiKeyDelete is the builder for deleting a ApiKey entity.
type APIKeyDelete struct { type ApiKeyDelete struct {
config config
hooks []Hook hooks []Hook
mutation *APIKeyMutation mutation *ApiKeyMutation
} }
// Where appends a list predicates to the APIKeyDelete builder. // Where appends a list predicates to the ApiKeyDelete builder.
func (_d *APIKeyDelete) Where(ps ...predicate.APIKey) *APIKeyDelete { func (_d *ApiKeyDelete) Where(ps ...predicate.ApiKey) *ApiKeyDelete {
_d.mutation.Where(ps...) _d.mutation.Where(ps...)
return _d return _d
} }
// Exec executes the deletion query and returns how many vertices were deleted. // Exec executes the deletion query and returns how many vertices were deleted.
func (_d *APIKeyDelete) Exec(ctx context.Context) (int, error) { func (_d *ApiKeyDelete) Exec(ctx context.Context) (int, error) {
return withHooks(ctx, _d.sqlExec, _d.mutation, _d.hooks) return withHooks(ctx, _d.sqlExec, _d.mutation, _d.hooks)
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_d *APIKeyDelete) ExecX(ctx context.Context) int { func (_d *ApiKeyDelete) ExecX(ctx context.Context) int {
n, err := _d.Exec(ctx) n, err := _d.Exec(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -39,7 +39,7 @@ func (_d *APIKeyDelete) ExecX(ctx context.Context) int {
return n return n
} }
func (_d *APIKeyDelete) sqlExec(ctx context.Context) (int, error) { func (_d *ApiKeyDelete) sqlExec(ctx context.Context) (int, error) {
_spec := sqlgraph.NewDeleteSpec(apikey.Table, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) _spec := sqlgraph.NewDeleteSpec(apikey.Table, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64))
if ps := _d.mutation.predicates; len(ps) > 0 { if ps := _d.mutation.predicates; len(ps) > 0 {
_spec.Predicate = func(selector *sql.Selector) { _spec.Predicate = func(selector *sql.Selector) {
@@ -56,19 +56,19 @@ func (_d *APIKeyDelete) sqlExec(ctx context.Context) (int, error) {
return affected, err return affected, err
} }
// APIKeyDeleteOne is the builder for deleting a single APIKey entity. // ApiKeyDeleteOne is the builder for deleting a single ApiKey entity.
type APIKeyDeleteOne struct { type ApiKeyDeleteOne struct {
_d *APIKeyDelete _d *ApiKeyDelete
} }
// Where appends a list predicates to the APIKeyDelete builder. // Where appends a list predicates to the ApiKeyDelete builder.
func (_d *APIKeyDeleteOne) Where(ps ...predicate.APIKey) *APIKeyDeleteOne { func (_d *ApiKeyDeleteOne) Where(ps ...predicate.ApiKey) *ApiKeyDeleteOne {
_d._d.mutation.Where(ps...) _d._d.mutation.Where(ps...)
return _d return _d
} }
// Exec executes the deletion query. // Exec executes the deletion query.
func (_d *APIKeyDeleteOne) Exec(ctx context.Context) error { func (_d *ApiKeyDeleteOne) Exec(ctx context.Context) error {
n, err := _d._d.Exec(ctx) n, err := _d._d.Exec(ctx)
switch { switch {
case err != nil: case err != nil:
@@ -81,7 +81,7 @@ func (_d *APIKeyDeleteOne) Exec(ctx context.Context) error {
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_d *APIKeyDeleteOne) ExecX(ctx context.Context) { func (_d *ApiKeyDeleteOne) ExecX(ctx context.Context) {
if err := _d.Exec(ctx); err != nil { if err := _d.Exec(ctx); err != nil {
panic(err) panic(err)
} }

View File

@@ -19,13 +19,13 @@ import (
"github.com/Wei-Shaw/sub2api/ent/user" "github.com/Wei-Shaw/sub2api/ent/user"
) )
// APIKeyQuery is the builder for querying APIKey entities. // ApiKeyQuery is the builder for querying ApiKey entities.
type APIKeyQuery struct { type ApiKeyQuery struct {
config config
ctx *QueryContext ctx *QueryContext
order []apikey.OrderOption order []apikey.OrderOption
inters []Interceptor inters []Interceptor
predicates []predicate.APIKey predicates []predicate.ApiKey
withUser *UserQuery withUser *UserQuery
withGroup *GroupQuery withGroup *GroupQuery
withUsageLogs *UsageLogQuery withUsageLogs *UsageLogQuery
@@ -34,39 +34,39 @@ type APIKeyQuery struct {
path func(context.Context) (*sql.Selector, error) path func(context.Context) (*sql.Selector, error)
} }
// Where adds a new predicate for the APIKeyQuery builder. // Where adds a new predicate for the ApiKeyQuery builder.
func (_q *APIKeyQuery) Where(ps ...predicate.APIKey) *APIKeyQuery { func (_q *ApiKeyQuery) Where(ps ...predicate.ApiKey) *ApiKeyQuery {
_q.predicates = append(_q.predicates, ps...) _q.predicates = append(_q.predicates, ps...)
return _q return _q
} }
// Limit the number of records to be returned by this query. // Limit the number of records to be returned by this query.
func (_q *APIKeyQuery) Limit(limit int) *APIKeyQuery { func (_q *ApiKeyQuery) Limit(limit int) *ApiKeyQuery {
_q.ctx.Limit = &limit _q.ctx.Limit = &limit
return _q return _q
} }
// Offset to start from. // Offset to start from.
func (_q *APIKeyQuery) Offset(offset int) *APIKeyQuery { func (_q *ApiKeyQuery) Offset(offset int) *ApiKeyQuery {
_q.ctx.Offset = &offset _q.ctx.Offset = &offset
return _q return _q
} }
// Unique configures the query builder to filter duplicate records on query. // Unique configures the query builder to filter duplicate records on query.
// By default, unique is set to true, and can be disabled using this method. // By default, unique is set to true, and can be disabled using this method.
func (_q *APIKeyQuery) Unique(unique bool) *APIKeyQuery { func (_q *ApiKeyQuery) Unique(unique bool) *ApiKeyQuery {
_q.ctx.Unique = &unique _q.ctx.Unique = &unique
return _q return _q
} }
// Order specifies how the records should be ordered. // Order specifies how the records should be ordered.
func (_q *APIKeyQuery) Order(o ...apikey.OrderOption) *APIKeyQuery { func (_q *ApiKeyQuery) Order(o ...apikey.OrderOption) *ApiKeyQuery {
_q.order = append(_q.order, o...) _q.order = append(_q.order, o...)
return _q return _q
} }
// QueryUser chains the current query on the "user" edge. // QueryUser chains the current query on the "user" edge.
func (_q *APIKeyQuery) QueryUser() *UserQuery { func (_q *ApiKeyQuery) QueryUser() *UserQuery {
query := (&UserClient{config: _q.config}).Query() query := (&UserClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
@@ -88,7 +88,7 @@ func (_q *APIKeyQuery) QueryUser() *UserQuery {
} }
// QueryGroup chains the current query on the "group" edge. // QueryGroup chains the current query on the "group" edge.
func (_q *APIKeyQuery) QueryGroup() *GroupQuery { func (_q *ApiKeyQuery) QueryGroup() *GroupQuery {
query := (&GroupClient{config: _q.config}).Query() query := (&GroupClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
@@ -110,7 +110,7 @@ func (_q *APIKeyQuery) QueryGroup() *GroupQuery {
} }
// QueryUsageLogs chains the current query on the "usage_logs" edge. // QueryUsageLogs chains the current query on the "usage_logs" edge.
func (_q *APIKeyQuery) QueryUsageLogs() *UsageLogQuery { func (_q *ApiKeyQuery) QueryUsageLogs() *UsageLogQuery {
query := (&UsageLogClient{config: _q.config}).Query() query := (&UsageLogClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
@@ -131,9 +131,9 @@ func (_q *APIKeyQuery) QueryUsageLogs() *UsageLogQuery {
return query return query
} }
// First returns the first APIKey entity from the query. // First returns the first ApiKey entity from the query.
// Returns a *NotFoundError when no APIKey was found. // Returns a *NotFoundError when no ApiKey was found.
func (_q *APIKeyQuery) First(ctx context.Context) (*APIKey, error) { func (_q *ApiKeyQuery) First(ctx context.Context) (*ApiKey, error) {
nodes, err := _q.Limit(1).All(setContextOp(ctx, _q.ctx, ent.OpQueryFirst)) nodes, err := _q.Limit(1).All(setContextOp(ctx, _q.ctx, ent.OpQueryFirst))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -145,7 +145,7 @@ func (_q *APIKeyQuery) First(ctx context.Context) (*APIKey, error) {
} }
// FirstX is like First, but panics if an error occurs. // FirstX is like First, but panics if an error occurs.
func (_q *APIKeyQuery) FirstX(ctx context.Context) *APIKey { func (_q *ApiKeyQuery) FirstX(ctx context.Context) *ApiKey {
node, err := _q.First(ctx) node, err := _q.First(ctx)
if err != nil && !IsNotFound(err) { if err != nil && !IsNotFound(err) {
panic(err) panic(err)
@@ -153,9 +153,9 @@ func (_q *APIKeyQuery) FirstX(ctx context.Context) *APIKey {
return node return node
} }
// FirstID returns the first APIKey ID from the query. // FirstID returns the first ApiKey ID from the query.
// Returns a *NotFoundError when no APIKey ID was found. // Returns a *NotFoundError when no ApiKey ID was found.
func (_q *APIKeyQuery) FirstID(ctx context.Context) (id int64, err error) { func (_q *ApiKeyQuery) FirstID(ctx context.Context) (id int64, err error) {
var ids []int64 var ids []int64
if ids, err = _q.Limit(1).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryFirstID)); err != nil { if ids, err = _q.Limit(1).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryFirstID)); err != nil {
return return
@@ -168,7 +168,7 @@ func (_q *APIKeyQuery) FirstID(ctx context.Context) (id int64, err error) {
} }
// FirstIDX is like FirstID, but panics if an error occurs. // FirstIDX is like FirstID, but panics if an error occurs.
func (_q *APIKeyQuery) FirstIDX(ctx context.Context) int64 { func (_q *ApiKeyQuery) FirstIDX(ctx context.Context) int64 {
id, err := _q.FirstID(ctx) id, err := _q.FirstID(ctx)
if err != nil && !IsNotFound(err) { if err != nil && !IsNotFound(err) {
panic(err) panic(err)
@@ -176,10 +176,10 @@ func (_q *APIKeyQuery) FirstIDX(ctx context.Context) int64 {
return id return id
} }
// Only returns a single APIKey entity found by the query, ensuring it only returns one. // Only returns a single ApiKey entity found by the query, ensuring it only returns one.
// Returns a *NotSingularError when more than one APIKey entity is found. // Returns a *NotSingularError when more than one ApiKey entity is found.
// Returns a *NotFoundError when no APIKey entities are found. // Returns a *NotFoundError when no ApiKey entities are found.
func (_q *APIKeyQuery) Only(ctx context.Context) (*APIKey, error) { func (_q *ApiKeyQuery) Only(ctx context.Context) (*ApiKey, error) {
nodes, err := _q.Limit(2).All(setContextOp(ctx, _q.ctx, ent.OpQueryOnly)) nodes, err := _q.Limit(2).All(setContextOp(ctx, _q.ctx, ent.OpQueryOnly))
if err != nil { if err != nil {
return nil, err return nil, err
@@ -195,7 +195,7 @@ func (_q *APIKeyQuery) Only(ctx context.Context) (*APIKey, error) {
} }
// OnlyX is like Only, but panics if an error occurs. // OnlyX is like Only, but panics if an error occurs.
func (_q *APIKeyQuery) OnlyX(ctx context.Context) *APIKey { func (_q *ApiKeyQuery) OnlyX(ctx context.Context) *ApiKey {
node, err := _q.Only(ctx) node, err := _q.Only(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -203,10 +203,10 @@ func (_q *APIKeyQuery) OnlyX(ctx context.Context) *APIKey {
return node return node
} }
// OnlyID is like Only, but returns the only APIKey ID in the query. // OnlyID is like Only, but returns the only ApiKey ID in the query.
// Returns a *NotSingularError when more than one APIKey ID is found. // Returns a *NotSingularError when more than one ApiKey ID is found.
// Returns a *NotFoundError when no entities are found. // Returns a *NotFoundError when no entities are found.
func (_q *APIKeyQuery) OnlyID(ctx context.Context) (id int64, err error) { func (_q *ApiKeyQuery) OnlyID(ctx context.Context) (id int64, err error) {
var ids []int64 var ids []int64
if ids, err = _q.Limit(2).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryOnlyID)); err != nil { if ids, err = _q.Limit(2).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryOnlyID)); err != nil {
return return
@@ -223,7 +223,7 @@ func (_q *APIKeyQuery) OnlyID(ctx context.Context) (id int64, err error) {
} }
// OnlyIDX is like OnlyID, but panics if an error occurs. // OnlyIDX is like OnlyID, but panics if an error occurs.
func (_q *APIKeyQuery) OnlyIDX(ctx context.Context) int64 { func (_q *ApiKeyQuery) OnlyIDX(ctx context.Context) int64 {
id, err := _q.OnlyID(ctx) id, err := _q.OnlyID(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -231,18 +231,18 @@ func (_q *APIKeyQuery) OnlyIDX(ctx context.Context) int64 {
return id return id
} }
// All executes the query and returns a list of APIKeys. // All executes the query and returns a list of ApiKeys.
func (_q *APIKeyQuery) All(ctx context.Context) ([]*APIKey, error) { func (_q *ApiKeyQuery) All(ctx context.Context) ([]*ApiKey, error) {
ctx = setContextOp(ctx, _q.ctx, ent.OpQueryAll) ctx = setContextOp(ctx, _q.ctx, ent.OpQueryAll)
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
return nil, err return nil, err
} }
qr := querierAll[[]*APIKey, *APIKeyQuery]() qr := querierAll[[]*ApiKey, *ApiKeyQuery]()
return withInterceptors[[]*APIKey](ctx, _q, qr, _q.inters) return withInterceptors[[]*ApiKey](ctx, _q, qr, _q.inters)
} }
// AllX is like All, but panics if an error occurs. // AllX is like All, but panics if an error occurs.
func (_q *APIKeyQuery) AllX(ctx context.Context) []*APIKey { func (_q *ApiKeyQuery) AllX(ctx context.Context) []*ApiKey {
nodes, err := _q.All(ctx) nodes, err := _q.All(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -250,8 +250,8 @@ func (_q *APIKeyQuery) AllX(ctx context.Context) []*APIKey {
return nodes return nodes
} }
// IDs executes the query and returns a list of APIKey IDs. // IDs executes the query and returns a list of ApiKey IDs.
func (_q *APIKeyQuery) IDs(ctx context.Context) (ids []int64, err error) { func (_q *ApiKeyQuery) IDs(ctx context.Context) (ids []int64, err error) {
if _q.ctx.Unique == nil && _q.path != nil { if _q.ctx.Unique == nil && _q.path != nil {
_q.Unique(true) _q.Unique(true)
} }
@@ -263,7 +263,7 @@ func (_q *APIKeyQuery) IDs(ctx context.Context) (ids []int64, err error) {
} }
// IDsX is like IDs, but panics if an error occurs. // IDsX is like IDs, but panics if an error occurs.
func (_q *APIKeyQuery) IDsX(ctx context.Context) []int64 { func (_q *ApiKeyQuery) IDsX(ctx context.Context) []int64 {
ids, err := _q.IDs(ctx) ids, err := _q.IDs(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -272,16 +272,16 @@ func (_q *APIKeyQuery) IDsX(ctx context.Context) []int64 {
} }
// Count returns the count of the given query. // Count returns the count of the given query.
func (_q *APIKeyQuery) Count(ctx context.Context) (int, error) { func (_q *ApiKeyQuery) Count(ctx context.Context) (int, error) {
ctx = setContextOp(ctx, _q.ctx, ent.OpQueryCount) ctx = setContextOp(ctx, _q.ctx, ent.OpQueryCount)
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
return 0, err return 0, err
} }
return withInterceptors[int](ctx, _q, querierCount[*APIKeyQuery](), _q.inters) return withInterceptors[int](ctx, _q, querierCount[*ApiKeyQuery](), _q.inters)
} }
// CountX is like Count, but panics if an error occurs. // CountX is like Count, but panics if an error occurs.
func (_q *APIKeyQuery) CountX(ctx context.Context) int { func (_q *ApiKeyQuery) CountX(ctx context.Context) int {
count, err := _q.Count(ctx) count, err := _q.Count(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -290,7 +290,7 @@ func (_q *APIKeyQuery) CountX(ctx context.Context) int {
} }
// Exist returns true if the query has elements in the graph. // Exist returns true if the query has elements in the graph.
func (_q *APIKeyQuery) Exist(ctx context.Context) (bool, error) { func (_q *ApiKeyQuery) Exist(ctx context.Context) (bool, error) {
ctx = setContextOp(ctx, _q.ctx, ent.OpQueryExist) ctx = setContextOp(ctx, _q.ctx, ent.OpQueryExist)
switch _, err := _q.FirstID(ctx); { switch _, err := _q.FirstID(ctx); {
case IsNotFound(err): case IsNotFound(err):
@@ -303,7 +303,7 @@ func (_q *APIKeyQuery) Exist(ctx context.Context) (bool, error) {
} }
// ExistX is like Exist, but panics if an error occurs. // ExistX is like Exist, but panics if an error occurs.
func (_q *APIKeyQuery) ExistX(ctx context.Context) bool { func (_q *ApiKeyQuery) ExistX(ctx context.Context) bool {
exist, err := _q.Exist(ctx) exist, err := _q.Exist(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -311,18 +311,18 @@ func (_q *APIKeyQuery) ExistX(ctx context.Context) bool {
return exist return exist
} }
// Clone returns a duplicate of the APIKeyQuery builder, including all associated steps. It can be // Clone returns a duplicate of the ApiKeyQuery builder, including all associated steps. It can be
// used to prepare common query builders and use them differently after the clone is made. // used to prepare common query builders and use them differently after the clone is made.
func (_q *APIKeyQuery) Clone() *APIKeyQuery { func (_q *ApiKeyQuery) Clone() *ApiKeyQuery {
if _q == nil { if _q == nil {
return nil return nil
} }
return &APIKeyQuery{ return &ApiKeyQuery{
config: _q.config, config: _q.config,
ctx: _q.ctx.Clone(), ctx: _q.ctx.Clone(),
order: append([]apikey.OrderOption{}, _q.order...), order: append([]apikey.OrderOption{}, _q.order...),
inters: append([]Interceptor{}, _q.inters...), inters: append([]Interceptor{}, _q.inters...),
predicates: append([]predicate.APIKey{}, _q.predicates...), predicates: append([]predicate.ApiKey{}, _q.predicates...),
withUser: _q.withUser.Clone(), withUser: _q.withUser.Clone(),
withGroup: _q.withGroup.Clone(), withGroup: _q.withGroup.Clone(),
withUsageLogs: _q.withUsageLogs.Clone(), withUsageLogs: _q.withUsageLogs.Clone(),
@@ -334,7 +334,7 @@ func (_q *APIKeyQuery) Clone() *APIKeyQuery {
// WithUser tells the query-builder to eager-load the nodes that are connected to // WithUser tells the query-builder to eager-load the nodes that are connected to
// the "user" edge. The optional arguments are used to configure the query builder of the edge. // the "user" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *APIKeyQuery) WithUser(opts ...func(*UserQuery)) *APIKeyQuery { func (_q *ApiKeyQuery) WithUser(opts ...func(*UserQuery)) *ApiKeyQuery {
query := (&UserClient{config: _q.config}).Query() query := (&UserClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
@@ -345,7 +345,7 @@ func (_q *APIKeyQuery) WithUser(opts ...func(*UserQuery)) *APIKeyQuery {
// WithGroup tells the query-builder to eager-load the nodes that are connected to // WithGroup tells the query-builder to eager-load the nodes that are connected to
// the "group" edge. The optional arguments are used to configure the query builder of the edge. // the "group" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *APIKeyQuery) WithGroup(opts ...func(*GroupQuery)) *APIKeyQuery { func (_q *ApiKeyQuery) WithGroup(opts ...func(*GroupQuery)) *ApiKeyQuery {
query := (&GroupClient{config: _q.config}).Query() query := (&GroupClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
@@ -356,7 +356,7 @@ func (_q *APIKeyQuery) WithGroup(opts ...func(*GroupQuery)) *APIKeyQuery {
// WithUsageLogs tells the query-builder to eager-load the nodes that are connected to // WithUsageLogs tells the query-builder to eager-load the nodes that are connected to
// the "usage_logs" edge. The optional arguments are used to configure the query builder of the edge. // the "usage_logs" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *APIKeyQuery) WithUsageLogs(opts ...func(*UsageLogQuery)) *APIKeyQuery { func (_q *ApiKeyQuery) WithUsageLogs(opts ...func(*UsageLogQuery)) *ApiKeyQuery {
query := (&UsageLogClient{config: _q.config}).Query() query := (&UsageLogClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
@@ -375,13 +375,13 @@ func (_q *APIKeyQuery) WithUsageLogs(opts ...func(*UsageLogQuery)) *APIKeyQuery
// Count int `json:"count,omitempty"` // Count int `json:"count,omitempty"`
// } // }
// //
// client.APIKey.Query(). // client.ApiKey.Query().
// GroupBy(apikey.FieldCreatedAt). // GroupBy(apikey.FieldCreatedAt).
// Aggregate(ent.Count()). // Aggregate(ent.Count()).
// Scan(ctx, &v) // Scan(ctx, &v)
func (_q *APIKeyQuery) GroupBy(field string, fields ...string) *APIKeyGroupBy { func (_q *ApiKeyQuery) GroupBy(field string, fields ...string) *ApiKeyGroupBy {
_q.ctx.Fields = append([]string{field}, fields...) _q.ctx.Fields = append([]string{field}, fields...)
grbuild := &APIKeyGroupBy{build: _q} grbuild := &ApiKeyGroupBy{build: _q}
grbuild.flds = &_q.ctx.Fields grbuild.flds = &_q.ctx.Fields
grbuild.label = apikey.Label grbuild.label = apikey.Label
grbuild.scan = grbuild.Scan grbuild.scan = grbuild.Scan
@@ -397,23 +397,23 @@ func (_q *APIKeyQuery) GroupBy(field string, fields ...string) *APIKeyGroupBy {
// CreatedAt time.Time `json:"created_at,omitempty"` // CreatedAt time.Time `json:"created_at,omitempty"`
// } // }
// //
// client.APIKey.Query(). // client.ApiKey.Query().
// Select(apikey.FieldCreatedAt). // Select(apikey.FieldCreatedAt).
// Scan(ctx, &v) // Scan(ctx, &v)
func (_q *APIKeyQuery) Select(fields ...string) *APIKeySelect { func (_q *ApiKeyQuery) Select(fields ...string) *ApiKeySelect {
_q.ctx.Fields = append(_q.ctx.Fields, fields...) _q.ctx.Fields = append(_q.ctx.Fields, fields...)
sbuild := &APIKeySelect{APIKeyQuery: _q} sbuild := &ApiKeySelect{ApiKeyQuery: _q}
sbuild.label = apikey.Label sbuild.label = apikey.Label
sbuild.flds, sbuild.scan = &_q.ctx.Fields, sbuild.Scan sbuild.flds, sbuild.scan = &_q.ctx.Fields, sbuild.Scan
return sbuild return sbuild
} }
// Aggregate returns a APIKeySelect configured with the given aggregations. // Aggregate returns a ApiKeySelect configured with the given aggregations.
func (_q *APIKeyQuery) Aggregate(fns ...AggregateFunc) *APIKeySelect { func (_q *ApiKeyQuery) Aggregate(fns ...AggregateFunc) *ApiKeySelect {
return _q.Select().Aggregate(fns...) return _q.Select().Aggregate(fns...)
} }
func (_q *APIKeyQuery) prepareQuery(ctx context.Context) error { func (_q *ApiKeyQuery) prepareQuery(ctx context.Context) error {
for _, inter := range _q.inters { for _, inter := range _q.inters {
if inter == nil { if inter == nil {
return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)") return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)")
@@ -439,9 +439,9 @@ func (_q *APIKeyQuery) prepareQuery(ctx context.Context) error {
return nil return nil
} }
func (_q *APIKeyQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*APIKey, error) { func (_q *ApiKeyQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*ApiKey, error) {
var ( var (
nodes = []*APIKey{} nodes = []*ApiKey{}
_spec = _q.querySpec() _spec = _q.querySpec()
loadedTypes = [3]bool{ loadedTypes = [3]bool{
_q.withUser != nil, _q.withUser != nil,
@@ -450,10 +450,10 @@ func (_q *APIKeyQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*APIKe
} }
) )
_spec.ScanValues = func(columns []string) ([]any, error) { _spec.ScanValues = func(columns []string) ([]any, error) {
return (*APIKey).scanValues(nil, columns) return (*ApiKey).scanValues(nil, columns)
} }
_spec.Assign = func(columns []string, values []any) error { _spec.Assign = func(columns []string, values []any) error {
node := &APIKey{config: _q.config} node := &ApiKey{config: _q.config}
nodes = append(nodes, node) nodes = append(nodes, node)
node.Edges.loadedTypes = loadedTypes node.Edges.loadedTypes = loadedTypes
return node.assignValues(columns, values) return node.assignValues(columns, values)
@@ -469,29 +469,29 @@ func (_q *APIKeyQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*APIKe
} }
if query := _q.withUser; query != nil { if query := _q.withUser; query != nil {
if err := _q.loadUser(ctx, query, nodes, nil, if err := _q.loadUser(ctx, query, nodes, nil,
func(n *APIKey, e *User) { n.Edges.User = e }); err != nil { func(n *ApiKey, e *User) { n.Edges.User = e }); err != nil {
return nil, err return nil, err
} }
} }
if query := _q.withGroup; query != nil { if query := _q.withGroup; query != nil {
if err := _q.loadGroup(ctx, query, nodes, nil, if err := _q.loadGroup(ctx, query, nodes, nil,
func(n *APIKey, e *Group) { n.Edges.Group = e }); err != nil { func(n *ApiKey, e *Group) { n.Edges.Group = e }); err != nil {
return nil, err return nil, err
} }
} }
if query := _q.withUsageLogs; query != nil { if query := _q.withUsageLogs; query != nil {
if err := _q.loadUsageLogs(ctx, query, nodes, if err := _q.loadUsageLogs(ctx, query, nodes,
func(n *APIKey) { n.Edges.UsageLogs = []*UsageLog{} }, func(n *ApiKey) { n.Edges.UsageLogs = []*UsageLog{} },
func(n *APIKey, e *UsageLog) { n.Edges.UsageLogs = append(n.Edges.UsageLogs, e) }); err != nil { func(n *ApiKey, e *UsageLog) { n.Edges.UsageLogs = append(n.Edges.UsageLogs, e) }); err != nil {
return nil, err return nil, err
} }
} }
return nodes, nil return nodes, nil
} }
func (_q *APIKeyQuery) loadUser(ctx context.Context, query *UserQuery, nodes []*APIKey, init func(*APIKey), assign func(*APIKey, *User)) error { func (_q *ApiKeyQuery) loadUser(ctx context.Context, query *UserQuery, nodes []*ApiKey, init func(*ApiKey), assign func(*ApiKey, *User)) error {
ids := make([]int64, 0, len(nodes)) ids := make([]int64, 0, len(nodes))
nodeids := make(map[int64][]*APIKey) nodeids := make(map[int64][]*ApiKey)
for i := range nodes { for i := range nodes {
fk := nodes[i].UserID fk := nodes[i].UserID
if _, ok := nodeids[fk]; !ok { if _, ok := nodeids[fk]; !ok {
@@ -518,9 +518,9 @@ func (_q *APIKeyQuery) loadUser(ctx context.Context, query *UserQuery, nodes []*
} }
return nil return nil
} }
func (_q *APIKeyQuery) loadGroup(ctx context.Context, query *GroupQuery, nodes []*APIKey, init func(*APIKey), assign func(*APIKey, *Group)) error { func (_q *ApiKeyQuery) loadGroup(ctx context.Context, query *GroupQuery, nodes []*ApiKey, init func(*ApiKey), assign func(*ApiKey, *Group)) error {
ids := make([]int64, 0, len(nodes)) ids := make([]int64, 0, len(nodes))
nodeids := make(map[int64][]*APIKey) nodeids := make(map[int64][]*ApiKey)
for i := range nodes { for i := range nodes {
if nodes[i].GroupID == nil { if nodes[i].GroupID == nil {
continue continue
@@ -550,9 +550,9 @@ func (_q *APIKeyQuery) loadGroup(ctx context.Context, query *GroupQuery, nodes [
} }
return nil return nil
} }
func (_q *APIKeyQuery) loadUsageLogs(ctx context.Context, query *UsageLogQuery, nodes []*APIKey, init func(*APIKey), assign func(*APIKey, *UsageLog)) error { func (_q *ApiKeyQuery) loadUsageLogs(ctx context.Context, query *UsageLogQuery, nodes []*ApiKey, init func(*ApiKey), assign func(*ApiKey, *UsageLog)) error {
fks := make([]driver.Value, 0, len(nodes)) fks := make([]driver.Value, 0, len(nodes))
nodeids := make(map[int64]*APIKey) nodeids := make(map[int64]*ApiKey)
for i := range nodes { for i := range nodes {
fks = append(fks, nodes[i].ID) fks = append(fks, nodes[i].ID)
nodeids[nodes[i].ID] = nodes[i] nodeids[nodes[i].ID] = nodes[i]
@@ -581,7 +581,7 @@ func (_q *APIKeyQuery) loadUsageLogs(ctx context.Context, query *UsageLogQuery,
return nil return nil
} }
func (_q *APIKeyQuery) sqlCount(ctx context.Context) (int, error) { func (_q *ApiKeyQuery) sqlCount(ctx context.Context) (int, error) {
_spec := _q.querySpec() _spec := _q.querySpec()
_spec.Node.Columns = _q.ctx.Fields _spec.Node.Columns = _q.ctx.Fields
if len(_q.ctx.Fields) > 0 { if len(_q.ctx.Fields) > 0 {
@@ -590,7 +590,7 @@ func (_q *APIKeyQuery) sqlCount(ctx context.Context) (int, error) {
return sqlgraph.CountNodes(ctx, _q.driver, _spec) return sqlgraph.CountNodes(ctx, _q.driver, _spec)
} }
func (_q *APIKeyQuery) querySpec() *sqlgraph.QuerySpec { func (_q *ApiKeyQuery) querySpec() *sqlgraph.QuerySpec {
_spec := sqlgraph.NewQuerySpec(apikey.Table, apikey.Columns, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) _spec := sqlgraph.NewQuerySpec(apikey.Table, apikey.Columns, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64))
_spec.From = _q.sql _spec.From = _q.sql
if unique := _q.ctx.Unique; unique != nil { if unique := _q.ctx.Unique; unique != nil {
@@ -636,7 +636,7 @@ func (_q *APIKeyQuery) querySpec() *sqlgraph.QuerySpec {
return _spec return _spec
} }
func (_q *APIKeyQuery) sqlQuery(ctx context.Context) *sql.Selector { func (_q *ApiKeyQuery) sqlQuery(ctx context.Context) *sql.Selector {
builder := sql.Dialect(_q.driver.Dialect()) builder := sql.Dialect(_q.driver.Dialect())
t1 := builder.Table(apikey.Table) t1 := builder.Table(apikey.Table)
columns := _q.ctx.Fields columns := _q.ctx.Fields
@@ -668,28 +668,28 @@ func (_q *APIKeyQuery) sqlQuery(ctx context.Context) *sql.Selector {
return selector return selector
} }
// APIKeyGroupBy is the group-by builder for APIKey entities. // ApiKeyGroupBy is the group-by builder for ApiKey entities.
type APIKeyGroupBy struct { type ApiKeyGroupBy struct {
selector selector
build *APIKeyQuery build *ApiKeyQuery
} }
// Aggregate adds the given aggregation functions to the group-by query. // Aggregate adds the given aggregation functions to the group-by query.
func (_g *APIKeyGroupBy) Aggregate(fns ...AggregateFunc) *APIKeyGroupBy { func (_g *ApiKeyGroupBy) Aggregate(fns ...AggregateFunc) *ApiKeyGroupBy {
_g.fns = append(_g.fns, fns...) _g.fns = append(_g.fns, fns...)
return _g return _g
} }
// Scan applies the selector query and scans the result into the given value. // Scan applies the selector query and scans the result into the given value.
func (_g *APIKeyGroupBy) Scan(ctx context.Context, v any) error { func (_g *ApiKeyGroupBy) Scan(ctx context.Context, v any) error {
ctx = setContextOp(ctx, _g.build.ctx, ent.OpQueryGroupBy) ctx = setContextOp(ctx, _g.build.ctx, ent.OpQueryGroupBy)
if err := _g.build.prepareQuery(ctx); err != nil { if err := _g.build.prepareQuery(ctx); err != nil {
return err return err
} }
return scanWithInterceptors[*APIKeyQuery, *APIKeyGroupBy](ctx, _g.build, _g, _g.build.inters, v) return scanWithInterceptors[*ApiKeyQuery, *ApiKeyGroupBy](ctx, _g.build, _g, _g.build.inters, v)
} }
func (_g *APIKeyGroupBy) sqlScan(ctx context.Context, root *APIKeyQuery, v any) error { func (_g *ApiKeyGroupBy) sqlScan(ctx context.Context, root *ApiKeyQuery, v any) error {
selector := root.sqlQuery(ctx).Select() selector := root.sqlQuery(ctx).Select()
aggregation := make([]string, 0, len(_g.fns)) aggregation := make([]string, 0, len(_g.fns))
for _, fn := range _g.fns { for _, fn := range _g.fns {
@@ -716,28 +716,28 @@ func (_g *APIKeyGroupBy) sqlScan(ctx context.Context, root *APIKeyQuery, v any)
return sql.ScanSlice(rows, v) return sql.ScanSlice(rows, v)
} }
// APIKeySelect is the builder for selecting fields of APIKey entities. // ApiKeySelect is the builder for selecting fields of ApiKey entities.
type APIKeySelect struct { type ApiKeySelect struct {
*APIKeyQuery *ApiKeyQuery
selector selector
} }
// Aggregate adds the given aggregation functions to the selector query. // Aggregate adds the given aggregation functions to the selector query.
func (_s *APIKeySelect) Aggregate(fns ...AggregateFunc) *APIKeySelect { func (_s *ApiKeySelect) Aggregate(fns ...AggregateFunc) *ApiKeySelect {
_s.fns = append(_s.fns, fns...) _s.fns = append(_s.fns, fns...)
return _s return _s
} }
// Scan applies the selector query and scans the result into the given value. // Scan applies the selector query and scans the result into the given value.
func (_s *APIKeySelect) Scan(ctx context.Context, v any) error { func (_s *ApiKeySelect) Scan(ctx context.Context, v any) error {
ctx = setContextOp(ctx, _s.ctx, ent.OpQuerySelect) ctx = setContextOp(ctx, _s.ctx, ent.OpQuerySelect)
if err := _s.prepareQuery(ctx); err != nil { if err := _s.prepareQuery(ctx); err != nil {
return err return err
} }
return scanWithInterceptors[*APIKeyQuery, *APIKeySelect](ctx, _s.APIKeyQuery, _s, _s.inters, v) return scanWithInterceptors[*ApiKeyQuery, *ApiKeySelect](ctx, _s.ApiKeyQuery, _s, _s.inters, v)
} }
func (_s *APIKeySelect) sqlScan(ctx context.Context, root *APIKeyQuery, v any) error { func (_s *ApiKeySelect) sqlScan(ctx context.Context, root *ApiKeyQuery, v any) error {
selector := root.sqlQuery(ctx) selector := root.sqlQuery(ctx)
aggregation := make([]string, 0, len(_s.fns)) aggregation := make([]string, 0, len(_s.fns))
for _, fn := range _s.fns { for _, fn := range _s.fns {

View File

@@ -18,33 +18,33 @@ import (
"github.com/Wei-Shaw/sub2api/ent/user" "github.com/Wei-Shaw/sub2api/ent/user"
) )
// APIKeyUpdate is the builder for updating APIKey entities. // ApiKeyUpdate is the builder for updating ApiKey entities.
type APIKeyUpdate struct { type ApiKeyUpdate struct {
config config
hooks []Hook hooks []Hook
mutation *APIKeyMutation mutation *ApiKeyMutation
} }
// Where appends a list predicates to the APIKeyUpdate builder. // Where appends a list predicates to the ApiKeyUpdate builder.
func (_u *APIKeyUpdate) Where(ps ...predicate.APIKey) *APIKeyUpdate { func (_u *ApiKeyUpdate) Where(ps ...predicate.ApiKey) *ApiKeyUpdate {
_u.mutation.Where(ps...) _u.mutation.Where(ps...)
return _u return _u
} }
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (_u *APIKeyUpdate) SetUpdatedAt(v time.Time) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetUpdatedAt(v time.Time) *ApiKeyUpdate {
_u.mutation.SetUpdatedAt(v) _u.mutation.SetUpdatedAt(v)
return _u return _u
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (_u *APIKeyUpdate) SetDeletedAt(v time.Time) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetDeletedAt(v time.Time) *ApiKeyUpdate {
_u.mutation.SetDeletedAt(v) _u.mutation.SetDeletedAt(v)
return _u return _u
} }
// SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil. // SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableDeletedAt(v *time.Time) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableDeletedAt(v *time.Time) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetDeletedAt(*v) _u.SetDeletedAt(*v)
} }
@@ -52,19 +52,19 @@ func (_u *APIKeyUpdate) SetNillableDeletedAt(v *time.Time) *APIKeyUpdate {
} }
// ClearDeletedAt clears the value of the "deleted_at" field. // ClearDeletedAt clears the value of the "deleted_at" field.
func (_u *APIKeyUpdate) ClearDeletedAt() *APIKeyUpdate { func (_u *ApiKeyUpdate) ClearDeletedAt() *ApiKeyUpdate {
_u.mutation.ClearDeletedAt() _u.mutation.ClearDeletedAt()
return _u return _u
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (_u *APIKeyUpdate) SetUserID(v int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetUserID(v int64) *ApiKeyUpdate {
_u.mutation.SetUserID(v) _u.mutation.SetUserID(v)
return _u return _u
} }
// SetNillableUserID sets the "user_id" field if the given value is not nil. // SetNillableUserID sets the "user_id" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableUserID(v *int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableUserID(v *int64) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetUserID(*v) _u.SetUserID(*v)
} }
@@ -72,13 +72,13 @@ func (_u *APIKeyUpdate) SetNillableUserID(v *int64) *APIKeyUpdate {
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (_u *APIKeyUpdate) SetKey(v string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetKey(v string) *ApiKeyUpdate {
_u.mutation.SetKey(v) _u.mutation.SetKey(v)
return _u return _u
} }
// SetNillableKey sets the "key" field if the given value is not nil. // SetNillableKey sets the "key" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableKey(v *string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableKey(v *string) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetKey(*v) _u.SetKey(*v)
} }
@@ -86,13 +86,13 @@ func (_u *APIKeyUpdate) SetNillableKey(v *string) *APIKeyUpdate {
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (_u *APIKeyUpdate) SetName(v string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetName(v string) *ApiKeyUpdate {
_u.mutation.SetName(v) _u.mutation.SetName(v)
return _u return _u
} }
// SetNillableName sets the "name" field if the given value is not nil. // SetNillableName sets the "name" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableName(v *string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableName(v *string) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetName(*v) _u.SetName(*v)
} }
@@ -100,13 +100,13 @@ func (_u *APIKeyUpdate) SetNillableName(v *string) *APIKeyUpdate {
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (_u *APIKeyUpdate) SetGroupID(v int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetGroupID(v int64) *ApiKeyUpdate {
_u.mutation.SetGroupID(v) _u.mutation.SetGroupID(v)
return _u return _u
} }
// SetNillableGroupID sets the "group_id" field if the given value is not nil. // SetNillableGroupID sets the "group_id" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableGroupID(v *int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableGroupID(v *int64) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetGroupID(*v) _u.SetGroupID(*v)
} }
@@ -114,19 +114,19 @@ func (_u *APIKeyUpdate) SetNillableGroupID(v *int64) *APIKeyUpdate {
} }
// ClearGroupID clears the value of the "group_id" field. // ClearGroupID clears the value of the "group_id" field.
func (_u *APIKeyUpdate) ClearGroupID() *APIKeyUpdate { func (_u *ApiKeyUpdate) ClearGroupID() *ApiKeyUpdate {
_u.mutation.ClearGroupID() _u.mutation.ClearGroupID()
return _u return _u
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (_u *APIKeyUpdate) SetStatus(v string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetStatus(v string) *ApiKeyUpdate {
_u.mutation.SetStatus(v) _u.mutation.SetStatus(v)
return _u return _u
} }
// SetNillableStatus sets the "status" field if the given value is not nil. // SetNillableStatus sets the "status" field if the given value is not nil.
func (_u *APIKeyUpdate) SetNillableStatus(v *string) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetNillableStatus(v *string) *ApiKeyUpdate {
if v != nil { if v != nil {
_u.SetStatus(*v) _u.SetStatus(*v)
} }
@@ -134,23 +134,23 @@ func (_u *APIKeyUpdate) SetNillableStatus(v *string) *APIKeyUpdate {
} }
// SetUser sets the "user" edge to the User entity. // SetUser sets the "user" edge to the User entity.
func (_u *APIKeyUpdate) SetUser(v *User) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetUser(v *User) *ApiKeyUpdate {
return _u.SetUserID(v.ID) return _u.SetUserID(v.ID)
} }
// SetGroup sets the "group" edge to the Group entity. // SetGroup sets the "group" edge to the Group entity.
func (_u *APIKeyUpdate) SetGroup(v *Group) *APIKeyUpdate { func (_u *ApiKeyUpdate) SetGroup(v *Group) *ApiKeyUpdate {
return _u.SetGroupID(v.ID) return _u.SetGroupID(v.ID)
} }
// AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs. // AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs.
func (_u *APIKeyUpdate) AddUsageLogIDs(ids ...int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) AddUsageLogIDs(ids ...int64) *ApiKeyUpdate {
_u.mutation.AddUsageLogIDs(ids...) _u.mutation.AddUsageLogIDs(ids...)
return _u return _u
} }
// AddUsageLogs adds the "usage_logs" edges to the UsageLog entity. // AddUsageLogs adds the "usage_logs" edges to the UsageLog entity.
func (_u *APIKeyUpdate) AddUsageLogs(v ...*UsageLog) *APIKeyUpdate { func (_u *ApiKeyUpdate) AddUsageLogs(v ...*UsageLog) *ApiKeyUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -158,37 +158,37 @@ func (_u *APIKeyUpdate) AddUsageLogs(v ...*UsageLog) *APIKeyUpdate {
return _u.AddUsageLogIDs(ids...) return _u.AddUsageLogIDs(ids...)
} }
// Mutation returns the APIKeyMutation object of the builder. // Mutation returns the ApiKeyMutation object of the builder.
func (_u *APIKeyUpdate) Mutation() *APIKeyMutation { func (_u *ApiKeyUpdate) Mutation() *ApiKeyMutation {
return _u.mutation return _u.mutation
} }
// ClearUser clears the "user" edge to the User entity. // ClearUser clears the "user" edge to the User entity.
func (_u *APIKeyUpdate) ClearUser() *APIKeyUpdate { func (_u *ApiKeyUpdate) ClearUser() *ApiKeyUpdate {
_u.mutation.ClearUser() _u.mutation.ClearUser()
return _u return _u
} }
// ClearGroup clears the "group" edge to the Group entity. // ClearGroup clears the "group" edge to the Group entity.
func (_u *APIKeyUpdate) ClearGroup() *APIKeyUpdate { func (_u *ApiKeyUpdate) ClearGroup() *ApiKeyUpdate {
_u.mutation.ClearGroup() _u.mutation.ClearGroup()
return _u return _u
} }
// ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity. // ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity.
func (_u *APIKeyUpdate) ClearUsageLogs() *APIKeyUpdate { func (_u *ApiKeyUpdate) ClearUsageLogs() *ApiKeyUpdate {
_u.mutation.ClearUsageLogs() _u.mutation.ClearUsageLogs()
return _u return _u
} }
// RemoveUsageLogIDs removes the "usage_logs" edge to UsageLog entities by IDs. // RemoveUsageLogIDs removes the "usage_logs" edge to UsageLog entities by IDs.
func (_u *APIKeyUpdate) RemoveUsageLogIDs(ids ...int64) *APIKeyUpdate { func (_u *ApiKeyUpdate) RemoveUsageLogIDs(ids ...int64) *ApiKeyUpdate {
_u.mutation.RemoveUsageLogIDs(ids...) _u.mutation.RemoveUsageLogIDs(ids...)
return _u return _u
} }
// RemoveUsageLogs removes "usage_logs" edges to UsageLog entities. // RemoveUsageLogs removes "usage_logs" edges to UsageLog entities.
func (_u *APIKeyUpdate) RemoveUsageLogs(v ...*UsageLog) *APIKeyUpdate { func (_u *ApiKeyUpdate) RemoveUsageLogs(v ...*UsageLog) *ApiKeyUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -197,7 +197,7 @@ func (_u *APIKeyUpdate) RemoveUsageLogs(v ...*UsageLog) *APIKeyUpdate {
} }
// Save executes the query and returns the number of nodes affected by the update operation. // Save executes the query and returns the number of nodes affected by the update operation.
func (_u *APIKeyUpdate) Save(ctx context.Context) (int, error) { func (_u *ApiKeyUpdate) Save(ctx context.Context) (int, error) {
if err := _u.defaults(); err != nil { if err := _u.defaults(); err != nil {
return 0, err return 0, err
} }
@@ -205,7 +205,7 @@ func (_u *APIKeyUpdate) Save(ctx context.Context) (int, error) {
} }
// SaveX is like Save, but panics if an error occurs. // SaveX is like Save, but panics if an error occurs.
func (_u *APIKeyUpdate) SaveX(ctx context.Context) int { func (_u *ApiKeyUpdate) SaveX(ctx context.Context) int {
affected, err := _u.Save(ctx) affected, err := _u.Save(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -214,20 +214,20 @@ func (_u *APIKeyUpdate) SaveX(ctx context.Context) int {
} }
// Exec executes the query. // Exec executes the query.
func (_u *APIKeyUpdate) Exec(ctx context.Context) error { func (_u *ApiKeyUpdate) Exec(ctx context.Context) error {
_, err := _u.Save(ctx) _, err := _u.Save(ctx)
return err return err
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_u *APIKeyUpdate) ExecX(ctx context.Context) { func (_u *ApiKeyUpdate) ExecX(ctx context.Context) {
if err := _u.Exec(ctx); err != nil { if err := _u.Exec(ctx); err != nil {
panic(err) panic(err)
} }
} }
// defaults sets the default values of the builder before save. // defaults sets the default values of the builder before save.
func (_u *APIKeyUpdate) defaults() error { func (_u *ApiKeyUpdate) defaults() error {
if _, ok := _u.mutation.UpdatedAt(); !ok { if _, ok := _u.mutation.UpdatedAt(); !ok {
if apikey.UpdateDefaultUpdatedAt == nil { if apikey.UpdateDefaultUpdatedAt == nil {
return fmt.Errorf("ent: uninitialized apikey.UpdateDefaultUpdatedAt (forgotten import ent/runtime?)") return fmt.Errorf("ent: uninitialized apikey.UpdateDefaultUpdatedAt (forgotten import ent/runtime?)")
@@ -239,29 +239,29 @@ func (_u *APIKeyUpdate) defaults() error {
} }
// check runs all checks and user-defined validators on the builder. // check runs all checks and user-defined validators on the builder.
func (_u *APIKeyUpdate) check() error { func (_u *ApiKeyUpdate) check() error {
if v, ok := _u.mutation.Key(); ok { if v, ok := _u.mutation.Key(); ok {
if err := apikey.KeyValidator(v); err != nil { if err := apikey.KeyValidator(v); err != nil {
return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "APIKey.key": %w`, err)} return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "ApiKey.key": %w`, err)}
} }
} }
if v, ok := _u.mutation.Name(); ok { if v, ok := _u.mutation.Name(); ok {
if err := apikey.NameValidator(v); err != nil { if err := apikey.NameValidator(v); err != nil {
return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "APIKey.name": %w`, err)} return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ApiKey.name": %w`, err)}
} }
} }
if v, ok := _u.mutation.Status(); ok { if v, ok := _u.mutation.Status(); ok {
if err := apikey.StatusValidator(v); err != nil { if err := apikey.StatusValidator(v); err != nil {
return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "APIKey.status": %w`, err)} return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "ApiKey.status": %w`, err)}
} }
} }
if _u.mutation.UserCleared() && len(_u.mutation.UserIDs()) > 0 { if _u.mutation.UserCleared() && len(_u.mutation.UserIDs()) > 0 {
return errors.New(`ent: clearing a required unique edge "APIKey.user"`) return errors.New(`ent: clearing a required unique edge "ApiKey.user"`)
} }
return nil return nil
} }
func (_u *APIKeyUpdate) sqlSave(ctx context.Context) (_node int, err error) { func (_u *ApiKeyUpdate) sqlSave(ctx context.Context) (_node int, err error) {
if err := _u.check(); err != nil { if err := _u.check(); err != nil {
return _node, err return _node, err
} }
@@ -406,28 +406,28 @@ func (_u *APIKeyUpdate) sqlSave(ctx context.Context) (_node int, err error) {
return _node, nil return _node, nil
} }
// APIKeyUpdateOne is the builder for updating a single APIKey entity. // ApiKeyUpdateOne is the builder for updating a single ApiKey entity.
type APIKeyUpdateOne struct { type ApiKeyUpdateOne struct {
config config
fields []string fields []string
hooks []Hook hooks []Hook
mutation *APIKeyMutation mutation *ApiKeyMutation
} }
// SetUpdatedAt sets the "updated_at" field. // SetUpdatedAt sets the "updated_at" field.
func (_u *APIKeyUpdateOne) SetUpdatedAt(v time.Time) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetUpdatedAt(v time.Time) *ApiKeyUpdateOne {
_u.mutation.SetUpdatedAt(v) _u.mutation.SetUpdatedAt(v)
return _u return _u
} }
// SetDeletedAt sets the "deleted_at" field. // SetDeletedAt sets the "deleted_at" field.
func (_u *APIKeyUpdateOne) SetDeletedAt(v time.Time) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetDeletedAt(v time.Time) *ApiKeyUpdateOne {
_u.mutation.SetDeletedAt(v) _u.mutation.SetDeletedAt(v)
return _u return _u
} }
// SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil. // SetNillableDeletedAt sets the "deleted_at" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableDeletedAt(v *time.Time) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableDeletedAt(v *time.Time) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetDeletedAt(*v) _u.SetDeletedAt(*v)
} }
@@ -435,19 +435,19 @@ func (_u *APIKeyUpdateOne) SetNillableDeletedAt(v *time.Time) *APIKeyUpdateOne {
} }
// ClearDeletedAt clears the value of the "deleted_at" field. // ClearDeletedAt clears the value of the "deleted_at" field.
func (_u *APIKeyUpdateOne) ClearDeletedAt() *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) ClearDeletedAt() *ApiKeyUpdateOne {
_u.mutation.ClearDeletedAt() _u.mutation.ClearDeletedAt()
return _u return _u
} }
// SetUserID sets the "user_id" field. // SetUserID sets the "user_id" field.
func (_u *APIKeyUpdateOne) SetUserID(v int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetUserID(v int64) *ApiKeyUpdateOne {
_u.mutation.SetUserID(v) _u.mutation.SetUserID(v)
return _u return _u
} }
// SetNillableUserID sets the "user_id" field if the given value is not nil. // SetNillableUserID sets the "user_id" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableUserID(v *int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableUserID(v *int64) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetUserID(*v) _u.SetUserID(*v)
} }
@@ -455,13 +455,13 @@ func (_u *APIKeyUpdateOne) SetNillableUserID(v *int64) *APIKeyUpdateOne {
} }
// SetKey sets the "key" field. // SetKey sets the "key" field.
func (_u *APIKeyUpdateOne) SetKey(v string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetKey(v string) *ApiKeyUpdateOne {
_u.mutation.SetKey(v) _u.mutation.SetKey(v)
return _u return _u
} }
// SetNillableKey sets the "key" field if the given value is not nil. // SetNillableKey sets the "key" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableKey(v *string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableKey(v *string) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetKey(*v) _u.SetKey(*v)
} }
@@ -469,13 +469,13 @@ func (_u *APIKeyUpdateOne) SetNillableKey(v *string) *APIKeyUpdateOne {
} }
// SetName sets the "name" field. // SetName sets the "name" field.
func (_u *APIKeyUpdateOne) SetName(v string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetName(v string) *ApiKeyUpdateOne {
_u.mutation.SetName(v) _u.mutation.SetName(v)
return _u return _u
} }
// SetNillableName sets the "name" field if the given value is not nil. // SetNillableName sets the "name" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableName(v *string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableName(v *string) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetName(*v) _u.SetName(*v)
} }
@@ -483,13 +483,13 @@ func (_u *APIKeyUpdateOne) SetNillableName(v *string) *APIKeyUpdateOne {
} }
// SetGroupID sets the "group_id" field. // SetGroupID sets the "group_id" field.
func (_u *APIKeyUpdateOne) SetGroupID(v int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetGroupID(v int64) *ApiKeyUpdateOne {
_u.mutation.SetGroupID(v) _u.mutation.SetGroupID(v)
return _u return _u
} }
// SetNillableGroupID sets the "group_id" field if the given value is not nil. // SetNillableGroupID sets the "group_id" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableGroupID(v *int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableGroupID(v *int64) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetGroupID(*v) _u.SetGroupID(*v)
} }
@@ -497,19 +497,19 @@ func (_u *APIKeyUpdateOne) SetNillableGroupID(v *int64) *APIKeyUpdateOne {
} }
// ClearGroupID clears the value of the "group_id" field. // ClearGroupID clears the value of the "group_id" field.
func (_u *APIKeyUpdateOne) ClearGroupID() *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) ClearGroupID() *ApiKeyUpdateOne {
_u.mutation.ClearGroupID() _u.mutation.ClearGroupID()
return _u return _u
} }
// SetStatus sets the "status" field. // SetStatus sets the "status" field.
func (_u *APIKeyUpdateOne) SetStatus(v string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetStatus(v string) *ApiKeyUpdateOne {
_u.mutation.SetStatus(v) _u.mutation.SetStatus(v)
return _u return _u
} }
// SetNillableStatus sets the "status" field if the given value is not nil. // SetNillableStatus sets the "status" field if the given value is not nil.
func (_u *APIKeyUpdateOne) SetNillableStatus(v *string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetNillableStatus(v *string) *ApiKeyUpdateOne {
if v != nil { if v != nil {
_u.SetStatus(*v) _u.SetStatus(*v)
} }
@@ -517,23 +517,23 @@ func (_u *APIKeyUpdateOne) SetNillableStatus(v *string) *APIKeyUpdateOne {
} }
// SetUser sets the "user" edge to the User entity. // SetUser sets the "user" edge to the User entity.
func (_u *APIKeyUpdateOne) SetUser(v *User) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetUser(v *User) *ApiKeyUpdateOne {
return _u.SetUserID(v.ID) return _u.SetUserID(v.ID)
} }
// SetGroup sets the "group" edge to the Group entity. // SetGroup sets the "group" edge to the Group entity.
func (_u *APIKeyUpdateOne) SetGroup(v *Group) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) SetGroup(v *Group) *ApiKeyUpdateOne {
return _u.SetGroupID(v.ID) return _u.SetGroupID(v.ID)
} }
// AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs. // AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by IDs.
func (_u *APIKeyUpdateOne) AddUsageLogIDs(ids ...int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) AddUsageLogIDs(ids ...int64) *ApiKeyUpdateOne {
_u.mutation.AddUsageLogIDs(ids...) _u.mutation.AddUsageLogIDs(ids...)
return _u return _u
} }
// AddUsageLogs adds the "usage_logs" edges to the UsageLog entity. // AddUsageLogs adds the "usage_logs" edges to the UsageLog entity.
func (_u *APIKeyUpdateOne) AddUsageLogs(v ...*UsageLog) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) AddUsageLogs(v ...*UsageLog) *ApiKeyUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -541,37 +541,37 @@ func (_u *APIKeyUpdateOne) AddUsageLogs(v ...*UsageLog) *APIKeyUpdateOne {
return _u.AddUsageLogIDs(ids...) return _u.AddUsageLogIDs(ids...)
} }
// Mutation returns the APIKeyMutation object of the builder. // Mutation returns the ApiKeyMutation object of the builder.
func (_u *APIKeyUpdateOne) Mutation() *APIKeyMutation { func (_u *ApiKeyUpdateOne) Mutation() *ApiKeyMutation {
return _u.mutation return _u.mutation
} }
// ClearUser clears the "user" edge to the User entity. // ClearUser clears the "user" edge to the User entity.
func (_u *APIKeyUpdateOne) ClearUser() *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) ClearUser() *ApiKeyUpdateOne {
_u.mutation.ClearUser() _u.mutation.ClearUser()
return _u return _u
} }
// ClearGroup clears the "group" edge to the Group entity. // ClearGroup clears the "group" edge to the Group entity.
func (_u *APIKeyUpdateOne) ClearGroup() *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) ClearGroup() *ApiKeyUpdateOne {
_u.mutation.ClearGroup() _u.mutation.ClearGroup()
return _u return _u
} }
// ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity. // ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity.
func (_u *APIKeyUpdateOne) ClearUsageLogs() *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) ClearUsageLogs() *ApiKeyUpdateOne {
_u.mutation.ClearUsageLogs() _u.mutation.ClearUsageLogs()
return _u return _u
} }
// RemoveUsageLogIDs removes the "usage_logs" edge to UsageLog entities by IDs. // RemoveUsageLogIDs removes the "usage_logs" edge to UsageLog entities by IDs.
func (_u *APIKeyUpdateOne) RemoveUsageLogIDs(ids ...int64) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) RemoveUsageLogIDs(ids ...int64) *ApiKeyUpdateOne {
_u.mutation.RemoveUsageLogIDs(ids...) _u.mutation.RemoveUsageLogIDs(ids...)
return _u return _u
} }
// RemoveUsageLogs removes "usage_logs" edges to UsageLog entities. // RemoveUsageLogs removes "usage_logs" edges to UsageLog entities.
func (_u *APIKeyUpdateOne) RemoveUsageLogs(v ...*UsageLog) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) RemoveUsageLogs(v ...*UsageLog) *ApiKeyUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -579,21 +579,21 @@ func (_u *APIKeyUpdateOne) RemoveUsageLogs(v ...*UsageLog) *APIKeyUpdateOne {
return _u.RemoveUsageLogIDs(ids...) return _u.RemoveUsageLogIDs(ids...)
} }
// Where appends a list predicates to the APIKeyUpdate builder. // Where appends a list predicates to the ApiKeyUpdate builder.
func (_u *APIKeyUpdateOne) Where(ps ...predicate.APIKey) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) Where(ps ...predicate.ApiKey) *ApiKeyUpdateOne {
_u.mutation.Where(ps...) _u.mutation.Where(ps...)
return _u return _u
} }
// Select allows selecting one or more fields (columns) of the returned entity. // Select allows selecting one or more fields (columns) of the returned entity.
// The default is selecting all fields defined in the entity schema. // The default is selecting all fields defined in the entity schema.
func (_u *APIKeyUpdateOne) Select(field string, fields ...string) *APIKeyUpdateOne { func (_u *ApiKeyUpdateOne) Select(field string, fields ...string) *ApiKeyUpdateOne {
_u.fields = append([]string{field}, fields...) _u.fields = append([]string{field}, fields...)
return _u return _u
} }
// Save executes the query and returns the updated APIKey entity. // Save executes the query and returns the updated ApiKey entity.
func (_u *APIKeyUpdateOne) Save(ctx context.Context) (*APIKey, error) { func (_u *ApiKeyUpdateOne) Save(ctx context.Context) (*ApiKey, error) {
if err := _u.defaults(); err != nil { if err := _u.defaults(); err != nil {
return nil, err return nil, err
} }
@@ -601,7 +601,7 @@ func (_u *APIKeyUpdateOne) Save(ctx context.Context) (*APIKey, error) {
} }
// SaveX is like Save, but panics if an error occurs. // SaveX is like Save, but panics if an error occurs.
func (_u *APIKeyUpdateOne) SaveX(ctx context.Context) *APIKey { func (_u *ApiKeyUpdateOne) SaveX(ctx context.Context) *ApiKey {
node, err := _u.Save(ctx) node, err := _u.Save(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -610,20 +610,20 @@ func (_u *APIKeyUpdateOne) SaveX(ctx context.Context) *APIKey {
} }
// Exec executes the query on the entity. // Exec executes the query on the entity.
func (_u *APIKeyUpdateOne) Exec(ctx context.Context) error { func (_u *ApiKeyUpdateOne) Exec(ctx context.Context) error {
_, err := _u.Save(ctx) _, err := _u.Save(ctx)
return err return err
} }
// ExecX is like Exec, but panics if an error occurs. // ExecX is like Exec, but panics if an error occurs.
func (_u *APIKeyUpdateOne) ExecX(ctx context.Context) { func (_u *ApiKeyUpdateOne) ExecX(ctx context.Context) {
if err := _u.Exec(ctx); err != nil { if err := _u.Exec(ctx); err != nil {
panic(err) panic(err)
} }
} }
// defaults sets the default values of the builder before save. // defaults sets the default values of the builder before save.
func (_u *APIKeyUpdateOne) defaults() error { func (_u *ApiKeyUpdateOne) defaults() error {
if _, ok := _u.mutation.UpdatedAt(); !ok { if _, ok := _u.mutation.UpdatedAt(); !ok {
if apikey.UpdateDefaultUpdatedAt == nil { if apikey.UpdateDefaultUpdatedAt == nil {
return fmt.Errorf("ent: uninitialized apikey.UpdateDefaultUpdatedAt (forgotten import ent/runtime?)") return fmt.Errorf("ent: uninitialized apikey.UpdateDefaultUpdatedAt (forgotten import ent/runtime?)")
@@ -635,36 +635,36 @@ func (_u *APIKeyUpdateOne) defaults() error {
} }
// check runs all checks and user-defined validators on the builder. // check runs all checks and user-defined validators on the builder.
func (_u *APIKeyUpdateOne) check() error { func (_u *ApiKeyUpdateOne) check() error {
if v, ok := _u.mutation.Key(); ok { if v, ok := _u.mutation.Key(); ok {
if err := apikey.KeyValidator(v); err != nil { if err := apikey.KeyValidator(v); err != nil {
return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "APIKey.key": %w`, err)} return &ValidationError{Name: "key", err: fmt.Errorf(`ent: validator failed for field "ApiKey.key": %w`, err)}
} }
} }
if v, ok := _u.mutation.Name(); ok { if v, ok := _u.mutation.Name(); ok {
if err := apikey.NameValidator(v); err != nil { if err := apikey.NameValidator(v); err != nil {
return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "APIKey.name": %w`, err)} return &ValidationError{Name: "name", err: fmt.Errorf(`ent: validator failed for field "ApiKey.name": %w`, err)}
} }
} }
if v, ok := _u.mutation.Status(); ok { if v, ok := _u.mutation.Status(); ok {
if err := apikey.StatusValidator(v); err != nil { if err := apikey.StatusValidator(v); err != nil {
return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "APIKey.status": %w`, err)} return &ValidationError{Name: "status", err: fmt.Errorf(`ent: validator failed for field "ApiKey.status": %w`, err)}
} }
} }
if _u.mutation.UserCleared() && len(_u.mutation.UserIDs()) > 0 { if _u.mutation.UserCleared() && len(_u.mutation.UserIDs()) > 0 {
return errors.New(`ent: clearing a required unique edge "APIKey.user"`) return errors.New(`ent: clearing a required unique edge "ApiKey.user"`)
} }
return nil return nil
} }
func (_u *APIKeyUpdateOne) sqlSave(ctx context.Context) (_node *APIKey, err error) { func (_u *ApiKeyUpdateOne) sqlSave(ctx context.Context) (_node *ApiKey, err error) {
if err := _u.check(); err != nil { if err := _u.check(); err != nil {
return _node, err return _node, err
} }
_spec := sqlgraph.NewUpdateSpec(apikey.Table, apikey.Columns, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) _spec := sqlgraph.NewUpdateSpec(apikey.Table, apikey.Columns, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64))
id, ok := _u.mutation.ID() id, ok := _u.mutation.ID()
if !ok { if !ok {
return nil, &ValidationError{Name: "id", err: errors.New(`ent: missing "APIKey.id" for update`)} return nil, &ValidationError{Name: "id", err: errors.New(`ent: missing "ApiKey.id" for update`)}
} }
_spec.Node.ID.Value = id _spec.Node.ID.Value = id
if fields := _u.fields; len(fields) > 0 { if fields := _u.fields; len(fields) > 0 {
@@ -807,7 +807,7 @@ func (_u *APIKeyUpdateOne) sqlSave(ctx context.Context) (_node *APIKey, err erro
} }
_spec.Edges.Add = append(_spec.Edges.Add, edge) _spec.Edges.Add = append(_spec.Edges.Add, edge)
} }
_node = &APIKey{config: _u.config} _node = &ApiKey{config: _u.config}
_spec.Assign = _node.assignValues _spec.Assign = _node.assignValues
_spec.ScanValues = _node.scanValues _spec.ScanValues = _node.scanValues
if err = sqlgraph.UpdateNode(ctx, _u.driver, _spec); err != nil { if err = sqlgraph.UpdateNode(ctx, _u.driver, _spec); err != nil {

View File

@@ -37,12 +37,12 @@ type Client struct {
config config
// Schema is the client for creating, migrating and dropping schema. // Schema is the client for creating, migrating and dropping schema.
Schema *migrate.Schema Schema *migrate.Schema
// APIKey is the client for interacting with the APIKey builders.
APIKey *APIKeyClient
// Account is the client for interacting with the Account builders. // Account is the client for interacting with the Account builders.
Account *AccountClient Account *AccountClient
// AccountGroup is the client for interacting with the AccountGroup builders. // AccountGroup is the client for interacting with the AccountGroup builders.
AccountGroup *AccountGroupClient AccountGroup *AccountGroupClient
// ApiKey is the client for interacting with the ApiKey builders.
ApiKey *ApiKeyClient
// Group is the client for interacting with the Group builders. // Group is the client for interacting with the Group builders.
Group *GroupClient Group *GroupClient
// Proxy is the client for interacting with the Proxy builders. // Proxy is the client for interacting with the Proxy builders.
@@ -74,9 +74,9 @@ func NewClient(opts ...Option) *Client {
func (c *Client) init() { func (c *Client) init() {
c.Schema = migrate.NewSchema(c.driver) c.Schema = migrate.NewSchema(c.driver)
c.APIKey = NewAPIKeyClient(c.config)
c.Account = NewAccountClient(c.config) c.Account = NewAccountClient(c.config)
c.AccountGroup = NewAccountGroupClient(c.config) c.AccountGroup = NewAccountGroupClient(c.config)
c.ApiKey = NewApiKeyClient(c.config)
c.Group = NewGroupClient(c.config) c.Group = NewGroupClient(c.config)
c.Proxy = NewProxyClient(c.config) c.Proxy = NewProxyClient(c.config)
c.RedeemCode = NewRedeemCodeClient(c.config) c.RedeemCode = NewRedeemCodeClient(c.config)
@@ -179,9 +179,9 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) {
return &Tx{ return &Tx{
ctx: ctx, ctx: ctx,
config: cfg, config: cfg,
APIKey: NewAPIKeyClient(cfg),
Account: NewAccountClient(cfg), Account: NewAccountClient(cfg),
AccountGroup: NewAccountGroupClient(cfg), AccountGroup: NewAccountGroupClient(cfg),
ApiKey: NewApiKeyClient(cfg),
Group: NewGroupClient(cfg), Group: NewGroupClient(cfg),
Proxy: NewProxyClient(cfg), Proxy: NewProxyClient(cfg),
RedeemCode: NewRedeemCodeClient(cfg), RedeemCode: NewRedeemCodeClient(cfg),
@@ -211,9 +211,9 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
return &Tx{ return &Tx{
ctx: ctx, ctx: ctx,
config: cfg, config: cfg,
APIKey: NewAPIKeyClient(cfg),
Account: NewAccountClient(cfg), Account: NewAccountClient(cfg),
AccountGroup: NewAccountGroupClient(cfg), AccountGroup: NewAccountGroupClient(cfg),
ApiKey: NewApiKeyClient(cfg),
Group: NewGroupClient(cfg), Group: NewGroupClient(cfg),
Proxy: NewProxyClient(cfg), Proxy: NewProxyClient(cfg),
RedeemCode: NewRedeemCodeClient(cfg), RedeemCode: NewRedeemCodeClient(cfg),
@@ -230,7 +230,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
// Debug returns a new debug-client. It's used to get verbose logging on specific operations. // Debug returns a new debug-client. It's used to get verbose logging on specific operations.
// //
// client.Debug(). // client.Debug().
// APIKey. // Account.
// Query(). // Query().
// Count(ctx) // Count(ctx)
func (c *Client) Debug() *Client { func (c *Client) Debug() *Client {
@@ -253,9 +253,9 @@ func (c *Client) Close() error {
// In order to add hooks to a specific client, call: `client.Node.Use(...)`. // In order to add hooks to a specific client, call: `client.Node.Use(...)`.
func (c *Client) Use(hooks ...Hook) { func (c *Client) Use(hooks ...Hook) {
for _, n := range []interface{ Use(...Hook) }{ for _, n := range []interface{ Use(...Hook) }{
c.APIKey, c.Account, c.AccountGroup, c.Group, c.Proxy, c.RedeemCode, c.Setting, c.Account, c.AccountGroup, c.ApiKey, c.Group, c.Proxy, c.RedeemCode, c.Setting,
c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition, c.UserAttributeValue, c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition,
c.UserSubscription, c.UserAttributeValue, c.UserSubscription,
} { } {
n.Use(hooks...) n.Use(hooks...)
} }
@@ -265,9 +265,9 @@ func (c *Client) Use(hooks ...Hook) {
// In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`. // In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`.
func (c *Client) Intercept(interceptors ...Interceptor) { func (c *Client) Intercept(interceptors ...Interceptor) {
for _, n := range []interface{ Intercept(...Interceptor) }{ for _, n := range []interface{ Intercept(...Interceptor) }{
c.APIKey, c.Account, c.AccountGroup, c.Group, c.Proxy, c.RedeemCode, c.Setting, c.Account, c.AccountGroup, c.ApiKey, c.Group, c.Proxy, c.RedeemCode, c.Setting,
c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition, c.UserAttributeValue, c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition,
c.UserSubscription, c.UserAttributeValue, c.UserSubscription,
} { } {
n.Intercept(interceptors...) n.Intercept(interceptors...)
} }
@@ -276,12 +276,12 @@ func (c *Client) Intercept(interceptors ...Interceptor) {
// Mutate implements the ent.Mutator interface. // Mutate implements the ent.Mutator interface.
func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) { func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) {
switch m := m.(type) { switch m := m.(type) {
case *APIKeyMutation:
return c.APIKey.mutate(ctx, m)
case *AccountMutation: case *AccountMutation:
return c.Account.mutate(ctx, m) return c.Account.mutate(ctx, m)
case *AccountGroupMutation: case *AccountGroupMutation:
return c.AccountGroup.mutate(ctx, m) return c.AccountGroup.mutate(ctx, m)
case *ApiKeyMutation:
return c.ApiKey.mutate(ctx, m)
case *GroupMutation: case *GroupMutation:
return c.Group.mutate(ctx, m) return c.Group.mutate(ctx, m)
case *ProxyMutation: case *ProxyMutation:
@@ -307,189 +307,6 @@ func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) {
} }
} }
// APIKeyClient is a client for the APIKey schema.
type APIKeyClient struct {
config
}
// NewAPIKeyClient returns a client for the APIKey from the given config.
func NewAPIKeyClient(c config) *APIKeyClient {
return &APIKeyClient{config: c}
}
// Use adds a list of mutation hooks to the hooks stack.
// A call to `Use(f, g, h)` equals to `apikey.Hooks(f(g(h())))`.
func (c *APIKeyClient) Use(hooks ...Hook) {
c.hooks.APIKey = append(c.hooks.APIKey, hooks...)
}
// Intercept adds a list of query interceptors to the interceptors stack.
// A call to `Intercept(f, g, h)` equals to `apikey.Intercept(f(g(h())))`.
func (c *APIKeyClient) Intercept(interceptors ...Interceptor) {
c.inters.APIKey = append(c.inters.APIKey, interceptors...)
}
// Create returns a builder for creating a APIKey entity.
func (c *APIKeyClient) Create() *APIKeyCreate {
mutation := newAPIKeyMutation(c.config, OpCreate)
return &APIKeyCreate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// CreateBulk returns a builder for creating a bulk of APIKey entities.
func (c *APIKeyClient) CreateBulk(builders ...*APIKeyCreate) *APIKeyCreateBulk {
return &APIKeyCreateBulk{config: c.config, builders: builders}
}
// MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates
// a builder and applies setFunc on it.
func (c *APIKeyClient) MapCreateBulk(slice any, setFunc func(*APIKeyCreate, int)) *APIKeyCreateBulk {
rv := reflect.ValueOf(slice)
if rv.Kind() != reflect.Slice {
return &APIKeyCreateBulk{err: fmt.Errorf("calling to APIKeyClient.MapCreateBulk with wrong type %T, need slice", slice)}
}
builders := make([]*APIKeyCreate, rv.Len())
for i := 0; i < rv.Len(); i++ {
builders[i] = c.Create()
setFunc(builders[i], i)
}
return &APIKeyCreateBulk{config: c.config, builders: builders}
}
// Update returns an update builder for APIKey.
func (c *APIKeyClient) Update() *APIKeyUpdate {
mutation := newAPIKeyMutation(c.config, OpUpdate)
return &APIKeyUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOne returns an update builder for the given entity.
func (c *APIKeyClient) UpdateOne(_m *APIKey) *APIKeyUpdateOne {
mutation := newAPIKeyMutation(c.config, OpUpdateOne, withAPIKey(_m))
return &APIKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOneID returns an update builder for the given id.
func (c *APIKeyClient) UpdateOneID(id int64) *APIKeyUpdateOne {
mutation := newAPIKeyMutation(c.config, OpUpdateOne, withAPIKeyID(id))
return &APIKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// Delete returns a delete builder for APIKey.
func (c *APIKeyClient) Delete() *APIKeyDelete {
mutation := newAPIKeyMutation(c.config, OpDelete)
return &APIKeyDelete{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// DeleteOne returns a builder for deleting the given entity.
func (c *APIKeyClient) DeleteOne(_m *APIKey) *APIKeyDeleteOne {
return c.DeleteOneID(_m.ID)
}
// DeleteOneID returns a builder for deleting the given entity by its id.
func (c *APIKeyClient) DeleteOneID(id int64) *APIKeyDeleteOne {
builder := c.Delete().Where(apikey.ID(id))
builder.mutation.id = &id
builder.mutation.op = OpDeleteOne
return &APIKeyDeleteOne{builder}
}
// Query returns a query builder for APIKey.
func (c *APIKeyClient) Query() *APIKeyQuery {
return &APIKeyQuery{
config: c.config,
ctx: &QueryContext{Type: TypeAPIKey},
inters: c.Interceptors(),
}
}
// Get returns a APIKey entity by its id.
func (c *APIKeyClient) Get(ctx context.Context, id int64) (*APIKey, error) {
return c.Query().Where(apikey.ID(id)).Only(ctx)
}
// GetX is like Get, but panics if an error occurs.
func (c *APIKeyClient) GetX(ctx context.Context, id int64) *APIKey {
obj, err := c.Get(ctx, id)
if err != nil {
panic(err)
}
return obj
}
// QueryUser queries the user edge of a APIKey.
func (c *APIKeyClient) QueryUser(_m *APIKey) *UserQuery {
query := (&UserClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(user.Table, user.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, apikey.UserTable, apikey.UserColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryGroup queries the group edge of a APIKey.
func (c *APIKeyClient) QueryGroup(_m *APIKey) *GroupQuery {
query := (&GroupClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(group.Table, group.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, apikey.GroupTable, apikey.GroupColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryUsageLogs queries the usage_logs edge of a APIKey.
func (c *APIKeyClient) QueryUsageLogs(_m *APIKey) *UsageLogQuery {
query := (&UsageLogClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(usagelog.Table, usagelog.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, apikey.UsageLogsTable, apikey.UsageLogsColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// Hooks returns the client hooks.
func (c *APIKeyClient) Hooks() []Hook {
hooks := c.hooks.APIKey
return append(hooks[:len(hooks):len(hooks)], apikey.Hooks[:]...)
}
// Interceptors returns the client interceptors.
func (c *APIKeyClient) Interceptors() []Interceptor {
inters := c.inters.APIKey
return append(inters[:len(inters):len(inters)], apikey.Interceptors[:]...)
}
func (c *APIKeyClient) mutate(ctx context.Context, m *APIKeyMutation) (Value, error) {
switch m.Op() {
case OpCreate:
return (&APIKeyCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdate:
return (&APIKeyUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdateOne:
return (&APIKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpDelete, OpDeleteOne:
return (&APIKeyDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx)
default:
return nil, fmt.Errorf("ent: unknown APIKey mutation op: %q", m.Op())
}
}
// AccountClient is a client for the Account schema. // AccountClient is a client for the Account schema.
type AccountClient struct { type AccountClient struct {
config config
@@ -805,6 +622,189 @@ func (c *AccountGroupClient) mutate(ctx context.Context, m *AccountGroupMutation
} }
} }
// ApiKeyClient is a client for the ApiKey schema.
type ApiKeyClient struct {
config
}
// NewApiKeyClient returns a client for the ApiKey from the given config.
func NewApiKeyClient(c config) *ApiKeyClient {
return &ApiKeyClient{config: c}
}
// Use adds a list of mutation hooks to the hooks stack.
// A call to `Use(f, g, h)` equals to `apikey.Hooks(f(g(h())))`.
func (c *ApiKeyClient) Use(hooks ...Hook) {
c.hooks.ApiKey = append(c.hooks.ApiKey, hooks...)
}
// Intercept adds a list of query interceptors to the interceptors stack.
// A call to `Intercept(f, g, h)` equals to `apikey.Intercept(f(g(h())))`.
func (c *ApiKeyClient) Intercept(interceptors ...Interceptor) {
c.inters.ApiKey = append(c.inters.ApiKey, interceptors...)
}
// Create returns a builder for creating a ApiKey entity.
func (c *ApiKeyClient) Create() *ApiKeyCreate {
mutation := newApiKeyMutation(c.config, OpCreate)
return &ApiKeyCreate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// CreateBulk returns a builder for creating a bulk of ApiKey entities.
func (c *ApiKeyClient) CreateBulk(builders ...*ApiKeyCreate) *ApiKeyCreateBulk {
return &ApiKeyCreateBulk{config: c.config, builders: builders}
}
// MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates
// a builder and applies setFunc on it.
func (c *ApiKeyClient) MapCreateBulk(slice any, setFunc func(*ApiKeyCreate, int)) *ApiKeyCreateBulk {
rv := reflect.ValueOf(slice)
if rv.Kind() != reflect.Slice {
return &ApiKeyCreateBulk{err: fmt.Errorf("calling to ApiKeyClient.MapCreateBulk with wrong type %T, need slice", slice)}
}
builders := make([]*ApiKeyCreate, rv.Len())
for i := 0; i < rv.Len(); i++ {
builders[i] = c.Create()
setFunc(builders[i], i)
}
return &ApiKeyCreateBulk{config: c.config, builders: builders}
}
// Update returns an update builder for ApiKey.
func (c *ApiKeyClient) Update() *ApiKeyUpdate {
mutation := newApiKeyMutation(c.config, OpUpdate)
return &ApiKeyUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOne returns an update builder for the given entity.
func (c *ApiKeyClient) UpdateOne(_m *ApiKey) *ApiKeyUpdateOne {
mutation := newApiKeyMutation(c.config, OpUpdateOne, withApiKey(_m))
return &ApiKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOneID returns an update builder for the given id.
func (c *ApiKeyClient) UpdateOneID(id int64) *ApiKeyUpdateOne {
mutation := newApiKeyMutation(c.config, OpUpdateOne, withApiKeyID(id))
return &ApiKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// Delete returns a delete builder for ApiKey.
func (c *ApiKeyClient) Delete() *ApiKeyDelete {
mutation := newApiKeyMutation(c.config, OpDelete)
return &ApiKeyDelete{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// DeleteOne returns a builder for deleting the given entity.
func (c *ApiKeyClient) DeleteOne(_m *ApiKey) *ApiKeyDeleteOne {
return c.DeleteOneID(_m.ID)
}
// DeleteOneID returns a builder for deleting the given entity by its id.
func (c *ApiKeyClient) DeleteOneID(id int64) *ApiKeyDeleteOne {
builder := c.Delete().Where(apikey.ID(id))
builder.mutation.id = &id
builder.mutation.op = OpDeleteOne
return &ApiKeyDeleteOne{builder}
}
// Query returns a query builder for ApiKey.
func (c *ApiKeyClient) Query() *ApiKeyQuery {
return &ApiKeyQuery{
config: c.config,
ctx: &QueryContext{Type: TypeApiKey},
inters: c.Interceptors(),
}
}
// Get returns a ApiKey entity by its id.
func (c *ApiKeyClient) Get(ctx context.Context, id int64) (*ApiKey, error) {
return c.Query().Where(apikey.ID(id)).Only(ctx)
}
// GetX is like Get, but panics if an error occurs.
func (c *ApiKeyClient) GetX(ctx context.Context, id int64) *ApiKey {
obj, err := c.Get(ctx, id)
if err != nil {
panic(err)
}
return obj
}
// QueryUser queries the user edge of a ApiKey.
func (c *ApiKeyClient) QueryUser(_m *ApiKey) *UserQuery {
query := (&UserClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(user.Table, user.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, apikey.UserTable, apikey.UserColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryGroup queries the group edge of a ApiKey.
func (c *ApiKeyClient) QueryGroup(_m *ApiKey) *GroupQuery {
query := (&GroupClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(group.Table, group.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, apikey.GroupTable, apikey.GroupColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryUsageLogs queries the usage_logs edge of a ApiKey.
func (c *ApiKeyClient) QueryUsageLogs(_m *ApiKey) *UsageLogQuery {
query := (&UsageLogClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(apikey.Table, apikey.FieldID, id),
sqlgraph.To(usagelog.Table, usagelog.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, apikey.UsageLogsTable, apikey.UsageLogsColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// Hooks returns the client hooks.
func (c *ApiKeyClient) Hooks() []Hook {
hooks := c.hooks.ApiKey
return append(hooks[:len(hooks):len(hooks)], apikey.Hooks[:]...)
}
// Interceptors returns the client interceptors.
func (c *ApiKeyClient) Interceptors() []Interceptor {
inters := c.inters.ApiKey
return append(inters[:len(inters):len(inters)], apikey.Interceptors[:]...)
}
func (c *ApiKeyClient) mutate(ctx context.Context, m *ApiKeyMutation) (Value, error) {
switch m.Op() {
case OpCreate:
return (&ApiKeyCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdate:
return (&ApiKeyUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdateOne:
return (&ApiKeyUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpDelete, OpDeleteOne:
return (&ApiKeyDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx)
default:
return nil, fmt.Errorf("ent: unknown ApiKey mutation op: %q", m.Op())
}
}
// GroupClient is a client for the Group schema. // GroupClient is a client for the Group schema.
type GroupClient struct { type GroupClient struct {
config config
@@ -914,8 +914,8 @@ func (c *GroupClient) GetX(ctx context.Context, id int64) *Group {
} }
// QueryAPIKeys queries the api_keys edge of a Group. // QueryAPIKeys queries the api_keys edge of a Group.
func (c *GroupClient) QueryAPIKeys(_m *Group) *APIKeyQuery { func (c *GroupClient) QueryAPIKeys(_m *Group) *ApiKeyQuery {
query := (&APIKeyClient{config: c.config}).Query() query := (&ApiKeyClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) { query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID id := _m.ID
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
@@ -1642,8 +1642,8 @@ func (c *UsageLogClient) QueryUser(_m *UsageLog) *UserQuery {
} }
// QueryAPIKey queries the api_key edge of a UsageLog. // QueryAPIKey queries the api_key edge of a UsageLog.
func (c *UsageLogClient) QueryAPIKey(_m *UsageLog) *APIKeyQuery { func (c *UsageLogClient) QueryAPIKey(_m *UsageLog) *ApiKeyQuery {
query := (&APIKeyClient{config: c.config}).Query() query := (&ApiKeyClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) { query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID id := _m.ID
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
@@ -1839,8 +1839,8 @@ func (c *UserClient) GetX(ctx context.Context, id int64) *User {
} }
// QueryAPIKeys queries the api_keys edge of a User. // QueryAPIKeys queries the api_keys edge of a User.
func (c *UserClient) QueryAPIKeys(_m *User) *APIKeyQuery { func (c *UserClient) QueryAPIKeys(_m *User) *ApiKeyQuery {
query := (&APIKeyClient{config: c.config}).Query() query := (&ApiKeyClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) { query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID id := _m.ID
step := sqlgraph.NewStep( step := sqlgraph.NewStep(
@@ -2627,12 +2627,12 @@ func (c *UserSubscriptionClient) mutate(ctx context.Context, m *UserSubscription
// hooks and interceptors per client, for fast access. // hooks and interceptors per client, for fast access.
type ( type (
hooks struct { hooks struct {
APIKey, Account, AccountGroup, Group, Proxy, RedeemCode, Setting, UsageLog, Account, AccountGroup, ApiKey, Group, Proxy, RedeemCode, Setting, UsageLog,
User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue, User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue,
UserSubscription []ent.Hook UserSubscription []ent.Hook
} }
inters struct { inters struct {
APIKey, Account, AccountGroup, Group, Proxy, RedeemCode, Setting, UsageLog, Account, AccountGroup, ApiKey, Group, Proxy, RedeemCode, Setting, UsageLog,
User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue, User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue,
UserSubscription []ent.Interceptor UserSubscription []ent.Interceptor
} }

View File

@@ -1,4 +1,3 @@
// Package ent provides database entity definitions and operations.
package ent package ent
import "entgo.io/ent/dialect" import "entgo.io/ent/dialect"

View File

@@ -54,7 +54,7 @@ type Group struct {
// GroupEdges holds the relations/edges for other nodes in the graph. // GroupEdges holds the relations/edges for other nodes in the graph.
type GroupEdges struct { type GroupEdges struct {
// APIKeys holds the value of the api_keys edge. // APIKeys holds the value of the api_keys edge.
APIKeys []*APIKey `json:"api_keys,omitempty"` APIKeys []*ApiKey `json:"api_keys,omitempty"`
// RedeemCodes holds the value of the redeem_codes edge. // RedeemCodes holds the value of the redeem_codes edge.
RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"` RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"`
// Subscriptions holds the value of the subscriptions edge. // Subscriptions holds the value of the subscriptions edge.
@@ -76,7 +76,7 @@ type GroupEdges struct {
// APIKeysOrErr returns the APIKeys value or an error if the edge // APIKeysOrErr returns the APIKeys value or an error if the edge
// was not loaded in eager-loading. // was not loaded in eager-loading.
func (e GroupEdges) APIKeysOrErr() ([]*APIKey, error) { func (e GroupEdges) APIKeysOrErr() ([]*ApiKey, error) {
if e.loadedTypes[0] { if e.loadedTypes[0] {
return e.APIKeys, nil return e.APIKeys, nil
} }
@@ -285,7 +285,7 @@ func (_m *Group) Value(name string) (ent.Value, error) {
} }
// QueryAPIKeys queries the "api_keys" edge of the Group entity. // QueryAPIKeys queries the "api_keys" edge of the Group entity.
func (_m *Group) QueryAPIKeys() *APIKeyQuery { func (_m *Group) QueryAPIKeys() *ApiKeyQuery {
return NewGroupClient(_m.config).QueryAPIKeys(_m) return NewGroupClient(_m.config).QueryAPIKeys(_m)
} }

View File

@@ -63,7 +63,7 @@ const (
Table = "groups" Table = "groups"
// APIKeysTable is the table that holds the api_keys relation/edge. // APIKeysTable is the table that holds the api_keys relation/edge.
APIKeysTable = "api_keys" APIKeysTable = "api_keys"
// APIKeysInverseTable is the table name for the APIKey entity. // APIKeysInverseTable is the table name for the ApiKey entity.
// It exists in this package in order to avoid circular dependency with the "apikey" package. // It exists in this package in order to avoid circular dependency with the "apikey" package.
APIKeysInverseTable = "api_keys" APIKeysInverseTable = "api_keys"
// APIKeysColumn is the table column denoting the api_keys relation/edge. // APIKeysColumn is the table column denoting the api_keys relation/edge.

View File

@@ -842,7 +842,7 @@ func HasAPIKeys() predicate.Group {
} }
// HasAPIKeysWith applies the HasEdge predicate on the "api_keys" edge with a given conditions (other predicates). // HasAPIKeysWith applies the HasEdge predicate on the "api_keys" edge with a given conditions (other predicates).
func HasAPIKeysWith(preds ...predicate.APIKey) predicate.Group { func HasAPIKeysWith(preds ...predicate.ApiKey) predicate.Group {
return predicate.Group(func(s *sql.Selector) { return predicate.Group(func(s *sql.Selector) {
step := newAPIKeysStep() step := newAPIKeysStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {

View File

@@ -216,14 +216,14 @@ func (_c *GroupCreate) SetNillableDefaultValidityDays(v *int) *GroupCreate {
return _c return _c
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_c *GroupCreate) AddAPIKeyIDs(ids ...int64) *GroupCreate { func (_c *GroupCreate) AddAPIKeyIDs(ids ...int64) *GroupCreate {
_c.mutation.AddAPIKeyIDs(ids...) _c.mutation.AddAPIKeyIDs(ids...)
return _c return _c
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_c *GroupCreate) AddAPIKeys(v ...*APIKey) *GroupCreate { func (_c *GroupCreate) AddAPIKeys(v ...*ApiKey) *GroupCreate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID

View File

@@ -31,7 +31,7 @@ type GroupQuery struct {
order []group.OrderOption order []group.OrderOption
inters []Interceptor inters []Interceptor
predicates []predicate.Group predicates []predicate.Group
withAPIKeys *APIKeyQuery withAPIKeys *ApiKeyQuery
withRedeemCodes *RedeemCodeQuery withRedeemCodes *RedeemCodeQuery
withSubscriptions *UserSubscriptionQuery withSubscriptions *UserSubscriptionQuery
withUsageLogs *UsageLogQuery withUsageLogs *UsageLogQuery
@@ -76,8 +76,8 @@ func (_q *GroupQuery) Order(o ...group.OrderOption) *GroupQuery {
} }
// QueryAPIKeys chains the current query on the "api_keys" edge. // QueryAPIKeys chains the current query on the "api_keys" edge.
func (_q *GroupQuery) QueryAPIKeys() *APIKeyQuery { func (_q *GroupQuery) QueryAPIKeys() *ApiKeyQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
return nil, err return nil, err
@@ -459,8 +459,8 @@ func (_q *GroupQuery) Clone() *GroupQuery {
// WithAPIKeys tells the query-builder to eager-load the nodes that are connected to // WithAPIKeys tells the query-builder to eager-load the nodes that are connected to
// the "api_keys" edge. The optional arguments are used to configure the query builder of the edge. // the "api_keys" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *GroupQuery) WithAPIKeys(opts ...func(*APIKeyQuery)) *GroupQuery { func (_q *GroupQuery) WithAPIKeys(opts ...func(*ApiKeyQuery)) *GroupQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
} }
@@ -654,8 +654,8 @@ func (_q *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group,
} }
if query := _q.withAPIKeys; query != nil { if query := _q.withAPIKeys; query != nil {
if err := _q.loadAPIKeys(ctx, query, nodes, if err := _q.loadAPIKeys(ctx, query, nodes,
func(n *Group) { n.Edges.APIKeys = []*APIKey{} }, func(n *Group) { n.Edges.APIKeys = []*ApiKey{} },
func(n *Group, e *APIKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil { func(n *Group, e *ApiKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil {
return nil, err return nil, err
} }
} }
@@ -711,7 +711,7 @@ func (_q *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group,
return nodes, nil return nodes, nil
} }
func (_q *GroupQuery) loadAPIKeys(ctx context.Context, query *APIKeyQuery, nodes []*Group, init func(*Group), assign func(*Group, *APIKey)) error { func (_q *GroupQuery) loadAPIKeys(ctx context.Context, query *ApiKeyQuery, nodes []*Group, init func(*Group), assign func(*Group, *ApiKey)) error {
fks := make([]driver.Value, 0, len(nodes)) fks := make([]driver.Value, 0, len(nodes))
nodeids := make(map[int64]*Group) nodeids := make(map[int64]*Group)
for i := range nodes { for i := range nodes {
@@ -724,7 +724,7 @@ func (_q *GroupQuery) loadAPIKeys(ctx context.Context, query *APIKeyQuery, nodes
if len(query.ctx.Fields) > 0 { if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(apikey.FieldGroupID) query.ctx.AppendFieldOnce(apikey.FieldGroupID)
} }
query.Where(predicate.APIKey(func(s *sql.Selector) { query.Where(predicate.ApiKey(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(group.APIKeysColumn), fks...)) s.Where(sql.InValues(s.C(group.APIKeysColumn), fks...))
})) }))
neighbors, err := query.All(ctx) neighbors, err := query.All(ctx)

View File

@@ -273,14 +273,14 @@ func (_u *GroupUpdate) AddDefaultValidityDays(v int) *GroupUpdate {
return _u return _u
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_u *GroupUpdate) AddAPIKeyIDs(ids ...int64) *GroupUpdate { func (_u *GroupUpdate) AddAPIKeyIDs(ids ...int64) *GroupUpdate {
_u.mutation.AddAPIKeyIDs(ids...) _u.mutation.AddAPIKeyIDs(ids...)
return _u return _u
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_u *GroupUpdate) AddAPIKeys(v ...*APIKey) *GroupUpdate { func (_u *GroupUpdate) AddAPIKeys(v ...*ApiKey) *GroupUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -368,20 +368,20 @@ func (_u *GroupUpdate) Mutation() *GroupMutation {
return _u.mutation return _u.mutation
} }
// ClearAPIKeys clears all "api_keys" edges to the APIKey entity. // ClearAPIKeys clears all "api_keys" edges to the ApiKey entity.
func (_u *GroupUpdate) ClearAPIKeys() *GroupUpdate { func (_u *GroupUpdate) ClearAPIKeys() *GroupUpdate {
_u.mutation.ClearAPIKeys() _u.mutation.ClearAPIKeys()
return _u return _u
} }
// RemoveAPIKeyIDs removes the "api_keys" edge to APIKey entities by IDs. // RemoveAPIKeyIDs removes the "api_keys" edge to ApiKey entities by IDs.
func (_u *GroupUpdate) RemoveAPIKeyIDs(ids ...int64) *GroupUpdate { func (_u *GroupUpdate) RemoveAPIKeyIDs(ids ...int64) *GroupUpdate {
_u.mutation.RemoveAPIKeyIDs(ids...) _u.mutation.RemoveAPIKeyIDs(ids...)
return _u return _u
} }
// RemoveAPIKeys removes "api_keys" edges to APIKey entities. // RemoveAPIKeys removes "api_keys" edges to ApiKey entities.
func (_u *GroupUpdate) RemoveAPIKeys(v ...*APIKey) *GroupUpdate { func (_u *GroupUpdate) RemoveAPIKeys(v ...*ApiKey) *GroupUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -1195,14 +1195,14 @@ func (_u *GroupUpdateOne) AddDefaultValidityDays(v int) *GroupUpdateOne {
return _u return _u
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_u *GroupUpdateOne) AddAPIKeyIDs(ids ...int64) *GroupUpdateOne { func (_u *GroupUpdateOne) AddAPIKeyIDs(ids ...int64) *GroupUpdateOne {
_u.mutation.AddAPIKeyIDs(ids...) _u.mutation.AddAPIKeyIDs(ids...)
return _u return _u
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_u *GroupUpdateOne) AddAPIKeys(v ...*APIKey) *GroupUpdateOne { func (_u *GroupUpdateOne) AddAPIKeys(v ...*ApiKey) *GroupUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -1290,20 +1290,20 @@ func (_u *GroupUpdateOne) Mutation() *GroupMutation {
return _u.mutation return _u.mutation
} }
// ClearAPIKeys clears all "api_keys" edges to the APIKey entity. // ClearAPIKeys clears all "api_keys" edges to the ApiKey entity.
func (_u *GroupUpdateOne) ClearAPIKeys() *GroupUpdateOne { func (_u *GroupUpdateOne) ClearAPIKeys() *GroupUpdateOne {
_u.mutation.ClearAPIKeys() _u.mutation.ClearAPIKeys()
return _u return _u
} }
// RemoveAPIKeyIDs removes the "api_keys" edge to APIKey entities by IDs. // RemoveAPIKeyIDs removes the "api_keys" edge to ApiKey entities by IDs.
func (_u *GroupUpdateOne) RemoveAPIKeyIDs(ids ...int64) *GroupUpdateOne { func (_u *GroupUpdateOne) RemoveAPIKeyIDs(ids ...int64) *GroupUpdateOne {
_u.mutation.RemoveAPIKeyIDs(ids...) _u.mutation.RemoveAPIKeyIDs(ids...)
return _u return _u
} }
// RemoveAPIKeys removes "api_keys" edges to APIKey entities. // RemoveAPIKeys removes "api_keys" edges to ApiKey entities.
func (_u *GroupUpdateOne) RemoveAPIKeys(v ...*APIKey) *GroupUpdateOne { func (_u *GroupUpdateOne) RemoveAPIKeys(v ...*ApiKey) *GroupUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID

View File

@@ -9,18 +9,6 @@ import (
"github.com/Wei-Shaw/sub2api/ent" "github.com/Wei-Shaw/sub2api/ent"
) )
// The APIKeyFunc type is an adapter to allow the use of ordinary
// function as APIKey mutator.
type APIKeyFunc func(context.Context, *ent.APIKeyMutation) (ent.Value, error)
// Mutate calls f(ctx, m).
func (f APIKeyFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
if mv, ok := m.(*ent.APIKeyMutation); ok {
return f(ctx, mv)
}
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.APIKeyMutation", m)
}
// The AccountFunc type is an adapter to allow the use of ordinary // The AccountFunc type is an adapter to allow the use of ordinary
// function as Account mutator. // function as Account mutator.
type AccountFunc func(context.Context, *ent.AccountMutation) (ent.Value, error) type AccountFunc func(context.Context, *ent.AccountMutation) (ent.Value, error)
@@ -45,6 +33,18 @@ func (f AccountGroupFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.AccountGroupMutation", m) return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.AccountGroupMutation", m)
} }
// The ApiKeyFunc type is an adapter to allow the use of ordinary
// function as ApiKey mutator.
type ApiKeyFunc func(context.Context, *ent.ApiKeyMutation) (ent.Value, error)
// Mutate calls f(ctx, m).
func (f ApiKeyFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
if mv, ok := m.(*ent.ApiKeyMutation); ok {
return f(ctx, mv)
}
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ApiKeyMutation", m)
}
// The GroupFunc type is an adapter to allow the use of ordinary // The GroupFunc type is an adapter to allow the use of ordinary
// function as Group mutator. // function as Group mutator.
type GroupFunc func(context.Context, *ent.GroupMutation) (ent.Value, error) type GroupFunc func(context.Context, *ent.GroupMutation) (ent.Value, error)

View File

@@ -80,33 +80,6 @@ func (f TraverseFunc) Traverse(ctx context.Context, q ent.Query) error {
return f(ctx, query) return f(ctx, query)
} }
// The APIKeyFunc type is an adapter to allow the use of ordinary function as a Querier.
type APIKeyFunc func(context.Context, *ent.APIKeyQuery) (ent.Value, error)
// Query calls f(ctx, q).
func (f APIKeyFunc) Query(ctx context.Context, q ent.Query) (ent.Value, error) {
if q, ok := q.(*ent.APIKeyQuery); ok {
return f(ctx, q)
}
return nil, fmt.Errorf("unexpected query type %T. expect *ent.APIKeyQuery", q)
}
// The TraverseAPIKey type is an adapter to allow the use of ordinary function as Traverser.
type TraverseAPIKey func(context.Context, *ent.APIKeyQuery) error
// Intercept is a dummy implementation of Intercept that returns the next Querier in the pipeline.
func (f TraverseAPIKey) Intercept(next ent.Querier) ent.Querier {
return next
}
// Traverse calls f(ctx, q).
func (f TraverseAPIKey) Traverse(ctx context.Context, q ent.Query) error {
if q, ok := q.(*ent.APIKeyQuery); ok {
return f(ctx, q)
}
return fmt.Errorf("unexpected query type %T. expect *ent.APIKeyQuery", q)
}
// The AccountFunc type is an adapter to allow the use of ordinary function as a Querier. // The AccountFunc type is an adapter to allow the use of ordinary function as a Querier.
type AccountFunc func(context.Context, *ent.AccountQuery) (ent.Value, error) type AccountFunc func(context.Context, *ent.AccountQuery) (ent.Value, error)
@@ -161,6 +134,33 @@ func (f TraverseAccountGroup) Traverse(ctx context.Context, q ent.Query) error {
return fmt.Errorf("unexpected query type %T. expect *ent.AccountGroupQuery", q) return fmt.Errorf("unexpected query type %T. expect *ent.AccountGroupQuery", q)
} }
// The ApiKeyFunc type is an adapter to allow the use of ordinary function as a Querier.
type ApiKeyFunc func(context.Context, *ent.ApiKeyQuery) (ent.Value, error)
// Query calls f(ctx, q).
func (f ApiKeyFunc) Query(ctx context.Context, q ent.Query) (ent.Value, error) {
if q, ok := q.(*ent.ApiKeyQuery); ok {
return f(ctx, q)
}
return nil, fmt.Errorf("unexpected query type %T. expect *ent.ApiKeyQuery", q)
}
// The TraverseApiKey type is an adapter to allow the use of ordinary function as Traverser.
type TraverseApiKey func(context.Context, *ent.ApiKeyQuery) error
// Intercept is a dummy implementation of Intercept that returns the next Querier in the pipeline.
func (f TraverseApiKey) Intercept(next ent.Querier) ent.Querier {
return next
}
// Traverse calls f(ctx, q).
func (f TraverseApiKey) Traverse(ctx context.Context, q ent.Query) error {
if q, ok := q.(*ent.ApiKeyQuery); ok {
return f(ctx, q)
}
return fmt.Errorf("unexpected query type %T. expect *ent.ApiKeyQuery", q)
}
// The GroupFunc type is an adapter to allow the use of ordinary function as a Querier. // The GroupFunc type is an adapter to allow the use of ordinary function as a Querier.
type GroupFunc func(context.Context, *ent.GroupQuery) (ent.Value, error) type GroupFunc func(context.Context, *ent.GroupQuery) (ent.Value, error)
@@ -434,12 +434,12 @@ func (f TraverseUserSubscription) Traverse(ctx context.Context, q ent.Query) err
// NewQuery returns the generic Query interface for the given typed query. // NewQuery returns the generic Query interface for the given typed query.
func NewQuery(q ent.Query) (Query, error) { func NewQuery(q ent.Query) (Query, error) {
switch q := q.(type) { switch q := q.(type) {
case *ent.APIKeyQuery:
return &query[*ent.APIKeyQuery, predicate.APIKey, apikey.OrderOption]{typ: ent.TypeAPIKey, tq: q}, nil
case *ent.AccountQuery: case *ent.AccountQuery:
return &query[*ent.AccountQuery, predicate.Account, account.OrderOption]{typ: ent.TypeAccount, tq: q}, nil return &query[*ent.AccountQuery, predicate.Account, account.OrderOption]{typ: ent.TypeAccount, tq: q}, nil
case *ent.AccountGroupQuery: case *ent.AccountGroupQuery:
return &query[*ent.AccountGroupQuery, predicate.AccountGroup, accountgroup.OrderOption]{typ: ent.TypeAccountGroup, tq: q}, nil return &query[*ent.AccountGroupQuery, predicate.AccountGroup, accountgroup.OrderOption]{typ: ent.TypeAccountGroup, tq: q}, nil
case *ent.ApiKeyQuery:
return &query[*ent.ApiKeyQuery, predicate.ApiKey, apikey.OrderOption]{typ: ent.TypeApiKey, tq: q}, nil
case *ent.GroupQuery: case *ent.GroupQuery:
return &query[*ent.GroupQuery, predicate.Group, group.OrderOption]{typ: ent.TypeGroup, tq: q}, nil return &query[*ent.GroupQuery, predicate.Group, group.OrderOption]{typ: ent.TypeGroup, tq: q}, nil
case *ent.ProxyQuery: case *ent.ProxyQuery:

View File

@@ -9,60 +9,6 @@ import (
) )
var ( var (
// APIKeysColumns holds the columns for the "api_keys" table.
APIKeysColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true},
{Name: "created_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "updated_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "deleted_at", Type: field.TypeTime, Nullable: true, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "key", Type: field.TypeString, Unique: true, Size: 128},
{Name: "name", Type: field.TypeString, Size: 100},
{Name: "status", Type: field.TypeString, Size: 20, Default: "active"},
{Name: "group_id", Type: field.TypeInt64, Nullable: true},
{Name: "user_id", Type: field.TypeInt64},
}
// APIKeysTable holds the schema information for the "api_keys" table.
APIKeysTable = &schema.Table{
Name: "api_keys",
Columns: APIKeysColumns,
PrimaryKey: []*schema.Column{APIKeysColumns[0]},
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "api_keys_groups_api_keys",
Columns: []*schema.Column{APIKeysColumns[7]},
RefColumns: []*schema.Column{GroupsColumns[0]},
OnDelete: schema.SetNull,
},
{
Symbol: "api_keys_users_api_keys",
Columns: []*schema.Column{APIKeysColumns[8]},
RefColumns: []*schema.Column{UsersColumns[0]},
OnDelete: schema.NoAction,
},
},
Indexes: []*schema.Index{
{
Name: "apikey_user_id",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[8]},
},
{
Name: "apikey_group_id",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[7]},
},
{
Name: "apikey_status",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[6]},
},
{
Name: "apikey_deleted_at",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[3]},
},
},
}
// AccountsColumns holds the columns for the "accounts" table. // AccountsColumns holds the columns for the "accounts" table.
AccountsColumns = []*schema.Column{ AccountsColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true}, {Name: "id", Type: field.TypeInt64, Increment: true},
@@ -198,6 +144,60 @@ var (
}, },
}, },
} }
// APIKeysColumns holds the columns for the "api_keys" table.
APIKeysColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true},
{Name: "created_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "updated_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "deleted_at", Type: field.TypeTime, Nullable: true, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "key", Type: field.TypeString, Unique: true, Size: 128},
{Name: "name", Type: field.TypeString, Size: 100},
{Name: "status", Type: field.TypeString, Size: 20, Default: "active"},
{Name: "group_id", Type: field.TypeInt64, Nullable: true},
{Name: "user_id", Type: field.TypeInt64},
}
// APIKeysTable holds the schema information for the "api_keys" table.
APIKeysTable = &schema.Table{
Name: "api_keys",
Columns: APIKeysColumns,
PrimaryKey: []*schema.Column{APIKeysColumns[0]},
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "api_keys_groups_api_keys",
Columns: []*schema.Column{APIKeysColumns[7]},
RefColumns: []*schema.Column{GroupsColumns[0]},
OnDelete: schema.SetNull,
},
{
Symbol: "api_keys_users_api_keys",
Columns: []*schema.Column{APIKeysColumns[8]},
RefColumns: []*schema.Column{UsersColumns[0]},
OnDelete: schema.NoAction,
},
},
Indexes: []*schema.Index{
{
Name: "apikey_user_id",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[8]},
},
{
Name: "apikey_group_id",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[7]},
},
{
Name: "apikey_status",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[6]},
},
{
Name: "apikey_deleted_at",
Unique: false,
Columns: []*schema.Column{APIKeysColumns[3]},
},
},
}
// GroupsColumns holds the columns for the "groups" table. // GroupsColumns holds the columns for the "groups" table.
GroupsColumns = []*schema.Column{ GroupsColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true}, {Name: "id", Type: field.TypeInt64, Increment: true},
@@ -368,8 +368,8 @@ var (
{Name: "duration_ms", Type: field.TypeInt, Nullable: true}, {Name: "duration_ms", Type: field.TypeInt, Nullable: true},
{Name: "first_token_ms", Type: field.TypeInt, Nullable: true}, {Name: "first_token_ms", Type: field.TypeInt, Nullable: true},
{Name: "created_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}}, {Name: "created_at", Type: field.TypeTime, SchemaType: map[string]string{"postgres": "timestamptz"}},
{Name: "api_key_id", Type: field.TypeInt64},
{Name: "account_id", Type: field.TypeInt64}, {Name: "account_id", Type: field.TypeInt64},
{Name: "api_key_id", Type: field.TypeInt64},
{Name: "group_id", Type: field.TypeInt64, Nullable: true}, {Name: "group_id", Type: field.TypeInt64, Nullable: true},
{Name: "user_id", Type: field.TypeInt64}, {Name: "user_id", Type: field.TypeInt64},
{Name: "subscription_id", Type: field.TypeInt64, Nullable: true}, {Name: "subscription_id", Type: field.TypeInt64, Nullable: true},
@@ -381,15 +381,15 @@ var (
PrimaryKey: []*schema.Column{UsageLogsColumns[0]}, PrimaryKey: []*schema.Column{UsageLogsColumns[0]},
ForeignKeys: []*schema.ForeignKey{ ForeignKeys: []*schema.ForeignKey{
{ {
Symbol: "usage_logs_api_keys_usage_logs", Symbol: "usage_logs_accounts_usage_logs",
Columns: []*schema.Column{UsageLogsColumns[21]}, Columns: []*schema.Column{UsageLogsColumns[21]},
RefColumns: []*schema.Column{APIKeysColumns[0]}, RefColumns: []*schema.Column{AccountsColumns[0]},
OnDelete: schema.NoAction, OnDelete: schema.NoAction,
}, },
{ {
Symbol: "usage_logs_accounts_usage_logs", Symbol: "usage_logs_api_keys_usage_logs",
Columns: []*schema.Column{UsageLogsColumns[22]}, Columns: []*schema.Column{UsageLogsColumns[22]},
RefColumns: []*schema.Column{AccountsColumns[0]}, RefColumns: []*schema.Column{APIKeysColumns[0]},
OnDelete: schema.NoAction, OnDelete: schema.NoAction,
}, },
{ {
@@ -420,12 +420,12 @@ var (
{ {
Name: "usagelog_api_key_id", Name: "usagelog_api_key_id",
Unique: false, Unique: false,
Columns: []*schema.Column{UsageLogsColumns[21]}, Columns: []*schema.Column{UsageLogsColumns[22]},
}, },
{ {
Name: "usagelog_account_id", Name: "usagelog_account_id",
Unique: false, Unique: false,
Columns: []*schema.Column{UsageLogsColumns[22]}, Columns: []*schema.Column{UsageLogsColumns[21]},
}, },
{ {
Name: "usagelog_group_id", Name: "usagelog_group_id",
@@ -460,7 +460,7 @@ var (
{ {
Name: "usagelog_api_key_id_created_at", Name: "usagelog_api_key_id_created_at",
Unique: false, Unique: false,
Columns: []*schema.Column{UsageLogsColumns[21], UsageLogsColumns[20]}, Columns: []*schema.Column{UsageLogsColumns[22], UsageLogsColumns[20]},
}, },
}, },
} }
@@ -702,9 +702,9 @@ var (
} }
// Tables holds all the tables in the schema. // Tables holds all the tables in the schema.
Tables = []*schema.Table{ Tables = []*schema.Table{
APIKeysTable,
AccountsTable, AccountsTable,
AccountGroupsTable, AccountGroupsTable,
APIKeysTable,
GroupsTable, GroupsTable,
ProxiesTable, ProxiesTable,
RedeemCodesTable, RedeemCodesTable,
@@ -719,11 +719,6 @@ var (
) )
func init() { func init() {
APIKeysTable.ForeignKeys[0].RefTable = GroupsTable
APIKeysTable.ForeignKeys[1].RefTable = UsersTable
APIKeysTable.Annotation = &entsql.Annotation{
Table: "api_keys",
}
AccountsTable.ForeignKeys[0].RefTable = ProxiesTable AccountsTable.ForeignKeys[0].RefTable = ProxiesTable
AccountsTable.Annotation = &entsql.Annotation{ AccountsTable.Annotation = &entsql.Annotation{
Table: "accounts", Table: "accounts",
@@ -733,6 +728,11 @@ func init() {
AccountGroupsTable.Annotation = &entsql.Annotation{ AccountGroupsTable.Annotation = &entsql.Annotation{
Table: "account_groups", Table: "account_groups",
} }
APIKeysTable.ForeignKeys[0].RefTable = GroupsTable
APIKeysTable.ForeignKeys[1].RefTable = UsersTable
APIKeysTable.Annotation = &entsql.Annotation{
Table: "api_keys",
}
GroupsTable.Annotation = &entsql.Annotation{ GroupsTable.Annotation = &entsql.Annotation{
Table: "groups", Table: "groups",
} }
@@ -747,8 +747,8 @@ func init() {
SettingsTable.Annotation = &entsql.Annotation{ SettingsTable.Annotation = &entsql.Annotation{
Table: "settings", Table: "settings",
} }
UsageLogsTable.ForeignKeys[0].RefTable = APIKeysTable UsageLogsTable.ForeignKeys[0].RefTable = AccountsTable
UsageLogsTable.ForeignKeys[1].RefTable = AccountsTable UsageLogsTable.ForeignKeys[1].RefTable = APIKeysTable
UsageLogsTable.ForeignKeys[2].RefTable = GroupsTable UsageLogsTable.ForeignKeys[2].RefTable = GroupsTable
UsageLogsTable.ForeignKeys[3].RefTable = UsersTable UsageLogsTable.ForeignKeys[3].RefTable = UsersTable
UsageLogsTable.ForeignKeys[4].RefTable = UserSubscriptionsTable UsageLogsTable.ForeignKeys[4].RefTable = UserSubscriptionsTable

File diff suppressed because it is too large Load Diff

View File

@@ -6,15 +6,15 @@ import (
"entgo.io/ent/dialect/sql" "entgo.io/ent/dialect/sql"
) )
// APIKey is the predicate function for apikey builders.
type APIKey func(*sql.Selector)
// Account is the predicate function for account builders. // Account is the predicate function for account builders.
type Account func(*sql.Selector) type Account func(*sql.Selector)
// AccountGroup is the predicate function for accountgroup builders. // AccountGroup is the predicate function for accountgroup builders.
type AccountGroup func(*sql.Selector) type AccountGroup func(*sql.Selector)
// ApiKey is the predicate function for apikey builders.
type ApiKey func(*sql.Selector)
// Group is the predicate function for group builders. // Group is the predicate function for group builders.
type Group func(*sql.Selector) type Group func(*sql.Selector)

View File

@@ -25,67 +25,6 @@ import (
// (default values, validators, hooks and policies) and stitches it // (default values, validators, hooks and policies) and stitches it
// to their package variables. // to their package variables.
func init() { func init() {
apikeyMixin := schema.APIKey{}.Mixin()
apikeyMixinHooks1 := apikeyMixin[1].Hooks()
apikey.Hooks[0] = apikeyMixinHooks1[0]
apikeyMixinInters1 := apikeyMixin[1].Interceptors()
apikey.Interceptors[0] = apikeyMixinInters1[0]
apikeyMixinFields0 := apikeyMixin[0].Fields()
_ = apikeyMixinFields0
apikeyFields := schema.APIKey{}.Fields()
_ = apikeyFields
// apikeyDescCreatedAt is the schema descriptor for created_at field.
apikeyDescCreatedAt := apikeyMixinFields0[0].Descriptor()
// apikey.DefaultCreatedAt holds the default value on creation for the created_at field.
apikey.DefaultCreatedAt = apikeyDescCreatedAt.Default.(func() time.Time)
// apikeyDescUpdatedAt is the schema descriptor for updated_at field.
apikeyDescUpdatedAt := apikeyMixinFields0[1].Descriptor()
// apikey.DefaultUpdatedAt holds the default value on creation for the updated_at field.
apikey.DefaultUpdatedAt = apikeyDescUpdatedAt.Default.(func() time.Time)
// apikey.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field.
apikey.UpdateDefaultUpdatedAt = apikeyDescUpdatedAt.UpdateDefault.(func() time.Time)
// apikeyDescKey is the schema descriptor for key field.
apikeyDescKey := apikeyFields[1].Descriptor()
// apikey.KeyValidator is a validator for the "key" field. It is called by the builders before save.
apikey.KeyValidator = func() func(string) error {
validators := apikeyDescKey.Validators
fns := [...]func(string) error{
validators[0].(func(string) error),
validators[1].(func(string) error),
}
return func(key string) error {
for _, fn := range fns {
if err := fn(key); err != nil {
return err
}
}
return nil
}
}()
// apikeyDescName is the schema descriptor for name field.
apikeyDescName := apikeyFields[2].Descriptor()
// apikey.NameValidator is a validator for the "name" field. It is called by the builders before save.
apikey.NameValidator = func() func(string) error {
validators := apikeyDescName.Validators
fns := [...]func(string) error{
validators[0].(func(string) error),
validators[1].(func(string) error),
}
return func(name string) error {
for _, fn := range fns {
if err := fn(name); err != nil {
return err
}
}
return nil
}
}()
// apikeyDescStatus is the schema descriptor for status field.
apikeyDescStatus := apikeyFields[4].Descriptor()
// apikey.DefaultStatus holds the default value on creation for the status field.
apikey.DefaultStatus = apikeyDescStatus.Default.(string)
// apikey.StatusValidator is a validator for the "status" field. It is called by the builders before save.
apikey.StatusValidator = apikeyDescStatus.Validators[0].(func(string) error)
accountMixin := schema.Account{}.Mixin() accountMixin := schema.Account{}.Mixin()
accountMixinHooks1 := accountMixin[1].Hooks() accountMixinHooks1 := accountMixin[1].Hooks()
account.Hooks[0] = accountMixinHooks1[0] account.Hooks[0] = accountMixinHooks1[0]
@@ -199,6 +138,67 @@ func init() {
accountgroupDescCreatedAt := accountgroupFields[3].Descriptor() accountgroupDescCreatedAt := accountgroupFields[3].Descriptor()
// accountgroup.DefaultCreatedAt holds the default value on creation for the created_at field. // accountgroup.DefaultCreatedAt holds the default value on creation for the created_at field.
accountgroup.DefaultCreatedAt = accountgroupDescCreatedAt.Default.(func() time.Time) accountgroup.DefaultCreatedAt = accountgroupDescCreatedAt.Default.(func() time.Time)
apikeyMixin := schema.ApiKey{}.Mixin()
apikeyMixinHooks1 := apikeyMixin[1].Hooks()
apikey.Hooks[0] = apikeyMixinHooks1[0]
apikeyMixinInters1 := apikeyMixin[1].Interceptors()
apikey.Interceptors[0] = apikeyMixinInters1[0]
apikeyMixinFields0 := apikeyMixin[0].Fields()
_ = apikeyMixinFields0
apikeyFields := schema.ApiKey{}.Fields()
_ = apikeyFields
// apikeyDescCreatedAt is the schema descriptor for created_at field.
apikeyDescCreatedAt := apikeyMixinFields0[0].Descriptor()
// apikey.DefaultCreatedAt holds the default value on creation for the created_at field.
apikey.DefaultCreatedAt = apikeyDescCreatedAt.Default.(func() time.Time)
// apikeyDescUpdatedAt is the schema descriptor for updated_at field.
apikeyDescUpdatedAt := apikeyMixinFields0[1].Descriptor()
// apikey.DefaultUpdatedAt holds the default value on creation for the updated_at field.
apikey.DefaultUpdatedAt = apikeyDescUpdatedAt.Default.(func() time.Time)
// apikey.UpdateDefaultUpdatedAt holds the default value on update for the updated_at field.
apikey.UpdateDefaultUpdatedAt = apikeyDescUpdatedAt.UpdateDefault.(func() time.Time)
// apikeyDescKey is the schema descriptor for key field.
apikeyDescKey := apikeyFields[1].Descriptor()
// apikey.KeyValidator is a validator for the "key" field. It is called by the builders before save.
apikey.KeyValidator = func() func(string) error {
validators := apikeyDescKey.Validators
fns := [...]func(string) error{
validators[0].(func(string) error),
validators[1].(func(string) error),
}
return func(key string) error {
for _, fn := range fns {
if err := fn(key); err != nil {
return err
}
}
return nil
}
}()
// apikeyDescName is the schema descriptor for name field.
apikeyDescName := apikeyFields[2].Descriptor()
// apikey.NameValidator is a validator for the "name" field. It is called by the builders before save.
apikey.NameValidator = func() func(string) error {
validators := apikeyDescName.Validators
fns := [...]func(string) error{
validators[0].(func(string) error),
validators[1].(func(string) error),
}
return func(name string) error {
for _, fn := range fns {
if err := fn(name); err != nil {
return err
}
}
return nil
}
}()
// apikeyDescStatus is the schema descriptor for status field.
apikeyDescStatus := apikeyFields[4].Descriptor()
// apikey.DefaultStatus holds the default value on creation for the status field.
apikey.DefaultStatus = apikeyDescStatus.Default.(string)
// apikey.StatusValidator is a validator for the "status" field. It is called by the builders before save.
apikey.StatusValidator = apikeyDescStatus.Validators[0].(func(string) error)
groupMixin := schema.Group{}.Mixin() groupMixin := schema.Group{}.Mixin()
groupMixinHooks1 := groupMixin[1].Hooks() groupMixinHooks1 := groupMixin[1].Hooks()
group.Hooks[0] = groupMixinHooks1[0] group.Hooks[0] = groupMixinHooks1[0]

View File

@@ -12,25 +12,25 @@ import (
"entgo.io/ent/schema/index" "entgo.io/ent/schema/index"
) )
// APIKey holds the schema definition for the APIKey entity. // ApiKey holds the schema definition for the ApiKey entity.
type APIKey struct { type ApiKey struct {
ent.Schema ent.Schema
} }
func (APIKey) Annotations() []schema.Annotation { func (ApiKey) Annotations() []schema.Annotation {
return []schema.Annotation{ return []schema.Annotation{
entsql.Annotation{Table: "api_keys"}, entsql.Annotation{Table: "api_keys"},
} }
} }
func (APIKey) Mixin() []ent.Mixin { func (ApiKey) Mixin() []ent.Mixin {
return []ent.Mixin{ return []ent.Mixin{
mixins.TimeMixin{}, mixins.TimeMixin{},
mixins.SoftDeleteMixin{}, mixins.SoftDeleteMixin{},
} }
} }
func (APIKey) Fields() []ent.Field { func (ApiKey) Fields() []ent.Field {
return []ent.Field{ return []ent.Field{
field.Int64("user_id"), field.Int64("user_id"),
field.String("key"). field.String("key").
@@ -49,7 +49,7 @@ func (APIKey) Fields() []ent.Field {
} }
} }
func (APIKey) Edges() []ent.Edge { func (ApiKey) Edges() []ent.Edge {
return []ent.Edge{ return []ent.Edge{
edge.From("user", User.Type). edge.From("user", User.Type).
Ref("api_keys"). Ref("api_keys").
@@ -64,7 +64,7 @@ func (APIKey) Edges() []ent.Edge {
} }
} }
func (APIKey) Indexes() []ent.Index { func (ApiKey) Indexes() []ent.Index {
return []ent.Index{ return []ent.Index{
// key 字段已在 Fields() 中声明 Unique(),无需重复索引 // key 字段已在 Fields() 中声明 Unique(),无需重复索引
index.Fields("user_id"), index.Fields("user_id"),

View File

@@ -77,7 +77,7 @@ func (Group) Fields() []ent.Field {
func (Group) Edges() []ent.Edge { func (Group) Edges() []ent.Edge {
return []ent.Edge{ return []ent.Edge{
edge.To("api_keys", APIKey.Type), edge.To("api_keys", ApiKey.Type),
edge.To("redeem_codes", RedeemCode.Type), edge.To("redeem_codes", RedeemCode.Type),
edge.To("subscriptions", UserSubscription.Type), edge.To("subscriptions", UserSubscription.Type),
edge.To("usage_logs", UsageLog.Type), edge.To("usage_logs", UsageLog.Type),

View File

@@ -113,7 +113,7 @@ func (UsageLog) Edges() []ent.Edge {
Field("user_id"). Field("user_id").
Required(). Required().
Unique(), Unique(),
edge.From("api_key", APIKey.Type). edge.From("api_key", ApiKey.Type).
Ref("usage_logs"). Ref("usage_logs").
Field("api_key_id"). Field("api_key_id").
Required(). Required().

View File

@@ -66,7 +66,7 @@ func (User) Fields() []ent.Field {
func (User) Edges() []ent.Edge { func (User) Edges() []ent.Edge {
return []ent.Edge{ return []ent.Edge{
edge.To("api_keys", APIKey.Type), edge.To("api_keys", ApiKey.Type),
edge.To("redeem_codes", RedeemCode.Type), edge.To("redeem_codes", RedeemCode.Type),
edge.To("subscriptions", UserSubscription.Type), edge.To("subscriptions", UserSubscription.Type),
edge.To("assigned_subscriptions", UserSubscription.Type), edge.To("assigned_subscriptions", UserSubscription.Type),

View File

@@ -14,12 +14,12 @@ import (
// Tx is a transactional client that is created by calling Client.Tx(). // Tx is a transactional client that is created by calling Client.Tx().
type Tx struct { type Tx struct {
config config
// APIKey is the client for interacting with the APIKey builders.
APIKey *APIKeyClient
// Account is the client for interacting with the Account builders. // Account is the client for interacting with the Account builders.
Account *AccountClient Account *AccountClient
// AccountGroup is the client for interacting with the AccountGroup builders. // AccountGroup is the client for interacting with the AccountGroup builders.
AccountGroup *AccountGroupClient AccountGroup *AccountGroupClient
// ApiKey is the client for interacting with the ApiKey builders.
ApiKey *ApiKeyClient
// Group is the client for interacting with the Group builders. // Group is the client for interacting with the Group builders.
Group *GroupClient Group *GroupClient
// Proxy is the client for interacting with the Proxy builders. // Proxy is the client for interacting with the Proxy builders.
@@ -171,9 +171,9 @@ func (tx *Tx) Client() *Client {
} }
func (tx *Tx) init() { func (tx *Tx) init() {
tx.APIKey = NewAPIKeyClient(tx.config)
tx.Account = NewAccountClient(tx.config) tx.Account = NewAccountClient(tx.config)
tx.AccountGroup = NewAccountGroupClient(tx.config) tx.AccountGroup = NewAccountGroupClient(tx.config)
tx.ApiKey = NewApiKeyClient(tx.config)
tx.Group = NewGroupClient(tx.config) tx.Group = NewGroupClient(tx.config)
tx.Proxy = NewProxyClient(tx.config) tx.Proxy = NewProxyClient(tx.config)
tx.RedeemCode = NewRedeemCodeClient(tx.config) tx.RedeemCode = NewRedeemCodeClient(tx.config)
@@ -193,7 +193,7 @@ func (tx *Tx) init() {
// of them in order to commit or rollback the transaction. // of them in order to commit or rollback the transaction.
// //
// If a closed transaction is embedded in one of the generated entities, and the entity // If a closed transaction is embedded in one of the generated entities, and the entity
// applies a query, for example: APIKey.QueryXXX(), the query will be executed // applies a query, for example: Account.QueryXXX(), the query will be executed
// through the driver which created this transaction. // through the driver which created this transaction.
// //
// Note that txDriver is not goroutine safe. // Note that txDriver is not goroutine safe.

View File

@@ -83,7 +83,7 @@ type UsageLogEdges struct {
// User holds the value of the user edge. // User holds the value of the user edge.
User *User `json:"user,omitempty"` User *User `json:"user,omitempty"`
// APIKey holds the value of the api_key edge. // APIKey holds the value of the api_key edge.
APIKey *APIKey `json:"api_key,omitempty"` APIKey *ApiKey `json:"api_key,omitempty"`
// Account holds the value of the account edge. // Account holds the value of the account edge.
Account *Account `json:"account,omitempty"` Account *Account `json:"account,omitempty"`
// Group holds the value of the group edge. // Group holds the value of the group edge.
@@ -108,7 +108,7 @@ func (e UsageLogEdges) UserOrErr() (*User, error) {
// APIKeyOrErr returns the APIKey value or an error if the edge // APIKeyOrErr returns the APIKey value or an error if the edge
// was not loaded in eager-loading, or loaded but was not found. // was not loaded in eager-loading, or loaded but was not found.
func (e UsageLogEdges) APIKeyOrErr() (*APIKey, error) { func (e UsageLogEdges) APIKeyOrErr() (*ApiKey, error) {
if e.APIKey != nil { if e.APIKey != nil {
return e.APIKey, nil return e.APIKey, nil
} else if e.loadedTypes[1] { } else if e.loadedTypes[1] {
@@ -359,7 +359,7 @@ func (_m *UsageLog) QueryUser() *UserQuery {
} }
// QueryAPIKey queries the "api_key" edge of the UsageLog entity. // QueryAPIKey queries the "api_key" edge of the UsageLog entity.
func (_m *UsageLog) QueryAPIKey() *APIKeyQuery { func (_m *UsageLog) QueryAPIKey() *ApiKeyQuery {
return NewUsageLogClient(_m.config).QueryAPIKey(_m) return NewUsageLogClient(_m.config).QueryAPIKey(_m)
} }

View File

@@ -85,7 +85,7 @@ const (
UserColumn = "user_id" UserColumn = "user_id"
// APIKeyTable is the table that holds the api_key relation/edge. // APIKeyTable is the table that holds the api_key relation/edge.
APIKeyTable = "usage_logs" APIKeyTable = "usage_logs"
// APIKeyInverseTable is the table name for the APIKey entity. // APIKeyInverseTable is the table name for the ApiKey entity.
// It exists in this package in order to avoid circular dependency with the "apikey" package. // It exists in this package in order to avoid circular dependency with the "apikey" package.
APIKeyInverseTable = "api_keys" APIKeyInverseTable = "api_keys"
// APIKeyColumn is the table column denoting the api_key relation/edge. // APIKeyColumn is the table column denoting the api_key relation/edge.

View File

@@ -1175,7 +1175,7 @@ func HasAPIKey() predicate.UsageLog {
} }
// HasAPIKeyWith applies the HasEdge predicate on the "api_key" edge with a given conditions (other predicates). // HasAPIKeyWith applies the HasEdge predicate on the "api_key" edge with a given conditions (other predicates).
func HasAPIKeyWith(preds ...predicate.APIKey) predicate.UsageLog { func HasAPIKeyWith(preds ...predicate.ApiKey) predicate.UsageLog {
return predicate.UsageLog(func(s *sql.Selector) { return predicate.UsageLog(func(s *sql.Selector) {
step := newAPIKeyStep() step := newAPIKeyStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {

View File

@@ -342,8 +342,8 @@ func (_c *UsageLogCreate) SetUser(v *User) *UsageLogCreate {
return _c.SetUserID(v.ID) return _c.SetUserID(v.ID)
} }
// SetAPIKey sets the "api_key" edge to the APIKey entity. // SetAPIKey sets the "api_key" edge to the ApiKey entity.
func (_c *UsageLogCreate) SetAPIKey(v *APIKey) *UsageLogCreate { func (_c *UsageLogCreate) SetAPIKey(v *ApiKey) *UsageLogCreate {
return _c.SetAPIKeyID(v.ID) return _c.SetAPIKeyID(v.ID)
} }

View File

@@ -28,7 +28,7 @@ type UsageLogQuery struct {
inters []Interceptor inters []Interceptor
predicates []predicate.UsageLog predicates []predicate.UsageLog
withUser *UserQuery withUser *UserQuery
withAPIKey *APIKeyQuery withAPIKey *ApiKeyQuery
withAccount *AccountQuery withAccount *AccountQuery
withGroup *GroupQuery withGroup *GroupQuery
withSubscription *UserSubscriptionQuery withSubscription *UserSubscriptionQuery
@@ -91,8 +91,8 @@ func (_q *UsageLogQuery) QueryUser() *UserQuery {
} }
// QueryAPIKey chains the current query on the "api_key" edge. // QueryAPIKey chains the current query on the "api_key" edge.
func (_q *UsageLogQuery) QueryAPIKey() *APIKeyQuery { func (_q *UsageLogQuery) QueryAPIKey() *ApiKeyQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
return nil, err return nil, err
@@ -394,8 +394,8 @@ func (_q *UsageLogQuery) WithUser(opts ...func(*UserQuery)) *UsageLogQuery {
// WithAPIKey tells the query-builder to eager-load the nodes that are connected to // WithAPIKey tells the query-builder to eager-load the nodes that are connected to
// the "api_key" edge. The optional arguments are used to configure the query builder of the edge. // the "api_key" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *UsageLogQuery) WithAPIKey(opts ...func(*APIKeyQuery)) *UsageLogQuery { func (_q *UsageLogQuery) WithAPIKey(opts ...func(*ApiKeyQuery)) *UsageLogQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
} }
@@ -548,7 +548,7 @@ func (_q *UsageLogQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Usa
} }
if query := _q.withAPIKey; query != nil { if query := _q.withAPIKey; query != nil {
if err := _q.loadAPIKey(ctx, query, nodes, nil, if err := _q.loadAPIKey(ctx, query, nodes, nil,
func(n *UsageLog, e *APIKey) { n.Edges.APIKey = e }); err != nil { func(n *UsageLog, e *ApiKey) { n.Edges.APIKey = e }); err != nil {
return nil, err return nil, err
} }
} }
@@ -602,7 +602,7 @@ func (_q *UsageLogQuery) loadUser(ctx context.Context, query *UserQuery, nodes [
} }
return nil return nil
} }
func (_q *UsageLogQuery) loadAPIKey(ctx context.Context, query *APIKeyQuery, nodes []*UsageLog, init func(*UsageLog), assign func(*UsageLog, *APIKey)) error { func (_q *UsageLogQuery) loadAPIKey(ctx context.Context, query *ApiKeyQuery, nodes []*UsageLog, init func(*UsageLog), assign func(*UsageLog, *ApiKey)) error {
ids := make([]int64, 0, len(nodes)) ids := make([]int64, 0, len(nodes))
nodeids := make(map[int64][]*UsageLog) nodeids := make(map[int64][]*UsageLog)
for i := range nodes { for i := range nodes {

View File

@@ -509,8 +509,8 @@ func (_u *UsageLogUpdate) SetUser(v *User) *UsageLogUpdate {
return _u.SetUserID(v.ID) return _u.SetUserID(v.ID)
} }
// SetAPIKey sets the "api_key" edge to the APIKey entity. // SetAPIKey sets the "api_key" edge to the ApiKey entity.
func (_u *UsageLogUpdate) SetAPIKey(v *APIKey) *UsageLogUpdate { func (_u *UsageLogUpdate) SetAPIKey(v *ApiKey) *UsageLogUpdate {
return _u.SetAPIKeyID(v.ID) return _u.SetAPIKeyID(v.ID)
} }
@@ -540,7 +540,7 @@ func (_u *UsageLogUpdate) ClearUser() *UsageLogUpdate {
return _u return _u
} }
// ClearAPIKey clears the "api_key" edge to the APIKey entity. // ClearAPIKey clears the "api_key" edge to the ApiKey entity.
func (_u *UsageLogUpdate) ClearAPIKey() *UsageLogUpdate { func (_u *UsageLogUpdate) ClearAPIKey() *UsageLogUpdate {
_u.mutation.ClearAPIKey() _u.mutation.ClearAPIKey()
return _u return _u
@@ -1380,8 +1380,8 @@ func (_u *UsageLogUpdateOne) SetUser(v *User) *UsageLogUpdateOne {
return _u.SetUserID(v.ID) return _u.SetUserID(v.ID)
} }
// SetAPIKey sets the "api_key" edge to the APIKey entity. // SetAPIKey sets the "api_key" edge to the ApiKey entity.
func (_u *UsageLogUpdateOne) SetAPIKey(v *APIKey) *UsageLogUpdateOne { func (_u *UsageLogUpdateOne) SetAPIKey(v *ApiKey) *UsageLogUpdateOne {
return _u.SetAPIKeyID(v.ID) return _u.SetAPIKeyID(v.ID)
} }
@@ -1411,7 +1411,7 @@ func (_u *UsageLogUpdateOne) ClearUser() *UsageLogUpdateOne {
return _u return _u
} }
// ClearAPIKey clears the "api_key" edge to the APIKey entity. // ClearAPIKey clears the "api_key" edge to the ApiKey entity.
func (_u *UsageLogUpdateOne) ClearAPIKey() *UsageLogUpdateOne { func (_u *UsageLogUpdateOne) ClearAPIKey() *UsageLogUpdateOne {
_u.mutation.ClearAPIKey() _u.mutation.ClearAPIKey()
return _u return _u

View File

@@ -48,7 +48,7 @@ type User struct {
// UserEdges holds the relations/edges for other nodes in the graph. // UserEdges holds the relations/edges for other nodes in the graph.
type UserEdges struct { type UserEdges struct {
// APIKeys holds the value of the api_keys edge. // APIKeys holds the value of the api_keys edge.
APIKeys []*APIKey `json:"api_keys,omitempty"` APIKeys []*ApiKey `json:"api_keys,omitempty"`
// RedeemCodes holds the value of the redeem_codes edge. // RedeemCodes holds the value of the redeem_codes edge.
RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"` RedeemCodes []*RedeemCode `json:"redeem_codes,omitempty"`
// Subscriptions holds the value of the subscriptions edge. // Subscriptions holds the value of the subscriptions edge.
@@ -70,7 +70,7 @@ type UserEdges struct {
// APIKeysOrErr returns the APIKeys value or an error if the edge // APIKeysOrErr returns the APIKeys value or an error if the edge
// was not loaded in eager-loading. // was not loaded in eager-loading.
func (e UserEdges) APIKeysOrErr() ([]*APIKey, error) { func (e UserEdges) APIKeysOrErr() ([]*ApiKey, error) {
if e.loadedTypes[0] { if e.loadedTypes[0] {
return e.APIKeys, nil return e.APIKeys, nil
} }
@@ -255,7 +255,7 @@ func (_m *User) Value(name string) (ent.Value, error) {
} }
// QueryAPIKeys queries the "api_keys" edge of the User entity. // QueryAPIKeys queries the "api_keys" edge of the User entity.
func (_m *User) QueryAPIKeys() *APIKeyQuery { func (_m *User) QueryAPIKeys() *ApiKeyQuery {
return NewUserClient(_m.config).QueryAPIKeys(_m) return NewUserClient(_m.config).QueryAPIKeys(_m)
} }

View File

@@ -57,7 +57,7 @@ const (
Table = "users" Table = "users"
// APIKeysTable is the table that holds the api_keys relation/edge. // APIKeysTable is the table that holds the api_keys relation/edge.
APIKeysTable = "api_keys" APIKeysTable = "api_keys"
// APIKeysInverseTable is the table name for the APIKey entity. // APIKeysInverseTable is the table name for the ApiKey entity.
// It exists in this package in order to avoid circular dependency with the "apikey" package. // It exists in this package in order to avoid circular dependency with the "apikey" package.
APIKeysInverseTable = "api_keys" APIKeysInverseTable = "api_keys"
// APIKeysColumn is the table column denoting the api_keys relation/edge. // APIKeysColumn is the table column denoting the api_keys relation/edge.

View File

@@ -722,7 +722,7 @@ func HasAPIKeys() predicate.User {
} }
// HasAPIKeysWith applies the HasEdge predicate on the "api_keys" edge with a given conditions (other predicates). // HasAPIKeysWith applies the HasEdge predicate on the "api_keys" edge with a given conditions (other predicates).
func HasAPIKeysWith(preds ...predicate.APIKey) predicate.User { func HasAPIKeysWith(preds ...predicate.ApiKey) predicate.User {
return predicate.User(func(s *sql.Selector) { return predicate.User(func(s *sql.Selector) {
step := newAPIKeysStep() step := newAPIKeysStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {

View File

@@ -166,14 +166,14 @@ func (_c *UserCreate) SetNillableNotes(v *string) *UserCreate {
return _c return _c
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_c *UserCreate) AddAPIKeyIDs(ids ...int64) *UserCreate { func (_c *UserCreate) AddAPIKeyIDs(ids ...int64) *UserCreate {
_c.mutation.AddAPIKeyIDs(ids...) _c.mutation.AddAPIKeyIDs(ids...)
return _c return _c
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_c *UserCreate) AddAPIKeys(v ...*APIKey) *UserCreate { func (_c *UserCreate) AddAPIKeys(v ...*ApiKey) *UserCreate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID

View File

@@ -30,7 +30,7 @@ type UserQuery struct {
order []user.OrderOption order []user.OrderOption
inters []Interceptor inters []Interceptor
predicates []predicate.User predicates []predicate.User
withAPIKeys *APIKeyQuery withAPIKeys *ApiKeyQuery
withRedeemCodes *RedeemCodeQuery withRedeemCodes *RedeemCodeQuery
withSubscriptions *UserSubscriptionQuery withSubscriptions *UserSubscriptionQuery
withAssignedSubscriptions *UserSubscriptionQuery withAssignedSubscriptions *UserSubscriptionQuery
@@ -75,8 +75,8 @@ func (_q *UserQuery) Order(o ...user.OrderOption) *UserQuery {
} }
// QueryAPIKeys chains the current query on the "api_keys" edge. // QueryAPIKeys chains the current query on the "api_keys" edge.
func (_q *UserQuery) QueryAPIKeys() *APIKeyQuery { func (_q *UserQuery) QueryAPIKeys() *ApiKeyQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil { if err := _q.prepareQuery(ctx); err != nil {
return nil, err return nil, err
@@ -458,8 +458,8 @@ func (_q *UserQuery) Clone() *UserQuery {
// WithAPIKeys tells the query-builder to eager-load the nodes that are connected to // WithAPIKeys tells the query-builder to eager-load the nodes that are connected to
// the "api_keys" edge. The optional arguments are used to configure the query builder of the edge. // the "api_keys" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *UserQuery) WithAPIKeys(opts ...func(*APIKeyQuery)) *UserQuery { func (_q *UserQuery) WithAPIKeys(opts ...func(*ApiKeyQuery)) *UserQuery {
query := (&APIKeyClient{config: _q.config}).Query() query := (&ApiKeyClient{config: _q.config}).Query()
for _, opt := range opts { for _, opt := range opts {
opt(query) opt(query)
} }
@@ -653,8 +653,8 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e
} }
if query := _q.withAPIKeys; query != nil { if query := _q.withAPIKeys; query != nil {
if err := _q.loadAPIKeys(ctx, query, nodes, if err := _q.loadAPIKeys(ctx, query, nodes,
func(n *User) { n.Edges.APIKeys = []*APIKey{} }, func(n *User) { n.Edges.APIKeys = []*ApiKey{} },
func(n *User, e *APIKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil { func(n *User, e *ApiKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil {
return nil, err return nil, err
} }
} }
@@ -712,7 +712,7 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e
return nodes, nil return nodes, nil
} }
func (_q *UserQuery) loadAPIKeys(ctx context.Context, query *APIKeyQuery, nodes []*User, init func(*User), assign func(*User, *APIKey)) error { func (_q *UserQuery) loadAPIKeys(ctx context.Context, query *ApiKeyQuery, nodes []*User, init func(*User), assign func(*User, *ApiKey)) error {
fks := make([]driver.Value, 0, len(nodes)) fks := make([]driver.Value, 0, len(nodes))
nodeids := make(map[int64]*User) nodeids := make(map[int64]*User)
for i := range nodes { for i := range nodes {
@@ -725,7 +725,7 @@ func (_q *UserQuery) loadAPIKeys(ctx context.Context, query *APIKeyQuery, nodes
if len(query.ctx.Fields) > 0 { if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(apikey.FieldUserID) query.ctx.AppendFieldOnce(apikey.FieldUserID)
} }
query.Where(predicate.APIKey(func(s *sql.Selector) { query.Where(predicate.ApiKey(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(user.APIKeysColumn), fks...)) s.Where(sql.InValues(s.C(user.APIKeysColumn), fks...))
})) }))
neighbors, err := query.All(ctx) neighbors, err := query.All(ctx)

View File

@@ -186,14 +186,14 @@ func (_u *UserUpdate) SetNillableNotes(v *string) *UserUpdate {
return _u return _u
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_u *UserUpdate) AddAPIKeyIDs(ids ...int64) *UserUpdate { func (_u *UserUpdate) AddAPIKeyIDs(ids ...int64) *UserUpdate {
_u.mutation.AddAPIKeyIDs(ids...) _u.mutation.AddAPIKeyIDs(ids...)
return _u return _u
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_u *UserUpdate) AddAPIKeys(v ...*APIKey) *UserUpdate { func (_u *UserUpdate) AddAPIKeys(v ...*ApiKey) *UserUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -296,20 +296,20 @@ func (_u *UserUpdate) Mutation() *UserMutation {
return _u.mutation return _u.mutation
} }
// ClearAPIKeys clears all "api_keys" edges to the APIKey entity. // ClearAPIKeys clears all "api_keys" edges to the ApiKey entity.
func (_u *UserUpdate) ClearAPIKeys() *UserUpdate { func (_u *UserUpdate) ClearAPIKeys() *UserUpdate {
_u.mutation.ClearAPIKeys() _u.mutation.ClearAPIKeys()
return _u return _u
} }
// RemoveAPIKeyIDs removes the "api_keys" edge to APIKey entities by IDs. // RemoveAPIKeyIDs removes the "api_keys" edge to ApiKey entities by IDs.
func (_u *UserUpdate) RemoveAPIKeyIDs(ids ...int64) *UserUpdate { func (_u *UserUpdate) RemoveAPIKeyIDs(ids ...int64) *UserUpdate {
_u.mutation.RemoveAPIKeyIDs(ids...) _u.mutation.RemoveAPIKeyIDs(ids...)
return _u return _u
} }
// RemoveAPIKeys removes "api_keys" edges to APIKey entities. // RemoveAPIKeys removes "api_keys" edges to ApiKey entities.
func (_u *UserUpdate) RemoveAPIKeys(v ...*APIKey) *UserUpdate { func (_u *UserUpdate) RemoveAPIKeys(v ...*ApiKey) *UserUpdate {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -1065,14 +1065,14 @@ func (_u *UserUpdateOne) SetNillableNotes(v *string) *UserUpdateOne {
return _u return _u
} }
// AddAPIKeyIDs adds the "api_keys" edge to the APIKey entity by IDs. // AddAPIKeyIDs adds the "api_keys" edge to the ApiKey entity by IDs.
func (_u *UserUpdateOne) AddAPIKeyIDs(ids ...int64) *UserUpdateOne { func (_u *UserUpdateOne) AddAPIKeyIDs(ids ...int64) *UserUpdateOne {
_u.mutation.AddAPIKeyIDs(ids...) _u.mutation.AddAPIKeyIDs(ids...)
return _u return _u
} }
// AddAPIKeys adds the "api_keys" edges to the APIKey entity. // AddAPIKeys adds the "api_keys" edges to the ApiKey entity.
func (_u *UserUpdateOne) AddAPIKeys(v ...*APIKey) *UserUpdateOne { func (_u *UserUpdateOne) AddAPIKeys(v ...*ApiKey) *UserUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID
@@ -1175,20 +1175,20 @@ func (_u *UserUpdateOne) Mutation() *UserMutation {
return _u.mutation return _u.mutation
} }
// ClearAPIKeys clears all "api_keys" edges to the APIKey entity. // ClearAPIKeys clears all "api_keys" edges to the ApiKey entity.
func (_u *UserUpdateOne) ClearAPIKeys() *UserUpdateOne { func (_u *UserUpdateOne) ClearAPIKeys() *UserUpdateOne {
_u.mutation.ClearAPIKeys() _u.mutation.ClearAPIKeys()
return _u return _u
} }
// RemoveAPIKeyIDs removes the "api_keys" edge to APIKey entities by IDs. // RemoveAPIKeyIDs removes the "api_keys" edge to ApiKey entities by IDs.
func (_u *UserUpdateOne) RemoveAPIKeyIDs(ids ...int64) *UserUpdateOne { func (_u *UserUpdateOne) RemoveAPIKeyIDs(ids ...int64) *UserUpdateOne {
_u.mutation.RemoveAPIKeyIDs(ids...) _u.mutation.RemoveAPIKeyIDs(ids...)
return _u return _u
} }
// RemoveAPIKeys removes "api_keys" edges to APIKey entities. // RemoveAPIKeys removes "api_keys" edges to ApiKey entities.
func (_u *UserUpdateOne) RemoveAPIKeys(v ...*APIKey) *UserUpdateOne { func (_u *UserUpdateOne) RemoveAPIKeys(v ...*ApiKey) *UserUpdateOne {
ids := make([]int64, len(v)) ids := make([]int64, len(v))
for i := range v { for i := range v {
ids[i] = v[i].ID ids[i] = v[i].ID

View File

@@ -69,7 +69,6 @@ require (
github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-querystring v1.1.0 // indirect
github.com/google/subcommands v1.2.0 // indirect github.com/google/subcommands v1.2.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/hcl/v2 v2.18.1 // indirect github.com/hashicorp/hcl/v2 v2.18.1 // indirect

View File

@@ -118,8 +118,6 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4=
github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=

View File

@@ -1,4 +1,3 @@
// Package config provides application configuration management.
package config package config
import ( import (
@@ -140,7 +139,7 @@ type GatewayConfig struct {
LogUpstreamErrorBodyMaxBytes int `mapstructure:"log_upstream_error_body_max_bytes"` LogUpstreamErrorBodyMaxBytes int `mapstructure:"log_upstream_error_body_max_bytes"`
// API-key 账号在客户端未提供 anthropic-beta 时,是否按需自动补齐(默认关闭以保持兼容) // API-key 账号在客户端未提供 anthropic-beta 时,是否按需自动补齐(默认关闭以保持兼容)
InjectBetaForAPIKey bool `mapstructure:"inject_beta_for_apikey"` InjectBetaForApiKey bool `mapstructure:"inject_beta_for_apikey"`
// 是否允许对部分 400 错误触发 failover默认关闭以避免改变语义 // 是否允许对部分 400 错误触发 failover默认关闭以避免改变语义
FailoverOn400 bool `mapstructure:"failover_on_400"` FailoverOn400 bool `mapstructure:"failover_on_400"`
@@ -242,7 +241,7 @@ type DefaultConfig struct {
AdminPassword string `mapstructure:"admin_password"` AdminPassword string `mapstructure:"admin_password"`
UserConcurrency int `mapstructure:"user_concurrency"` UserConcurrency int `mapstructure:"user_concurrency"`
UserBalance float64 `mapstructure:"user_balance"` UserBalance float64 `mapstructure:"user_balance"`
APIKeyPrefix string `mapstructure:"api_key_prefix"` ApiKeyPrefix string `mapstructure:"api_key_prefix"`
RateMultiplier float64 `mapstructure:"rate_multiplier"` RateMultiplier float64 `mapstructure:"rate_multiplier"`
} }

View File

@@ -1,4 +1,3 @@
// Package config provides application configuration management.
package config package config
import "github.com/google/wire" import "github.com/google/wire"

View File

@@ -1,5 +1,3 @@
// Package admin provides HTTP handlers for administrative operations including
// dashboard statistics, user management, API key management, and account management.
package admin package admin
import ( import (
@@ -77,8 +75,8 @@ func (h *DashboardHandler) GetStats(c *gin.Context) {
"active_users": stats.ActiveUsers, "active_users": stats.ActiveUsers,
// API Key 统计 // API Key 统计
"total_api_keys": stats.TotalAPIKeys, "total_api_keys": stats.TotalApiKeys,
"active_api_keys": stats.ActiveAPIKeys, "active_api_keys": stats.ActiveApiKeys,
// 账户统计 // 账户统计
"total_accounts": stats.TotalAccounts, "total_accounts": stats.TotalAccounts,
@@ -195,10 +193,10 @@ func (h *DashboardHandler) GetModelStats(c *gin.Context) {
}) })
} }
// GetAPIKeyUsageTrend handles getting API key usage trend data // GetApiKeyUsageTrend handles getting API key usage trend data
// GET /api/v1/admin/dashboard/api-keys-trend // GET /api/v1/admin/dashboard/api-keys-trend
// Query params: start_date, end_date (YYYY-MM-DD), granularity (day/hour), limit (default 5) // Query params: start_date, end_date (YYYY-MM-DD), granularity (day/hour), limit (default 5)
func (h *DashboardHandler) GetAPIKeyUsageTrend(c *gin.Context) { func (h *DashboardHandler) GetApiKeyUsageTrend(c *gin.Context) {
startTime, endTime := parseTimeRange(c) startTime, endTime := parseTimeRange(c)
granularity := c.DefaultQuery("granularity", "day") granularity := c.DefaultQuery("granularity", "day")
limitStr := c.DefaultQuery("limit", "5") limitStr := c.DefaultQuery("limit", "5")
@@ -207,7 +205,7 @@ func (h *DashboardHandler) GetAPIKeyUsageTrend(c *gin.Context) {
limit = 5 limit = 5
} }
trend, err := h.dashboardService.GetAPIKeyUsageTrend(c.Request.Context(), startTime, endTime, granularity, limit) trend, err := h.dashboardService.GetApiKeyUsageTrend(c.Request.Context(), startTime, endTime, granularity, limit)
if err != nil { if err != nil {
response.Error(c, 500, "Failed to get API key usage trend") response.Error(c, 500, "Failed to get API key usage trend")
return return
@@ -275,26 +273,26 @@ func (h *DashboardHandler) GetBatchUsersUsage(c *gin.Context) {
response.Success(c, gin.H{"stats": stats}) response.Success(c, gin.H{"stats": stats})
} }
// BatchAPIKeysUsageRequest represents the request body for batch api key usage stats // BatchApiKeysUsageRequest represents the request body for batch api key usage stats
type BatchAPIKeysUsageRequest struct { type BatchApiKeysUsageRequest struct {
APIKeyIDs []int64 `json:"api_key_ids" binding:"required"` ApiKeyIDs []int64 `json:"api_key_ids" binding:"required"`
} }
// GetBatchAPIKeysUsage handles getting usage stats for multiple API keys // GetBatchApiKeysUsage handles getting usage stats for multiple API keys
// POST /api/v1/admin/dashboard/api-keys-usage // POST /api/v1/admin/dashboard/api-keys-usage
func (h *DashboardHandler) GetBatchAPIKeysUsage(c *gin.Context) { func (h *DashboardHandler) GetBatchApiKeysUsage(c *gin.Context) {
var req BatchAPIKeysUsageRequest var req BatchApiKeysUsageRequest
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "Invalid request: "+err.Error()) response.BadRequest(c, "Invalid request: "+err.Error())
return return
} }
if len(req.APIKeyIDs) == 0 { if len(req.ApiKeyIDs) == 0 {
response.Success(c, gin.H{"stats": map[string]any{}}) response.Success(c, gin.H{"stats": map[string]any{}})
return return
} }
stats, err := h.dashboardService.GetBatchAPIKeyUsageStats(c.Request.Context(), req.APIKeyIDs) stats, err := h.dashboardService.GetBatchApiKeyUsageStats(c.Request.Context(), req.ApiKeyIDs)
if err != nil { if err != nil {
response.Error(c, 500, "Failed to get API key usage stats") response.Error(c, 500, "Failed to get API key usage stats")
return return

View File

@@ -237,9 +237,9 @@ func (h *GroupHandler) GetGroupAPIKeys(c *gin.Context) {
return return
} }
outKeys := make([]dto.APIKey, 0, len(keys)) outKeys := make([]dto.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
outKeys = append(outKeys, *dto.APIKeyFromService(&keys[i])) outKeys = append(outKeys, *dto.ApiKeyFromService(&keys[i]))
} }
response.Paginated(c, outKeys, total, page, pageSize) response.Paginated(c, outKeys, total, page, pageSize)
} }

View File

@@ -36,24 +36,29 @@ func (h *SettingHandler) GetSettings(c *gin.Context) {
response.Success(c, dto.SystemSettings{ response.Success(c, dto.SystemSettings{
RegistrationEnabled: settings.RegistrationEnabled, RegistrationEnabled: settings.RegistrationEnabled,
EmailVerifyEnabled: settings.EmailVerifyEnabled, EmailVerifyEnabled: settings.EmailVerifyEnabled,
SMTPHost: settings.SMTPHost, SmtpHost: settings.SmtpHost,
SMTPPort: settings.SMTPPort, SmtpPort: settings.SmtpPort,
SMTPUsername: settings.SMTPUsername, SmtpUsername: settings.SmtpUsername,
SMTPPassword: settings.SMTPPassword, SmtpPassword: settings.SmtpPassword,
SMTPFrom: settings.SMTPFrom, SmtpFrom: settings.SmtpFrom,
SMTPFromName: settings.SMTPFromName, SmtpFromName: settings.SmtpFromName,
SMTPUseTLS: settings.SMTPUseTLS, SmtpUseTLS: settings.SmtpUseTLS,
TurnstileEnabled: settings.TurnstileEnabled, TurnstileEnabled: settings.TurnstileEnabled,
TurnstileSiteKey: settings.TurnstileSiteKey, TurnstileSiteKey: settings.TurnstileSiteKey,
TurnstileSecretKey: settings.TurnstileSecretKey, TurnstileSecretKey: settings.TurnstileSecretKey,
SiteName: settings.SiteName, SiteName: settings.SiteName,
SiteLogo: settings.SiteLogo, SiteLogo: settings.SiteLogo,
SiteSubtitle: settings.SiteSubtitle, SiteSubtitle: settings.SiteSubtitle,
APIBaseURL: settings.APIBaseURL, ApiBaseUrl: settings.ApiBaseUrl,
ContactInfo: settings.ContactInfo, ContactInfo: settings.ContactInfo,
DocURL: settings.DocURL, DocUrl: settings.DocUrl,
DefaultConcurrency: settings.DefaultConcurrency, DefaultConcurrency: settings.DefaultConcurrency,
DefaultBalance: settings.DefaultBalance, DefaultBalance: settings.DefaultBalance,
EnableModelFallback: settings.EnableModelFallback,
FallbackModelAnthropic: settings.FallbackModelAnthropic,
FallbackModelOpenAI: settings.FallbackModelOpenAI,
FallbackModelGemini: settings.FallbackModelGemini,
FallbackModelAntigravity: settings.FallbackModelAntigravity,
}) })
} }
@@ -64,13 +69,13 @@ type UpdateSettingsRequest struct {
EmailVerifyEnabled bool `json:"email_verify_enabled"` EmailVerifyEnabled bool `json:"email_verify_enabled"`
// 邮件服务设置 // 邮件服务设置
SMTPHost string `json:"smtp_host"` SmtpHost string `json:"smtp_host"`
SMTPPort int `json:"smtp_port"` SmtpPort int `json:"smtp_port"`
SMTPUsername string `json:"smtp_username"` SmtpUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password"` SmtpPassword string `json:"smtp_password"`
SMTPFrom string `json:"smtp_from_email"` SmtpFrom string `json:"smtp_from_email"`
SMTPFromName string `json:"smtp_from_name"` SmtpFromName string `json:"smtp_from_name"`
SMTPUseTLS bool `json:"smtp_use_tls"` SmtpUseTLS bool `json:"smtp_use_tls"`
// Cloudflare Turnstile 设置 // Cloudflare Turnstile 设置
TurnstileEnabled bool `json:"turnstile_enabled"` TurnstileEnabled bool `json:"turnstile_enabled"`
@@ -81,13 +86,20 @@ type UpdateSettingsRequest struct {
SiteName string `json:"site_name"` SiteName string `json:"site_name"`
SiteLogo string `json:"site_logo"` SiteLogo string `json:"site_logo"`
SiteSubtitle string `json:"site_subtitle"` SiteSubtitle string `json:"site_subtitle"`
APIBaseURL string `json:"api_base_url"` ApiBaseUrl string `json:"api_base_url"`
ContactInfo string `json:"contact_info"` ContactInfo string `json:"contact_info"`
DocURL string `json:"doc_url"` DocUrl string `json:"doc_url"`
// 默认配置 // 默认配置
DefaultConcurrency int `json:"default_concurrency"` DefaultConcurrency int `json:"default_concurrency"`
DefaultBalance float64 `json:"default_balance"` DefaultBalance float64 `json:"default_balance"`
// Model fallback configuration
EnableModelFallback bool `json:"enable_model_fallback"`
FallbackModelAnthropic string `json:"fallback_model_anthropic"`
FallbackModelOpenAI string `json:"fallback_model_openai"`
FallbackModelGemini string `json:"fallback_model_gemini"`
FallbackModelAntigravity string `json:"fallback_model_antigravity"`
} }
// UpdateSettings 更新系统设置 // UpdateSettings 更新系统设置
@@ -106,8 +118,8 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
if req.DefaultBalance < 0 { if req.DefaultBalance < 0 {
req.DefaultBalance = 0 req.DefaultBalance = 0
} }
if req.SMTPPort <= 0 { if req.SmtpPort <= 0 {
req.SMTPPort = 587 req.SmtpPort = 587
} }
// Turnstile 参数验证 // Turnstile 参数验证
@@ -143,24 +155,29 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
settings := &service.SystemSettings{ settings := &service.SystemSettings{
RegistrationEnabled: req.RegistrationEnabled, RegistrationEnabled: req.RegistrationEnabled,
EmailVerifyEnabled: req.EmailVerifyEnabled, EmailVerifyEnabled: req.EmailVerifyEnabled,
SMTPHost: req.SMTPHost, SmtpHost: req.SmtpHost,
SMTPPort: req.SMTPPort, SmtpPort: req.SmtpPort,
SMTPUsername: req.SMTPUsername, SmtpUsername: req.SmtpUsername,
SMTPPassword: req.SMTPPassword, SmtpPassword: req.SmtpPassword,
SMTPFrom: req.SMTPFrom, SmtpFrom: req.SmtpFrom,
SMTPFromName: req.SMTPFromName, SmtpFromName: req.SmtpFromName,
SMTPUseTLS: req.SMTPUseTLS, SmtpUseTLS: req.SmtpUseTLS,
TurnstileEnabled: req.TurnstileEnabled, TurnstileEnabled: req.TurnstileEnabled,
TurnstileSiteKey: req.TurnstileSiteKey, TurnstileSiteKey: req.TurnstileSiteKey,
TurnstileSecretKey: req.TurnstileSecretKey, TurnstileSecretKey: req.TurnstileSecretKey,
SiteName: req.SiteName, SiteName: req.SiteName,
SiteLogo: req.SiteLogo, SiteLogo: req.SiteLogo,
SiteSubtitle: req.SiteSubtitle, SiteSubtitle: req.SiteSubtitle,
APIBaseURL: req.APIBaseURL, ApiBaseUrl: req.ApiBaseUrl,
ContactInfo: req.ContactInfo, ContactInfo: req.ContactInfo,
DocURL: req.DocURL, DocUrl: req.DocUrl,
DefaultConcurrency: req.DefaultConcurrency, DefaultConcurrency: req.DefaultConcurrency,
DefaultBalance: req.DefaultBalance, DefaultBalance: req.DefaultBalance,
EnableModelFallback: req.EnableModelFallback,
FallbackModelAnthropic: req.FallbackModelAnthropic,
FallbackModelOpenAI: req.FallbackModelOpenAI,
FallbackModelGemini: req.FallbackModelGemini,
FallbackModelAntigravity: req.FallbackModelAntigravity,
} }
if err := h.settingService.UpdateSettings(c.Request.Context(), settings); err != nil { if err := h.settingService.UpdateSettings(c.Request.Context(), settings); err != nil {
@@ -178,67 +195,72 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
response.Success(c, dto.SystemSettings{ response.Success(c, dto.SystemSettings{
RegistrationEnabled: updatedSettings.RegistrationEnabled, RegistrationEnabled: updatedSettings.RegistrationEnabled,
EmailVerifyEnabled: updatedSettings.EmailVerifyEnabled, EmailVerifyEnabled: updatedSettings.EmailVerifyEnabled,
SMTPHost: updatedSettings.SMTPHost, SmtpHost: updatedSettings.SmtpHost,
SMTPPort: updatedSettings.SMTPPort, SmtpPort: updatedSettings.SmtpPort,
SMTPUsername: updatedSettings.SMTPUsername, SmtpUsername: updatedSettings.SmtpUsername,
SMTPPassword: updatedSettings.SMTPPassword, SmtpPassword: updatedSettings.SmtpPassword,
SMTPFrom: updatedSettings.SMTPFrom, SmtpFrom: updatedSettings.SmtpFrom,
SMTPFromName: updatedSettings.SMTPFromName, SmtpFromName: updatedSettings.SmtpFromName,
SMTPUseTLS: updatedSettings.SMTPUseTLS, SmtpUseTLS: updatedSettings.SmtpUseTLS,
TurnstileEnabled: updatedSettings.TurnstileEnabled, TurnstileEnabled: updatedSettings.TurnstileEnabled,
TurnstileSiteKey: updatedSettings.TurnstileSiteKey, TurnstileSiteKey: updatedSettings.TurnstileSiteKey,
TurnstileSecretKey: updatedSettings.TurnstileSecretKey, TurnstileSecretKey: updatedSettings.TurnstileSecretKey,
SiteName: updatedSettings.SiteName, SiteName: updatedSettings.SiteName,
SiteLogo: updatedSettings.SiteLogo, SiteLogo: updatedSettings.SiteLogo,
SiteSubtitle: updatedSettings.SiteSubtitle, SiteSubtitle: updatedSettings.SiteSubtitle,
APIBaseURL: updatedSettings.APIBaseURL, ApiBaseUrl: updatedSettings.ApiBaseUrl,
ContactInfo: updatedSettings.ContactInfo, ContactInfo: updatedSettings.ContactInfo,
DocURL: updatedSettings.DocURL, DocUrl: updatedSettings.DocUrl,
DefaultConcurrency: updatedSettings.DefaultConcurrency, DefaultConcurrency: updatedSettings.DefaultConcurrency,
DefaultBalance: updatedSettings.DefaultBalance, DefaultBalance: updatedSettings.DefaultBalance,
EnableModelFallback: updatedSettings.EnableModelFallback,
FallbackModelAnthropic: updatedSettings.FallbackModelAnthropic,
FallbackModelOpenAI: updatedSettings.FallbackModelOpenAI,
FallbackModelGemini: updatedSettings.FallbackModelGemini,
FallbackModelAntigravity: updatedSettings.FallbackModelAntigravity,
}) })
} }
// TestSMTPRequest 测试SMTP连接请求 // TestSmtpRequest 测试SMTP连接请求
type TestSMTPRequest struct { type TestSmtpRequest struct {
SMTPHost string `json:"smtp_host" binding:"required"` SmtpHost string `json:"smtp_host" binding:"required"`
SMTPPort int `json:"smtp_port"` SmtpPort int `json:"smtp_port"`
SMTPUsername string `json:"smtp_username"` SmtpUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password"` SmtpPassword string `json:"smtp_password"`
SMTPUseTLS bool `json:"smtp_use_tls"` SmtpUseTLS bool `json:"smtp_use_tls"`
} }
// TestSMTPConnection 测试SMTP连接 // TestSmtpConnection 测试SMTP连接
// POST /api/v1/admin/settings/test-smtp // POST /api/v1/admin/settings/test-smtp
func (h *SettingHandler) TestSMTPConnection(c *gin.Context) { func (h *SettingHandler) TestSmtpConnection(c *gin.Context) {
var req TestSMTPRequest var req TestSmtpRequest
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "Invalid request: "+err.Error()) response.BadRequest(c, "Invalid request: "+err.Error())
return return
} }
if req.SMTPPort <= 0 { if req.SmtpPort <= 0 {
req.SMTPPort = 587 req.SmtpPort = 587
} }
// 如果未提供密码,从数据库获取已保存的密码 // 如果未提供密码,从数据库获取已保存的密码
password := req.SMTPPassword password := req.SmtpPassword
if password == "" { if password == "" {
savedConfig, err := h.emailService.GetSMTPConfig(c.Request.Context()) savedConfig, err := h.emailService.GetSmtpConfig(c.Request.Context())
if err == nil && savedConfig != nil { if err == nil && savedConfig != nil {
password = savedConfig.Password password = savedConfig.Password
} }
} }
config := &service.SMTPConfig{ config := &service.SmtpConfig{
Host: req.SMTPHost, Host: req.SmtpHost,
Port: req.SMTPPort, Port: req.SmtpPort,
Username: req.SMTPUsername, Username: req.SmtpUsername,
Password: password, Password: password,
UseTLS: req.SMTPUseTLS, UseTLS: req.SmtpUseTLS,
} }
err := h.emailService.TestSMTPConnectionWithConfig(config) err := h.emailService.TestSmtpConnectionWithConfig(config)
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
@@ -250,13 +272,13 @@ func (h *SettingHandler) TestSMTPConnection(c *gin.Context) {
// SendTestEmailRequest 发送测试邮件请求 // SendTestEmailRequest 发送测试邮件请求
type SendTestEmailRequest struct { type SendTestEmailRequest struct {
Email string `json:"email" binding:"required,email"` Email string `json:"email" binding:"required,email"`
SMTPHost string `json:"smtp_host" binding:"required"` SmtpHost string `json:"smtp_host" binding:"required"`
SMTPPort int `json:"smtp_port"` SmtpPort int `json:"smtp_port"`
SMTPUsername string `json:"smtp_username"` SmtpUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password"` SmtpPassword string `json:"smtp_password"`
SMTPFrom string `json:"smtp_from_email"` SmtpFrom string `json:"smtp_from_email"`
SMTPFromName string `json:"smtp_from_name"` SmtpFromName string `json:"smtp_from_name"`
SMTPUseTLS bool `json:"smtp_use_tls"` SmtpUseTLS bool `json:"smtp_use_tls"`
} }
// SendTestEmail 发送测试邮件 // SendTestEmail 发送测试邮件
@@ -268,27 +290,27 @@ func (h *SettingHandler) SendTestEmail(c *gin.Context) {
return return
} }
if req.SMTPPort <= 0 { if req.SmtpPort <= 0 {
req.SMTPPort = 587 req.SmtpPort = 587
} }
// 如果未提供密码,从数据库获取已保存的密码 // 如果未提供密码,从数据库获取已保存的密码
password := req.SMTPPassword password := req.SmtpPassword
if password == "" { if password == "" {
savedConfig, err := h.emailService.GetSMTPConfig(c.Request.Context()) savedConfig, err := h.emailService.GetSmtpConfig(c.Request.Context())
if err == nil && savedConfig != nil { if err == nil && savedConfig != nil {
password = savedConfig.Password password = savedConfig.Password
} }
} }
config := &service.SMTPConfig{ config := &service.SmtpConfig{
Host: req.SMTPHost, Host: req.SmtpHost,
Port: req.SMTPPort, Port: req.SmtpPort,
Username: req.SMTPUsername, Username: req.SmtpUsername,
Password: password, Password: password,
From: req.SMTPFrom, From: req.SmtpFrom,
FromName: req.SMTPFromName, FromName: req.SmtpFromName,
UseTLS: req.SMTPUseTLS, UseTLS: req.SmtpUseTLS,
} }
siteName := h.settingService.GetSiteName(c.Request.Context()) siteName := h.settingService.GetSiteName(c.Request.Context())
@@ -333,10 +355,10 @@ func (h *SettingHandler) SendTestEmail(c *gin.Context) {
response.Success(c, gin.H{"message": "Test email sent successfully"}) response.Success(c, gin.H{"message": "Test email sent successfully"})
} }
// GetAdminAPIKey 获取管理员 API Key 状态 // GetAdminApiKey 获取管理员 API Key 状态
// GET /api/v1/admin/settings/admin-api-key // GET /api/v1/admin/settings/admin-api-key
func (h *SettingHandler) GetAdminAPIKey(c *gin.Context) { func (h *SettingHandler) GetAdminApiKey(c *gin.Context) {
maskedKey, exists, err := h.settingService.GetAdminAPIKeyStatus(c.Request.Context()) maskedKey, exists, err := h.settingService.GetAdminApiKeyStatus(c.Request.Context())
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
@@ -348,10 +370,10 @@ func (h *SettingHandler) GetAdminAPIKey(c *gin.Context) {
}) })
} }
// RegenerateAdminAPIKey 生成/重新生成管理员 API Key // RegenerateAdminApiKey 生成/重新生成管理员 API Key
// POST /api/v1/admin/settings/admin-api-key/regenerate // POST /api/v1/admin/settings/admin-api-key/regenerate
func (h *SettingHandler) RegenerateAdminAPIKey(c *gin.Context) { func (h *SettingHandler) RegenerateAdminApiKey(c *gin.Context) {
key, err := h.settingService.GenerateAdminAPIKey(c.Request.Context()) key, err := h.settingService.GenerateAdminApiKey(c.Request.Context())
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
@@ -362,10 +384,10 @@ func (h *SettingHandler) RegenerateAdminAPIKey(c *gin.Context) {
}) })
} }
// DeleteAdminAPIKey 删除管理员 API Key // DeleteAdminApiKey 删除管理员 API Key
// DELETE /api/v1/admin/settings/admin-api-key // DELETE /api/v1/admin/settings/admin-api-key
func (h *SettingHandler) DeleteAdminAPIKey(c *gin.Context) { func (h *SettingHandler) DeleteAdminApiKey(c *gin.Context) {
if err := h.settingService.DeleteAdminAPIKey(c.Request.Context()); err != nil { if err := h.settingService.DeleteAdminApiKey(c.Request.Context()); err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
} }

View File

@@ -17,14 +17,14 @@ import (
// UsageHandler handles admin usage-related requests // UsageHandler handles admin usage-related requests
type UsageHandler struct { type UsageHandler struct {
usageService *service.UsageService usageService *service.UsageService
apiKeyService *service.APIKeyService apiKeyService *service.ApiKeyService
adminService service.AdminService adminService service.AdminService
} }
// NewUsageHandler creates a new admin usage handler // NewUsageHandler creates a new admin usage handler
func NewUsageHandler( func NewUsageHandler(
usageService *service.UsageService, usageService *service.UsageService,
apiKeyService *service.APIKeyService, apiKeyService *service.ApiKeyService,
adminService service.AdminService, adminService service.AdminService,
) *UsageHandler { ) *UsageHandler {
return &UsageHandler{ return &UsageHandler{
@@ -125,7 +125,7 @@ func (h *UsageHandler) List(c *gin.Context) {
params := pagination.PaginationParams{Page: page, PageSize: pageSize} params := pagination.PaginationParams{Page: page, PageSize: pageSize}
filters := usagestats.UsageLogFilters{ filters := usagestats.UsageLogFilters{
UserID: userID, UserID: userID,
APIKeyID: apiKeyID, ApiKeyID: apiKeyID,
AccountID: accountID, AccountID: accountID,
GroupID: groupID, GroupID: groupID,
Model: model, Model: model,
@@ -207,7 +207,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
} }
if apiKeyID > 0 { if apiKeyID > 0 {
stats, err := h.usageService.GetStatsByAPIKey(c.Request.Context(), apiKeyID, startTime, endTime) stats, err := h.usageService.GetStatsByApiKey(c.Request.Context(), apiKeyID, startTime, endTime)
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
@@ -269,9 +269,9 @@ func (h *UsageHandler) SearchUsers(c *gin.Context) {
response.Success(c, result) response.Success(c, result)
} }
// SearchAPIKeys handles searching API keys by user // SearchApiKeys handles searching API keys by user
// GET /api/v1/admin/usage/search-api-keys // GET /api/v1/admin/usage/search-api-keys
func (h *UsageHandler) SearchAPIKeys(c *gin.Context) { func (h *UsageHandler) SearchApiKeys(c *gin.Context) {
userIDStr := c.Query("user_id") userIDStr := c.Query("user_id")
keyword := c.Query("q") keyword := c.Query("q")
@@ -285,22 +285,22 @@ func (h *UsageHandler) SearchAPIKeys(c *gin.Context) {
userID = id userID = id
} }
keys, err := h.apiKeyService.SearchAPIKeys(c.Request.Context(), userID, keyword, 30) keys, err := h.apiKeyService.SearchApiKeys(c.Request.Context(), userID, keyword, 30)
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
} }
// Return simplified API key list (only id and name) // Return simplified API key list (only id and name)
type SimpleAPIKey struct { type SimpleApiKey struct {
ID int64 `json:"id"` ID int64 `json:"id"`
Name string `json:"name"` Name string `json:"name"`
UserID int64 `json:"user_id"` UserID int64 `json:"user_id"`
} }
result := make([]SimpleAPIKey, len(keys)) result := make([]SimpleApiKey, len(keys))
for i, k := range keys { for i, k := range keys {
result[i] = SimpleAPIKey{ result[i] = SimpleApiKey{
ID: k.ID, ID: k.ID,
Name: k.Name, Name: k.Name,
UserID: k.UserID, UserID: k.UserID,

View File

@@ -243,9 +243,9 @@ func (h *UserHandler) GetUserAPIKeys(c *gin.Context) {
return return
} }
out := make([]dto.APIKey, 0, len(keys)) out := make([]dto.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
out = append(out, *dto.APIKeyFromService(&keys[i])) out = append(out, *dto.ApiKeyFromService(&keys[i]))
} }
response.Paginated(c, out, total, page, pageSize) response.Paginated(c, out, total, page, pageSize)
} }

View File

@@ -14,11 +14,11 @@ import (
// APIKeyHandler handles API key-related requests // APIKeyHandler handles API key-related requests
type APIKeyHandler struct { type APIKeyHandler struct {
apiKeyService *service.APIKeyService apiKeyService *service.ApiKeyService
} }
// NewAPIKeyHandler creates a new APIKeyHandler // NewAPIKeyHandler creates a new APIKeyHandler
func NewAPIKeyHandler(apiKeyService *service.APIKeyService) *APIKeyHandler { func NewAPIKeyHandler(apiKeyService *service.ApiKeyService) *APIKeyHandler {
return &APIKeyHandler{ return &APIKeyHandler{
apiKeyService: apiKeyService, apiKeyService: apiKeyService,
} }
@@ -56,9 +56,9 @@ func (h *APIKeyHandler) List(c *gin.Context) {
return return
} }
out := make([]dto.APIKey, 0, len(keys)) out := make([]dto.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
out = append(out, *dto.APIKeyFromService(&keys[i])) out = append(out, *dto.ApiKeyFromService(&keys[i]))
} }
response.Paginated(c, out, result.Total, page, pageSize) response.Paginated(c, out, result.Total, page, pageSize)
} }
@@ -90,7 +90,7 @@ func (h *APIKeyHandler) GetByID(c *gin.Context) {
return return
} }
response.Success(c, dto.APIKeyFromService(key)) response.Success(c, dto.ApiKeyFromService(key))
} }
// Create handles creating a new API key // Create handles creating a new API key
@@ -108,7 +108,7 @@ func (h *APIKeyHandler) Create(c *gin.Context) {
return return
} }
svcReq := service.CreateAPIKeyRequest{ svcReq := service.CreateApiKeyRequest{
Name: req.Name, Name: req.Name,
GroupID: req.GroupID, GroupID: req.GroupID,
CustomKey: req.CustomKey, CustomKey: req.CustomKey,
@@ -119,7 +119,7 @@ func (h *APIKeyHandler) Create(c *gin.Context) {
return return
} }
response.Success(c, dto.APIKeyFromService(key)) response.Success(c, dto.ApiKeyFromService(key))
} }
// Update handles updating an API key // Update handles updating an API key
@@ -143,7 +143,7 @@ func (h *APIKeyHandler) Update(c *gin.Context) {
return return
} }
svcReq := service.UpdateAPIKeyRequest{} svcReq := service.UpdateApiKeyRequest{}
if req.Name != "" { if req.Name != "" {
svcReq.Name = &req.Name svcReq.Name = &req.Name
} }
@@ -158,7 +158,7 @@ func (h *APIKeyHandler) Update(c *gin.Context) {
return return
} }
response.Success(c, dto.APIKeyFromService(key)) response.Success(c, dto.ApiKeyFromService(key))
} }
// Delete handles deleting an API key // Delete handles deleting an API key

View File

@@ -5,13 +5,13 @@ type SystemSettings struct {
RegistrationEnabled bool `json:"registration_enabled"` RegistrationEnabled bool `json:"registration_enabled"`
EmailVerifyEnabled bool `json:"email_verify_enabled"` EmailVerifyEnabled bool `json:"email_verify_enabled"`
SMTPHost string `json:"smtp_host"` SmtpHost string `json:"smtp_host"`
SMTPPort int `json:"smtp_port"` SmtpPort int `json:"smtp_port"`
SMTPUsername string `json:"smtp_username"` SmtpUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password,omitempty"` SmtpPassword string `json:"smtp_password,omitempty"`
SMTPFrom string `json:"smtp_from_email"` SmtpFrom string `json:"smtp_from_email"`
SMTPFromName string `json:"smtp_from_name"` SmtpFromName string `json:"smtp_from_name"`
SMTPUseTLS bool `json:"smtp_use_tls"` SmtpUseTLS bool `json:"smtp_use_tls"`
TurnstileEnabled bool `json:"turnstile_enabled"` TurnstileEnabled bool `json:"turnstile_enabled"`
TurnstileSiteKey string `json:"turnstile_site_key"` TurnstileSiteKey string `json:"turnstile_site_key"`
@@ -20,12 +20,19 @@ type SystemSettings struct {
SiteName string `json:"site_name"` SiteName string `json:"site_name"`
SiteLogo string `json:"site_logo"` SiteLogo string `json:"site_logo"`
SiteSubtitle string `json:"site_subtitle"` SiteSubtitle string `json:"site_subtitle"`
APIBaseURL string `json:"api_base_url"` ApiBaseUrl string `json:"api_base_url"`
ContactInfo string `json:"contact_info"` ContactInfo string `json:"contact_info"`
DocURL string `json:"doc_url"` DocUrl string `json:"doc_url"`
DefaultConcurrency int `json:"default_concurrency"` DefaultConcurrency int `json:"default_concurrency"`
DefaultBalance float64 `json:"default_balance"` DefaultBalance float64 `json:"default_balance"`
// Model fallback configuration
EnableModelFallback bool `json:"enable_model_fallback"`
FallbackModelAnthropic string `json:"fallback_model_anthropic"`
FallbackModelOpenAI string `json:"fallback_model_openai"`
FallbackModelGemini string `json:"fallback_model_gemini"`
FallbackModelAntigravity string `json:"fallback_model_antigravity"`
} }
type PublicSettings struct { type PublicSettings struct {
@@ -36,8 +43,8 @@ type PublicSettings struct {
SiteName string `json:"site_name"` SiteName string `json:"site_name"`
SiteLogo string `json:"site_logo"` SiteLogo string `json:"site_logo"`
SiteSubtitle string `json:"site_subtitle"` SiteSubtitle string `json:"site_subtitle"`
APIBaseURL string `json:"api_base_url"` ApiBaseUrl string `json:"api_base_url"`
ContactInfo string `json:"contact_info"` ContactInfo string `json:"contact_info"`
DocURL string `json:"doc_url"` DocUrl string `json:"doc_url"`
Version string `json:"version"` Version string `json:"version"`
} }

View File

@@ -7,7 +7,6 @@ import (
// AdminHandlers contains all admin-related HTTP handlers // AdminHandlers contains all admin-related HTTP handlers
type AdminHandlers struct { type AdminHandlers struct {
Dashboard *admin.DashboardHandler Dashboard *admin.DashboardHandler
Ops *admin.OpsHandler
User *admin.UserHandler User *admin.UserHandler
Group *admin.GroupHandler Group *admin.GroupHandler
Account *admin.AccountHandler Account *admin.AccountHandler

View File

@@ -22,7 +22,6 @@ type OpenAIGatewayHandler struct {
gatewayService *service.OpenAIGatewayService gatewayService *service.OpenAIGatewayService
billingCacheService *service.BillingCacheService billingCacheService *service.BillingCacheService
concurrencyHelper *ConcurrencyHelper concurrencyHelper *ConcurrencyHelper
opsService *service.OpsService
} }
// NewOpenAIGatewayHandler creates a new OpenAIGatewayHandler // NewOpenAIGatewayHandler creates a new OpenAIGatewayHandler
@@ -30,21 +29,19 @@ func NewOpenAIGatewayHandler(
gatewayService *service.OpenAIGatewayService, gatewayService *service.OpenAIGatewayService,
concurrencyService *service.ConcurrencyService, concurrencyService *service.ConcurrencyService,
billingCacheService *service.BillingCacheService, billingCacheService *service.BillingCacheService,
opsService *service.OpsService,
) *OpenAIGatewayHandler { ) *OpenAIGatewayHandler {
return &OpenAIGatewayHandler{ return &OpenAIGatewayHandler{
gatewayService: gatewayService, gatewayService: gatewayService,
billingCacheService: billingCacheService, billingCacheService: billingCacheService,
concurrencyHelper: NewConcurrencyHelper(concurrencyService, SSEPingFormatNone), concurrencyHelper: NewConcurrencyHelper(concurrencyService, SSEPingFormatNone),
opsService: opsService,
} }
} }
// Responses handles OpenAI Responses API endpoint // Responses handles OpenAI Responses API endpoint
// POST /openai/v1/responses // POST /openai/v1/responses
func (h *OpenAIGatewayHandler) Responses(c *gin.Context) { func (h *OpenAIGatewayHandler) Responses(c *gin.Context) {
// Get apiKey and user from context (set by APIKeyAuth middleware) // Get apiKey and user from context (set by ApiKeyAuth middleware)
apiKey, ok := middleware2.GetAPIKeyFromContext(c) apiKey, ok := middleware2.GetApiKeyFromContext(c)
if !ok { if !ok {
h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key") h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key")
return return
@@ -82,7 +79,6 @@ func (h *OpenAIGatewayHandler) Responses(c *gin.Context) {
// Extract model and stream // Extract model and stream
reqModel, _ := reqBody["model"].(string) reqModel, _ := reqBody["model"].(string)
reqStream, _ := reqBody["stream"].(bool) reqStream, _ := reqBody["stream"].(bool)
setOpsRequestContext(c, reqModel, reqStream)
// 验证 model 必填 // 验证 model 必填
if reqModel == "" { if reqModel == "" {
@@ -239,7 +235,7 @@ func (h *OpenAIGatewayHandler) Responses(c *gin.Context) {
defer cancel() defer cancel()
if err := h.gatewayService.RecordUsage(ctx, &service.OpenAIRecordUsageInput{ if err := h.gatewayService.RecordUsage(ctx, &service.OpenAIRecordUsageInput{
Result: result, Result: result,
APIKey: apiKey, ApiKey: apiKey,
User: apiKey.User, User: apiKey.User,
Account: usedAccount, Account: usedAccount,
Subscription: subscription, Subscription: subscription,
@@ -282,7 +278,6 @@ func (h *OpenAIGatewayHandler) mapUpstreamError(statusCode int) (int, string, st
// handleStreamingAwareError handles errors that may occur after streaming has started // handleStreamingAwareError handles errors that may occur after streaming has started
func (h *OpenAIGatewayHandler) handleStreamingAwareError(c *gin.Context, status int, errType, message string, streamStarted bool) { func (h *OpenAIGatewayHandler) handleStreamingAwareError(c *gin.Context, status int, errType, message string, streamStarted bool) {
if streamStarted { if streamStarted {
recordOpsError(c, h.opsService, status, errType, message, service.PlatformOpenAI)
// Stream already started, send error as SSE event then close // Stream already started, send error as SSE event then close
flusher, ok := c.Writer.(http.Flusher) flusher, ok := c.Writer.(http.Flusher)
if ok { if ok {
@@ -302,7 +297,6 @@ func (h *OpenAIGatewayHandler) handleStreamingAwareError(c *gin.Context, status
// errorResponse returns OpenAI API format error response // errorResponse returns OpenAI API format error response
func (h *OpenAIGatewayHandler) errorResponse(c *gin.Context, status int, errType, message string) { func (h *OpenAIGatewayHandler) errorResponse(c *gin.Context, status int, errType, message string) {
recordOpsError(c, h.opsService, status, errType, message, service.PlatformOpenAI)
c.JSON(status, gin.H{ c.JSON(status, gin.H{
"error": gin.H{ "error": gin.H{
"type": errType, "type": errType,

View File

@@ -39,9 +39,9 @@ func (h *SettingHandler) GetPublicSettings(c *gin.Context) {
SiteName: settings.SiteName, SiteName: settings.SiteName,
SiteLogo: settings.SiteLogo, SiteLogo: settings.SiteLogo,
SiteSubtitle: settings.SiteSubtitle, SiteSubtitle: settings.SiteSubtitle,
APIBaseURL: settings.APIBaseURL, ApiBaseUrl: settings.ApiBaseUrl,
ContactInfo: settings.ContactInfo, ContactInfo: settings.ContactInfo,
DocURL: settings.DocURL, DocUrl: settings.DocUrl,
Version: h.version, Version: h.version,
}) })
} }

View File

@@ -18,11 +18,11 @@ import (
// UsageHandler handles usage-related requests // UsageHandler handles usage-related requests
type UsageHandler struct { type UsageHandler struct {
usageService *service.UsageService usageService *service.UsageService
apiKeyService *service.APIKeyService apiKeyService *service.ApiKeyService
} }
// NewUsageHandler creates a new UsageHandler // NewUsageHandler creates a new UsageHandler
func NewUsageHandler(usageService *service.UsageService, apiKeyService *service.APIKeyService) *UsageHandler { func NewUsageHandler(usageService *service.UsageService, apiKeyService *service.ApiKeyService) *UsageHandler {
return &UsageHandler{ return &UsageHandler{
usageService: usageService, usageService: usageService,
apiKeyService: apiKeyService, apiKeyService: apiKeyService,
@@ -111,7 +111,7 @@ func (h *UsageHandler) List(c *gin.Context) {
params := pagination.PaginationParams{Page: page, PageSize: pageSize} params := pagination.PaginationParams{Page: page, PageSize: pageSize}
filters := usagestats.UsageLogFilters{ filters := usagestats.UsageLogFilters{
UserID: subject.UserID, // Always filter by current user for security UserID: subject.UserID, // Always filter by current user for security
APIKeyID: apiKeyID, ApiKeyID: apiKeyID,
Model: model, Model: model,
Stream: stream, Stream: stream,
BillingType: billingType, BillingType: billingType,
@@ -235,7 +235,7 @@ func (h *UsageHandler) Stats(c *gin.Context) {
var stats *service.UsageStats var stats *service.UsageStats
var err error var err error
if apiKeyID > 0 { if apiKeyID > 0 {
stats, err = h.usageService.GetStatsByAPIKey(c.Request.Context(), apiKeyID, startTime, endTime) stats, err = h.usageService.GetStatsByApiKey(c.Request.Context(), apiKeyID, startTime, endTime)
} else { } else {
stats, err = h.usageService.GetStatsByUser(c.Request.Context(), subject.UserID, startTime, endTime) stats, err = h.usageService.GetStatsByUser(c.Request.Context(), subject.UserID, startTime, endTime)
} }
@@ -346,49 +346,49 @@ func (h *UsageHandler) DashboardModels(c *gin.Context) {
}) })
} }
// BatchAPIKeysUsageRequest represents the request for batch API keys usage // BatchApiKeysUsageRequest represents the request for batch API keys usage
type BatchAPIKeysUsageRequest struct { type BatchApiKeysUsageRequest struct {
APIKeyIDs []int64 `json:"api_key_ids" binding:"required"` ApiKeyIDs []int64 `json:"api_key_ids" binding:"required"`
} }
// DashboardAPIKeysUsage handles getting usage stats for user's own API keys // DashboardApiKeysUsage handles getting usage stats for user's own API keys
// POST /api/v1/usage/dashboard/api-keys-usage // POST /api/v1/usage/dashboard/api-keys-usage
func (h *UsageHandler) DashboardAPIKeysUsage(c *gin.Context) { func (h *UsageHandler) DashboardApiKeysUsage(c *gin.Context) {
subject, ok := middleware2.GetAuthSubjectFromContext(c) subject, ok := middleware2.GetAuthSubjectFromContext(c)
if !ok { if !ok {
response.Unauthorized(c, "User not authenticated") response.Unauthorized(c, "User not authenticated")
return return
} }
var req BatchAPIKeysUsageRequest var req BatchApiKeysUsageRequest
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "Invalid request: "+err.Error()) response.BadRequest(c, "Invalid request: "+err.Error())
return return
} }
if len(req.APIKeyIDs) == 0 { if len(req.ApiKeyIDs) == 0 {
response.Success(c, gin.H{"stats": map[string]any{}}) response.Success(c, gin.H{"stats": map[string]any{}})
return return
} }
// Limit the number of API key IDs to prevent SQL parameter overflow // Limit the number of API key IDs to prevent SQL parameter overflow
if len(req.APIKeyIDs) > 100 { if len(req.ApiKeyIDs) > 100 {
response.BadRequest(c, "Too many API key IDs (maximum 100 allowed)") response.BadRequest(c, "Too many API key IDs (maximum 100 allowed)")
return return
} }
validAPIKeyIDs, err := h.apiKeyService.VerifyOwnership(c.Request.Context(), subject.UserID, req.APIKeyIDs) validApiKeyIDs, err := h.apiKeyService.VerifyOwnership(c.Request.Context(), subject.UserID, req.ApiKeyIDs)
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return
} }
if len(validAPIKeyIDs) == 0 { if len(validApiKeyIDs) == 0 {
response.Success(c, gin.H{"stats": map[string]any{}}) response.Success(c, gin.H{"stats": map[string]any{}})
return return
} }
stats, err := h.usageService.GetBatchAPIKeyUsageStats(c.Request.Context(), validAPIKeyIDs) stats, err := h.usageService.GetBatchApiKeyUsageStats(c.Request.Context(), validApiKeyIDs)
if err != nil { if err != nil {
response.ErrorFrom(c, err) response.ErrorFrom(c, err)
return return

View File

@@ -10,7 +10,6 @@ import (
// ProvideAdminHandlers creates the AdminHandlers struct // ProvideAdminHandlers creates the AdminHandlers struct
func ProvideAdminHandlers( func ProvideAdminHandlers(
dashboardHandler *admin.DashboardHandler, dashboardHandler *admin.DashboardHandler,
opsHandler *admin.OpsHandler,
userHandler *admin.UserHandler, userHandler *admin.UserHandler,
groupHandler *admin.GroupHandler, groupHandler *admin.GroupHandler,
accountHandler *admin.AccountHandler, accountHandler *admin.AccountHandler,
@@ -28,7 +27,6 @@ func ProvideAdminHandlers(
) *AdminHandlers { ) *AdminHandlers {
return &AdminHandlers{ return &AdminHandlers{
Dashboard: dashboardHandler, Dashboard: dashboardHandler,
Ops: opsHandler,
User: userHandler, User: userHandler,
Group: groupHandler, Group: groupHandler,
Account: accountHandler, Account: accountHandler,
@@ -98,7 +96,6 @@ var ProviderSet = wire.NewSet(
// Admin handlers // Admin handlers
admin.NewDashboardHandler, admin.NewDashboardHandler,
admin.NewOpsHandler,
admin.NewUserHandler, admin.NewUserHandler,
admin.NewGroupHandler, admin.NewGroupHandler,
admin.NewAccountHandler, admin.NewAccountHandler,

View File

@@ -1,4 +1,3 @@
// Package claude provides Claude API client constants and utilities.
package claude package claude
// Claude Code 客户端相关常量 // Claude Code 客户端相关常量
@@ -17,13 +16,13 @@ const DefaultBetaHeader = BetaClaudeCode + "," + BetaOAuth + "," + BetaInterleav
// HaikuBetaHeader Haiku 模型使用的 anthropic-beta header不需要 claude-code beta // HaikuBetaHeader Haiku 模型使用的 anthropic-beta header不需要 claude-code beta
const HaikuBetaHeader = BetaOAuth + "," + BetaInterleavedThinking const HaikuBetaHeader = BetaOAuth + "," + BetaInterleavedThinking
// APIKeyBetaHeader API-key 账号建议使用的 anthropic-beta header不包含 oauth // ApiKeyBetaHeader API-key 账号建议使用的 anthropic-beta header不包含 oauth
const APIKeyBetaHeader = BetaClaudeCode + "," + BetaInterleavedThinking + "," + BetaFineGrainedToolStreaming const ApiKeyBetaHeader = BetaClaudeCode + "," + BetaInterleavedThinking + "," + BetaFineGrainedToolStreaming
// APIKeyHaikuBetaHeader Haiku 模型在 API-key 账号下使用的 anthropic-beta header不包含 oauth / claude-code // ApiKeyHaikuBetaHeader Haiku 模型在 API-key 账号下使用的 anthropic-beta header不包含 oauth / claude-code
const APIKeyHaikuBetaHeader = BetaInterleavedThinking const ApiKeyHaikuBetaHeader = BetaInterleavedThinking
// DefaultHeaders are the default request headers for Claude Code client. // Claude Code 客户端默认请求头
var DefaultHeaders = map[string]string{ var DefaultHeaders = map[string]string{
"User-Agent": "claude-cli/2.0.62 (external, cli)", "User-Agent": "claude-cli/2.0.62 (external, cli)",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",

View File

@@ -1,4 +1,3 @@
// Package errors provides custom error types and error handling utilities.
// nolint:mnd // nolint:mnd
package errors package errors

View File

@@ -1,7 +1,7 @@
// Package gemini provides minimal fallback model metadata for Gemini native endpoints.
package gemini package gemini
// This package is used when upstream model listing is unavailable (e.g. OAuth token missing AI Studio scopes). // This package provides minimal fallback model metadata for Gemini native endpoints.
// It is used when upstream model listing is unavailable (e.g. OAuth token missing AI Studio scopes).
type Model struct { type Model struct {
Name string `json:"name"` Name string `json:"name"`

View File

@@ -1,4 +1,3 @@
// Package googleapi provides utilities for Google API interactions.
package googleapi package googleapi
import "net/http" import "net/http"

View File

@@ -1,4 +1,3 @@
// Package oauth provides OAuth 2.0 utilities including PKCE flow, session management, and token exchange.
package oauth package oauth
import ( import (

View File

@@ -1,4 +1,3 @@
// Package openai provides OpenAI API models and configuration.
package openai package openai
import _ "embed" import _ "embed"

View File

@@ -327,7 +327,7 @@ func ParseIDToken(idToken string) (*IDTokenClaims, error) {
return &claims, nil return &claims, nil
} }
// UserInfo extracts user information from ID Token claims // ExtractUserInfo extracts user information from ID Token claims
type UserInfo struct { type UserInfo struct {
Email string Email string
ChatGPTAccountID string ChatGPTAccountID string

View File

@@ -1,4 +1,3 @@
// Package pagination provides utilities for handling paginated queries and results.
package pagination package pagination
// PaginationParams 分页参数 // PaginationParams 分页参数

View File

@@ -1,4 +1,3 @@
// Package response provides HTTP response utilities for standardized API responses and error handling.
package response package response
import ( import (

View File

@@ -1,4 +1,3 @@
// Package sysutil provides system-level utilities for service management.
package sysutil package sysutil
import ( import (

View File

@@ -1,4 +1,3 @@
// Package usagestats defines types for tracking and reporting API usage statistics.
package usagestats package usagestats
import "time" import "time"
@@ -11,8 +10,8 @@ type DashboardStats struct {
ActiveUsers int64 `json:"active_users"` // 今日有请求的用户数 ActiveUsers int64 `json:"active_users"` // 今日有请求的用户数
// API Key 统计 // API Key 统计
TotalAPIKeys int64 `json:"total_api_keys"` TotalApiKeys int64 `json:"total_api_keys"`
ActiveAPIKeys int64 `json:"active_api_keys"` // 状态为 active 的 API Key 数 ActiveApiKeys int64 `json:"active_api_keys"` // 状态为 active 的 API Key 数
// 账户统计 // 账户统计
TotalAccounts int64 `json:"total_accounts"` TotalAccounts int64 `json:"total_accounts"`
@@ -83,10 +82,10 @@ type UserUsageTrendPoint struct {
ActualCost float64 `json:"actual_cost"` // 实际扣除 ActualCost float64 `json:"actual_cost"` // 实际扣除
} }
// APIKeyUsageTrendPoint represents API key usage trend data point // ApiKeyUsageTrendPoint represents API key usage trend data point
type APIKeyUsageTrendPoint struct { type ApiKeyUsageTrendPoint struct {
Date string `json:"date"` Date string `json:"date"`
APIKeyID int64 `json:"api_key_id"` ApiKeyID int64 `json:"api_key_id"`
KeyName string `json:"key_name"` KeyName string `json:"key_name"`
Requests int64 `json:"requests"` Requests int64 `json:"requests"`
Tokens int64 `json:"tokens"` Tokens int64 `json:"tokens"`
@@ -95,8 +94,8 @@ type APIKeyUsageTrendPoint struct {
// UserDashboardStats 用户仪表盘统计 // UserDashboardStats 用户仪表盘统计
type UserDashboardStats struct { type UserDashboardStats struct {
// API Key 统计 // API Key 统计
TotalAPIKeys int64 `json:"total_api_keys"` TotalApiKeys int64 `json:"total_api_keys"`
ActiveAPIKeys int64 `json:"active_api_keys"` ActiveApiKeys int64 `json:"active_api_keys"`
// 累计 Token 使用统计 // 累计 Token 使用统计
TotalRequests int64 `json:"total_requests"` TotalRequests int64 `json:"total_requests"`
@@ -129,7 +128,7 @@ type UserDashboardStats struct {
// UsageLogFilters represents filters for usage log queries // UsageLogFilters represents filters for usage log queries
type UsageLogFilters struct { type UsageLogFilters struct {
UserID int64 UserID int64
APIKeyID int64 ApiKeyID int64
AccountID int64 AccountID int64
GroupID int64 GroupID int64
Model string Model string
@@ -158,9 +157,9 @@ type BatchUserUsageStats struct {
TotalActualCost float64 `json:"total_actual_cost"` TotalActualCost float64 `json:"total_actual_cost"`
} }
// BatchAPIKeyUsageStats represents usage stats for a single API key // BatchApiKeyUsageStats represents usage stats for a single API key
type BatchAPIKeyUsageStats struct { type BatchApiKeyUsageStats struct {
APIKeyID int64 `json:"api_key_id"` ApiKeyID int64 `json:"api_key_id"`
TodayActualCost float64 `json:"today_actual_cost"` TodayActualCost float64 `json:"today_actual_cost"`
TotalActualCost float64 `json:"total_actual_cost"` TotalActualCost float64 `json:"total_actual_cost"`
} }

View File

@@ -135,12 +135,12 @@ func (s *AccountRepoSuite) TestListWithFilters() {
name: "filter_by_type", name: "filter_by_type",
setup: func(client *dbent.Client) { setup: func(client *dbent.Client) {
mustCreateAccount(s.T(), client, &service.Account{Name: "t1", Type: service.AccountTypeOAuth}) mustCreateAccount(s.T(), client, &service.Account{Name: "t1", Type: service.AccountTypeOAuth})
mustCreateAccount(s.T(), client, &service.Account{Name: "t2", Type: service.AccountTypeAPIKey}) mustCreateAccount(s.T(), client, &service.Account{Name: "t2", Type: service.AccountTypeApiKey})
}, },
accType: service.AccountTypeAPIKey, accType: service.AccountTypeApiKey,
wantCount: 1, wantCount: 1,
validate: func(accounts []service.Account) { validate: func(accounts []service.Account) {
s.Require().Equal(service.AccountTypeAPIKey, accounts[0].Type) s.Require().Equal(service.AccountTypeApiKey, accounts[0].Type)
}, },
}, },
{ {

View File

@@ -80,7 +80,7 @@ func TestUserRepository_RemoveGroupFromAllowedGroups_RemovesAllOccurrences(t *te
require.NotContains(t, u2After.AllowedGroups, targetGroup.ID) require.NotContains(t, u2After.AllowedGroups, targetGroup.ID)
} }
func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsAPIKeys(t *testing.T) { func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsApiKeys(t *testing.T) {
ctx := context.Background() ctx := context.Background()
tx := testEntTx(t) tx := testEntTx(t)
entClient := tx.Client() entClient := tx.Client()
@@ -98,7 +98,7 @@ func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsAPIKeys(t *t
userRepo := newUserRepositoryWithSQL(entClient, tx) userRepo := newUserRepositoryWithSQL(entClient, tx)
groupRepo := newGroupRepositoryWithSQL(entClient, tx) groupRepo := newGroupRepositoryWithSQL(entClient, tx)
apiKeyRepo := NewAPIKeyRepository(entClient) apiKeyRepo := NewApiKeyRepository(entClient)
u := &service.User{ u := &service.User{
Email: uniqueTestValue(t, "cascade-user") + "@example.com", Email: uniqueTestValue(t, "cascade-user") + "@example.com",
@@ -110,7 +110,7 @@ func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsAPIKeys(t *t
} }
require.NoError(t, userRepo.Create(ctx, u)) require.NoError(t, userRepo.Create(ctx, u))
key := &service.APIKey{ key := &service.ApiKey{
UserID: u.ID, UserID: u.ID,
Key: uniqueTestValue(t, "sk-test-delete-cascade"), Key: uniqueTestValue(t, "sk-test-delete-cascade"),
Name: "test key", Name: "test key",

View File

@@ -24,7 +24,7 @@ type apiKeyCache struct {
rdb *redis.Client rdb *redis.Client
} }
func NewAPIKeyCache(rdb *redis.Client) service.APIKeyCache { func NewApiKeyCache(rdb *redis.Client) service.ApiKeyCache {
return &apiKeyCache{rdb: rdb} return &apiKeyCache{rdb: rdb}
} }

View File

@@ -13,11 +13,11 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )
type APIKeyCacheSuite struct { type ApiKeyCacheSuite struct {
IntegrationRedisSuite IntegrationRedisSuite
} }
func (s *APIKeyCacheSuite) TestCreateAttemptCount() { func (s *ApiKeyCacheSuite) TestCreateAttemptCount() {
tests := []struct { tests := []struct {
name string name string
fn func(ctx context.Context, rdb *redis.Client, cache *apiKeyCache) fn func(ctx context.Context, rdb *redis.Client, cache *apiKeyCache)
@@ -78,7 +78,7 @@ func (s *APIKeyCacheSuite) TestCreateAttemptCount() {
} }
} }
func (s *APIKeyCacheSuite) TestDailyUsage() { func (s *ApiKeyCacheSuite) TestDailyUsage() {
tests := []struct { tests := []struct {
name string name string
fn func(ctx context.Context, rdb *redis.Client, cache *apiKeyCache) fn func(ctx context.Context, rdb *redis.Client, cache *apiKeyCache)
@@ -122,6 +122,6 @@ func (s *APIKeyCacheSuite) TestDailyUsage() {
} }
} }
func TestAPIKeyCacheSuite(t *testing.T) { func TestApiKeyCacheSuite(t *testing.T) {
suite.Run(t, new(APIKeyCacheSuite)) suite.Run(t, new(ApiKeyCacheSuite))
} }

View File

@@ -9,7 +9,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestAPIKeyRateLimitKey(t *testing.T) { func TestApiKeyRateLimitKey(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
userID int64 userID int64

View File

@@ -16,17 +16,17 @@ type apiKeyRepository struct {
client *dbent.Client client *dbent.Client
} }
func NewAPIKeyRepository(client *dbent.Client) service.APIKeyRepository { func NewApiKeyRepository(client *dbent.Client) service.ApiKeyRepository {
return &apiKeyRepository{client: client} return &apiKeyRepository{client: client}
} }
func (r *apiKeyRepository) activeQuery() *dbent.APIKeyQuery { func (r *apiKeyRepository) activeQuery() *dbent.ApiKeyQuery {
// 默认过滤已软删除记录,避免删除后仍被查询到。 // 默认过滤已软删除记录,避免删除后仍被查询到。
return r.client.APIKey.Query().Where(apikey.DeletedAtIsNil()) return r.client.ApiKey.Query().Where(apikey.DeletedAtIsNil())
} }
func (r *apiKeyRepository) Create(ctx context.Context, key *service.APIKey) error { func (r *apiKeyRepository) Create(ctx context.Context, key *service.ApiKey) error {
created, err := r.client.APIKey.Create(). created, err := r.client.ApiKey.Create().
SetUserID(key.UserID). SetUserID(key.UserID).
SetKey(key.Key). SetKey(key.Key).
SetName(key.Name). SetName(key.Name).
@@ -38,10 +38,10 @@ func (r *apiKeyRepository) Create(ctx context.Context, key *service.APIKey) erro
key.CreatedAt = created.CreatedAt key.CreatedAt = created.CreatedAt
key.UpdatedAt = created.UpdatedAt key.UpdatedAt = created.UpdatedAt
} }
return translatePersistenceError(err, nil, service.ErrAPIKeyExists) return translatePersistenceError(err, nil, service.ErrApiKeyExists)
} }
func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.APIKey, error) { func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.ApiKey, error) {
m, err := r.activeQuery(). m, err := r.activeQuery().
Where(apikey.IDEQ(id)). Where(apikey.IDEQ(id)).
WithUser(). WithUser().
@@ -49,7 +49,7 @@ func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.APIK
Only(ctx) Only(ctx)
if err != nil { if err != nil {
if dbent.IsNotFound(err) { if dbent.IsNotFound(err) {
return nil, service.ErrAPIKeyNotFound return nil, service.ErrApiKeyNotFound
} }
return nil, err return nil, err
} }
@@ -59,7 +59,7 @@ func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.APIK
// GetOwnerID 根据 API Key ID 获取其所有者(用户)的 ID。 // GetOwnerID 根据 API Key ID 获取其所有者(用户)的 ID。
// 相比 GetByID此方法性能更优因为 // 相比 GetByID此方法性能更优因为
// - 使用 Select() 只查询 user_id 字段,减少数据传输量 // - 使用 Select() 只查询 user_id 字段,减少数据传输量
// - 不加载完整的 APIKey 实体及其关联数据User、Group 等) // - 不加载完整的 ApiKey 实体及其关联数据User、Group 等)
// - 适用于权限验证等只需用户 ID 的场景(如删除前的所有权检查) // - 适用于权限验证等只需用户 ID 的场景(如删除前的所有权检查)
func (r *apiKeyRepository) GetOwnerID(ctx context.Context, id int64) (int64, error) { func (r *apiKeyRepository) GetOwnerID(ctx context.Context, id int64) (int64, error) {
m, err := r.activeQuery(). m, err := r.activeQuery().
@@ -68,14 +68,14 @@ func (r *apiKeyRepository) GetOwnerID(ctx context.Context, id int64) (int64, err
Only(ctx) Only(ctx)
if err != nil { if err != nil {
if dbent.IsNotFound(err) { if dbent.IsNotFound(err) {
return 0, service.ErrAPIKeyNotFound return 0, service.ErrApiKeyNotFound
} }
return 0, err return 0, err
} }
return m.UserID, nil return m.UserID, nil
} }
func (r *apiKeyRepository) GetByKey(ctx context.Context, key string) (*service.APIKey, error) { func (r *apiKeyRepository) GetByKey(ctx context.Context, key string) (*service.ApiKey, error) {
m, err := r.activeQuery(). m, err := r.activeQuery().
Where(apikey.KeyEQ(key)). Where(apikey.KeyEQ(key)).
WithUser(). WithUser().
@@ -83,21 +83,21 @@ func (r *apiKeyRepository) GetByKey(ctx context.Context, key string) (*service.A
Only(ctx) Only(ctx)
if err != nil { if err != nil {
if dbent.IsNotFound(err) { if dbent.IsNotFound(err) {
return nil, service.ErrAPIKeyNotFound return nil, service.ErrApiKeyNotFound
} }
return nil, err return nil, err
} }
return apiKeyEntityToService(m), nil return apiKeyEntityToService(m), nil
} }
func (r *apiKeyRepository) Update(ctx context.Context, key *service.APIKey) error { func (r *apiKeyRepository) Update(ctx context.Context, key *service.ApiKey) error {
// 使用原子操作:将软删除检查与更新合并到同一语句,避免竞态条件。 // 使用原子操作:将软删除检查与更新合并到同一语句,避免竞态条件。
// 之前的实现先检查 Exist 再 UpdateOneID若在两步之间发生软删除 // 之前的实现先检查 Exist 再 UpdateOneID若在两步之间发生软删除
// 则会更新已删除的记录。 // 则会更新已删除的记录。
// 这里选择 Update().Where(),确保只有未软删除记录能被更新。 // 这里选择 Update().Where(),确保只有未软删除记录能被更新。
// 同时显式设置 updated_at避免二次查询带来的并发可见性问题。 // 同时显式设置 updated_at避免二次查询带来的并发可见性问题。
now := time.Now() now := time.Now()
builder := r.client.APIKey.Update(). builder := r.client.ApiKey.Update().
Where(apikey.IDEQ(key.ID), apikey.DeletedAtIsNil()). Where(apikey.IDEQ(key.ID), apikey.DeletedAtIsNil()).
SetName(key.Name). SetName(key.Name).
SetStatus(key.Status). SetStatus(key.Status).
@@ -114,7 +114,7 @@ func (r *apiKeyRepository) Update(ctx context.Context, key *service.APIKey) erro
} }
if affected == 0 { if affected == 0 {
// 更新影响行数为 0说明记录不存在或已被软删除。 // 更新影响行数为 0说明记录不存在或已被软删除。
return service.ErrAPIKeyNotFound return service.ErrApiKeyNotFound
} }
// 使用同一时间戳回填,避免并发删除导致二次查询失败。 // 使用同一时间戳回填,避免并发删除导致二次查询失败。
@@ -124,18 +124,18 @@ func (r *apiKeyRepository) Update(ctx context.Context, key *service.APIKey) erro
func (r *apiKeyRepository) Delete(ctx context.Context, id int64) error { func (r *apiKeyRepository) Delete(ctx context.Context, id int64) error {
// 显式软删除:避免依赖 Hook 行为,确保 deleted_at 一定被设置。 // 显式软删除:避免依赖 Hook 行为,确保 deleted_at 一定被设置。
affected, err := r.client.APIKey.Update(). affected, err := r.client.ApiKey.Update().
Where(apikey.IDEQ(id), apikey.DeletedAtIsNil()). Where(apikey.IDEQ(id), apikey.DeletedAtIsNil()).
SetDeletedAt(time.Now()). SetDeletedAt(time.Now()).
Save(ctx) Save(ctx)
if err != nil { if err != nil {
if dbent.IsNotFound(err) { if dbent.IsNotFound(err) {
return service.ErrAPIKeyNotFound return service.ErrApiKeyNotFound
} }
return err return err
} }
if affected == 0 { if affected == 0 {
exists, err := r.client.APIKey.Query(). exists, err := r.client.ApiKey.Query().
Where(apikey.IDEQ(id)). Where(apikey.IDEQ(id)).
Exist(mixins.SkipSoftDelete(ctx)) Exist(mixins.SkipSoftDelete(ctx))
if err != nil { if err != nil {
@@ -144,12 +144,12 @@ func (r *apiKeyRepository) Delete(ctx context.Context, id int64) error {
if exists { if exists {
return nil return nil
} }
return service.ErrAPIKeyNotFound return service.ErrApiKeyNotFound
} }
return nil return nil
} }
func (r *apiKeyRepository) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (r *apiKeyRepository) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
q := r.activeQuery().Where(apikey.UserIDEQ(userID)) q := r.activeQuery().Where(apikey.UserIDEQ(userID))
total, err := q.Count(ctx) total, err := q.Count(ctx)
@@ -167,7 +167,7 @@ func (r *apiKeyRepository) ListByUserID(ctx context.Context, userID int64, param
return nil, nil, err return nil, nil, err
} }
outKeys := make([]service.APIKey, 0, len(keys)) outKeys := make([]service.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
outKeys = append(outKeys, *apiKeyEntityToService(keys[i])) outKeys = append(outKeys, *apiKeyEntityToService(keys[i]))
} }
@@ -180,7 +180,7 @@ func (r *apiKeyRepository) VerifyOwnership(ctx context.Context, userID int64, ap
return []int64{}, nil return []int64{}, nil
} }
ids, err := r.client.APIKey.Query(). ids, err := r.client.ApiKey.Query().
Where(apikey.UserIDEQ(userID), apikey.IDIn(apiKeyIDs...), apikey.DeletedAtIsNil()). Where(apikey.UserIDEQ(userID), apikey.IDIn(apiKeyIDs...), apikey.DeletedAtIsNil()).
IDs(ctx) IDs(ctx)
if err != nil { if err != nil {
@@ -199,7 +199,7 @@ func (r *apiKeyRepository) ExistsByKey(ctx context.Context, key string) (bool, e
return count > 0, err return count > 0, err
} }
func (r *apiKeyRepository) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (r *apiKeyRepository) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
q := r.activeQuery().Where(apikey.GroupIDEQ(groupID)) q := r.activeQuery().Where(apikey.GroupIDEQ(groupID))
total, err := q.Count(ctx) total, err := q.Count(ctx)
@@ -217,7 +217,7 @@ func (r *apiKeyRepository) ListByGroupID(ctx context.Context, groupID int64, par
return nil, nil, err return nil, nil, err
} }
outKeys := make([]service.APIKey, 0, len(keys)) outKeys := make([]service.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
outKeys = append(outKeys, *apiKeyEntityToService(keys[i])) outKeys = append(outKeys, *apiKeyEntityToService(keys[i]))
} }
@@ -225,8 +225,8 @@ func (r *apiKeyRepository) ListByGroupID(ctx context.Context, groupID int64, par
return outKeys, paginationResultFromTotal(int64(total), params), nil return outKeys, paginationResultFromTotal(int64(total), params), nil
} }
// SearchAPIKeys searches API keys by user ID and/or keyword (name) // SearchApiKeys searches API keys by user ID and/or keyword (name)
func (r *apiKeyRepository) SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.APIKey, error) { func (r *apiKeyRepository) SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.ApiKey, error) {
q := r.activeQuery() q := r.activeQuery()
if userID > 0 { if userID > 0 {
q = q.Where(apikey.UserIDEQ(userID)) q = q.Where(apikey.UserIDEQ(userID))
@@ -241,7 +241,7 @@ func (r *apiKeyRepository) SearchAPIKeys(ctx context.Context, userID int64, keyw
return nil, err return nil, err
} }
outKeys := make([]service.APIKey, 0, len(keys)) outKeys := make([]service.ApiKey, 0, len(keys))
for i := range keys { for i := range keys {
outKeys = append(outKeys, *apiKeyEntityToService(keys[i])) outKeys = append(outKeys, *apiKeyEntityToService(keys[i]))
} }
@@ -250,7 +250,7 @@ func (r *apiKeyRepository) SearchAPIKeys(ctx context.Context, userID int64, keyw
// ClearGroupIDByGroupID 将指定分组的所有 API Key 的 group_id 设为 nil // ClearGroupIDByGroupID 将指定分组的所有 API Key 的 group_id 设为 nil
func (r *apiKeyRepository) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) { func (r *apiKeyRepository) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) {
n, err := r.client.APIKey.Update(). n, err := r.client.ApiKey.Update().
Where(apikey.GroupIDEQ(groupID), apikey.DeletedAtIsNil()). Where(apikey.GroupIDEQ(groupID), apikey.DeletedAtIsNil()).
ClearGroupID(). ClearGroupID().
Save(ctx) Save(ctx)
@@ -263,11 +263,11 @@ func (r *apiKeyRepository) CountByGroupID(ctx context.Context, groupID int64) (i
return int64(count), err return int64(count), err
} }
func apiKeyEntityToService(m *dbent.APIKey) *service.APIKey { func apiKeyEntityToService(m *dbent.ApiKey) *service.ApiKey {
if m == nil { if m == nil {
return nil return nil
} }
out := &service.APIKey{ out := &service.ApiKey{
ID: m.ID, ID: m.ID,
UserID: m.UserID, UserID: m.UserID,
Key: m.Key, Key: m.Key,

View File

@@ -12,30 +12,30 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )
type APIKeyRepoSuite struct { type ApiKeyRepoSuite struct {
suite.Suite suite.Suite
ctx context.Context ctx context.Context
client *dbent.Client client *dbent.Client
repo *apiKeyRepository repo *apiKeyRepository
} }
func (s *APIKeyRepoSuite) SetupTest() { func (s *ApiKeyRepoSuite) SetupTest() {
s.ctx = context.Background() s.ctx = context.Background()
tx := testEntTx(s.T()) tx := testEntTx(s.T())
s.client = tx.Client() s.client = tx.Client()
s.repo = NewAPIKeyRepository(s.client).(*apiKeyRepository) s.repo = NewApiKeyRepository(s.client).(*apiKeyRepository)
} }
func TestAPIKeyRepoSuite(t *testing.T) { func TestApiKeyRepoSuite(t *testing.T) {
suite.Run(t, new(APIKeyRepoSuite)) suite.Run(t, new(ApiKeyRepoSuite))
} }
// --- Create / GetByID / GetByKey --- // --- Create / GetByID / GetByKey ---
func (s *APIKeyRepoSuite) TestCreate() { func (s *ApiKeyRepoSuite) TestCreate() {
user := s.mustCreateUser("create@test.com") user := s.mustCreateUser("create@test.com")
key := &service.APIKey{ key := &service.ApiKey{
UserID: user.ID, UserID: user.ID,
Key: "sk-create-test", Key: "sk-create-test",
Name: "Test Key", Name: "Test Key",
@@ -51,16 +51,16 @@ func (s *APIKeyRepoSuite) TestCreate() {
s.Require().Equal("sk-create-test", got.Key) s.Require().Equal("sk-create-test", got.Key)
} }
func (s *APIKeyRepoSuite) TestGetByID_NotFound() { func (s *ApiKeyRepoSuite) TestGetByID_NotFound() {
_, err := s.repo.GetByID(s.ctx, 999999) _, err := s.repo.GetByID(s.ctx, 999999)
s.Require().Error(err, "expected error for non-existent ID") s.Require().Error(err, "expected error for non-existent ID")
} }
func (s *APIKeyRepoSuite) TestGetByKey() { func (s *ApiKeyRepoSuite) TestGetByKey() {
user := s.mustCreateUser("getbykey@test.com") user := s.mustCreateUser("getbykey@test.com")
group := s.mustCreateGroup("g-key") group := s.mustCreateGroup("g-key")
key := &service.APIKey{ key := &service.ApiKey{
UserID: user.ID, UserID: user.ID,
Key: "sk-getbykey", Key: "sk-getbykey",
Name: "My Key", Name: "My Key",
@@ -78,16 +78,16 @@ func (s *APIKeyRepoSuite) TestGetByKey() {
s.Require().Equal(group.ID, got.Group.ID) s.Require().Equal(group.ID, got.Group.ID)
} }
func (s *APIKeyRepoSuite) TestGetByKey_NotFound() { func (s *ApiKeyRepoSuite) TestGetByKey_NotFound() {
_, err := s.repo.GetByKey(s.ctx, "non-existent-key") _, err := s.repo.GetByKey(s.ctx, "non-existent-key")
s.Require().Error(err, "expected error for non-existent key") s.Require().Error(err, "expected error for non-existent key")
} }
// --- Update --- // --- Update ---
func (s *APIKeyRepoSuite) TestUpdate() { func (s *ApiKeyRepoSuite) TestUpdate() {
user := s.mustCreateUser("update@test.com") user := s.mustCreateUser("update@test.com")
key := &service.APIKey{ key := &service.ApiKey{
UserID: user.ID, UserID: user.ID,
Key: "sk-update", Key: "sk-update",
Name: "Original", Name: "Original",
@@ -108,10 +108,10 @@ func (s *APIKeyRepoSuite) TestUpdate() {
s.Require().Equal(service.StatusDisabled, got.Status) s.Require().Equal(service.StatusDisabled, got.Status)
} }
func (s *APIKeyRepoSuite) TestUpdate_ClearGroupID() { func (s *ApiKeyRepoSuite) TestUpdate_ClearGroupID() {
user := s.mustCreateUser("cleargroup@test.com") user := s.mustCreateUser("cleargroup@test.com")
group := s.mustCreateGroup("g-clear") group := s.mustCreateGroup("g-clear")
key := &service.APIKey{ key := &service.ApiKey{
UserID: user.ID, UserID: user.ID,
Key: "sk-clear-group", Key: "sk-clear-group",
Name: "Group Key", Name: "Group Key",
@@ -131,9 +131,9 @@ func (s *APIKeyRepoSuite) TestUpdate_ClearGroupID() {
// --- Delete --- // --- Delete ---
func (s *APIKeyRepoSuite) TestDelete() { func (s *ApiKeyRepoSuite) TestDelete() {
user := s.mustCreateUser("delete@test.com") user := s.mustCreateUser("delete@test.com")
key := &service.APIKey{ key := &service.ApiKey{
UserID: user.ID, UserID: user.ID,
Key: "sk-delete", Key: "sk-delete",
Name: "Delete Me", Name: "Delete Me",
@@ -150,10 +150,10 @@ func (s *APIKeyRepoSuite) TestDelete() {
// --- ListByUserID / CountByUserID --- // --- ListByUserID / CountByUserID ---
func (s *APIKeyRepoSuite) TestListByUserID() { func (s *ApiKeyRepoSuite) TestListByUserID() {
user := s.mustCreateUser("listbyuser@test.com") user := s.mustCreateUser("listbyuser@test.com")
s.mustCreateAPIKey(user.ID, "sk-list-1", "Key 1", nil) s.mustCreateApiKey(user.ID, "sk-list-1", "Key 1", nil)
s.mustCreateAPIKey(user.ID, "sk-list-2", "Key 2", nil) s.mustCreateApiKey(user.ID, "sk-list-2", "Key 2", nil)
keys, page, err := s.repo.ListByUserID(s.ctx, user.ID, pagination.PaginationParams{Page: 1, PageSize: 10}) keys, page, err := s.repo.ListByUserID(s.ctx, user.ID, pagination.PaginationParams{Page: 1, PageSize: 10})
s.Require().NoError(err, "ListByUserID") s.Require().NoError(err, "ListByUserID")
@@ -161,10 +161,10 @@ func (s *APIKeyRepoSuite) TestListByUserID() {
s.Require().Equal(int64(2), page.Total) s.Require().Equal(int64(2), page.Total)
} }
func (s *APIKeyRepoSuite) TestListByUserID_Pagination() { func (s *ApiKeyRepoSuite) TestListByUserID_Pagination() {
user := s.mustCreateUser("paging@test.com") user := s.mustCreateUser("paging@test.com")
for i := 0; i < 5; i++ { for i := 0; i < 5; i++ {
s.mustCreateAPIKey(user.ID, "sk-page-"+string(rune('a'+i)), "Key", nil) s.mustCreateApiKey(user.ID, "sk-page-"+string(rune('a'+i)), "Key", nil)
} }
keys, page, err := s.repo.ListByUserID(s.ctx, user.ID, pagination.PaginationParams{Page: 1, PageSize: 2}) keys, page, err := s.repo.ListByUserID(s.ctx, user.ID, pagination.PaginationParams{Page: 1, PageSize: 2})
@@ -174,10 +174,10 @@ func (s *APIKeyRepoSuite) TestListByUserID_Pagination() {
s.Require().Equal(3, page.Pages) s.Require().Equal(3, page.Pages)
} }
func (s *APIKeyRepoSuite) TestCountByUserID() { func (s *ApiKeyRepoSuite) TestCountByUserID() {
user := s.mustCreateUser("count@test.com") user := s.mustCreateUser("count@test.com")
s.mustCreateAPIKey(user.ID, "sk-count-1", "K1", nil) s.mustCreateApiKey(user.ID, "sk-count-1", "K1", nil)
s.mustCreateAPIKey(user.ID, "sk-count-2", "K2", nil) s.mustCreateApiKey(user.ID, "sk-count-2", "K2", nil)
count, err := s.repo.CountByUserID(s.ctx, user.ID) count, err := s.repo.CountByUserID(s.ctx, user.ID)
s.Require().NoError(err, "CountByUserID") s.Require().NoError(err, "CountByUserID")
@@ -186,13 +186,13 @@ func (s *APIKeyRepoSuite) TestCountByUserID() {
// --- ListByGroupID / CountByGroupID --- // --- ListByGroupID / CountByGroupID ---
func (s *APIKeyRepoSuite) TestListByGroupID() { func (s *ApiKeyRepoSuite) TestListByGroupID() {
user := s.mustCreateUser("listbygroup@test.com") user := s.mustCreateUser("listbygroup@test.com")
group := s.mustCreateGroup("g-list") group := s.mustCreateGroup("g-list")
s.mustCreateAPIKey(user.ID, "sk-grp-1", "K1", &group.ID) s.mustCreateApiKey(user.ID, "sk-grp-1", "K1", &group.ID)
s.mustCreateAPIKey(user.ID, "sk-grp-2", "K2", &group.ID) s.mustCreateApiKey(user.ID, "sk-grp-2", "K2", &group.ID)
s.mustCreateAPIKey(user.ID, "sk-grp-3", "K3", nil) // no group s.mustCreateApiKey(user.ID, "sk-grp-3", "K3", nil) // no group
keys, page, err := s.repo.ListByGroupID(s.ctx, group.ID, pagination.PaginationParams{Page: 1, PageSize: 10}) keys, page, err := s.repo.ListByGroupID(s.ctx, group.ID, pagination.PaginationParams{Page: 1, PageSize: 10})
s.Require().NoError(err, "ListByGroupID") s.Require().NoError(err, "ListByGroupID")
@@ -202,10 +202,10 @@ func (s *APIKeyRepoSuite) TestListByGroupID() {
s.Require().NotNil(keys[0].User) s.Require().NotNil(keys[0].User)
} }
func (s *APIKeyRepoSuite) TestCountByGroupID() { func (s *ApiKeyRepoSuite) TestCountByGroupID() {
user := s.mustCreateUser("countgroup@test.com") user := s.mustCreateUser("countgroup@test.com")
group := s.mustCreateGroup("g-count") group := s.mustCreateGroup("g-count")
s.mustCreateAPIKey(user.ID, "sk-gc-1", "K1", &group.ID) s.mustCreateApiKey(user.ID, "sk-gc-1", "K1", &group.ID)
count, err := s.repo.CountByGroupID(s.ctx, group.ID) count, err := s.repo.CountByGroupID(s.ctx, group.ID)
s.Require().NoError(err, "CountByGroupID") s.Require().NoError(err, "CountByGroupID")
@@ -214,9 +214,9 @@ func (s *APIKeyRepoSuite) TestCountByGroupID() {
// --- ExistsByKey --- // --- ExistsByKey ---
func (s *APIKeyRepoSuite) TestExistsByKey() { func (s *ApiKeyRepoSuite) TestExistsByKey() {
user := s.mustCreateUser("exists@test.com") user := s.mustCreateUser("exists@test.com")
s.mustCreateAPIKey(user.ID, "sk-exists", "K", nil) s.mustCreateApiKey(user.ID, "sk-exists", "K", nil)
exists, err := s.repo.ExistsByKey(s.ctx, "sk-exists") exists, err := s.repo.ExistsByKey(s.ctx, "sk-exists")
s.Require().NoError(err, "ExistsByKey") s.Require().NoError(err, "ExistsByKey")
@@ -227,47 +227,47 @@ func (s *APIKeyRepoSuite) TestExistsByKey() {
s.Require().False(notExists) s.Require().False(notExists)
} }
// --- SearchAPIKeys --- // --- SearchApiKeys ---
func (s *APIKeyRepoSuite) TestSearchAPIKeys() { func (s *ApiKeyRepoSuite) TestSearchApiKeys() {
user := s.mustCreateUser("search@test.com") user := s.mustCreateUser("search@test.com")
s.mustCreateAPIKey(user.ID, "sk-search-1", "Production Key", nil) s.mustCreateApiKey(user.ID, "sk-search-1", "Production Key", nil)
s.mustCreateAPIKey(user.ID, "sk-search-2", "Development Key", nil) s.mustCreateApiKey(user.ID, "sk-search-2", "Development Key", nil)
found, err := s.repo.SearchAPIKeys(s.ctx, user.ID, "prod", 10) found, err := s.repo.SearchApiKeys(s.ctx, user.ID, "prod", 10)
s.Require().NoError(err, "SearchAPIKeys") s.Require().NoError(err, "SearchApiKeys")
s.Require().Len(found, 1) s.Require().Len(found, 1)
s.Require().Contains(found[0].Name, "Production") s.Require().Contains(found[0].Name, "Production")
} }
func (s *APIKeyRepoSuite) TestSearchAPIKeys_NoKeyword() { func (s *ApiKeyRepoSuite) TestSearchApiKeys_NoKeyword() {
user := s.mustCreateUser("searchnokw@test.com") user := s.mustCreateUser("searchnokw@test.com")
s.mustCreateAPIKey(user.ID, "sk-nk-1", "K1", nil) s.mustCreateApiKey(user.ID, "sk-nk-1", "K1", nil)
s.mustCreateAPIKey(user.ID, "sk-nk-2", "K2", nil) s.mustCreateApiKey(user.ID, "sk-nk-2", "K2", nil)
found, err := s.repo.SearchAPIKeys(s.ctx, user.ID, "", 10) found, err := s.repo.SearchApiKeys(s.ctx, user.ID, "", 10)
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Len(found, 2) s.Require().Len(found, 2)
} }
func (s *APIKeyRepoSuite) TestSearchAPIKeys_NoUserID() { func (s *ApiKeyRepoSuite) TestSearchApiKeys_NoUserID() {
user := s.mustCreateUser("searchnouid@test.com") user := s.mustCreateUser("searchnouid@test.com")
s.mustCreateAPIKey(user.ID, "sk-nu-1", "TestKey", nil) s.mustCreateApiKey(user.ID, "sk-nu-1", "TestKey", nil)
found, err := s.repo.SearchAPIKeys(s.ctx, 0, "testkey", 10) found, err := s.repo.SearchApiKeys(s.ctx, 0, "testkey", 10)
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Len(found, 1) s.Require().Len(found, 1)
} }
// --- ClearGroupIDByGroupID --- // --- ClearGroupIDByGroupID ---
func (s *APIKeyRepoSuite) TestClearGroupIDByGroupID() { func (s *ApiKeyRepoSuite) TestClearGroupIDByGroupID() {
user := s.mustCreateUser("cleargrp@test.com") user := s.mustCreateUser("cleargrp@test.com")
group := s.mustCreateGroup("g-clear-bulk") group := s.mustCreateGroup("g-clear-bulk")
k1 := s.mustCreateAPIKey(user.ID, "sk-clr-1", "K1", &group.ID) k1 := s.mustCreateApiKey(user.ID, "sk-clr-1", "K1", &group.ID)
k2 := s.mustCreateAPIKey(user.ID, "sk-clr-2", "K2", &group.ID) k2 := s.mustCreateApiKey(user.ID, "sk-clr-2", "K2", &group.ID)
s.mustCreateAPIKey(user.ID, "sk-clr-3", "K3", nil) // no group s.mustCreateApiKey(user.ID, "sk-clr-3", "K3", nil) // no group
affected, err := s.repo.ClearGroupIDByGroupID(s.ctx, group.ID) affected, err := s.repo.ClearGroupIDByGroupID(s.ctx, group.ID)
s.Require().NoError(err, "ClearGroupIDByGroupID") s.Require().NoError(err, "ClearGroupIDByGroupID")
@@ -284,10 +284,10 @@ func (s *APIKeyRepoSuite) TestClearGroupIDByGroupID() {
// --- Combined CRUD/Search/ClearGroupID (original test preserved as integration) --- // --- Combined CRUD/Search/ClearGroupID (original test preserved as integration) ---
func (s *APIKeyRepoSuite) TestCRUD_Search_ClearGroupID() { func (s *ApiKeyRepoSuite) TestCRUD_Search_ClearGroupID() {
user := s.mustCreateUser("k@example.com") user := s.mustCreateUser("k@example.com")
group := s.mustCreateGroup("g-k") group := s.mustCreateGroup("g-k")
key := s.mustCreateAPIKey(user.ID, "sk-test-1", "My Key", &group.ID) key := s.mustCreateApiKey(user.ID, "sk-test-1", "My Key", &group.ID)
key.GroupID = &group.ID key.GroupID = &group.ID
got, err := s.repo.GetByKey(s.ctx, key.Key) got, err := s.repo.GetByKey(s.ctx, key.Key)
@@ -320,13 +320,13 @@ func (s *APIKeyRepoSuite) TestCRUD_Search_ClearGroupID() {
s.Require().NoError(err, "ExistsByKey") s.Require().NoError(err, "ExistsByKey")
s.Require().True(exists, "expected key to exist") s.Require().True(exists, "expected key to exist")
found, err := s.repo.SearchAPIKeys(s.ctx, user.ID, "renam", 10) found, err := s.repo.SearchApiKeys(s.ctx, user.ID, "renam", 10)
s.Require().NoError(err, "SearchAPIKeys") s.Require().NoError(err, "SearchApiKeys")
s.Require().Len(found, 1) s.Require().Len(found, 1)
s.Require().Equal(key.ID, found[0].ID) s.Require().Equal(key.ID, found[0].ID)
// ClearGroupIDByGroupID // ClearGroupIDByGroupID
k2 := s.mustCreateAPIKey(user.ID, "sk-test-2", "Group Key", &group.ID) k2 := s.mustCreateApiKey(user.ID, "sk-test-2", "Group Key", &group.ID)
k2.GroupID = &group.ID k2.GroupID = &group.ID
countBefore, err := s.repo.CountByGroupID(s.ctx, group.ID) countBefore, err := s.repo.CountByGroupID(s.ctx, group.ID)
@@ -346,7 +346,7 @@ func (s *APIKeyRepoSuite) TestCRUD_Search_ClearGroupID() {
s.Require().Equal(int64(0), countAfter, "expected 0 keys in group after clear") s.Require().Equal(int64(0), countAfter, "expected 0 keys in group after clear")
} }
func (s *APIKeyRepoSuite) mustCreateUser(email string) *service.User { func (s *ApiKeyRepoSuite) mustCreateUser(email string) *service.User {
s.T().Helper() s.T().Helper()
u, err := s.client.User.Create(). u, err := s.client.User.Create().
@@ -359,7 +359,7 @@ func (s *APIKeyRepoSuite) mustCreateUser(email string) *service.User {
return userEntityToService(u) return userEntityToService(u)
} }
func (s *APIKeyRepoSuite) mustCreateGroup(name string) *service.Group { func (s *ApiKeyRepoSuite) mustCreateGroup(name string) *service.Group {
s.T().Helper() s.T().Helper()
g, err := s.client.Group.Create(). g, err := s.client.Group.Create().
@@ -370,10 +370,10 @@ func (s *APIKeyRepoSuite) mustCreateGroup(name string) *service.Group {
return groupEntityToService(g) return groupEntityToService(g)
} }
func (s *APIKeyRepoSuite) mustCreateAPIKey(userID int64, key, name string, groupID *int64) *service.APIKey { func (s *ApiKeyRepoSuite) mustCreateApiKey(userID int64, key, name string, groupID *int64) *service.ApiKey {
s.T().Helper() s.T().Helper()
k := &service.APIKey{ k := &service.ApiKey{
UserID: userID, UserID: userID,
Key: key, Key: key,
Name: name, Name: name,

View File

@@ -1,4 +1,4 @@
// Package repository 提供应用程序的基础设施层组件。 // Package infrastructure 提供应用程序的基础设施层组件。
// 包括数据库连接初始化、ORM 客户端管理、Redis 连接、数据库迁移等核心功能。 // 包括数据库连接初始化、ORM 客户端管理、Redis 连接、数据库迁移等核心功能。
package repository package repository

View File

@@ -243,7 +243,7 @@ func mustCreateAccount(t *testing.T, client *dbent.Client, a *service.Account) *
return a return a
} }
func mustCreateAPIKey(t *testing.T, client *dbent.Client, k *service.APIKey) *service.APIKey { func mustCreateApiKey(t *testing.T, client *dbent.Client, k *service.ApiKey) *service.ApiKey {
t.Helper() t.Helper()
ctx := context.Background() ctx := context.Background()
@@ -257,7 +257,7 @@ func mustCreateAPIKey(t *testing.T, client *dbent.Client, k *service.APIKey) *se
k.Name = "default" k.Name = "default"
} }
create := client.APIKey.Create(). create := client.ApiKey.Create().
SetUserID(k.UserID). SetUserID(k.UserID).
SetKey(k.Key). SetKey(k.Key).
SetName(k.Name). SetName(k.Name).

View File

@@ -293,8 +293,8 @@ func (r *groupRepository) DeleteCascade(ctx context.Context, id int64) ([]int64,
// 2. Clear group_id for api keys bound to this group. // 2. Clear group_id for api keys bound to this group.
// 仅更新未软删除的记录,避免修改已删除数据,保证审计与历史回溯一致性。 // 仅更新未软删除的记录,避免修改已删除数据,保证审计与历史回溯一致性。
// 与 APIKeyRepository 的软删除语义保持一致,减少跨模块行为差异。 // 与 ApiKeyRepository 的软删除语义保持一致,减少跨模块行为差异。
if _, err := txClient.APIKey.Update(). if _, err := txClient.ApiKey.Update().
Where(apikey.GroupIDEQ(id), apikey.DeletedAtIsNil()). Where(apikey.GroupIDEQ(id), apikey.DeletedAtIsNil()).
ClearGroupID(). ClearGroupID().
Save(ctx); err != nil { Save(ctx); err != nil {

View File

@@ -34,15 +34,15 @@ func createEntUser(t *testing.T, ctx context.Context, client *dbent.Client, emai
return u return u
} }
func TestEntSoftDelete_APIKey_DefaultFilterAndSkip(t *testing.T) { func TestEntSoftDelete_ApiKey_DefaultFilterAndSkip(t *testing.T) {
ctx := context.Background() ctx := context.Background()
// 使用全局 ent client确保软删除验证在实际持久化数据上进行。 // 使用全局 ent client确保软删除验证在实际持久化数据上进行。
client := testEntClient(t) client := testEntClient(t)
u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user")+"@example.com") u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user")+"@example.com")
repo := NewAPIKeyRepository(client) repo := NewApiKeyRepository(client)
key := &service.APIKey{ key := &service.ApiKey{
UserID: u.ID, UserID: u.ID,
Key: uniqueSoftDeleteValue(t, "sk-soft-delete"), Key: uniqueSoftDeleteValue(t, "sk-soft-delete"),
Name: "soft-delete", Name: "soft-delete",
@@ -53,28 +53,28 @@ func TestEntSoftDelete_APIKey_DefaultFilterAndSkip(t *testing.T) {
require.NoError(t, repo.Delete(ctx, key.ID), "soft delete api key") require.NoError(t, repo.Delete(ctx, key.ID), "soft delete api key")
_, err := repo.GetByID(ctx, key.ID) _, err := repo.GetByID(ctx, key.ID)
require.ErrorIs(t, err, service.ErrAPIKeyNotFound, "deleted rows should be hidden by default") require.ErrorIs(t, err, service.ErrApiKeyNotFound, "deleted rows should be hidden by default")
_, err = client.APIKey.Query().Where(apikey.IDEQ(key.ID)).Only(ctx) _, err = client.ApiKey.Query().Where(apikey.IDEQ(key.ID)).Only(ctx)
require.Error(t, err, "default ent query should not see soft-deleted rows") require.Error(t, err, "default ent query should not see soft-deleted rows")
require.True(t, dbent.IsNotFound(err), "expected ent not-found after default soft delete filter") require.True(t, dbent.IsNotFound(err), "expected ent not-found after default soft delete filter")
got, err := client.APIKey.Query(). got, err := client.ApiKey.Query().
Where(apikey.IDEQ(key.ID)). Where(apikey.IDEQ(key.ID)).
Only(mixins.SkipSoftDelete(ctx)) Only(mixins.SkipSoftDelete(ctx))
require.NoError(t, err, "SkipSoftDelete should include soft-deleted rows") require.NoError(t, err, "SkipSoftDelete should include soft-deleted rows")
require.NotNil(t, got.DeletedAt, "deleted_at should be set after soft delete") require.NotNil(t, got.DeletedAt, "deleted_at should be set after soft delete")
} }
func TestEntSoftDelete_APIKey_DeleteIdempotent(t *testing.T) { func TestEntSoftDelete_ApiKey_DeleteIdempotent(t *testing.T) {
ctx := context.Background() ctx := context.Background()
// 使用全局 ent client避免事务回滚影响幂等性验证。 // 使用全局 ent client避免事务回滚影响幂等性验证。
client := testEntClient(t) client := testEntClient(t)
u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user2")+"@example.com") u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user2")+"@example.com")
repo := NewAPIKeyRepository(client) repo := NewApiKeyRepository(client)
key := &service.APIKey{ key := &service.ApiKey{
UserID: u.ID, UserID: u.ID,
Key: uniqueSoftDeleteValue(t, "sk-soft-delete2"), Key: uniqueSoftDeleteValue(t, "sk-soft-delete2"),
Name: "soft-delete2", Name: "soft-delete2",
@@ -86,15 +86,15 @@ func TestEntSoftDelete_APIKey_DeleteIdempotent(t *testing.T) {
require.NoError(t, repo.Delete(ctx, key.ID), "second delete should be idempotent") require.NoError(t, repo.Delete(ctx, key.ID), "second delete should be idempotent")
} }
func TestEntSoftDelete_APIKey_HardDeleteViaSkipSoftDelete(t *testing.T) { func TestEntSoftDelete_ApiKey_HardDeleteViaSkipSoftDelete(t *testing.T) {
ctx := context.Background() ctx := context.Background()
// 使用全局 ent client确保 SkipSoftDelete 的硬删除语义可验证。 // 使用全局 ent client确保 SkipSoftDelete 的硬删除语义可验证。
client := testEntClient(t) client := testEntClient(t)
u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user3")+"@example.com") u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user3")+"@example.com")
repo := NewAPIKeyRepository(client) repo := NewApiKeyRepository(client)
key := &service.APIKey{ key := &service.ApiKey{
UserID: u.ID, UserID: u.ID,
Key: uniqueSoftDeleteValue(t, "sk-soft-delete3"), Key: uniqueSoftDeleteValue(t, "sk-soft-delete3"),
Name: "soft-delete3", Name: "soft-delete3",
@@ -105,10 +105,10 @@ func TestEntSoftDelete_APIKey_HardDeleteViaSkipSoftDelete(t *testing.T) {
require.NoError(t, repo.Delete(ctx, key.ID), "soft delete api key") require.NoError(t, repo.Delete(ctx, key.ID), "soft delete api key")
// Hard delete using SkipSoftDelete so the hook doesn't convert it to update-deleted_at. // Hard delete using SkipSoftDelete so the hook doesn't convert it to update-deleted_at.
_, err := client.APIKey.Delete().Where(apikey.IDEQ(key.ID)).Exec(mixins.SkipSoftDelete(ctx)) _, err := client.ApiKey.Delete().Where(apikey.IDEQ(key.ID)).Exec(mixins.SkipSoftDelete(ctx))
require.NoError(t, err, "hard delete") require.NoError(t, err, "hard delete")
_, err = client.APIKey.Query(). _, err = client.ApiKey.Query().
Where(apikey.IDEQ(key.ID)). Where(apikey.IDEQ(key.ID)).
Only(mixins.SkipSoftDelete(ctx)) Only(mixins.SkipSoftDelete(ctx))
require.True(t, dbent.IsNotFound(err), "expected row to be hard deleted") require.True(t, dbent.IsNotFound(err), "expected row to be hard deleted")

View File

@@ -4,12 +4,13 @@ import (
"context" "context"
"database/sql" "database/sql"
"errors" "errors"
"fmt"
"sort" "sort"
"strings"
dbent "github.com/Wei-Shaw/sub2api/ent" dbent "github.com/Wei-Shaw/sub2api/ent"
dbuser "github.com/Wei-Shaw/sub2api/ent/user" dbuser "github.com/Wei-Shaw/sub2api/ent/user"
"github.com/Wei-Shaw/sub2api/ent/userallowedgroup" "github.com/Wei-Shaw/sub2api/ent/userallowedgroup"
"github.com/Wei-Shaw/sub2api/ent/userattributevalue"
"github.com/Wei-Shaw/sub2api/ent/usersubscription" "github.com/Wei-Shaw/sub2api/ent/usersubscription"
"github.com/Wei-Shaw/sub2api/internal/pkg/pagination" "github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
"github.com/Wei-Shaw/sub2api/internal/service" "github.com/Wei-Shaw/sub2api/internal/service"
@@ -17,14 +18,15 @@ import (
type userRepository struct { type userRepository struct {
client *dbent.Client client *dbent.Client
sql sqlExecutor
} }
func NewUserRepository(client *dbent.Client, sqlDB *sql.DB) service.UserRepository { func NewUserRepository(client *dbent.Client, sqlDB *sql.DB) service.UserRepository {
return newUserRepositoryWithSQL(client, sqlDB) return newUserRepositoryWithSQL(client, sqlDB)
} }
func newUserRepositoryWithSQL(client *dbent.Client, _ sqlExecutor) *userRepository { func newUserRepositoryWithSQL(client *dbent.Client, sqlq sqlExecutor) *userRepository {
return &userRepository{client: client} return &userRepository{client: client, sql: sqlq}
} }
func (r *userRepository) Create(ctx context.Context, userIn *service.User) error { func (r *userRepository) Create(ctx context.Context, userIn *service.User) error {
@@ -194,7 +196,11 @@ func (r *userRepository) ListWithFilters(ctx context.Context, params pagination.
// If attribute filters are specified, we need to filter by user IDs first // If attribute filters are specified, we need to filter by user IDs first
var allowedUserIDs []int64 var allowedUserIDs []int64
if len(filters.Attributes) > 0 { if len(filters.Attributes) > 0 {
allowedUserIDs = r.filterUsersByAttributes(ctx, filters.Attributes) var attrErr error
allowedUserIDs, attrErr = r.filterUsersByAttributes(ctx, filters.Attributes)
if attrErr != nil {
return nil, nil, attrErr
}
if len(allowedUserIDs) == 0 { if len(allowedUserIDs) == 0 {
// No users match the attribute filters // No users match the attribute filters
return []service.User{}, paginationResultFromTotal(0, params), nil return []service.User{}, paginationResultFromTotal(0, params), nil
@@ -262,56 +268,53 @@ func (r *userRepository) ListWithFilters(ctx context.Context, params pagination.
} }
// filterUsersByAttributes returns user IDs that match ALL the given attribute filters // filterUsersByAttributes returns user IDs that match ALL the given attribute filters
func (r *userRepository) filterUsersByAttributes(ctx context.Context, attrs map[int64]string) []int64 { func (r *userRepository) filterUsersByAttributes(ctx context.Context, attrs map[int64]string) ([]int64, error) {
if len(attrs) == 0 { if len(attrs) == 0 {
return nil return nil, nil
} }
// For each attribute filter, get the set of matching user IDs if r.sql == nil {
// Then intersect all sets to get users matching ALL filters return nil, fmt.Errorf("sql executor is not configured")
var resultSet map[int64]struct{} }
first := true
clauses := make([]string, 0, len(attrs))
args := make([]any, 0, len(attrs)*2+1)
argIndex := 1
for attrID, value := range attrs { for attrID, value := range attrs {
// Query user_attribute_values for this attribute clauses = append(clauses, fmt.Sprintf("(attribute_id = $%d AND value ILIKE $%d)", argIndex, argIndex+1))
values, err := r.client.UserAttributeValue.Query(). args = append(args, attrID, "%"+value+"%")
Where( argIndex += 2
userattributevalue.AttributeIDEQ(attrID),
userattributevalue.ValueContainsFold(value),
).
All(ctx)
if err != nil {
continue
}
currentSet := make(map[int64]struct{}, len(values))
for _, v := range values {
currentSet[v.UserID] = struct{}{}
}
if first {
resultSet = currentSet
first = false
} else {
// Intersect with previous results
for userID := range resultSet {
if _, ok := currentSet[userID]; !ok {
delete(resultSet, userID)
}
}
}
// Early exit if no users match
if len(resultSet) == 0 {
return nil
}
} }
result := make([]int64, 0, len(resultSet)) query := fmt.Sprintf(
for userID := range resultSet { `SELECT user_id
FROM user_attribute_values
WHERE %s
GROUP BY user_id
HAVING COUNT(DISTINCT attribute_id) = $%d`,
strings.Join(clauses, " OR "),
argIndex,
)
args = append(args, len(attrs))
rows, err := r.sql.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
result := make([]int64, 0)
for rows.Next() {
var userID int64
if scanErr := rows.Scan(&userID); scanErr != nil {
return nil, scanErr
}
result = append(result, userID) result = append(result, userID)
} }
return result if err := rows.Err(); err != nil {
return nil, err
}
return result, nil
} }
func (r *userRepository) UpdateBalance(ctx context.Context, id int64, amount float64) error { func (r *userRepository) UpdateBalance(ctx context.Context, id int64, amount float64) error {

View File

@@ -28,13 +28,12 @@ func ProvideConcurrencyCache(rdb *redis.Client, cfg *config.Config) service.Conc
// ProviderSet is the Wire provider set for all repositories // ProviderSet is the Wire provider set for all repositories
var ProviderSet = wire.NewSet( var ProviderSet = wire.NewSet(
NewUserRepository, NewUserRepository,
NewAPIKeyRepository, NewApiKeyRepository,
NewGroupRepository, NewGroupRepository,
NewAccountRepository, NewAccountRepository,
NewProxyRepository, NewProxyRepository,
NewRedeemCodeRepository, NewRedeemCodeRepository,
NewUsageLogRepository, NewUsageLogRepository,
NewOpsRepository,
NewSettingRepository, NewSettingRepository,
NewUserSubscriptionRepository, NewUserSubscriptionRepository,
NewUserAttributeDefinitionRepository, NewUserAttributeDefinitionRepository,
@@ -43,7 +42,8 @@ var ProviderSet = wire.NewSet(
// Cache implementations // Cache implementations
NewGatewayCache, NewGatewayCache,
NewBillingCache, NewBillingCache,
NewAPIKeyCache, NewApiKeyCache,
NewTempUnschedCache,
ProvideConcurrencyCache, ProvideConcurrencyCache,
NewEmailCache, NewEmailCache,
NewIdentityCache, NewIdentityCache,

View File

@@ -1,4 +1,3 @@
// Package server provides HTTP server setup and routing configuration.
package server package server
import ( import (
@@ -26,8 +25,8 @@ func ProvideRouter(
handlers *handler.Handlers, handlers *handler.Handlers,
jwtAuth middleware2.JWTAuthMiddleware, jwtAuth middleware2.JWTAuthMiddleware,
adminAuth middleware2.AdminAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware,
apiKeyAuth middleware2.APIKeyAuthMiddleware, apiKeyAuth middleware2.ApiKeyAuthMiddleware,
apiKeyService *service.APIKeyService, apiKeyService *service.ApiKeyService,
subscriptionService *service.SubscriptionService, subscriptionService *service.SubscriptionService,
) *gin.Engine { ) *gin.Engine {
if cfg.Server.Mode == "release" { if cfg.Server.Mode == "release" {

View File

@@ -32,7 +32,7 @@ func adminAuth(
// 检查 x-api-key headerAdmin API Key 认证) // 检查 x-api-key headerAdmin API Key 认证)
apiKey := c.GetHeader("x-api-key") apiKey := c.GetHeader("x-api-key")
if apiKey != "" { if apiKey != "" {
if !validateAdminAPIKey(c, apiKey, settingService, userService) { if !validateAdminApiKey(c, apiKey, settingService, userService) {
return return
} }
c.Next() c.Next()
@@ -52,48 +52,19 @@ func adminAuth(
} }
} }
// WebSocket 请求无法设置自定义 header允许在 query 中携带凭证
if isWebSocketRequest(c) {
if token := strings.TrimSpace(c.Query("token")); token != "" {
if !validateJWTForAdmin(c, token, authService, userService) {
return
}
c.Next()
return
}
if apiKey := strings.TrimSpace(c.Query("api_key")); apiKey != "" {
if !validateAdminAPIKey(c, apiKey, settingService, userService) {
return
}
c.Next()
return
}
}
// 无有效认证信息 // 无有效认证信息
AbortWithError(c, 401, "UNAUTHORIZED", "Authorization required") AbortWithError(c, 401, "UNAUTHORIZED", "Authorization required")
} }
} }
func isWebSocketRequest(c *gin.Context) bool { // validateAdminApiKey 验证管理员 API Key
if c == nil || c.Request == nil { func validateAdminApiKey(
return false
}
if strings.EqualFold(c.GetHeader("Upgrade"), "websocket") {
return true
}
conn := strings.ToLower(c.GetHeader("Connection"))
return strings.Contains(conn, "upgrade") && strings.EqualFold(c.GetHeader("Upgrade"), "websocket")
}
// validateAdminAPIKey 验证管理员 API Key
func validateAdminAPIKey(
c *gin.Context, c *gin.Context,
key string, key string,
settingService *service.SettingService, settingService *service.SettingService,
userService *service.UserService, userService *service.UserService,
) bool { ) bool {
storedKey, err := settingService.GetAdminAPIKey(c.Request.Context()) storedKey, err := settingService.GetAdminApiKey(c.Request.Context())
if err != nil { if err != nil {
AbortWithError(c, 500, "INTERNAL_ERROR", "Internal server error") AbortWithError(c, 500, "INTERNAL_ERROR", "Internal server error")
return false return false

View File

@@ -11,13 +11,13 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// NewAPIKeyAuthMiddleware 创建 API Key 认证中间件 // NewApiKeyAuthMiddleware 创建 API Key 认证中间件
func NewAPIKeyAuthMiddleware(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config, opsService *service.OpsService) APIKeyAuthMiddleware { func NewApiKeyAuthMiddleware(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) ApiKeyAuthMiddleware {
return APIKeyAuthMiddleware(apiKeyAuthWithSubscription(apiKeyService, subscriptionService, cfg, opsService)) return ApiKeyAuthMiddleware(apiKeyAuthWithSubscription(apiKeyService, subscriptionService, cfg))
} }
// apiKeyAuthWithSubscription API Key认证中间件支持订阅验证 // apiKeyAuthWithSubscription API Key认证中间件支持订阅验证
func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config, opsService *service.OpsService) gin.HandlerFunc { func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
// 尝试从Authorization header中提取API key (Bearer scheme) // 尝试从Authorization header中提取API key (Bearer scheme)
authHeader := c.GetHeader("Authorization") authHeader := c.GetHeader("Authorization")
@@ -53,7 +53,6 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
// 如果所有header都没有API key // 如果所有header都没有API key
if apiKeyString == "" { if apiKeyString == "" {
recordOpsAuthError(c, opsService, nil, 401, "API key is required in Authorization header (Bearer scheme), x-api-key header, x-goog-api-key header, or key/api_key query parameter")
AbortWithError(c, 401, "API_KEY_REQUIRED", "API key is required in Authorization header (Bearer scheme), x-api-key header, x-goog-api-key header, or key/api_key query parameter") AbortWithError(c, 401, "API_KEY_REQUIRED", "API key is required in Authorization header (Bearer scheme), x-api-key header, x-goog-api-key header, or key/api_key query parameter")
return return
} }
@@ -61,40 +60,35 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
// 从数据库验证API key // 从数据库验证API key
apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString) apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString)
if err != nil { if err != nil {
if errors.Is(err, service.ErrAPIKeyNotFound) { if errors.Is(err, service.ErrApiKeyNotFound) {
recordOpsAuthError(c, opsService, nil, 401, "Invalid API key")
AbortWithError(c, 401, "INVALID_API_KEY", "Invalid API key") AbortWithError(c, 401, "INVALID_API_KEY", "Invalid API key")
return return
} }
recordOpsAuthError(c, opsService, nil, 500, "Failed to validate API key")
AbortWithError(c, 500, "INTERNAL_ERROR", "Failed to validate API key") AbortWithError(c, 500, "INTERNAL_ERROR", "Failed to validate API key")
return return
} }
// 检查API key是否激活 // 检查API key是否激活
if !apiKey.IsActive() { if !apiKey.IsActive() {
recordOpsAuthError(c, opsService, apiKey, 401, "API key is disabled")
AbortWithError(c, 401, "API_KEY_DISABLED", "API key is disabled") AbortWithError(c, 401, "API_KEY_DISABLED", "API key is disabled")
return return
} }
// 检查关联的用户 // 检查关联的用户
if apiKey.User == nil { if apiKey.User == nil {
recordOpsAuthError(c, opsService, apiKey, 401, "User associated with API key not found")
AbortWithError(c, 401, "USER_NOT_FOUND", "User associated with API key not found") AbortWithError(c, 401, "USER_NOT_FOUND", "User associated with API key not found")
return return
} }
// 检查用户状态 // 检查用户状态
if !apiKey.User.IsActive() { if !apiKey.User.IsActive() {
recordOpsAuthError(c, opsService, apiKey, 401, "User account is not active")
AbortWithError(c, 401, "USER_INACTIVE", "User account is not active") AbortWithError(c, 401, "USER_INACTIVE", "User account is not active")
return return
} }
if cfg.RunMode == config.RunModeSimple { if cfg.RunMode == config.RunModeSimple {
// 简易模式:跳过余额和订阅检查,但仍需设置必要的上下文 // 简易模式:跳过余额和订阅检查,但仍需设置必要的上下文
c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyApiKey), apiKey)
c.Set(string(ContextKeyUser), AuthSubject{ c.Set(string(ContextKeyUser), AuthSubject{
UserID: apiKey.User.ID, UserID: apiKey.User.ID,
Concurrency: apiKey.User.Concurrency, Concurrency: apiKey.User.Concurrency,
@@ -115,14 +109,12 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
apiKey.Group.ID, apiKey.Group.ID,
) )
if err != nil { if err != nil {
recordOpsAuthError(c, opsService, apiKey, 403, "No active subscription found for this group")
AbortWithError(c, 403, "SUBSCRIPTION_NOT_FOUND", "No active subscription found for this group") AbortWithError(c, 403, "SUBSCRIPTION_NOT_FOUND", "No active subscription found for this group")
return return
} }
// 验证订阅状态(是否过期、暂停等) // 验证订阅状态(是否过期、暂停等)
if err := subscriptionService.ValidateSubscription(c.Request.Context(), subscription); err != nil { if err := subscriptionService.ValidateSubscription(c.Request.Context(), subscription); err != nil {
recordOpsAuthError(c, opsService, apiKey, 403, err.Error())
AbortWithError(c, 403, "SUBSCRIPTION_INVALID", err.Error()) AbortWithError(c, 403, "SUBSCRIPTION_INVALID", err.Error())
return return
} }
@@ -139,7 +131,6 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
// 预检查用量限制使用0作为额外费用进行预检查 // 预检查用量限制使用0作为额外费用进行预检查
if err := subscriptionService.CheckUsageLimits(c.Request.Context(), subscription, apiKey.Group, 0); err != nil { if err := subscriptionService.CheckUsageLimits(c.Request.Context(), subscription, apiKey.Group, 0); err != nil {
recordOpsAuthError(c, opsService, apiKey, 429, err.Error())
AbortWithError(c, 429, "USAGE_LIMIT_EXCEEDED", err.Error()) AbortWithError(c, 429, "USAGE_LIMIT_EXCEEDED", err.Error())
return return
} }
@@ -149,14 +140,13 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
} else { } else {
// 余额模式:检查用户余额 // 余额模式:检查用户余额
if apiKey.User.Balance <= 0 { if apiKey.User.Balance <= 0 {
recordOpsAuthError(c, opsService, apiKey, 403, "Insufficient account balance")
AbortWithError(c, 403, "INSUFFICIENT_BALANCE", "Insufficient account balance") AbortWithError(c, 403, "INSUFFICIENT_BALANCE", "Insufficient account balance")
return return
} }
} }
// 将API key和用户信息存入上下文 // 将API key和用户信息存入上下文
c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyApiKey), apiKey)
c.Set(string(ContextKeyUser), AuthSubject{ c.Set(string(ContextKeyUser), AuthSubject{
UserID: apiKey.User.ID, UserID: apiKey.User.ID,
Concurrency: apiKey.User.Concurrency, Concurrency: apiKey.User.Concurrency,
@@ -167,66 +157,13 @@ func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscripti
} }
} }
func recordOpsAuthError(c *gin.Context, opsService *service.OpsService, apiKey *service.APIKey, status int, message string) { // GetApiKeyFromContext 从上下文中获取API key
if opsService == nil || c == nil { func GetApiKeyFromContext(c *gin.Context) (*service.ApiKey, bool) {
return value, exists := c.Get(string(ContextKeyApiKey))
}
errType := "authentication_error"
phase := "auth"
severity := "P3"
switch status {
case 403:
errType = "billing_error"
phase = "billing"
case 429:
errType = "rate_limit_error"
phase = "billing"
severity = "P2"
case 500:
errType = "api_error"
phase = "internal"
severity = "P1"
}
logEntry := &service.OpsErrorLog{
Phase: phase,
Type: errType,
Severity: severity,
StatusCode: status,
Message: message,
ClientIP: c.ClientIP(),
RequestPath: func() string {
if c.Request != nil && c.Request.URL != nil {
return c.Request.URL.Path
}
return ""
}(),
}
if apiKey != nil {
logEntry.APIKeyID = &apiKey.ID
if apiKey.User != nil {
logEntry.UserID = &apiKey.User.ID
}
if apiKey.GroupID != nil {
logEntry.GroupID = apiKey.GroupID
}
if apiKey.Group != nil {
logEntry.Platform = apiKey.Group.Platform
}
}
enqueueOpsAuthErrorLog(opsService, logEntry)
}
// GetAPIKeyFromContext 从上下文中获取API key
func GetAPIKeyFromContext(c *gin.Context) (*service.APIKey, bool) {
value, exists := c.Get(string(ContextKeyAPIKey))
if !exists { if !exists {
return nil, false return nil, false
} }
apiKey, ok := value.(*service.APIKey) apiKey, ok := value.(*service.ApiKey)
return apiKey, ok return apiKey, ok
} }

View File

@@ -11,16 +11,16 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// APIKeyAuthGoogle is a Google-style error wrapper for API key auth. // ApiKeyAuthGoogle is a Google-style error wrapper for API key auth.
func APIKeyAuthGoogle(apiKeyService *service.APIKeyService, cfg *config.Config) gin.HandlerFunc { func ApiKeyAuthGoogle(apiKeyService *service.ApiKeyService, cfg *config.Config) gin.HandlerFunc {
return APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, cfg) return ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, cfg)
} }
// APIKeyAuthWithSubscriptionGoogle behaves like APIKeyAuthWithSubscription but returns Google-style errors: // ApiKeyAuthWithSubscriptionGoogle behaves like ApiKeyAuthWithSubscription but returns Google-style errors:
// {"error":{"code":401,"message":"...","status":"UNAUTHENTICATED"}} // {"error":{"code":401,"message":"...","status":"UNAUTHENTICATED"}}
// //
// It is intended for Gemini native endpoints (/v1beta) to match Gemini SDK expectations. // It is intended for Gemini native endpoints (/v1beta) to match Gemini SDK expectations.
func APIKeyAuthWithSubscriptionGoogle(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) gin.HandlerFunc { func ApiKeyAuthWithSubscriptionGoogle(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
apiKeyString := extractAPIKeyFromRequest(c) apiKeyString := extractAPIKeyFromRequest(c)
if apiKeyString == "" { if apiKeyString == "" {
@@ -30,7 +30,7 @@ func APIKeyAuthWithSubscriptionGoogle(apiKeyService *service.APIKeyService, subs
apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString) apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString)
if err != nil { if err != nil {
if errors.Is(err, service.ErrAPIKeyNotFound) { if errors.Is(err, service.ErrApiKeyNotFound) {
abortWithGoogleError(c, 401, "Invalid API key") abortWithGoogleError(c, 401, "Invalid API key")
return return
} }
@@ -53,7 +53,7 @@ func APIKeyAuthWithSubscriptionGoogle(apiKeyService *service.APIKeyService, subs
// 简易模式:跳过余额和订阅检查 // 简易模式:跳过余额和订阅检查
if cfg.RunMode == config.RunModeSimple { if cfg.RunMode == config.RunModeSimple {
c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyApiKey), apiKey)
c.Set(string(ContextKeyUser), AuthSubject{ c.Set(string(ContextKeyUser), AuthSubject{
UserID: apiKey.User.ID, UserID: apiKey.User.ID,
Concurrency: apiKey.User.Concurrency, Concurrency: apiKey.User.Concurrency,
@@ -92,7 +92,7 @@ func APIKeyAuthWithSubscriptionGoogle(apiKeyService *service.APIKeyService, subs
} }
} }
c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyApiKey), apiKey)
c.Set(string(ContextKeyUser), AuthSubject{ c.Set(string(ContextKeyUser), AuthSubject{
UserID: apiKey.User.ID, UserID: apiKey.User.ID,
Concurrency: apiKey.User.Concurrency, Concurrency: apiKey.User.Concurrency,

View File

@@ -16,53 +16,53 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
type fakeAPIKeyRepo struct { type fakeApiKeyRepo struct {
getByKey func(ctx context.Context, key string) (*service.APIKey, error) getByKey func(ctx context.Context, key string) (*service.ApiKey, error)
} }
func (f fakeAPIKeyRepo) Create(ctx context.Context, key *service.APIKey) error { func (f fakeApiKeyRepo) Create(ctx context.Context, key *service.ApiKey) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) GetByID(ctx context.Context, id int64) (*service.APIKey, error) { func (f fakeApiKeyRepo) GetByID(ctx context.Context, id int64) (*service.ApiKey, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error) { func (f fakeApiKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) GetByKey(ctx context.Context, key string) (*service.APIKey, error) { func (f fakeApiKeyRepo) GetByKey(ctx context.Context, key string) (*service.ApiKey, error) {
if f.getByKey == nil { if f.getByKey == nil {
return nil, errors.New("unexpected call") return nil, errors.New("unexpected call")
} }
return f.getByKey(ctx, key) return f.getByKey(ctx, key)
} }
func (f fakeAPIKeyRepo) Update(ctx context.Context, key *service.APIKey) error { func (f fakeApiKeyRepo) Update(ctx context.Context, key *service.ApiKey) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) Delete(ctx context.Context, id int64) error { func (f fakeApiKeyRepo) Delete(ctx context.Context, id int64) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (f fakeApiKeyRepo) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
return nil, nil, errors.New("not implemented") return nil, nil, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) { func (f fakeApiKeyRepo) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) CountByUserID(ctx context.Context, userID int64) (int64, error) { func (f fakeApiKeyRepo) CountByUserID(ctx context.Context, userID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, error) { func (f fakeApiKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, error) {
return false, errors.New("not implemented") return false, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (f fakeApiKeyRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
return nil, nil, errors.New("not implemented") return nil, nil, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.APIKey, error) { func (f fakeApiKeyRepo) SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.ApiKey, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) { func (f fakeApiKeyRepo) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (f fakeAPIKeyRepo) CountByGroupID(ctx context.Context, groupID int64) (int64, error) { func (f fakeApiKeyRepo) CountByGroupID(ctx context.Context, groupID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
@@ -74,8 +74,8 @@ type googleErrorResponse struct {
} `json:"error"` } `json:"error"`
} }
func newTestAPIKeyService(repo service.APIKeyRepository) *service.APIKeyService { func newTestApiKeyService(repo service.ApiKeyRepository) *service.ApiKeyService {
return service.NewAPIKeyService( return service.NewApiKeyService(
repo, repo,
nil, // userRepo (unused in GetByKey) nil, // userRepo (unused in GetByKey)
nil, // groupRepo nil, // groupRepo
@@ -85,16 +85,16 @@ func newTestAPIKeyService(repo service.APIKeyRepository) *service.APIKeyService
) )
} }
func TestAPIKeyAuthWithSubscriptionGoogle_MissingKey(t *testing.T) { func TestApiKeyAuthWithSubscriptionGoogle_MissingKey(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
r := gin.New() r := gin.New()
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ apiKeyService := newTestApiKeyService(fakeApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
return nil, errors.New("should not be called") return nil, errors.New("should not be called")
}, },
}) })
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{})) r.Use(ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{}))
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)
@@ -109,16 +109,16 @@ func TestAPIKeyAuthWithSubscriptionGoogle_MissingKey(t *testing.T) {
require.Equal(t, "UNAUTHENTICATED", resp.Error.Status) require.Equal(t, "UNAUTHENTICATED", resp.Error.Status)
} }
func TestAPIKeyAuthWithSubscriptionGoogle_InvalidKey(t *testing.T) { func TestApiKeyAuthWithSubscriptionGoogle_InvalidKey(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
r := gin.New() r := gin.New()
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ apiKeyService := newTestApiKeyService(fakeApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
return nil, service.ErrAPIKeyNotFound return nil, service.ErrApiKeyNotFound
}, },
}) })
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{})) r.Use(ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{}))
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)
@@ -134,16 +134,16 @@ func TestAPIKeyAuthWithSubscriptionGoogle_InvalidKey(t *testing.T) {
require.Equal(t, "UNAUTHENTICATED", resp.Error.Status) require.Equal(t, "UNAUTHENTICATED", resp.Error.Status)
} }
func TestAPIKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) { func TestApiKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
r := gin.New() r := gin.New()
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ apiKeyService := newTestApiKeyService(fakeApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
return nil, errors.New("db down") return nil, errors.New("db down")
}, },
}) })
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{})) r.Use(ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{}))
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)
@@ -159,13 +159,13 @@ func TestAPIKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) {
require.Equal(t, "INTERNAL", resp.Error.Status) require.Equal(t, "INTERNAL", resp.Error.Status)
} }
func TestAPIKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) { func TestApiKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
r := gin.New() r := gin.New()
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ apiKeyService := newTestApiKeyService(fakeApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
return &service.APIKey{ return &service.ApiKey{
ID: 1, ID: 1,
Key: key, Key: key,
Status: service.StatusDisabled, Status: service.StatusDisabled,
@@ -176,7 +176,7 @@ func TestAPIKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) {
}, nil }, nil
}, },
}) })
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{})) r.Use(ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{}))
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)
@@ -192,13 +192,13 @@ func TestAPIKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) {
require.Equal(t, "UNAUTHENTICATED", resp.Error.Status) require.Equal(t, "UNAUTHENTICATED", resp.Error.Status)
} }
func TestAPIKeyAuthWithSubscriptionGoogle_InsufficientBalance(t *testing.T) { func TestApiKeyAuthWithSubscriptionGoogle_InsufficientBalance(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
r := gin.New() r := gin.New()
apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ apiKeyService := newTestApiKeyService(fakeApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
return &service.APIKey{ return &service.ApiKey{
ID: 1, ID: 1,
Key: key, Key: key,
Status: service.StatusActive, Status: service.StatusActive,
@@ -210,7 +210,7 @@ func TestAPIKeyAuthWithSubscriptionGoogle_InsufficientBalance(t *testing.T) {
}, nil }, nil
}, },
}) })
r.Use(APIKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{})) r.Use(ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, &config.Config{}))
r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) r.GET("/v1beta/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) })
req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil)

View File

@@ -35,7 +35,7 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) {
Balance: 10, Balance: 10,
Concurrency: 3, Concurrency: 3,
} }
apiKey := &service.APIKey{ apiKey := &service.ApiKey{
ID: 100, ID: 100,
UserID: user.ID, UserID: user.ID,
Key: "test-key", Key: "test-key",
@@ -45,10 +45,10 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) {
} }
apiKey.GroupID = &group.ID apiKey.GroupID = &group.ID
apiKeyRepo := &stubAPIKeyRepo{ apiKeyRepo := &stubApiKeyRepo{
getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) {
if key != apiKey.Key { if key != apiKey.Key {
return nil, service.ErrAPIKeyNotFound return nil, service.ErrApiKeyNotFound
} }
clone := *apiKey clone := *apiKey
return &clone, nil return &clone, nil
@@ -57,7 +57,7 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) {
t.Run("simple_mode_bypasses_quota_check", func(t *testing.T) { t.Run("simple_mode_bypasses_quota_check", func(t *testing.T) {
cfg := &config.Config{RunMode: config.RunModeSimple} cfg := &config.Config{RunMode: config.RunModeSimple}
apiKeyService := service.NewAPIKeyService(apiKeyRepo, nil, nil, nil, nil, cfg) apiKeyService := service.NewApiKeyService(apiKeyRepo, nil, nil, nil, nil, cfg)
subscriptionService := service.NewSubscriptionService(nil, &stubUserSubscriptionRepo{}, nil) subscriptionService := service.NewSubscriptionService(nil, &stubUserSubscriptionRepo{}, nil)
router := newAuthTestRouter(apiKeyService, subscriptionService, cfg) router := newAuthTestRouter(apiKeyService, subscriptionService, cfg)
@@ -71,7 +71,7 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) {
t.Run("standard_mode_enforces_quota_check", func(t *testing.T) { t.Run("standard_mode_enforces_quota_check", func(t *testing.T) {
cfg := &config.Config{RunMode: config.RunModeStandard} cfg := &config.Config{RunMode: config.RunModeStandard}
apiKeyService := service.NewAPIKeyService(apiKeyRepo, nil, nil, nil, nil, cfg) apiKeyService := service.NewApiKeyService(apiKeyRepo, nil, nil, nil, nil, cfg)
now := time.Now() now := time.Now()
sub := &service.UserSubscription{ sub := &service.UserSubscription{
@@ -110,75 +110,75 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) {
}) })
} }
func newAuthTestRouter(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) *gin.Engine { func newAuthTestRouter(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) *gin.Engine {
router := gin.New() router := gin.New()
router.Use(gin.HandlerFunc(NewAPIKeyAuthMiddleware(apiKeyService, subscriptionService, cfg, nil))) router.Use(gin.HandlerFunc(NewApiKeyAuthMiddleware(apiKeyService, subscriptionService, cfg)))
router.GET("/t", func(c *gin.Context) { router.GET("/t", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"ok": true}) c.JSON(http.StatusOK, gin.H{"ok": true})
}) })
return router return router
} }
type stubAPIKeyRepo struct { type stubApiKeyRepo struct {
getByKey func(ctx context.Context, key string) (*service.APIKey, error) getByKey func(ctx context.Context, key string) (*service.ApiKey, error)
} }
func (r *stubAPIKeyRepo) Create(ctx context.Context, key *service.APIKey) error { func (r *stubApiKeyRepo) Create(ctx context.Context, key *service.ApiKey) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) GetByID(ctx context.Context, id int64) (*service.APIKey, error) { func (r *stubApiKeyRepo) GetByID(ctx context.Context, id int64) (*service.ApiKey, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error) { func (r *stubApiKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) GetByKey(ctx context.Context, key string) (*service.APIKey, error) { func (r *stubApiKeyRepo) GetByKey(ctx context.Context, key string) (*service.ApiKey, error) {
if r.getByKey != nil { if r.getByKey != nil {
return r.getByKey(ctx, key) return r.getByKey(ctx, key)
} }
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) Update(ctx context.Context, key *service.APIKey) error { func (r *stubApiKeyRepo) Update(ctx context.Context, key *service.ApiKey) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) Delete(ctx context.Context, id int64) error { func (r *stubApiKeyRepo) Delete(ctx context.Context, id int64) error {
return errors.New("not implemented") return errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (r *stubApiKeyRepo) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
return nil, nil, errors.New("not implemented") return nil, nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) { func (r *stubApiKeyRepo) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) CountByUserID(ctx context.Context, userID int64) (int64, error) { func (r *stubApiKeyRepo) CountByUserID(ctx context.Context, userID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, error) { func (r *stubApiKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, error) {
return false, errors.New("not implemented") return false, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.APIKey, *pagination.PaginationResult, error) { func (r *stubApiKeyRepo) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]service.ApiKey, *pagination.PaginationResult, error) {
return nil, nil, errors.New("not implemented") return nil, nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.APIKey, error) { func (r *stubApiKeyRepo) SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]service.ApiKey, error) {
return nil, errors.New("not implemented") return nil, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) { func (r *stubApiKeyRepo) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }
func (r *stubAPIKeyRepo) CountByGroupID(ctx context.Context, groupID int64) (int64, error) { func (r *stubApiKeyRepo) CountByGroupID(ctx context.Context, groupID int64) (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }

View File

@@ -2,14 +2,11 @@ package middleware
import ( import (
"log" "log"
"regexp"
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
var sensitiveQueryParamRE = regexp.MustCompile(`(?i)([?&](?:token|api_key)=)[^&#]*`)
// Logger 请求日志中间件 // Logger 请求日志中间件
func Logger() gin.HandlerFunc { func Logger() gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
@@ -29,7 +26,7 @@ func Logger() gin.HandlerFunc {
method := c.Request.Method method := c.Request.Method
// 请求路径 // 请求路径
path := sensitiveQueryParamRE.ReplaceAllString(c.Request.URL.RequestURI(), "${1}***") path := c.Request.URL.Path
// 状态码 // 状态码
statusCode := c.Writer.Status() statusCode := c.Writer.Status()

View File

@@ -1,5 +1,3 @@
// Package middleware provides HTTP middleware components for authentication,
// authorization, logging, error recovery, and request processing.
package middleware package middleware
import ( import (
@@ -17,8 +15,8 @@ const (
ContextKeyUser ContextKey = "user" ContextKeyUser ContextKey = "user"
// ContextKeyUserRole 当前用户角色string // ContextKeyUserRole 当前用户角色string
ContextKeyUserRole ContextKey = "user_role" ContextKeyUserRole ContextKey = "user_role"
// ContextKeyAPIKey API密钥上下文键 // ContextKeyApiKey API密钥上下文键
ContextKeyAPIKey ContextKey = "api_key" ContextKeyApiKey ContextKey = "api_key"
// ContextKeySubscription 订阅上下文键 // ContextKeySubscription 订阅上下文键
ContextKeySubscription ContextKey = "subscription" ContextKeySubscription ContextKey = "subscription"
// ContextKeyForcePlatform 强制平台(用于 /antigravity 路由) // ContextKeyForcePlatform 强制平台(用于 /antigravity 路由)

View File

@@ -11,12 +11,12 @@ type JWTAuthMiddleware gin.HandlerFunc
// AdminAuthMiddleware 管理员认证中间件类型 // AdminAuthMiddleware 管理员认证中间件类型
type AdminAuthMiddleware gin.HandlerFunc type AdminAuthMiddleware gin.HandlerFunc
// APIKeyAuthMiddleware API Key 认证中间件类型 // ApiKeyAuthMiddleware API Key 认证中间件类型
type APIKeyAuthMiddleware gin.HandlerFunc type ApiKeyAuthMiddleware gin.HandlerFunc
// ProviderSet 中间件层的依赖注入 // ProviderSet 中间件层的依赖注入
var ProviderSet = wire.NewSet( var ProviderSet = wire.NewSet(
NewJWTAuthMiddleware, NewJWTAuthMiddleware,
NewAdminAuthMiddleware, NewAdminAuthMiddleware,
NewAPIKeyAuthMiddleware, NewApiKeyAuthMiddleware,
) )

View File

@@ -17,8 +17,8 @@ func SetupRouter(
handlers *handler.Handlers, handlers *handler.Handlers,
jwtAuth middleware2.JWTAuthMiddleware, jwtAuth middleware2.JWTAuthMiddleware,
adminAuth middleware2.AdminAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware,
apiKeyAuth middleware2.APIKeyAuthMiddleware, apiKeyAuth middleware2.ApiKeyAuthMiddleware,
apiKeyService *service.APIKeyService, apiKeyService *service.ApiKeyService,
subscriptionService *service.SubscriptionService, subscriptionService *service.SubscriptionService,
cfg *config.Config, cfg *config.Config,
) *gin.Engine { ) *gin.Engine {
@@ -43,8 +43,8 @@ func registerRoutes(
h *handler.Handlers, h *handler.Handlers,
jwtAuth middleware2.JWTAuthMiddleware, jwtAuth middleware2.JWTAuthMiddleware,
adminAuth middleware2.AdminAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware,
apiKeyAuth middleware2.APIKeyAuthMiddleware, apiKeyAuth middleware2.ApiKeyAuthMiddleware,
apiKeyService *service.APIKeyService, apiKeyService *service.ApiKeyService,
subscriptionService *service.SubscriptionService, subscriptionService *service.SubscriptionService,
cfg *config.Config, cfg *config.Config,
) { ) {

View File

@@ -1,4 +1,3 @@
// Package routes 提供 HTTP 路由注册和处理函数
package routes package routes
import ( import (

View File

@@ -50,7 +50,7 @@ func RegisterUserRoutes(
usage.GET("/dashboard/stats", h.Usage.DashboardStats) usage.GET("/dashboard/stats", h.Usage.DashboardStats)
usage.GET("/dashboard/trend", h.Usage.DashboardTrend) usage.GET("/dashboard/trend", h.Usage.DashboardTrend)
usage.GET("/dashboard/models", h.Usage.DashboardModels) usage.GET("/dashboard/models", h.Usage.DashboardModels)
usage.POST("/dashboard/api-keys-usage", h.Usage.DashboardAPIKeysUsage) usage.POST("/dashboard/api-keys-usage", h.Usage.DashboardApiKeysUsage)
} }
// 卡密兑换 // 卡密兑换

View File

@@ -29,6 +29,9 @@ type Account struct {
RateLimitResetAt *time.Time RateLimitResetAt *time.Time
OverloadUntil *time.Time OverloadUntil *time.Time
TempUnschedulableUntil *time.Time
TempUnschedulableReason string
SessionWindowStart *time.Time SessionWindowStart *time.Time
SessionWindowEnd *time.Time SessionWindowEnd *time.Time
SessionWindowStatus string SessionWindowStatus string
@@ -39,6 +42,13 @@ type Account struct {
Groups []*Group Groups []*Group
} }
type TempUnschedulableRule struct {
ErrorCode int `json:"error_code"`
Keywords []string `json:"keywords"`
DurationMinutes int `json:"duration_minutes"`
Description string `json:"description"`
}
func (a *Account) IsActive() bool { func (a *Account) IsActive() bool {
return a.Status == StatusActive return a.Status == StatusActive
} }
@@ -54,6 +64,9 @@ func (a *Account) IsSchedulable() bool {
if a.RateLimitResetAt != nil && now.Before(*a.RateLimitResetAt) { if a.RateLimitResetAt != nil && now.Before(*a.RateLimitResetAt) {
return false return false
} }
if a.TempUnschedulableUntil != nil && now.Before(*a.TempUnschedulableUntil) {
return false
}
return true return true
} }
@@ -163,6 +176,114 @@ func (a *Account) GetCredentialAsTime(key string) *time.Time {
return nil return nil
} }
func (a *Account) IsTempUnschedulableEnabled() bool {
if a.Credentials == nil {
return false
}
raw, ok := a.Credentials["temp_unschedulable_enabled"]
if !ok || raw == nil {
return false
}
enabled, ok := raw.(bool)
return ok && enabled
}
func (a *Account) GetTempUnschedulableRules() []TempUnschedulableRule {
if a.Credentials == nil {
return nil
}
raw, ok := a.Credentials["temp_unschedulable_rules"]
if !ok || raw == nil {
return nil
}
arr, ok := raw.([]any)
if !ok {
return nil
}
rules := make([]TempUnschedulableRule, 0, len(arr))
for _, item := range arr {
entry, ok := item.(map[string]any)
if !ok || entry == nil {
continue
}
rule := TempUnschedulableRule{
ErrorCode: parseTempUnschedInt(entry["error_code"]),
Keywords: parseTempUnschedStrings(entry["keywords"]),
DurationMinutes: parseTempUnschedInt(entry["duration_minutes"]),
Description: parseTempUnschedString(entry["description"]),
}
if rule.ErrorCode <= 0 || rule.DurationMinutes <= 0 || len(rule.Keywords) == 0 {
continue
}
rules = append(rules, rule)
}
return rules
}
func parseTempUnschedString(value any) string {
s, ok := value.(string)
if !ok {
return ""
}
return strings.TrimSpace(s)
}
func parseTempUnschedStrings(value any) []string {
if value == nil {
return nil
}
var raw []string
switch v := value.(type) {
case []string:
raw = v
case []any:
raw = make([]string, 0, len(v))
for _, item := range v {
if s, ok := item.(string); ok {
raw = append(raw, s)
}
}
default:
return nil
}
out := make([]string, 0, len(raw))
for _, item := range raw {
s := strings.TrimSpace(item)
if s != "" {
out = append(out, s)
}
}
return out
}
func parseTempUnschedInt(value any) int {
switch v := value.(type) {
case int:
return v
case int64:
return int(v)
case float64:
return int(v)
case json.Number:
if i, err := v.Int64(); err == nil {
return int(i)
}
case string:
if i, err := strconv.Atoi(strings.TrimSpace(v)); err == nil {
return i
}
}
return 0
}
func (a *Account) GetModelMapping() map[string]string { func (a *Account) GetModelMapping() map[string]string {
if a.Credentials == nil { if a.Credentials == nil {
return nil return nil
@@ -206,7 +327,7 @@ func (a *Account) GetMappedModel(requestedModel string) string {
} }
func (a *Account) GetBaseURL() string { func (a *Account) GetBaseURL() string {
if a.Type != AccountTypeAPIKey { if a.Type != AccountTypeApiKey {
return "" return ""
} }
baseURL := a.GetCredential("base_url") baseURL := a.GetCredential("base_url")
@@ -229,7 +350,7 @@ func (a *Account) GetExtraString(key string) string {
} }
func (a *Account) IsCustomErrorCodesEnabled() bool { func (a *Account) IsCustomErrorCodesEnabled() bool {
if a.Type != AccountTypeAPIKey || a.Credentials == nil { if a.Type != AccountTypeApiKey || a.Credentials == nil {
return false return false
} }
if v, ok := a.Credentials["custom_error_codes_enabled"]; ok { if v, ok := a.Credentials["custom_error_codes_enabled"]; ok {
@@ -300,15 +421,15 @@ func (a *Account) IsOpenAIOAuth() bool {
return a.IsOpenAI() && a.Type == AccountTypeOAuth return a.IsOpenAI() && a.Type == AccountTypeOAuth
} }
func (a *Account) IsOpenAIAPIKey() bool { func (a *Account) IsOpenAIApiKey() bool {
return a.IsOpenAI() && a.Type == AccountTypeAPIKey return a.IsOpenAI() && a.Type == AccountTypeApiKey
} }
func (a *Account) GetOpenAIBaseURL() string { func (a *Account) GetOpenAIBaseURL() string {
if !a.IsOpenAI() { if !a.IsOpenAI() {
return "" return ""
} }
if a.Type == AccountTypeAPIKey { if a.Type == AccountTypeApiKey {
baseURL := a.GetCredential("base_url") baseURL := a.GetCredential("base_url")
if baseURL != "" { if baseURL != "" {
return baseURL return baseURL
@@ -338,8 +459,8 @@ func (a *Account) GetOpenAIIDToken() string {
return a.GetCredential("id_token") return a.GetCredential("id_token")
} }
func (a *Account) GetOpenAIAPIKey() string { func (a *Account) GetOpenAIApiKey() string {
if !a.IsOpenAIAPIKey() { if !a.IsOpenAIApiKey() {
return "" return ""
} }
return a.GetCredential("api_key") return a.GetCredential("api_key")

View File

@@ -1,5 +1,3 @@
// Package service 提供业务逻辑层服务,封装领域模型的业务规则和操作流程。
// 服务层协调 repository 层的数据访问,实现跨实体的业务逻辑,并为上层 API 提供统一的业务接口。
package service package service
import ( import (
@@ -51,6 +49,8 @@ type AccountRepository interface {
SetRateLimited(ctx context.Context, id int64, resetAt time.Time) error SetRateLimited(ctx context.Context, id int64, resetAt time.Time) error
SetOverloaded(ctx context.Context, id int64, until time.Time) error SetOverloaded(ctx context.Context, id int64, until time.Time) error
SetTempUnschedulable(ctx context.Context, id int64, until time.Time, reason string) error
ClearTempUnschedulable(ctx context.Context, id int64) error
ClearRateLimit(ctx context.Context, id int64) error ClearRateLimit(ctx context.Context, id int64) error
UpdateSessionWindow(ctx context.Context, id int64, start, end *time.Time, status string) error UpdateSessionWindow(ctx context.Context, id int64, start, end *time.Time, status string) error
UpdateExtra(ctx context.Context, id int64, updates map[string]any) error UpdateExtra(ctx context.Context, id int64, updates map[string]any) error

View File

@@ -139,6 +139,14 @@ func (s *accountRepoStub) SetOverloaded(ctx context.Context, id int64, until tim
panic("unexpected SetOverloaded call") panic("unexpected SetOverloaded call")
} }
func (s *accountRepoStub) SetTempUnschedulable(ctx context.Context, id int64, until time.Time, reason string) error {
panic("unexpected SetTempUnschedulable call")
}
func (s *accountRepoStub) ClearTempUnschedulable(ctx context.Context, id int64) error {
panic("unexpected ClearTempUnschedulable call")
}
func (s *accountRepoStub) ClearRateLimit(ctx context.Context, id int64) error { func (s *accountRepoStub) ClearRateLimit(ctx context.Context, id int64) error {
panic("unexpected ClearRateLimit call") panic("unexpected ClearRateLimit call")
} }

View File

@@ -324,7 +324,7 @@ func (s *AccountTestService) testOpenAIAccountConnection(c *gin.Context, account
chatgptAccountID = account.GetChatGPTAccountID() chatgptAccountID = account.GetChatGPTAccountID()
} else if account.Type == "apikey" { } else if account.Type == "apikey" {
// API Key - use Platform API // API Key - use Platform API
authToken = account.GetOpenAIAPIKey() authToken = account.GetOpenAIApiKey()
if authToken == "" { if authToken == "" {
return s.sendErrorAndEnd(c, "No API key available") return s.sendErrorAndEnd(c, "No API key available")
} }
@@ -402,7 +402,7 @@ func (s *AccountTestService) testGeminiAccountConnection(c *gin.Context, account
} }
// For API Key accounts with model mapping, map the model // For API Key accounts with model mapping, map the model
if account.Type == AccountTypeAPIKey { if account.Type == AccountTypeApiKey {
mapping := account.GetModelMapping() mapping := account.GetModelMapping()
if len(mapping) > 0 { if len(mapping) > 0 {
if mappedModel, exists := mapping[testModelID]; exists { if mappedModel, exists := mapping[testModelID]; exists {
@@ -426,7 +426,7 @@ func (s *AccountTestService) testGeminiAccountConnection(c *gin.Context, account
var err error var err error
switch account.Type { switch account.Type {
case AccountTypeAPIKey: case AccountTypeApiKey:
req, err = s.buildGeminiAPIKeyRequest(ctx, account, testModelID, payload) req, err = s.buildGeminiAPIKeyRequest(ctx, account, testModelID, payload)
case AccountTypeOAuth: case AccountTypeOAuth:
req, err = s.buildGeminiOAuthRequest(ctx, account, testModelID, payload) req, err = s.buildGeminiOAuthRequest(ctx, account, testModelID, payload)

Some files were not shown because too many files have changed in this diff Show More