mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-04-03 06:52:13 +08:00
chore: 更新依赖、配置和代码生成
主要更新: - 更新 go.mod/go.sum 依赖 - 重新生成 Ent ORM 代码 - 更新 Wire 依赖注入配置 - 添加 docker-compose.override.yml 到 .gitignore - 更新 README 文档(Simple Mode 说明和已知问题) - 清理调试日志 - 其他代码优化和格式修复
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -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/
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -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
|
||||||
|
|||||||
@@ -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
0
backend/__tmp_test
Normal 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()
|
||||||
}},
|
}},
|
||||||
|
|||||||
@@ -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()
|
||||||
}},
|
}},
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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().
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package config provides application configuration management.
|
|
||||||
package config
|
package config
|
||||||
|
|
||||||
import "github.com/google/wire"
|
import "github.com/google/wire"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package errors provides custom error types and error handling utilities.
|
|
||||||
// nolint:mnd
|
// nolint:mnd
|
||||||
package errors
|
package errors
|
||||||
|
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package googleapi provides utilities for Google API interactions.
|
|
||||||
package googleapi
|
package googleapi
|
||||||
|
|
||||||
import "net/http"
|
import "net/http"
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package openai provides OpenAI API models and configuration.
|
|
||||||
package openai
|
package openai
|
||||||
|
|
||||||
import _ "embed"
|
import _ "embed"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package pagination provides utilities for handling paginated queries and results.
|
|
||||||
package pagination
|
package pagination
|
||||||
|
|
||||||
// PaginationParams 分页参数
|
// PaginationParams 分页参数
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package response provides HTTP response utilities for standardized API responses and error handling.
|
|
||||||
package response
|
package response
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package sysutil provides system-level utilities for service management.
|
|
||||||
package sysutil
|
package sysutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -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"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Package repository 提供应用程序的基础设施层组件。
|
// Package infrastructure 提供应用程序的基础设施层组件。
|
||||||
// 包括数据库连接初始化、ORM 客户端管理、Redis 连接、数据库迁移等核心功能。
|
// 包括数据库连接初始化、ORM 客户端管理、Redis 连接、数据库迁移等核心功能。
|
||||||
package repository
|
package repository
|
||||||
|
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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" {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ func adminAuth(
|
|||||||
// 检查 x-api-key header(Admin API Key 认证)
|
// 检查 x-api-key header(Admin 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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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 路由)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// Package routes 提供 HTTP 路由注册和处理函数
|
|
||||||
package routes
|
package routes
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 卡密兑换
|
// 卡密兑换
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user