diff --git a/backend/cmd/server/wire_gen.go b/backend/cmd/server/wire_gen.go index 0f9b0823..47cf5f3a 100644 --- a/backend/cmd/server/wire_gen.go +++ b/backend/cmd/server/wire_gen.go @@ -55,11 +55,11 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) { userService := service.NewUserService(userRepository) authHandler := handler.NewAuthHandler(configConfig, authService, userService) userHandler := handler.NewUserHandler(userService) - apiKeyRepository := repository.NewApiKeyRepository(client) + apiKeyRepository := repository.NewAPIKeyRepository(client) groupRepository := repository.NewGroupRepository(client, db) userSubscriptionRepository := repository.NewUserSubscriptionRepository(client) - apiKeyCache := repository.NewApiKeyCache(redisClient) - apiKeyService := service.NewApiKeyService(apiKeyRepository, userRepository, groupRepository, userSubscriptionRepository, apiKeyCache, configConfig) + apiKeyCache := repository.NewAPIKeyCache(redisClient) + apiKeyService := service.NewAPIKeyService(apiKeyRepository, userRepository, groupRepository, userSubscriptionRepository, apiKeyCache, configConfig) apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService) usageLogRepository := repository.NewUsageLogRepository(client, db) usageService := service.NewUsageService(usageLogRepository, userRepository, client) @@ -144,7 +144,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) { handlers := handler.ProvideHandlers(authHandler, userHandler, apiKeyHandler, usageHandler, redeemHandler, subscriptionHandler, adminHandlers, gatewayHandler, openAIGatewayHandler, handlerSettingHandler) jwtAuthMiddleware := middleware.NewJWTAuthMiddleware(authService, userService) adminAuthMiddleware := middleware.NewAdminAuthMiddleware(authService, userService, settingService) - apiKeyAuthMiddleware := middleware.NewApiKeyAuthMiddleware(apiKeyService, subscriptionService, configConfig) + apiKeyAuthMiddleware := middleware.NewAPIKeyAuthMiddleware(apiKeyService, subscriptionService, configConfig) engine := server.ProvideRouter(configConfig, handlers, jwtAuthMiddleware, adminAuthMiddleware, apiKeyAuthMiddleware, apiKeyService, subscriptionService) httpServer := server.ProvideHTTPServer(configConfig, engine) tokenRefreshService := service.ProvideTokenRefreshService(accountRepository, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, configConfig) diff --git a/backend/ent/apikey.go b/backend/ent/apikey.go index 61ac15fa..fe3ad0cf 100644 --- a/backend/ent/apikey.go +++ b/backend/ent/apikey.go @@ -14,8 +14,8 @@ import ( "github.com/Wei-Shaw/sub2api/ent/user" ) -// ApiKey is the model entity for the ApiKey schema. -type ApiKey struct { +// APIKey is the model entity for the APIKey schema. +type APIKey struct { config `json:"-"` // ID of the ent. ID int64 `json:"id,omitempty"` @@ -36,13 +36,13 @@ type ApiKey struct { // Status holds the value of the "status" field. Status string `json:"status,omitempty"` // Edges holds the relations/edges for other nodes in the graph. - // The values are being populated by the ApiKeyQuery when eager-loading is set. - Edges ApiKeyEdges `json:"edges"` + // The values are being populated by the APIKeyQuery when eager-loading is set. + Edges APIKeyEdges `json:"edges"` selectValues sql.SelectValues } -// ApiKeyEdges holds the relations/edges for other nodes in the graph. -type ApiKeyEdges struct { +// APIKeyEdges holds the relations/edges for other nodes in the graph. +type APIKeyEdges struct { // User holds the value of the user edge. User *User `json:"user,omitempty"` // 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 // 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 { return e.User, nil } 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 // 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 { return e.Group, nil } 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 // was not loaded in eager-loading. -func (e ApiKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) { +func (e APIKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) { if e.loadedTypes[2] { return e.UsageLogs, nil } @@ -86,7 +86,7 @@ func (e ApiKeyEdges) UsageLogsOrErr() ([]*UsageLog, error) { } // 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)) for i := range columns { 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) -// to the ApiKey fields. -func (_m *ApiKey) assignValues(columns []string, values []any) error { +// to the APIKey fields. +func (_m *APIKey) assignValues(columns []string, values []any) error { if m, n := len(values), len(columns); 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 } -// 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. -func (_m *ApiKey) Value(name string) (ent.Value, error) { +func (_m *APIKey) Value(name string) (ent.Value, error) { return _m.selectValues.Get(name) } -// QueryUser queries the "user" edge of the ApiKey entity. -func (_m *ApiKey) QueryUser() *UserQuery { - return NewApiKeyClient(_m.config).QueryUser(_m) +// QueryUser queries the "user" edge of the APIKey entity. +func (_m *APIKey) QueryUser() *UserQuery { + return NewAPIKeyClient(_m.config).QueryUser(_m) } -// QueryGroup queries the "group" edge of the ApiKey entity. -func (_m *ApiKey) QueryGroup() *GroupQuery { - return NewApiKeyClient(_m.config).QueryGroup(_m) +// QueryGroup queries the "group" edge of the APIKey entity. +func (_m *APIKey) QueryGroup() *GroupQuery { + return NewAPIKeyClient(_m.config).QueryGroup(_m) } -// QueryUsageLogs queries the "usage_logs" edge of the ApiKey entity. -func (_m *ApiKey) QueryUsageLogs() *UsageLogQuery { - return NewApiKeyClient(_m.config).QueryUsageLogs(_m) +// QueryUsageLogs queries the "usage_logs" edge of the APIKey entity. +func (_m *APIKey) QueryUsageLogs() *UsageLogQuery { + return NewAPIKeyClient(_m.config).QueryUsageLogs(_m) } -// Update returns a builder for updating this ApiKey. -// Note that you need to call ApiKey.Unwrap() before calling this method if 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 // was returned from a transaction, and the transaction was committed or rolled back. -func (_m *ApiKey) Update() *ApiKeyUpdateOne { - return NewApiKeyClient(_m.config).UpdateOne(_m) +func (_m *APIKey) Update() *APIKeyUpdateOne { + 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. -func (_m *ApiKey) Unwrap() *ApiKey { +func (_m *APIKey) Unwrap() *APIKey { _tx, ok := _m.config.driver.(*txDriver) if !ok { - panic("ent: ApiKey is not a transactional entity") + panic("ent: APIKey is not a transactional entity") } _m.config.driver = _tx.drv return _m } // String implements the fmt.Stringer. -func (_m *ApiKey) String() string { +func (_m *APIKey) String() string { var builder strings.Builder - builder.WriteString("ApiKey(") + builder.WriteString("APIKey(") builder.WriteString(fmt.Sprintf("id=%v, ", _m.ID)) builder.WriteString("created_at=") builder.WriteString(_m.CreatedAt.Format(time.ANSIC)) @@ -249,5 +249,5 @@ func (_m *ApiKey) String() string { return builder.String() } -// ApiKeys is a parsable slice of ApiKey. -type ApiKeys []*ApiKey +// APIKeys is a parsable slice of APIKey. +type APIKeys []*APIKey diff --git a/backend/ent/apikey/apikey.go b/backend/ent/apikey/apikey.go index f03b2daa..91f7d620 100644 --- a/backend/ent/apikey/apikey.go +++ b/backend/ent/apikey/apikey.go @@ -109,7 +109,7 @@ var ( 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) // ByID orders the results by the id field. diff --git a/backend/ent/apikey/where.go b/backend/ent/apikey/where.go index 95bc4e2a..5e739006 100644 --- a/backend/ent/apikey/where.go +++ b/backend/ent/apikey/where.go @@ -11,468 +11,468 @@ import ( ) // ID filters vertices based on their ID field. -func ID(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldID, id)) +func ID(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldID, id)) } // IDEQ applies the EQ predicate on the ID field. -func IDEQ(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldID, id)) +func IDEQ(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldID, id)) } // IDNEQ applies the NEQ predicate on the ID field. -func IDNEQ(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldID, id)) +func IDNEQ(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldID, id)) } // IDIn applies the In predicate on the ID field. -func IDIn(ids ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldID, ids...)) +func IDIn(ids ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldID, ids...)) } // IDNotIn applies the NotIn predicate on the ID field. -func IDNotIn(ids ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldID, ids...)) +func IDNotIn(ids ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldID, ids...)) } // IDGT applies the GT predicate on the ID field. -func IDGT(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldID, id)) +func IDGT(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldID, id)) } // IDGTE applies the GTE predicate on the ID field. -func IDGTE(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldID, id)) +func IDGTE(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldID, id)) } // IDLT applies the LT predicate on the ID field. -func IDLT(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldID, id)) +func IDLT(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldID, id)) } // IDLTE applies the LTE predicate on the ID field. -func IDLTE(id int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldID, id)) +func IDLTE(id int64) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldID, id)) } // CreatedAt applies equality check predicate on the "created_at" field. It's identical to CreatedAtEQ. -func CreatedAt(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldCreatedAt, v)) +func CreatedAt(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldCreatedAt, v)) } // UpdatedAt applies equality check predicate on the "updated_at" field. It's identical to UpdatedAtEQ. -func UpdatedAt(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldUpdatedAt, v)) +func UpdatedAt(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldUpdatedAt, v)) } // DeletedAt applies equality check predicate on the "deleted_at" field. It's identical to DeletedAtEQ. -func DeletedAt(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldDeletedAt, v)) +func DeletedAt(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldDeletedAt, v)) } // UserID applies equality check predicate on the "user_id" field. It's identical to UserIDEQ. -func UserID(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldUserID, v)) +func UserID(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldUserID, v)) } // Key applies equality check predicate on the "key" field. It's identical to KeyEQ. -func Key(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldKey, v)) +func Key(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldKey, v)) } // Name applies equality check predicate on the "name" field. It's identical to NameEQ. -func Name(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldName, v)) +func Name(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldName, v)) } // GroupID applies equality check predicate on the "group_id" field. It's identical to GroupIDEQ. -func GroupID(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldGroupID, v)) +func GroupID(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldGroupID, v)) } // Status applies equality check predicate on the "status" field. It's identical to StatusEQ. -func Status(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldStatus, v)) +func Status(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldStatus, v)) } // CreatedAtEQ applies the EQ predicate on the "created_at" field. -func CreatedAtEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldCreatedAt, v)) +func CreatedAtEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldCreatedAt, v)) } // CreatedAtNEQ applies the NEQ predicate on the "created_at" field. -func CreatedAtNEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldCreatedAt, v)) +func CreatedAtNEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldCreatedAt, v)) } // CreatedAtIn applies the In predicate on the "created_at" field. -func CreatedAtIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldCreatedAt, vs...)) +func CreatedAtIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldCreatedAt, vs...)) } // CreatedAtNotIn applies the NotIn predicate on the "created_at" field. -func CreatedAtNotIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldCreatedAt, vs...)) +func CreatedAtNotIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldCreatedAt, vs...)) } // CreatedAtGT applies the GT predicate on the "created_at" field. -func CreatedAtGT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldCreatedAt, v)) +func CreatedAtGT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldCreatedAt, v)) } // CreatedAtGTE applies the GTE predicate on the "created_at" field. -func CreatedAtGTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldCreatedAt, v)) +func CreatedAtGTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldCreatedAt, v)) } // CreatedAtLT applies the LT predicate on the "created_at" field. -func CreatedAtLT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldCreatedAt, v)) +func CreatedAtLT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldCreatedAt, v)) } // CreatedAtLTE applies the LTE predicate on the "created_at" field. -func CreatedAtLTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldCreatedAt, v)) +func CreatedAtLTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldCreatedAt, v)) } // UpdatedAtEQ applies the EQ predicate on the "updated_at" field. -func UpdatedAtEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldUpdatedAt, v)) +func UpdatedAtEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldUpdatedAt, v)) } // UpdatedAtNEQ applies the NEQ predicate on the "updated_at" field. -func UpdatedAtNEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldUpdatedAt, v)) +func UpdatedAtNEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldUpdatedAt, v)) } // UpdatedAtIn applies the In predicate on the "updated_at" field. -func UpdatedAtIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldUpdatedAt, vs...)) +func UpdatedAtIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldUpdatedAt, vs...)) } // UpdatedAtNotIn applies the NotIn predicate on the "updated_at" field. -func UpdatedAtNotIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldUpdatedAt, vs...)) +func UpdatedAtNotIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldUpdatedAt, vs...)) } // UpdatedAtGT applies the GT predicate on the "updated_at" field. -func UpdatedAtGT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldUpdatedAt, v)) +func UpdatedAtGT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldUpdatedAt, v)) } // UpdatedAtGTE applies the GTE predicate on the "updated_at" field. -func UpdatedAtGTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldUpdatedAt, v)) +func UpdatedAtGTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldUpdatedAt, v)) } // UpdatedAtLT applies the LT predicate on the "updated_at" field. -func UpdatedAtLT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldUpdatedAt, v)) +func UpdatedAtLT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldUpdatedAt, v)) } // UpdatedAtLTE applies the LTE predicate on the "updated_at" field. -func UpdatedAtLTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldUpdatedAt, v)) +func UpdatedAtLTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldUpdatedAt, v)) } // DeletedAtEQ applies the EQ predicate on the "deleted_at" field. -func DeletedAtEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldDeletedAt, v)) +func DeletedAtEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldDeletedAt, v)) } // DeletedAtNEQ applies the NEQ predicate on the "deleted_at" field. -func DeletedAtNEQ(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldDeletedAt, v)) +func DeletedAtNEQ(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldDeletedAt, v)) } // DeletedAtIn applies the In predicate on the "deleted_at" field. -func DeletedAtIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldDeletedAt, vs...)) +func DeletedAtIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldDeletedAt, vs...)) } // DeletedAtNotIn applies the NotIn predicate on the "deleted_at" field. -func DeletedAtNotIn(vs ...time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldDeletedAt, vs...)) +func DeletedAtNotIn(vs ...time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldDeletedAt, vs...)) } // DeletedAtGT applies the GT predicate on the "deleted_at" field. -func DeletedAtGT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldDeletedAt, v)) +func DeletedAtGT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldDeletedAt, v)) } // DeletedAtGTE applies the GTE predicate on the "deleted_at" field. -func DeletedAtGTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldDeletedAt, v)) +func DeletedAtGTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldDeletedAt, v)) } // DeletedAtLT applies the LT predicate on the "deleted_at" field. -func DeletedAtLT(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldDeletedAt, v)) +func DeletedAtLT(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldDeletedAt, v)) } // DeletedAtLTE applies the LTE predicate on the "deleted_at" field. -func DeletedAtLTE(v time.Time) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldDeletedAt, v)) +func DeletedAtLTE(v time.Time) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldDeletedAt, v)) } // DeletedAtIsNil applies the IsNil predicate on the "deleted_at" field. -func DeletedAtIsNil() predicate.ApiKey { - return predicate.ApiKey(sql.FieldIsNull(FieldDeletedAt)) +func DeletedAtIsNil() predicate.APIKey { + return predicate.APIKey(sql.FieldIsNull(FieldDeletedAt)) } // DeletedAtNotNil applies the NotNil predicate on the "deleted_at" field. -func DeletedAtNotNil() predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotNull(FieldDeletedAt)) +func DeletedAtNotNil() predicate.APIKey { + return predicate.APIKey(sql.FieldNotNull(FieldDeletedAt)) } // UserIDEQ applies the EQ predicate on the "user_id" field. -func UserIDEQ(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldUserID, v)) +func UserIDEQ(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldUserID, v)) } // UserIDNEQ applies the NEQ predicate on the "user_id" field. -func UserIDNEQ(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldUserID, v)) +func UserIDNEQ(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldUserID, v)) } // UserIDIn applies the In predicate on the "user_id" field. -func UserIDIn(vs ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldUserID, vs...)) +func UserIDIn(vs ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldUserID, vs...)) } // UserIDNotIn applies the NotIn predicate on the "user_id" field. -func UserIDNotIn(vs ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldUserID, vs...)) +func UserIDNotIn(vs ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldUserID, vs...)) } // KeyEQ applies the EQ predicate on the "key" field. -func KeyEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldKey, v)) +func KeyEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldKey, v)) } // KeyNEQ applies the NEQ predicate on the "key" field. -func KeyNEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldKey, v)) +func KeyNEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldKey, v)) } // KeyIn applies the In predicate on the "key" field. -func KeyIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldKey, vs...)) +func KeyIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldKey, vs...)) } // KeyNotIn applies the NotIn predicate on the "key" field. -func KeyNotIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldKey, vs...)) +func KeyNotIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldKey, vs...)) } // KeyGT applies the GT predicate on the "key" field. -func KeyGT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldKey, v)) +func KeyGT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldKey, v)) } // KeyGTE applies the GTE predicate on the "key" field. -func KeyGTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldKey, v)) +func KeyGTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldKey, v)) } // KeyLT applies the LT predicate on the "key" field. -func KeyLT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldKey, v)) +func KeyLT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldKey, v)) } // KeyLTE applies the LTE predicate on the "key" field. -func KeyLTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldKey, v)) +func KeyLTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldKey, v)) } // KeyContains applies the Contains predicate on the "key" field. -func KeyContains(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContains(FieldKey, v)) +func KeyContains(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContains(FieldKey, v)) } // KeyHasPrefix applies the HasPrefix predicate on the "key" field. -func KeyHasPrefix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasPrefix(FieldKey, v)) +func KeyHasPrefix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasPrefix(FieldKey, v)) } // KeyHasSuffix applies the HasSuffix predicate on the "key" field. -func KeyHasSuffix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasSuffix(FieldKey, v)) +func KeyHasSuffix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasSuffix(FieldKey, v)) } // KeyEqualFold applies the EqualFold predicate on the "key" field. -func KeyEqualFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEqualFold(FieldKey, v)) +func KeyEqualFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEqualFold(FieldKey, v)) } // KeyContainsFold applies the ContainsFold predicate on the "key" field. -func KeyContainsFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContainsFold(FieldKey, v)) +func KeyContainsFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContainsFold(FieldKey, v)) } // NameEQ applies the EQ predicate on the "name" field. -func NameEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldName, v)) +func NameEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldName, v)) } // NameNEQ applies the NEQ predicate on the "name" field. -func NameNEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldName, v)) +func NameNEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldName, v)) } // NameIn applies the In predicate on the "name" field. -func NameIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldName, vs...)) +func NameIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldName, vs...)) } // NameNotIn applies the NotIn predicate on the "name" field. -func NameNotIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldName, vs...)) +func NameNotIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldName, vs...)) } // NameGT applies the GT predicate on the "name" field. -func NameGT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldName, v)) +func NameGT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldName, v)) } // NameGTE applies the GTE predicate on the "name" field. -func NameGTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldName, v)) +func NameGTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldName, v)) } // NameLT applies the LT predicate on the "name" field. -func NameLT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldName, v)) +func NameLT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldName, v)) } // NameLTE applies the LTE predicate on the "name" field. -func NameLTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldName, v)) +func NameLTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldName, v)) } // NameContains applies the Contains predicate on the "name" field. -func NameContains(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContains(FieldName, v)) +func NameContains(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContains(FieldName, v)) } // NameHasPrefix applies the HasPrefix predicate on the "name" field. -func NameHasPrefix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasPrefix(FieldName, v)) +func NameHasPrefix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasPrefix(FieldName, v)) } // NameHasSuffix applies the HasSuffix predicate on the "name" field. -func NameHasSuffix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasSuffix(FieldName, v)) +func NameHasSuffix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasSuffix(FieldName, v)) } // NameEqualFold applies the EqualFold predicate on the "name" field. -func NameEqualFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEqualFold(FieldName, v)) +func NameEqualFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEqualFold(FieldName, v)) } // NameContainsFold applies the ContainsFold predicate on the "name" field. -func NameContainsFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContainsFold(FieldName, v)) +func NameContainsFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContainsFold(FieldName, v)) } // GroupIDEQ applies the EQ predicate on the "group_id" field. -func GroupIDEQ(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldGroupID, v)) +func GroupIDEQ(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldGroupID, v)) } // GroupIDNEQ applies the NEQ predicate on the "group_id" field. -func GroupIDNEQ(v int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldGroupID, v)) +func GroupIDNEQ(v int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldGroupID, v)) } // GroupIDIn applies the In predicate on the "group_id" field. -func GroupIDIn(vs ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldGroupID, vs...)) +func GroupIDIn(vs ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldGroupID, vs...)) } // GroupIDNotIn applies the NotIn predicate on the "group_id" field. -func GroupIDNotIn(vs ...int64) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldGroupID, vs...)) +func GroupIDNotIn(vs ...int64) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldGroupID, vs...)) } // GroupIDIsNil applies the IsNil predicate on the "group_id" field. -func GroupIDIsNil() predicate.ApiKey { - return predicate.ApiKey(sql.FieldIsNull(FieldGroupID)) +func GroupIDIsNil() predicate.APIKey { + return predicate.APIKey(sql.FieldIsNull(FieldGroupID)) } // GroupIDNotNil applies the NotNil predicate on the "group_id" field. -func GroupIDNotNil() predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotNull(FieldGroupID)) +func GroupIDNotNil() predicate.APIKey { + return predicate.APIKey(sql.FieldNotNull(FieldGroupID)) } // StatusEQ applies the EQ predicate on the "status" field. -func StatusEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEQ(FieldStatus, v)) +func StatusEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEQ(FieldStatus, v)) } // StatusNEQ applies the NEQ predicate on the "status" field. -func StatusNEQ(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNEQ(FieldStatus, v)) +func StatusNEQ(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldNEQ(FieldStatus, v)) } // StatusIn applies the In predicate on the "status" field. -func StatusIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldIn(FieldStatus, vs...)) +func StatusIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldIn(FieldStatus, vs...)) } // StatusNotIn applies the NotIn predicate on the "status" field. -func StatusNotIn(vs ...string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldNotIn(FieldStatus, vs...)) +func StatusNotIn(vs ...string) predicate.APIKey { + return predicate.APIKey(sql.FieldNotIn(FieldStatus, vs...)) } // StatusGT applies the GT predicate on the "status" field. -func StatusGT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGT(FieldStatus, v)) +func StatusGT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGT(FieldStatus, v)) } // StatusGTE applies the GTE predicate on the "status" field. -func StatusGTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldGTE(FieldStatus, v)) +func StatusGTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldGTE(FieldStatus, v)) } // StatusLT applies the LT predicate on the "status" field. -func StatusLT(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLT(FieldStatus, v)) +func StatusLT(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLT(FieldStatus, v)) } // StatusLTE applies the LTE predicate on the "status" field. -func StatusLTE(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldLTE(FieldStatus, v)) +func StatusLTE(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldLTE(FieldStatus, v)) } // StatusContains applies the Contains predicate on the "status" field. -func StatusContains(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContains(FieldStatus, v)) +func StatusContains(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContains(FieldStatus, v)) } // StatusHasPrefix applies the HasPrefix predicate on the "status" field. -func StatusHasPrefix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasPrefix(FieldStatus, v)) +func StatusHasPrefix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasPrefix(FieldStatus, v)) } // StatusHasSuffix applies the HasSuffix predicate on the "status" field. -func StatusHasSuffix(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldHasSuffix(FieldStatus, v)) +func StatusHasSuffix(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldHasSuffix(FieldStatus, v)) } // StatusEqualFold applies the EqualFold predicate on the "status" field. -func StatusEqualFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldEqualFold(FieldStatus, v)) +func StatusEqualFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldEqualFold(FieldStatus, v)) } // StatusContainsFold applies the ContainsFold predicate on the "status" field. -func StatusContainsFold(v string) predicate.ApiKey { - return predicate.ApiKey(sql.FieldContainsFold(FieldStatus, v)) +func StatusContainsFold(v string) predicate.APIKey { + return predicate.APIKey(sql.FieldContainsFold(FieldStatus, v)) } // HasUser applies the HasEdge predicate on the "user" edge. -func HasUser() predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasUser() predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), 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). -func HasUserWith(preds ...predicate.User) predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasUserWith(preds ...predicate.User) predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := newUserStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { for _, p := range preds { @@ -494,8 +494,8 @@ func HasUserWith(preds ...predicate.User) predicate.ApiKey { } // HasGroup applies the HasEdge predicate on the "group" edge. -func HasGroup() predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasGroup() predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), 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). -func HasGroupWith(preds ...predicate.Group) predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasGroupWith(preds ...predicate.Group) predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := newGroupStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { 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. -func HasUsageLogs() predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasUsageLogs() predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := sqlgraph.NewStep( sqlgraph.From(Table, FieldID), 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). -func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.ApiKey { - return predicate.ApiKey(func(s *sql.Selector) { +func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.APIKey { + return predicate.APIKey(func(s *sql.Selector) { step := newUsageLogsStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { for _, p := range preds { @@ -540,16 +540,16 @@ func HasUsageLogsWith(preds ...predicate.UsageLog) predicate.ApiKey { } // And groups predicates with the AND operator between them. -func And(predicates ...predicate.ApiKey) predicate.ApiKey { - return predicate.ApiKey(sql.AndPredicates(predicates...)) +func And(predicates ...predicate.APIKey) predicate.APIKey { + return predicate.APIKey(sql.AndPredicates(predicates...)) } // Or groups predicates with the OR operator between them. -func Or(predicates ...predicate.ApiKey) predicate.ApiKey { - return predicate.ApiKey(sql.OrPredicates(predicates...)) +func Or(predicates ...predicate.APIKey) predicate.APIKey { + return predicate.APIKey(sql.OrPredicates(predicates...)) } // Not applies the not operator on the given predicate. -func Not(p predicate.ApiKey) predicate.ApiKey { - return predicate.ApiKey(sql.NotPredicates(p)) +func Not(p predicate.APIKey) predicate.APIKey { + return predicate.APIKey(sql.NotPredicates(p)) } diff --git a/backend/ent/apikey_create.go b/backend/ent/apikey_create.go index 5b984b21..2098872c 100644 --- a/backend/ent/apikey_create.go +++ b/backend/ent/apikey_create.go @@ -17,22 +17,22 @@ import ( "github.com/Wei-Shaw/sub2api/ent/user" ) -// ApiKeyCreate is the builder for creating a ApiKey entity. -type ApiKeyCreate struct { +// APIKeyCreate is the builder for creating a APIKey entity. +type APIKeyCreate struct { config - mutation *ApiKeyMutation + mutation *APIKeyMutation hooks []Hook conflict []sql.ConflictOption } // 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) return _c } // 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 { _c.SetCreatedAt(*v) } @@ -40,13 +40,13 @@ func (_c *ApiKeyCreate) SetNillableCreatedAt(v *time.Time) *ApiKeyCreate { } // 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) return _c } // 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 { _c.SetUpdatedAt(*v) } @@ -54,13 +54,13 @@ func (_c *ApiKeyCreate) SetNillableUpdatedAt(v *time.Time) *ApiKeyCreate { } // 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) return _c } // 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 { _c.SetDeletedAt(*v) } @@ -68,31 +68,31 @@ func (_c *ApiKeyCreate) SetNillableDeletedAt(v *time.Time) *ApiKeyCreate { } // SetUserID sets the "user_id" field. -func (_c *ApiKeyCreate) SetUserID(v int64) *ApiKeyCreate { +func (_c *APIKeyCreate) SetUserID(v int64) *APIKeyCreate { _c.mutation.SetUserID(v) return _c } // SetKey sets the "key" field. -func (_c *ApiKeyCreate) SetKey(v string) *ApiKeyCreate { +func (_c *APIKeyCreate) SetKey(v string) *APIKeyCreate { _c.mutation.SetKey(v) return _c } // SetName sets the "name" field. -func (_c *ApiKeyCreate) SetName(v string) *ApiKeyCreate { +func (_c *APIKeyCreate) SetName(v string) *APIKeyCreate { _c.mutation.SetName(v) return _c } // SetGroupID sets the "group_id" field. -func (_c *ApiKeyCreate) SetGroupID(v int64) *ApiKeyCreate { +func (_c *APIKeyCreate) SetGroupID(v int64) *APIKeyCreate { _c.mutation.SetGroupID(v) return _c } // 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 { _c.SetGroupID(*v) } @@ -100,13 +100,13 @@ func (_c *ApiKeyCreate) SetNillableGroupID(v *int64) *ApiKeyCreate { } // SetStatus sets the "status" field. -func (_c *ApiKeyCreate) SetStatus(v string) *ApiKeyCreate { +func (_c *APIKeyCreate) SetStatus(v string) *APIKeyCreate { _c.mutation.SetStatus(v) return _c } // 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 { _c.SetStatus(*v) } @@ -114,23 +114,23 @@ func (_c *ApiKeyCreate) SetNillableStatus(v *string) *ApiKeyCreate { } // 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) } // 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) } // 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...) return _c } // 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)) for i := range v { ids[i] = v[i].ID @@ -138,13 +138,13 @@ func (_c *ApiKeyCreate) AddUsageLogs(v ...*UsageLog) *ApiKeyCreate { return _c.AddUsageLogIDs(ids...) } -// Mutation returns the ApiKeyMutation object of the builder. -func (_c *ApiKeyCreate) Mutation() *ApiKeyMutation { +// Mutation returns the APIKeyMutation object of the builder. +func (_c *APIKeyCreate) Mutation() *APIKeyMutation { return _c.mutation } -// Save creates the ApiKey in the database. -func (_c *ApiKeyCreate) Save(ctx context.Context) (*ApiKey, error) { +// Save creates the APIKey in the database. +func (_c *APIKeyCreate) Save(ctx context.Context) (*APIKey, error) { if err := _c.defaults(); err != nil { 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. -func (_c *ApiKeyCreate) SaveX(ctx context.Context) *ApiKey { +func (_c *APIKeyCreate) SaveX(ctx context.Context) *APIKey { v, err := _c.Save(ctx) if err != nil { panic(err) @@ -161,20 +161,20 @@ func (_c *ApiKeyCreate) SaveX(ctx context.Context) *ApiKey { } // Exec executes the query. -func (_c *ApiKeyCreate) Exec(ctx context.Context) error { +func (_c *APIKeyCreate) Exec(ctx context.Context) error { _, err := _c.Save(ctx) return err } // 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 { panic(err) } } // 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 apikey.DefaultCreatedAt == nil { 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. -func (_c *ApiKeyCreate) check() error { +func (_c *APIKeyCreate) check() error { 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 { - 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 { - 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 { - 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 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 { - 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 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 { - 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 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 { - 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 } -func (_c *ApiKeyCreate) sqlSave(ctx context.Context) (*ApiKey, error) { +func (_c *APIKeyCreate) sqlSave(ctx context.Context) (*APIKey, error) { if err := _c.check(); err != nil { return nil, err } @@ -255,9 +255,9 @@ func (_c *ApiKeyCreate) sqlSave(ctx context.Context) (*ApiKey, error) { return _node, nil } -func (_c *ApiKeyCreate) createSpec() (*ApiKey, *sqlgraph.CreateSpec) { +func (_c *APIKeyCreate) createSpec() (*APIKey, *sqlgraph.CreateSpec) { var ( - _node = &ApiKey{config: _c.config} + _node = &APIKey{config: _c.config} _spec = sqlgraph.NewCreateSpec(apikey.Table, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) ) _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 // of the `INSERT` statement. For example: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // SetCreatedAt(v). // OnConflict( // // 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 // // update values. -// Update(func(u *ent.ApiKeyUpsert) { +// Update(func(u *ent.APIKeyUpsert) { // SetCreatedAt(v+v). // }). // Exec(ctx) -func (_c *ApiKeyCreate) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsertOne { +func (_c *APIKeyCreate) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsertOne { _c.conflict = opts - return &ApiKeyUpsertOne{ + return &APIKeyUpsertOne{ create: _c, } } @@ -364,121 +364,121 @@ func (_c *ApiKeyCreate) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsertOne // OnConflictColumns calls `OnConflict` and configures the columns // as conflict target. Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict(sql.ConflictColumns(columns...)). // Exec(ctx) -func (_c *ApiKeyCreate) OnConflictColumns(columns ...string) *ApiKeyUpsertOne { +func (_c *APIKeyCreate) OnConflictColumns(columns ...string) *APIKeyUpsertOne { _c.conflict = append(_c.conflict, sql.ConflictColumns(columns...)) - return &ApiKeyUpsertOne{ + return &APIKeyUpsertOne{ create: _c, } } type ( - // ApiKeyUpsertOne is the builder for "upsert"-ing - // one ApiKey node. - ApiKeyUpsertOne struct { - create *ApiKeyCreate + // APIKeyUpsertOne is the builder for "upsert"-ing + // one APIKey node. + APIKeyUpsertOne struct { + create *APIKeyCreate } - // ApiKeyUpsert is the "OnConflict" setter. - ApiKeyUpsert struct { + // APIKeyUpsert is the "OnConflict" setter. + APIKeyUpsert struct { *sql.UpdateSet } ) // 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) return u } // 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) return u } // 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) return u } // 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) return u } // ClearDeletedAt clears the value of the "deleted_at" field. -func (u *ApiKeyUpsert) ClearDeletedAt() *ApiKeyUpsert { +func (u *APIKeyUpsert) ClearDeletedAt() *APIKeyUpsert { u.SetNull(apikey.FieldDeletedAt) return u } // 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) return u } // 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) return u } // SetKey sets the "key" field. -func (u *ApiKeyUpsert) SetKey(v string) *ApiKeyUpsert { +func (u *APIKeyUpsert) SetKey(v string) *APIKeyUpsert { u.Set(apikey.FieldKey, v) return u } // 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) return u } // SetName sets the "name" field. -func (u *ApiKeyUpsert) SetName(v string) *ApiKeyUpsert { +func (u *APIKeyUpsert) SetName(v string) *APIKeyUpsert { u.Set(apikey.FieldName, v) return u } // 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) return u } // 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) return u } // 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) return u } // ClearGroupID clears the value of the "group_id" field. -func (u *ApiKeyUpsert) ClearGroupID() *ApiKeyUpsert { +func (u *APIKeyUpsert) ClearGroupID() *APIKeyUpsert { u.SetNull(apikey.FieldGroupID) return u } // SetStatus sets the "status" field. -func (u *ApiKeyUpsert) SetStatus(v string) *ApiKeyUpsert { +func (u *APIKeyUpsert) SetStatus(v string) *APIKeyUpsert { u.Set(apikey.FieldStatus, v) return u } // 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) 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. // Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict( // sql.ResolveWithNewValues(), // ). // 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.ResolveWith(func(s *sql.UpdateSet) { 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. // Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict(sql.ResolveWithIgnore()). // Exec(ctx) -func (u *ApiKeyUpsertOne) Ignore() *ApiKeyUpsertOne { +func (u *APIKeyUpsertOne) Ignore() *APIKeyUpsertOne { u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) return u } // DoNothing configures the conflict_action to `DO NOTHING`. // 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()) 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. -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) { - set(&ApiKeyUpsert{UpdateSet: update}) + set(&APIKeyUpsert{UpdateSet: update}) })) return u } // SetUpdatedAt sets the "updated_at" field. -func (u *ApiKeyUpsertOne) SetUpdatedAt(v time.Time) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetUpdatedAt(v time.Time) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetUpdatedAt(v) }) } // UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateUpdatedAt() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateUpdatedAt() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateUpdatedAt() }) } // SetDeletedAt sets the "deleted_at" field. -func (u *ApiKeyUpsertOne) SetDeletedAt(v time.Time) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetDeletedAt(v time.Time) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetDeletedAt(v) }) } // UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateDeletedAt() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateDeletedAt() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateDeletedAt() }) } // ClearDeletedAt clears the value of the "deleted_at" field. -func (u *ApiKeyUpsertOne) ClearDeletedAt() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) ClearDeletedAt() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.ClearDeletedAt() }) } // SetUserID sets the "user_id" field. -func (u *ApiKeyUpsertOne) SetUserID(v int64) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetUserID(v int64) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetUserID(v) }) } // UpdateUserID sets the "user_id" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateUserID() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateUserID() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateUserID() }) } // SetKey sets the "key" field. -func (u *ApiKeyUpsertOne) SetKey(v string) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetKey(v string) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetKey(v) }) } // UpdateKey sets the "key" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateKey() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateKey() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateKey() }) } // SetName sets the "name" field. -func (u *ApiKeyUpsertOne) SetName(v string) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetName(v string) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetName(v) }) } // UpdateName sets the "name" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateName() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateName() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateName() }) } // SetGroupID sets the "group_id" field. -func (u *ApiKeyUpsertOne) SetGroupID(v int64) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetGroupID(v int64) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetGroupID(v) }) } // UpdateGroupID sets the "group_id" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateGroupID() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateGroupID() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateGroupID() }) } // ClearGroupID clears the value of the "group_id" field. -func (u *ApiKeyUpsertOne) ClearGroupID() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) ClearGroupID() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.ClearGroupID() }) } // SetStatus sets the "status" field. -func (u *ApiKeyUpsertOne) SetStatus(v string) *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) SetStatus(v string) *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.SetStatus(v) }) } // UpdateStatus sets the "status" field to the value that was provided on create. -func (u *ApiKeyUpsertOne) UpdateStatus() *ApiKeyUpsertOne { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertOne) UpdateStatus() *APIKeyUpsertOne { + return u.Update(func(s *APIKeyUpsert) { s.UpdateStatus() }) } // 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 { - return errors.New("ent: missing options for ApiKeyCreate.OnConflict") + return errors.New("ent: missing options for APIKeyCreate.OnConflict") } return u.create.Exec(ctx) } // 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 { panic(err) } } // 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) if err != nil { 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. -func (u *ApiKeyUpsertOne) IDX(ctx context.Context) int64 { +func (u *APIKeyUpsertOne) IDX(ctx context.Context) int64 { id, err := u.ID(ctx) if err != nil { panic(err) @@ -673,28 +673,28 @@ func (u *ApiKeyUpsertOne) IDX(ctx context.Context) int64 { return id } -// ApiKeyCreateBulk is the builder for creating many ApiKey entities in bulk. -type ApiKeyCreateBulk struct { +// APIKeyCreateBulk is the builder for creating many APIKey entities in bulk. +type APIKeyCreateBulk struct { config err error - builders []*ApiKeyCreate + builders []*APIKeyCreate conflict []sql.ConflictOption } -// Save creates the ApiKey entities in the database. -func (_c *ApiKeyCreateBulk) Save(ctx context.Context) ([]*ApiKey, error) { +// Save creates the APIKey entities in the database. +func (_c *APIKeyCreateBulk) Save(ctx context.Context) ([]*APIKey, error) { if _c.err != nil { return nil, _c.err } 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)) for i := range _c.builders { func(i int, root context.Context) { builder := _c.builders[i] builder.defaults() var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) { - mutation, ok := m.(*ApiKeyMutation) + mutation, ok := m.(*APIKeyMutation) if !ok { 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. -func (_c *ApiKeyCreateBulk) SaveX(ctx context.Context) []*ApiKey { +func (_c *APIKeyCreateBulk) SaveX(ctx context.Context) []*APIKey { v, err := _c.Save(ctx) if err != nil { panic(err) @@ -751,13 +751,13 @@ func (_c *ApiKeyCreateBulk) SaveX(ctx context.Context) []*ApiKey { } // Exec executes the query. -func (_c *ApiKeyCreateBulk) Exec(ctx context.Context) error { +func (_c *APIKeyCreateBulk) Exec(ctx context.Context) error { _, err := _c.Save(ctx) return err } // 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 { panic(err) } @@ -766,7 +766,7 @@ func (_c *ApiKeyCreateBulk) ExecX(ctx context.Context) { // OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause // of the `INSERT` statement. For example: // -// client.ApiKey.CreateBulk(builders...). +// client.APIKey.CreateBulk(builders...). // OnConflict( // // Update the row with the new values // // the was proposed for insertion. @@ -774,13 +774,13 @@ func (_c *ApiKeyCreateBulk) ExecX(ctx context.Context) { // ). // // Override some of the fields with custom // // update values. -// Update(func(u *ent.ApiKeyUpsert) { +// Update(func(u *ent.APIKeyUpsert) { // SetCreatedAt(v+v). // }). // Exec(ctx) -func (_c *ApiKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsertBulk { +func (_c *APIKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *APIKeyUpsertBulk { _c.conflict = opts - return &ApiKeyUpsertBulk{ + return &APIKeyUpsertBulk{ create: _c, } } @@ -788,31 +788,31 @@ func (_c *ApiKeyCreateBulk) OnConflict(opts ...sql.ConflictOption) *ApiKeyUpsert // OnConflictColumns calls `OnConflict` and configures the columns // as conflict target. Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict(sql.ConflictColumns(columns...)). // Exec(ctx) -func (_c *ApiKeyCreateBulk) OnConflictColumns(columns ...string) *ApiKeyUpsertBulk { +func (_c *APIKeyCreateBulk) OnConflictColumns(columns ...string) *APIKeyUpsertBulk { _c.conflict = append(_c.conflict, sql.ConflictColumns(columns...)) - return &ApiKeyUpsertBulk{ + return &APIKeyUpsertBulk{ create: _c, } } -// ApiKeyUpsertBulk is the builder for "upsert"-ing -// a bulk of ApiKey nodes. -type ApiKeyUpsertBulk struct { - create *ApiKeyCreateBulk +// APIKeyUpsertBulk is the builder for "upsert"-ing +// a bulk of APIKey nodes. +type APIKeyUpsertBulk struct { + create *APIKeyCreateBulk } // UpdateNewValues updates the mutable fields using the new values that // were set on create. Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict( // sql.ResolveWithNewValues(), // ). // 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.ResolveWith(func(s *sql.UpdateSet) { 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. // Using this option is equivalent to using: // -// client.ApiKey.Create(). +// client.APIKey.Create(). // OnConflict(sql.ResolveWithIgnore()). // Exec(ctx) -func (u *ApiKeyUpsertBulk) Ignore() *ApiKeyUpsertBulk { +func (u *APIKeyUpsertBulk) Ignore() *APIKeyUpsertBulk { u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore()) return u } // DoNothing configures the conflict_action to `DO NOTHING`. // 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()) 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. -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) { - set(&ApiKeyUpsert{UpdateSet: update}) + set(&APIKeyUpsert{UpdateSet: update}) })) return u } // SetUpdatedAt sets the "updated_at" field. -func (u *ApiKeyUpsertBulk) SetUpdatedAt(v time.Time) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetUpdatedAt(v time.Time) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetUpdatedAt(v) }) } // UpdateUpdatedAt sets the "updated_at" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateUpdatedAt() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateUpdatedAt() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateUpdatedAt() }) } // SetDeletedAt sets the "deleted_at" field. -func (u *ApiKeyUpsertBulk) SetDeletedAt(v time.Time) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetDeletedAt(v time.Time) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetDeletedAt(v) }) } // UpdateDeletedAt sets the "deleted_at" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateDeletedAt() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateDeletedAt() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateDeletedAt() }) } // ClearDeletedAt clears the value of the "deleted_at" field. -func (u *ApiKeyUpsertBulk) ClearDeletedAt() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) ClearDeletedAt() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.ClearDeletedAt() }) } // SetUserID sets the "user_id" field. -func (u *ApiKeyUpsertBulk) SetUserID(v int64) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetUserID(v int64) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetUserID(v) }) } // UpdateUserID sets the "user_id" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateUserID() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateUserID() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateUserID() }) } // SetKey sets the "key" field. -func (u *ApiKeyUpsertBulk) SetKey(v string) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetKey(v string) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetKey(v) }) } // UpdateKey sets the "key" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateKey() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateKey() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateKey() }) } // SetName sets the "name" field. -func (u *ApiKeyUpsertBulk) SetName(v string) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetName(v string) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetName(v) }) } // UpdateName sets the "name" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateName() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateName() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateName() }) } // SetGroupID sets the "group_id" field. -func (u *ApiKeyUpsertBulk) SetGroupID(v int64) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetGroupID(v int64) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetGroupID(v) }) } // UpdateGroupID sets the "group_id" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateGroupID() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateGroupID() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateGroupID() }) } // ClearGroupID clears the value of the "group_id" field. -func (u *ApiKeyUpsertBulk) ClearGroupID() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) ClearGroupID() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.ClearGroupID() }) } // SetStatus sets the "status" field. -func (u *ApiKeyUpsertBulk) SetStatus(v string) *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) SetStatus(v string) *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.SetStatus(v) }) } // UpdateStatus sets the "status" field to the value that was provided on create. -func (u *ApiKeyUpsertBulk) UpdateStatus() *ApiKeyUpsertBulk { - return u.Update(func(s *ApiKeyUpsert) { +func (u *APIKeyUpsertBulk) UpdateStatus() *APIKeyUpsertBulk { + return u.Update(func(s *APIKeyUpsert) { s.UpdateStatus() }) } // 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 { return u.create.err } for i, b := range u.create.builders { 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 { - return errors.New("ent: missing options for ApiKeyCreateBulk.OnConflict") + return errors.New("ent: missing options for APIKeyCreateBulk.OnConflict") } return u.create.Exec(ctx) } // 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 { panic(err) } diff --git a/backend/ent/apikey_delete.go b/backend/ent/apikey_delete.go index 6e5c200c..761db81d 100644 --- a/backend/ent/apikey_delete.go +++ b/backend/ent/apikey_delete.go @@ -12,26 +12,26 @@ import ( "github.com/Wei-Shaw/sub2api/ent/predicate" ) -// ApiKeyDelete is the builder for deleting a ApiKey entity. -type ApiKeyDelete struct { +// APIKeyDelete is the builder for deleting a APIKey entity. +type APIKeyDelete struct { config hooks []Hook - mutation *ApiKeyMutation + mutation *APIKeyMutation } -// Where appends a list predicates to the ApiKeyDelete builder. -func (_d *ApiKeyDelete) Where(ps ...predicate.ApiKey) *ApiKeyDelete { +// Where appends a list predicates to the APIKeyDelete builder. +func (_d *APIKeyDelete) Where(ps ...predicate.APIKey) *APIKeyDelete { _d.mutation.Where(ps...) return _d } // 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) } // 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) if err != nil { panic(err) @@ -39,7 +39,7 @@ func (_d *ApiKeyDelete) ExecX(ctx context.Context) int { 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)) if ps := _d.mutation.predicates; len(ps) > 0 { _spec.Predicate = func(selector *sql.Selector) { @@ -56,19 +56,19 @@ func (_d *ApiKeyDelete) sqlExec(ctx context.Context) (int, error) { return affected, err } -// ApiKeyDeleteOne is the builder for deleting a single ApiKey entity. -type ApiKeyDeleteOne struct { - _d *ApiKeyDelete +// APIKeyDeleteOne is the builder for deleting a single APIKey entity. +type APIKeyDeleteOne struct { + _d *APIKeyDelete } -// Where appends a list predicates to the ApiKeyDelete builder. -func (_d *ApiKeyDeleteOne) Where(ps ...predicate.ApiKey) *ApiKeyDeleteOne { +// Where appends a list predicates to the APIKeyDelete builder. +func (_d *APIKeyDeleteOne) Where(ps ...predicate.APIKey) *APIKeyDeleteOne { _d._d.mutation.Where(ps...) return _d } // 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) switch { 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. -func (_d *ApiKeyDeleteOne) ExecX(ctx context.Context) { +func (_d *APIKeyDeleteOne) ExecX(ctx context.Context) { if err := _d.Exec(ctx); err != nil { panic(err) } diff --git a/backend/ent/apikey_query.go b/backend/ent/apikey_query.go index d4029feb..6e5c0f5e 100644 --- a/backend/ent/apikey_query.go +++ b/backend/ent/apikey_query.go @@ -19,13 +19,13 @@ import ( "github.com/Wei-Shaw/sub2api/ent/user" ) -// ApiKeyQuery is the builder for querying ApiKey entities. -type ApiKeyQuery struct { +// APIKeyQuery is the builder for querying APIKey entities. +type APIKeyQuery struct { config ctx *QueryContext order []apikey.OrderOption inters []Interceptor - predicates []predicate.ApiKey + predicates []predicate.APIKey withUser *UserQuery withGroup *GroupQuery withUsageLogs *UsageLogQuery @@ -34,39 +34,39 @@ type ApiKeyQuery struct { path func(context.Context) (*sql.Selector, error) } -// Where adds a new predicate for the ApiKeyQuery builder. -func (_q *ApiKeyQuery) Where(ps ...predicate.ApiKey) *ApiKeyQuery { +// Where adds a new predicate for the APIKeyQuery builder. +func (_q *APIKeyQuery) Where(ps ...predicate.APIKey) *APIKeyQuery { _q.predicates = append(_q.predicates, ps...) return _q } // 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 return _q } // Offset to start from. -func (_q *ApiKeyQuery) Offset(offset int) *ApiKeyQuery { +func (_q *APIKeyQuery) Offset(offset int) *APIKeyQuery { _q.ctx.Offset = &offset return _q } // 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. -func (_q *ApiKeyQuery) Unique(unique bool) *ApiKeyQuery { +func (_q *APIKeyQuery) Unique(unique bool) *APIKeyQuery { _q.ctx.Unique = &unique return _q } // 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...) return _q } // 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.path = func(ctx context.Context) (fromU *sql.Selector, err error) { 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. -func (_q *ApiKeyQuery) QueryGroup() *GroupQuery { +func (_q *APIKeyQuery) QueryGroup() *GroupQuery { query := (&GroupClient{config: _q.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { 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. -func (_q *ApiKeyQuery) QueryUsageLogs() *UsageLogQuery { +func (_q *APIKeyQuery) QueryUsageLogs() *UsageLogQuery { query := (&UsageLogClient{config: _q.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := _q.prepareQuery(ctx); err != nil { @@ -131,9 +131,9 @@ func (_q *ApiKeyQuery) QueryUsageLogs() *UsageLogQuery { return query } -// First returns the first ApiKey entity from the query. -// Returns a *NotFoundError when no ApiKey was found. -func (_q *ApiKeyQuery) First(ctx context.Context) (*ApiKey, error) { +// First returns the first APIKey entity from the query. +// Returns a *NotFoundError when no APIKey was found. +func (_q *APIKeyQuery) First(ctx context.Context) (*APIKey, error) { nodes, err := _q.Limit(1).All(setContextOp(ctx, _q.ctx, ent.OpQueryFirst)) if err != nil { 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. -func (_q *ApiKeyQuery) FirstX(ctx context.Context) *ApiKey { +func (_q *APIKeyQuery) FirstX(ctx context.Context) *APIKey { node, err := _q.First(ctx) if err != nil && !IsNotFound(err) { panic(err) @@ -153,9 +153,9 @@ func (_q *ApiKeyQuery) FirstX(ctx context.Context) *ApiKey { return node } -// FirstID returns the first ApiKey ID from the query. -// Returns a *NotFoundError when no ApiKey ID was found. -func (_q *ApiKeyQuery) FirstID(ctx context.Context) (id int64, err error) { +// FirstID returns the first APIKey ID from the query. +// Returns a *NotFoundError when no APIKey ID was found. +func (_q *APIKeyQuery) FirstID(ctx context.Context) (id int64, err error) { var ids []int64 if ids, err = _q.Limit(1).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryFirstID)); err != nil { 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. -func (_q *ApiKeyQuery) FirstIDX(ctx context.Context) int64 { +func (_q *APIKeyQuery) FirstIDX(ctx context.Context) int64 { id, err := _q.FirstID(ctx) if err != nil && !IsNotFound(err) { panic(err) @@ -176,10 +176,10 @@ func (_q *ApiKeyQuery) FirstIDX(ctx context.Context) int64 { return id } -// 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 *NotFoundError when no ApiKey entities are found. -func (_q *ApiKeyQuery) Only(ctx context.Context) (*ApiKey, error) { +// 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 *NotFoundError when no APIKey entities are found. +func (_q *APIKeyQuery) Only(ctx context.Context) (*APIKey, error) { nodes, err := _q.Limit(2).All(setContextOp(ctx, _q.ctx, ent.OpQueryOnly)) if err != nil { 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. -func (_q *ApiKeyQuery) OnlyX(ctx context.Context) *ApiKey { +func (_q *APIKeyQuery) OnlyX(ctx context.Context) *APIKey { node, err := _q.Only(ctx) if err != nil { panic(err) @@ -203,10 +203,10 @@ func (_q *ApiKeyQuery) OnlyX(ctx context.Context) *ApiKey { return node } -// OnlyID is like Only, but returns the only ApiKey ID in the query. -// Returns a *NotSingularError when more than one ApiKey ID is found. +// 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 *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 if ids, err = _q.Limit(2).IDs(setContextOp(ctx, _q.ctx, ent.OpQueryOnlyID)); err != nil { 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. -func (_q *ApiKeyQuery) OnlyIDX(ctx context.Context) int64 { +func (_q *APIKeyQuery) OnlyIDX(ctx context.Context) int64 { id, err := _q.OnlyID(ctx) if err != nil { panic(err) @@ -231,18 +231,18 @@ func (_q *ApiKeyQuery) OnlyIDX(ctx context.Context) int64 { return id } -// All executes the query and returns a list of ApiKeys. -func (_q *ApiKeyQuery) All(ctx context.Context) ([]*ApiKey, error) { +// All executes the query and returns a list of APIKeys. +func (_q *APIKeyQuery) All(ctx context.Context) ([]*APIKey, error) { ctx = setContextOp(ctx, _q.ctx, ent.OpQueryAll) if err := _q.prepareQuery(ctx); err != nil { return nil, err } - qr := querierAll[[]*ApiKey, *ApiKeyQuery]() - return withInterceptors[[]*ApiKey](ctx, _q, qr, _q.inters) + qr := querierAll[[]*APIKey, *APIKeyQuery]() + return withInterceptors[[]*APIKey](ctx, _q, qr, _q.inters) } // 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) if err != nil { panic(err) @@ -250,8 +250,8 @@ func (_q *ApiKeyQuery) AllX(ctx context.Context) []*ApiKey { return nodes } -// IDs executes the query and returns a list of ApiKey IDs. -func (_q *ApiKeyQuery) IDs(ctx context.Context) (ids []int64, err error) { +// IDs executes the query and returns a list of APIKey IDs. +func (_q *APIKeyQuery) IDs(ctx context.Context) (ids []int64, err error) { if _q.ctx.Unique == nil && _q.path != nil { _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. -func (_q *ApiKeyQuery) IDsX(ctx context.Context) []int64 { +func (_q *APIKeyQuery) IDsX(ctx context.Context) []int64 { ids, err := _q.IDs(ctx) if err != nil { panic(err) @@ -272,16 +272,16 @@ func (_q *ApiKeyQuery) IDsX(ctx context.Context) []int64 { } // 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) if err := _q.prepareQuery(ctx); err != nil { 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. -func (_q *ApiKeyQuery) CountX(ctx context.Context) int { +func (_q *APIKeyQuery) CountX(ctx context.Context) int { count, err := _q.Count(ctx) if err != nil { 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. -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) switch _, err := _q.FirstID(ctx); { 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. -func (_q *ApiKeyQuery) ExistX(ctx context.Context) bool { +func (_q *APIKeyQuery) ExistX(ctx context.Context) bool { exist, err := _q.Exist(ctx) if err != nil { panic(err) @@ -311,18 +311,18 @@ func (_q *ApiKeyQuery) ExistX(ctx context.Context) bool { 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. -func (_q *ApiKeyQuery) Clone() *ApiKeyQuery { +func (_q *APIKeyQuery) Clone() *APIKeyQuery { if _q == nil { return nil } - return &ApiKeyQuery{ + return &APIKeyQuery{ config: _q.config, ctx: _q.ctx.Clone(), order: append([]apikey.OrderOption{}, _q.order...), inters: append([]Interceptor{}, _q.inters...), - predicates: append([]predicate.ApiKey{}, _q.predicates...), + predicates: append([]predicate.APIKey{}, _q.predicates...), withUser: _q.withUser.Clone(), withGroup: _q.withGroup.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 // 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() for _, opt := range opts { 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 // 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() for _, opt := range opts { 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 // 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() for _, opt := range opts { opt(query) @@ -375,13 +375,13 @@ func (_q *ApiKeyQuery) WithUsageLogs(opts ...func(*UsageLogQuery)) *ApiKeyQuery // Count int `json:"count,omitempty"` // } // -// client.ApiKey.Query(). +// client.APIKey.Query(). // GroupBy(apikey.FieldCreatedAt). // Aggregate(ent.Count()). // 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...) - grbuild := &ApiKeyGroupBy{build: _q} + grbuild := &APIKeyGroupBy{build: _q} grbuild.flds = &_q.ctx.Fields grbuild.label = apikey.Label grbuild.scan = grbuild.Scan @@ -397,23 +397,23 @@ func (_q *ApiKeyQuery) GroupBy(field string, fields ...string) *ApiKeyGroupBy { // CreatedAt time.Time `json:"created_at,omitempty"` // } // -// client.ApiKey.Query(). +// client.APIKey.Query(). // Select(apikey.FieldCreatedAt). // 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...) - sbuild := &ApiKeySelect{ApiKeyQuery: _q} + sbuild := &APIKeySelect{APIKeyQuery: _q} sbuild.label = apikey.Label sbuild.flds, sbuild.scan = &_q.ctx.Fields, sbuild.Scan return sbuild } -// Aggregate returns a ApiKeySelect configured with the given aggregations. -func (_q *ApiKeyQuery) Aggregate(fns ...AggregateFunc) *ApiKeySelect { +// Aggregate returns a APIKeySelect configured with the given aggregations. +func (_q *APIKeyQuery) Aggregate(fns ...AggregateFunc) *APIKeySelect { 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 { if inter == nil { return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)") @@ -439,9 +439,9 @@ func (_q *ApiKeyQuery) prepareQuery(ctx context.Context) error { 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 ( - nodes = []*ApiKey{} + nodes = []*APIKey{} _spec = _q.querySpec() loadedTypes = [3]bool{ _q.withUser != nil, @@ -450,10 +450,10 @@ func (_q *ApiKeyQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*ApiKe } ) _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 { - node := &ApiKey{config: _q.config} + node := &APIKey{config: _q.config} nodes = append(nodes, node) node.Edges.loadedTypes = loadedTypes 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 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 } } if query := _q.withGroup; query != 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 } } if query := _q.withUsageLogs; query != nil { if err := _q.loadUsageLogs(ctx, query, nodes, - 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) { n.Edges.UsageLogs = []*UsageLog{} }, + func(n *APIKey, e *UsageLog) { n.Edges.UsageLogs = append(n.Edges.UsageLogs, e) }); err != nil { return nil, err } } 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)) - nodeids := make(map[int64][]*ApiKey) + nodeids := make(map[int64][]*APIKey) for i := range nodes { fk := nodes[i].UserID if _, ok := nodeids[fk]; !ok { @@ -518,9 +518,9 @@ func (_q *ApiKeyQuery) loadUser(ctx context.Context, query *UserQuery, nodes []* } 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)) - nodeids := make(map[int64][]*ApiKey) + nodeids := make(map[int64][]*APIKey) for i := range nodes { if nodes[i].GroupID == nil { continue @@ -550,9 +550,9 @@ func (_q *ApiKeyQuery) loadGroup(ctx context.Context, query *GroupQuery, nodes [ } 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)) - nodeids := make(map[int64]*ApiKey) + nodeids := make(map[int64]*APIKey) for i := range nodes { fks = append(fks, nodes[i].ID) nodeids[nodes[i].ID] = nodes[i] @@ -581,7 +581,7 @@ func (_q *ApiKeyQuery) loadUsageLogs(ctx context.Context, query *UsageLogQuery, return nil } -func (_q *ApiKeyQuery) sqlCount(ctx context.Context) (int, error) { +func (_q *APIKeyQuery) sqlCount(ctx context.Context) (int, error) { _spec := _q.querySpec() _spec.Node.Columns = _q.ctx.Fields 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) } -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.From = _q.sql if unique := _q.ctx.Unique; unique != nil { @@ -636,7 +636,7 @@ func (_q *ApiKeyQuery) querySpec() *sqlgraph.QuerySpec { 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()) t1 := builder.Table(apikey.Table) columns := _q.ctx.Fields @@ -668,28 +668,28 @@ func (_q *ApiKeyQuery) sqlQuery(ctx context.Context) *sql.Selector { return selector } -// ApiKeyGroupBy is the group-by builder for ApiKey entities. -type ApiKeyGroupBy struct { +// APIKeyGroupBy is the group-by builder for APIKey entities. +type APIKeyGroupBy struct { selector - build *ApiKeyQuery + build *APIKeyQuery } // 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...) return _g } // 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) if err := _g.build.prepareQuery(ctx); err != nil { 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() aggregation := make([]string, 0, len(_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) } -// ApiKeySelect is the builder for selecting fields of ApiKey entities. -type ApiKeySelect struct { - *ApiKeyQuery +// APIKeySelect is the builder for selecting fields of APIKey entities. +type APIKeySelect struct { + *APIKeyQuery selector } // 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...) return _s } // 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) if err := _s.prepareQuery(ctx); err != nil { 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) aggregation := make([]string, 0, len(_s.fns)) for _, fn := range _s.fns { diff --git a/backend/ent/apikey_update.go b/backend/ent/apikey_update.go index 3259bfd9..4a16369b 100644 --- a/backend/ent/apikey_update.go +++ b/backend/ent/apikey_update.go @@ -18,33 +18,33 @@ import ( "github.com/Wei-Shaw/sub2api/ent/user" ) -// ApiKeyUpdate is the builder for updating ApiKey entities. -type ApiKeyUpdate struct { +// APIKeyUpdate is the builder for updating APIKey entities. +type APIKeyUpdate struct { config hooks []Hook - mutation *ApiKeyMutation + mutation *APIKeyMutation } -// Where appends a list predicates to the ApiKeyUpdate builder. -func (_u *ApiKeyUpdate) Where(ps ...predicate.ApiKey) *ApiKeyUpdate { +// Where appends a list predicates to the APIKeyUpdate builder. +func (_u *APIKeyUpdate) Where(ps ...predicate.APIKey) *APIKeyUpdate { _u.mutation.Where(ps...) return _u } // 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) return _u } // 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) return _u } // 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 { _u.SetDeletedAt(*v) } @@ -52,19 +52,19 @@ func (_u *ApiKeyUpdate) SetNillableDeletedAt(v *time.Time) *ApiKeyUpdate { } // ClearDeletedAt clears the value of the "deleted_at" field. -func (_u *ApiKeyUpdate) ClearDeletedAt() *ApiKeyUpdate { +func (_u *APIKeyUpdate) ClearDeletedAt() *APIKeyUpdate { _u.mutation.ClearDeletedAt() return _u } // SetUserID sets the "user_id" field. -func (_u *ApiKeyUpdate) SetUserID(v int64) *ApiKeyUpdate { +func (_u *APIKeyUpdate) SetUserID(v int64) *APIKeyUpdate { _u.mutation.SetUserID(v) return _u } // 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 { _u.SetUserID(*v) } @@ -72,13 +72,13 @@ func (_u *ApiKeyUpdate) SetNillableUserID(v *int64) *ApiKeyUpdate { } // SetKey sets the "key" field. -func (_u *ApiKeyUpdate) SetKey(v string) *ApiKeyUpdate { +func (_u *APIKeyUpdate) SetKey(v string) *APIKeyUpdate { _u.mutation.SetKey(v) return _u } // 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 { _u.SetKey(*v) } @@ -86,13 +86,13 @@ func (_u *ApiKeyUpdate) SetNillableKey(v *string) *ApiKeyUpdate { } // SetName sets the "name" field. -func (_u *ApiKeyUpdate) SetName(v string) *ApiKeyUpdate { +func (_u *APIKeyUpdate) SetName(v string) *APIKeyUpdate { _u.mutation.SetName(v) return _u } // 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 { _u.SetName(*v) } @@ -100,13 +100,13 @@ func (_u *ApiKeyUpdate) SetNillableName(v *string) *ApiKeyUpdate { } // SetGroupID sets the "group_id" field. -func (_u *ApiKeyUpdate) SetGroupID(v int64) *ApiKeyUpdate { +func (_u *APIKeyUpdate) SetGroupID(v int64) *APIKeyUpdate { _u.mutation.SetGroupID(v) return _u } // 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 { _u.SetGroupID(*v) } @@ -114,19 +114,19 @@ func (_u *ApiKeyUpdate) SetNillableGroupID(v *int64) *ApiKeyUpdate { } // ClearGroupID clears the value of the "group_id" field. -func (_u *ApiKeyUpdate) ClearGroupID() *ApiKeyUpdate { +func (_u *APIKeyUpdate) ClearGroupID() *APIKeyUpdate { _u.mutation.ClearGroupID() return _u } // SetStatus sets the "status" field. -func (_u *ApiKeyUpdate) SetStatus(v string) *ApiKeyUpdate { +func (_u *APIKeyUpdate) SetStatus(v string) *APIKeyUpdate { _u.mutation.SetStatus(v) return _u } // 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 { _u.SetStatus(*v) } @@ -134,23 +134,23 @@ func (_u *ApiKeyUpdate) SetNillableStatus(v *string) *ApiKeyUpdate { } // 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) } // 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) } // 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...) return _u } // 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)) for i := range v { ids[i] = v[i].ID @@ -158,37 +158,37 @@ func (_u *ApiKeyUpdate) AddUsageLogs(v ...*UsageLog) *ApiKeyUpdate { return _u.AddUsageLogIDs(ids...) } -// Mutation returns the ApiKeyMutation object of the builder. -func (_u *ApiKeyUpdate) Mutation() *ApiKeyMutation { +// Mutation returns the APIKeyMutation object of the builder. +func (_u *APIKeyUpdate) Mutation() *APIKeyMutation { return _u.mutation } // ClearUser clears the "user" edge to the User entity. -func (_u *ApiKeyUpdate) ClearUser() *ApiKeyUpdate { +func (_u *APIKeyUpdate) ClearUser() *APIKeyUpdate { _u.mutation.ClearUser() return _u } // ClearGroup clears the "group" edge to the Group entity. -func (_u *ApiKeyUpdate) ClearGroup() *ApiKeyUpdate { +func (_u *APIKeyUpdate) ClearGroup() *APIKeyUpdate { _u.mutation.ClearGroup() return _u } // ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity. -func (_u *ApiKeyUpdate) ClearUsageLogs() *ApiKeyUpdate { +func (_u *APIKeyUpdate) ClearUsageLogs() *APIKeyUpdate { _u.mutation.ClearUsageLogs() return _u } // 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...) return _u } // 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)) for i := range v { 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. -func (_u *ApiKeyUpdate) Save(ctx context.Context) (int, error) { +func (_u *APIKeyUpdate) Save(ctx context.Context) (int, error) { if err := _u.defaults(); err != nil { 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. -func (_u *ApiKeyUpdate) SaveX(ctx context.Context) int { +func (_u *APIKeyUpdate) SaveX(ctx context.Context) int { affected, err := _u.Save(ctx) if err != nil { panic(err) @@ -214,20 +214,20 @@ func (_u *ApiKeyUpdate) SaveX(ctx context.Context) int { } // Exec executes the query. -func (_u *ApiKeyUpdate) Exec(ctx context.Context) error { +func (_u *APIKeyUpdate) Exec(ctx context.Context) error { _, err := _u.Save(ctx) return err } // 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 { panic(err) } } // 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 apikey.UpdateDefaultUpdatedAt == nil { 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. -func (_u *ApiKeyUpdate) check() error { +func (_u *APIKeyUpdate) check() error { if v, ok := _u.mutation.Key(); ok { 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 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 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 { - return errors.New(`ent: clearing a required unique edge "ApiKey.user"`) + return errors.New(`ent: clearing a required unique edge "APIKey.user"`) } 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 { return _node, err } @@ -406,28 +406,28 @@ func (_u *ApiKeyUpdate) sqlSave(ctx context.Context) (_node int, err error) { return _node, nil } -// ApiKeyUpdateOne is the builder for updating a single ApiKey entity. -type ApiKeyUpdateOne struct { +// APIKeyUpdateOne is the builder for updating a single APIKey entity. +type APIKeyUpdateOne struct { config fields []string hooks []Hook - mutation *ApiKeyMutation + mutation *APIKeyMutation } // 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) return _u } // 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) return _u } // 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 { _u.SetDeletedAt(*v) } @@ -435,19 +435,19 @@ func (_u *ApiKeyUpdateOne) SetNillableDeletedAt(v *time.Time) *ApiKeyUpdateOne { } // ClearDeletedAt clears the value of the "deleted_at" field. -func (_u *ApiKeyUpdateOne) ClearDeletedAt() *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) ClearDeletedAt() *APIKeyUpdateOne { _u.mutation.ClearDeletedAt() return _u } // SetUserID sets the "user_id" field. -func (_u *ApiKeyUpdateOne) SetUserID(v int64) *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) SetUserID(v int64) *APIKeyUpdateOne { _u.mutation.SetUserID(v) return _u } // 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 { _u.SetUserID(*v) } @@ -455,13 +455,13 @@ func (_u *ApiKeyUpdateOne) SetNillableUserID(v *int64) *ApiKeyUpdateOne { } // SetKey sets the "key" field. -func (_u *ApiKeyUpdateOne) SetKey(v string) *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) SetKey(v string) *APIKeyUpdateOne { _u.mutation.SetKey(v) return _u } // 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 { _u.SetKey(*v) } @@ -469,13 +469,13 @@ func (_u *ApiKeyUpdateOne) SetNillableKey(v *string) *ApiKeyUpdateOne { } // SetName sets the "name" field. -func (_u *ApiKeyUpdateOne) SetName(v string) *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) SetName(v string) *APIKeyUpdateOne { _u.mutation.SetName(v) return _u } // 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 { _u.SetName(*v) } @@ -483,13 +483,13 @@ func (_u *ApiKeyUpdateOne) SetNillableName(v *string) *ApiKeyUpdateOne { } // SetGroupID sets the "group_id" field. -func (_u *ApiKeyUpdateOne) SetGroupID(v int64) *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) SetGroupID(v int64) *APIKeyUpdateOne { _u.mutation.SetGroupID(v) return _u } // 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 { _u.SetGroupID(*v) } @@ -497,19 +497,19 @@ func (_u *ApiKeyUpdateOne) SetNillableGroupID(v *int64) *ApiKeyUpdateOne { } // ClearGroupID clears the value of the "group_id" field. -func (_u *ApiKeyUpdateOne) ClearGroupID() *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) ClearGroupID() *APIKeyUpdateOne { _u.mutation.ClearGroupID() return _u } // SetStatus sets the "status" field. -func (_u *ApiKeyUpdateOne) SetStatus(v string) *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) SetStatus(v string) *APIKeyUpdateOne { _u.mutation.SetStatus(v) return _u } // 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 { _u.SetStatus(*v) } @@ -517,23 +517,23 @@ func (_u *ApiKeyUpdateOne) SetNillableStatus(v *string) *ApiKeyUpdateOne { } // 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) } // 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) } // 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...) return _u } // 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)) for i := range v { ids[i] = v[i].ID @@ -541,37 +541,37 @@ func (_u *ApiKeyUpdateOne) AddUsageLogs(v ...*UsageLog) *ApiKeyUpdateOne { return _u.AddUsageLogIDs(ids...) } -// Mutation returns the ApiKeyMutation object of the builder. -func (_u *ApiKeyUpdateOne) Mutation() *ApiKeyMutation { +// Mutation returns the APIKeyMutation object of the builder. +func (_u *APIKeyUpdateOne) Mutation() *APIKeyMutation { return _u.mutation } // ClearUser clears the "user" edge to the User entity. -func (_u *ApiKeyUpdateOne) ClearUser() *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) ClearUser() *APIKeyUpdateOne { _u.mutation.ClearUser() return _u } // ClearGroup clears the "group" edge to the Group entity. -func (_u *ApiKeyUpdateOne) ClearGroup() *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) ClearGroup() *APIKeyUpdateOne { _u.mutation.ClearGroup() return _u } // ClearUsageLogs clears all "usage_logs" edges to the UsageLog entity. -func (_u *ApiKeyUpdateOne) ClearUsageLogs() *ApiKeyUpdateOne { +func (_u *APIKeyUpdateOne) ClearUsageLogs() *APIKeyUpdateOne { _u.mutation.ClearUsageLogs() return _u } // 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...) return _u } // 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)) for i := range v { ids[i] = v[i].ID @@ -579,21 +579,21 @@ func (_u *ApiKeyUpdateOne) RemoveUsageLogs(v ...*UsageLog) *ApiKeyUpdateOne { return _u.RemoveUsageLogIDs(ids...) } -// Where appends a list predicates to the ApiKeyUpdate builder. -func (_u *ApiKeyUpdateOne) Where(ps ...predicate.ApiKey) *ApiKeyUpdateOne { +// Where appends a list predicates to the APIKeyUpdate builder. +func (_u *APIKeyUpdateOne) Where(ps ...predicate.APIKey) *APIKeyUpdateOne { _u.mutation.Where(ps...) return _u } // Select allows selecting one or more fields (columns) of the returned entity. // 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...) return _u } -// Save executes the query and returns the updated ApiKey entity. -func (_u *ApiKeyUpdateOne) Save(ctx context.Context) (*ApiKey, error) { +// Save executes the query and returns the updated APIKey entity. +func (_u *APIKeyUpdateOne) Save(ctx context.Context) (*APIKey, error) { if err := _u.defaults(); err != nil { 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. -func (_u *ApiKeyUpdateOne) SaveX(ctx context.Context) *ApiKey { +func (_u *APIKeyUpdateOne) SaveX(ctx context.Context) *APIKey { node, err := _u.Save(ctx) if err != nil { panic(err) @@ -610,20 +610,20 @@ func (_u *ApiKeyUpdateOne) SaveX(ctx context.Context) *ApiKey { } // 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) return err } // 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 { panic(err) } } // 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 apikey.UpdateDefaultUpdatedAt == nil { 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. -func (_u *ApiKeyUpdateOne) check() error { +func (_u *APIKeyUpdateOne) check() error { if v, ok := _u.mutation.Key(); ok { 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 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 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 { - return errors.New(`ent: clearing a required unique edge "ApiKey.user"`) + return errors.New(`ent: clearing a required unique edge "APIKey.user"`) } 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 { return _node, err } _spec := sqlgraph.NewUpdateSpec(apikey.Table, apikey.Columns, sqlgraph.NewFieldSpec(apikey.FieldID, field.TypeInt64)) id, ok := _u.mutation.ID() 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 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) } - _node = &ApiKey{config: _u.config} + _node = &APIKey{config: _u.config} _spec.Assign = _node.assignValues _spec.ScanValues = _node.scanValues if err = sqlgraph.UpdateNode(ctx, _u.driver, _spec); err != nil { diff --git a/backend/ent/client.go b/backend/ent/client.go index fab70489..4084dac2 100644 --- a/backend/ent/client.go +++ b/backend/ent/client.go @@ -37,12 +37,12 @@ type Client struct { config // Schema is the client for creating, migrating and dropping 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 *AccountClient // AccountGroup is the client for interacting with the AccountGroup builders. 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 *GroupClient // Proxy is the client for interacting with the Proxy builders. @@ -74,9 +74,9 @@ func NewClient(opts ...Option) *Client { func (c *Client) init() { c.Schema = migrate.NewSchema(c.driver) + c.APIKey = NewAPIKeyClient(c.config) c.Account = NewAccountClient(c.config) c.AccountGroup = NewAccountGroupClient(c.config) - c.ApiKey = NewApiKeyClient(c.config) c.Group = NewGroupClient(c.config) c.Proxy = NewProxyClient(c.config) c.RedeemCode = NewRedeemCodeClient(c.config) @@ -179,9 +179,9 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) { return &Tx{ ctx: ctx, config: cfg, + APIKey: NewAPIKeyClient(cfg), Account: NewAccountClient(cfg), AccountGroup: NewAccountGroupClient(cfg), - ApiKey: NewApiKeyClient(cfg), Group: NewGroupClient(cfg), Proxy: NewProxyClient(cfg), RedeemCode: NewRedeemCodeClient(cfg), @@ -211,9 +211,9 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) return &Tx{ ctx: ctx, config: cfg, + APIKey: NewAPIKeyClient(cfg), Account: NewAccountClient(cfg), AccountGroup: NewAccountGroupClient(cfg), - ApiKey: NewApiKeyClient(cfg), Group: NewGroupClient(cfg), Proxy: NewProxyClient(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. // // client.Debug(). -// Account. +// APIKey. // Query(). // Count(ctx) func (c *Client) Debug() *Client { @@ -253,7 +253,7 @@ func (c *Client) Close() error { // In order to add hooks to a specific client, call: `client.Node.Use(...)`. func (c *Client) Use(hooks ...Hook) { for _, n := range []interface{ Use(...Hook) }{ - c.Account, c.AccountGroup, c.ApiKey, c.Group, c.Proxy, c.RedeemCode, c.Setting, + c.APIKey, c.Account, c.AccountGroup, c.Group, c.Proxy, c.RedeemCode, c.Setting, c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition, c.UserAttributeValue, c.UserSubscription, } { @@ -265,7 +265,7 @@ func (c *Client) Use(hooks ...Hook) { // In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`. func (c *Client) Intercept(interceptors ...Interceptor) { for _, n := range []interface{ Intercept(...Interceptor) }{ - c.Account, c.AccountGroup, c.ApiKey, c.Group, c.Proxy, c.RedeemCode, c.Setting, + c.APIKey, c.Account, c.AccountGroup, c.Group, c.Proxy, c.RedeemCode, c.Setting, c.UsageLog, c.User, c.UserAllowedGroup, c.UserAttributeDefinition, c.UserAttributeValue, c.UserSubscription, } { @@ -276,12 +276,12 @@ func (c *Client) Intercept(interceptors ...Interceptor) { // Mutate implements the ent.Mutator interface. func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) { switch m := m.(type) { + case *APIKeyMutation: + return c.APIKey.mutate(ctx, m) case *AccountMutation: return c.Account.mutate(ctx, m) case *AccountGroupMutation: return c.AccountGroup.mutate(ctx, m) - case *ApiKeyMutation: - return c.ApiKey.mutate(ctx, m) case *GroupMutation: return c.Group.mutate(ctx, m) case *ProxyMutation: @@ -307,6 +307,189 @@ 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. type AccountClient struct { config @@ -622,189 +805,6 @@ 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. type GroupClient struct { config @@ -914,8 +914,8 @@ func (c *GroupClient) GetX(ctx context.Context, id int64) *Group { } // QueryAPIKeys queries the api_keys edge of a Group. -func (c *GroupClient) QueryAPIKeys(_m *Group) *ApiKeyQuery { - query := (&ApiKeyClient{config: c.config}).Query() +func (c *GroupClient) QueryAPIKeys(_m *Group) *APIKeyQuery { + query := (&APIKeyClient{config: c.config}).Query() query.path = func(context.Context) (fromV *sql.Selector, _ error) { id := _m.ID step := sqlgraph.NewStep( @@ -1642,8 +1642,8 @@ func (c *UsageLogClient) QueryUser(_m *UsageLog) *UserQuery { } // QueryAPIKey queries the api_key edge of a UsageLog. -func (c *UsageLogClient) QueryAPIKey(_m *UsageLog) *ApiKeyQuery { - query := (&ApiKeyClient{config: c.config}).Query() +func (c *UsageLogClient) QueryAPIKey(_m *UsageLog) *APIKeyQuery { + query := (&APIKeyClient{config: c.config}).Query() query.path = func(context.Context) (fromV *sql.Selector, _ error) { id := _m.ID 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. -func (c *UserClient) QueryAPIKeys(_m *User) *ApiKeyQuery { - query := (&ApiKeyClient{config: c.config}).Query() +func (c *UserClient) QueryAPIKeys(_m *User) *APIKeyQuery { + query := (&APIKeyClient{config: c.config}).Query() query.path = func(context.Context) (fromV *sql.Selector, _ error) { id := _m.ID step := sqlgraph.NewStep( @@ -2627,12 +2627,12 @@ func (c *UserSubscriptionClient) mutate(ctx context.Context, m *UserSubscription // hooks and interceptors per client, for fast access. type ( hooks struct { - Account, AccountGroup, ApiKey, Group, Proxy, RedeemCode, Setting, UsageLog, + APIKey, Account, AccountGroup, Group, Proxy, RedeemCode, Setting, UsageLog, User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue, UserSubscription []ent.Hook } inters struct { - Account, AccountGroup, ApiKey, Group, Proxy, RedeemCode, Setting, UsageLog, + APIKey, Account, AccountGroup, Group, Proxy, RedeemCode, Setting, UsageLog, User, UserAllowedGroup, UserAttributeDefinition, UserAttributeValue, UserSubscription []ent.Interceptor } diff --git a/backend/ent/ent.go b/backend/ent/ent.go index 49437ad7..670ea0b2 100644 --- a/backend/ent/ent.go +++ b/backend/ent/ent.go @@ -85,9 +85,9 @@ var ( func checkColumn(t, c string) error { initCheck.Do(func() { columnCheck = sql.NewColumnCheck(map[string]func(string) bool{ + apikey.Table: apikey.ValidColumn, account.Table: account.ValidColumn, accountgroup.Table: accountgroup.ValidColumn, - apikey.Table: apikey.ValidColumn, group.Table: group.ValidColumn, proxy.Table: proxy.ValidColumn, redeemcode.Table: redeemcode.ValidColumn, diff --git a/backend/ent/generate.go b/backend/ent/generate.go index ed48678f..22ab4a78 100644 --- a/backend/ent/generate.go +++ b/backend/ent/generate.go @@ -1,3 +1,4 @@ +// Package ent provides the generated ORM code for database entities. package ent // 启用 sql/execquery 以生成 ExecContext/QueryContext 的透传接口,便于事务内执行原生 SQL。 diff --git a/backend/ent/group.go b/backend/ent/group.go index 9b1e8604..e8687224 100644 --- a/backend/ent/group.go +++ b/backend/ent/group.go @@ -54,7 +54,7 @@ type Group struct { // GroupEdges holds the relations/edges for other nodes in the graph. type GroupEdges struct { // 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 []*RedeemCode `json:"redeem_codes,omitempty"` // 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 // was not loaded in eager-loading. -func (e GroupEdges) APIKeysOrErr() ([]*ApiKey, error) { +func (e GroupEdges) APIKeysOrErr() ([]*APIKey, error) { if e.loadedTypes[0] { 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. -func (_m *Group) QueryAPIKeys() *ApiKeyQuery { +func (_m *Group) QueryAPIKeys() *APIKeyQuery { return NewGroupClient(_m.config).QueryAPIKeys(_m) } diff --git a/backend/ent/group/group.go b/backend/ent/group/group.go index 8dc53c49..1934b17b 100644 --- a/backend/ent/group/group.go +++ b/backend/ent/group/group.go @@ -63,7 +63,7 @@ const ( Table = "groups" // APIKeysTable is the table that holds the api_keys relation/edge. 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. APIKeysInverseTable = "api_keys" // APIKeysColumn is the table column denoting the api_keys relation/edge. diff --git a/backend/ent/group/where.go b/backend/ent/group/where.go index ac18a418..cb553242 100644 --- a/backend/ent/group/where.go +++ b/backend/ent/group/where.go @@ -842,7 +842,7 @@ func HasAPIKeys() predicate.Group { } // 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) { step := newAPIKeysStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { diff --git a/backend/ent/group_create.go b/backend/ent/group_create.go index 383a1352..0613c78e 100644 --- a/backend/ent/group_create.go +++ b/backend/ent/group_create.go @@ -216,14 +216,14 @@ func (_c *GroupCreate) SetNillableDefaultValidityDays(v *int) *GroupCreate { 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 { _c.mutation.AddAPIKeyIDs(ids...) return _c } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_c *GroupCreate) AddAPIKeys(v ...*ApiKey) *GroupCreate { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_c *GroupCreate) AddAPIKeys(v ...*APIKey) *GroupCreate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID diff --git a/backend/ent/group_query.go b/backend/ent/group_query.go index 93a8d8c2..3cc976cb 100644 --- a/backend/ent/group_query.go +++ b/backend/ent/group_query.go @@ -31,7 +31,7 @@ type GroupQuery struct { order []group.OrderOption inters []Interceptor predicates []predicate.Group - withAPIKeys *ApiKeyQuery + withAPIKeys *APIKeyQuery withRedeemCodes *RedeemCodeQuery withSubscriptions *UserSubscriptionQuery withUsageLogs *UsageLogQuery @@ -76,8 +76,8 @@ func (_q *GroupQuery) Order(o ...group.OrderOption) *GroupQuery { } // QueryAPIKeys chains the current query on the "api_keys" edge. -func (_q *GroupQuery) QueryAPIKeys() *ApiKeyQuery { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *GroupQuery) QueryAPIKeys() *APIKeyQuery { + query := (&APIKeyClient{config: _q.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := _q.prepareQuery(ctx); err != nil { 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 // 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 { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *GroupQuery) WithAPIKeys(opts ...func(*APIKeyQuery)) *GroupQuery { + query := (&APIKeyClient{config: _q.config}).Query() for _, opt := range opts { opt(query) } @@ -654,8 +654,8 @@ func (_q *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group, } if query := _q.withAPIKeys; query != nil { if err := _q.loadAPIKeys(ctx, query, nodes, - 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) { n.Edges.APIKeys = []*APIKey{} }, + func(n *Group, e *APIKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil { return nil, err } } @@ -711,7 +711,7 @@ func (_q *GroupQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Group, 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)) nodeids := make(map[int64]*Group) for i := range nodes { @@ -724,7 +724,7 @@ func (_q *GroupQuery) loadAPIKeys(ctx context.Context, query *ApiKeyQuery, nodes if len(query.ctx.Fields) > 0 { 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...)) })) neighbors, err := query.All(ctx) diff --git a/backend/ent/group_update.go b/backend/ent/group_update.go index 1825a892..43dcf319 100644 --- a/backend/ent/group_update.go +++ b/backend/ent/group_update.go @@ -273,14 +273,14 @@ func (_u *GroupUpdate) AddDefaultValidityDays(v int) *GroupUpdate { 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 { _u.mutation.AddAPIKeyIDs(ids...) return _u } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_u *GroupUpdate) AddAPIKeys(v ...*ApiKey) *GroupUpdate { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_u *GroupUpdate) AddAPIKeys(v ...*APIKey) *GroupUpdate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -368,20 +368,20 @@ func (_u *GroupUpdate) Mutation() *GroupMutation { 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 { _u.mutation.ClearAPIKeys() 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 { _u.mutation.RemoveAPIKeyIDs(ids...) return _u } -// RemoveAPIKeys removes "api_keys" edges to ApiKey entities. -func (_u *GroupUpdate) RemoveAPIKeys(v ...*ApiKey) *GroupUpdate { +// RemoveAPIKeys removes "api_keys" edges to APIKey entities. +func (_u *GroupUpdate) RemoveAPIKeys(v ...*APIKey) *GroupUpdate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -1195,14 +1195,14 @@ func (_u *GroupUpdateOne) AddDefaultValidityDays(v int) *GroupUpdateOne { 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 { _u.mutation.AddAPIKeyIDs(ids...) return _u } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_u *GroupUpdateOne) AddAPIKeys(v ...*ApiKey) *GroupUpdateOne { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_u *GroupUpdateOne) AddAPIKeys(v ...*APIKey) *GroupUpdateOne { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -1290,20 +1290,20 @@ func (_u *GroupUpdateOne) Mutation() *GroupMutation { 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 { _u.mutation.ClearAPIKeys() 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 { _u.mutation.RemoveAPIKeyIDs(ids...) return _u } -// RemoveAPIKeys removes "api_keys" edges to ApiKey entities. -func (_u *GroupUpdateOne) RemoveAPIKeys(v ...*ApiKey) *GroupUpdateOne { +// RemoveAPIKeys removes "api_keys" edges to APIKey entities. +func (_u *GroupUpdateOne) RemoveAPIKeys(v ...*APIKey) *GroupUpdateOne { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID diff --git a/backend/ent/hook/hook.go b/backend/ent/hook/hook.go index 3aa5d186..e82b00f9 100644 --- a/backend/ent/hook/hook.go +++ b/backend/ent/hook/hook.go @@ -9,6 +9,18 @@ import ( "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 // function as Account mutator. type AccountFunc func(context.Context, *ent.AccountMutation) (ent.Value, error) @@ -33,18 +45,6 @@ func (f AccountGroupFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value 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 // function as Group mutator. type GroupFunc func(context.Context, *ent.GroupMutation) (ent.Value, error) diff --git a/backend/ent/intercept/intercept.go b/backend/ent/intercept/intercept.go index 9f694d67..6add6fed 100644 --- a/backend/ent/intercept/intercept.go +++ b/backend/ent/intercept/intercept.go @@ -80,6 +80,33 @@ func (f TraverseFunc) Traverse(ctx context.Context, q ent.Query) error { 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. type AccountFunc func(context.Context, *ent.AccountQuery) (ent.Value, error) @@ -134,33 +161,6 @@ func (f TraverseAccountGroup) Traverse(ctx context.Context, q ent.Query) error { 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. 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. func NewQuery(q ent.Query) (Query, error) { switch q := q.(type) { + case *ent.APIKeyQuery: + return &query[*ent.APIKeyQuery, predicate.APIKey, apikey.OrderOption]{typ: ent.TypeAPIKey, tq: q}, nil case *ent.AccountQuery: return &query[*ent.AccountQuery, predicate.Account, account.OrderOption]{typ: ent.TypeAccount, tq: q}, nil case *ent.AccountGroupQuery: 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: return &query[*ent.GroupQuery, predicate.Group, group.OrderOption]{typ: ent.TypeGroup, tq: q}, nil case *ent.ProxyQuery: diff --git a/backend/ent/migrate/schema.go b/backend/ent/migrate/schema.go index d532b34b..b85630ea 100644 --- a/backend/ent/migrate/schema.go +++ b/backend/ent/migrate/schema.go @@ -9,6 +9,60 @@ import ( ) 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 = []*schema.Column{ {Name: "id", Type: field.TypeInt64, Increment: true}, @@ -144,60 +198,6 @@ 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 = []*schema.Column{ {Name: "id", Type: field.TypeInt64, Increment: true}, @@ -368,8 +368,8 @@ var ( {Name: "duration_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: "account_id", Type: field.TypeInt64}, {Name: "api_key_id", Type: field.TypeInt64}, + {Name: "account_id", Type: field.TypeInt64}, {Name: "group_id", Type: field.TypeInt64, Nullable: true}, {Name: "user_id", Type: field.TypeInt64}, {Name: "subscription_id", Type: field.TypeInt64, Nullable: true}, @@ -381,15 +381,15 @@ var ( PrimaryKey: []*schema.Column{UsageLogsColumns[0]}, ForeignKeys: []*schema.ForeignKey{ { - Symbol: "usage_logs_accounts_usage_logs", + Symbol: "usage_logs_api_keys_usage_logs", Columns: []*schema.Column{UsageLogsColumns[21]}, - RefColumns: []*schema.Column{AccountsColumns[0]}, + RefColumns: []*schema.Column{APIKeysColumns[0]}, OnDelete: schema.NoAction, }, { - Symbol: "usage_logs_api_keys_usage_logs", + Symbol: "usage_logs_accounts_usage_logs", Columns: []*schema.Column{UsageLogsColumns[22]}, - RefColumns: []*schema.Column{APIKeysColumns[0]}, + RefColumns: []*schema.Column{AccountsColumns[0]}, OnDelete: schema.NoAction, }, { @@ -420,12 +420,12 @@ var ( { Name: "usagelog_api_key_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[22]}, + Columns: []*schema.Column{UsageLogsColumns[21]}, }, { Name: "usagelog_account_id", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[21]}, + Columns: []*schema.Column{UsageLogsColumns[22]}, }, { Name: "usagelog_group_id", @@ -460,7 +460,7 @@ var ( { Name: "usagelog_api_key_id_created_at", Unique: false, - Columns: []*schema.Column{UsageLogsColumns[22], UsageLogsColumns[20]}, + Columns: []*schema.Column{UsageLogsColumns[21], UsageLogsColumns[20]}, }, }, } @@ -702,9 +702,9 @@ var ( } // Tables holds all the tables in the schema. Tables = []*schema.Table{ + APIKeysTable, AccountsTable, AccountGroupsTable, - APIKeysTable, GroupsTable, ProxiesTable, RedeemCodesTable, @@ -719,6 +719,11 @@ var ( ) 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.Annotation = &entsql.Annotation{ Table: "accounts", @@ -728,11 +733,6 @@ func init() { AccountGroupsTable.Annotation = &entsql.Annotation{ Table: "account_groups", } - APIKeysTable.ForeignKeys[0].RefTable = GroupsTable - APIKeysTable.ForeignKeys[1].RefTable = UsersTable - APIKeysTable.Annotation = &entsql.Annotation{ - Table: "api_keys", - } GroupsTable.Annotation = &entsql.Annotation{ Table: "groups", } @@ -747,8 +747,8 @@ func init() { SettingsTable.Annotation = &entsql.Annotation{ Table: "settings", } - UsageLogsTable.ForeignKeys[0].RefTable = AccountsTable - UsageLogsTable.ForeignKeys[1].RefTable = APIKeysTable + UsageLogsTable.ForeignKeys[0].RefTable = APIKeysTable + UsageLogsTable.ForeignKeys[1].RefTable = AccountsTable UsageLogsTable.ForeignKeys[2].RefTable = GroupsTable UsageLogsTable.ForeignKeys[3].RefTable = UsersTable UsageLogsTable.ForeignKeys[4].RefTable = UserSubscriptionsTable diff --git a/backend/ent/mutation.go b/backend/ent/mutation.go index 7d5fd2ad..6a64b16c 100644 --- a/backend/ent/mutation.go +++ b/backend/ent/mutation.go @@ -36,9 +36,9 @@ const ( OpUpdateOne = ent.OpUpdateOne // Node types. + TypeAPIKey = "APIKey" TypeAccount = "Account" TypeAccountGroup = "AccountGroup" - TypeApiKey = "ApiKey" TypeGroup = "Group" TypeProxy = "Proxy" TypeRedeemCode = "RedeemCode" @@ -51,6 +51,939 @@ const ( TypeUserSubscription = "UserSubscription" ) +// APIKeyMutation represents an operation that mutates the APIKey nodes in the graph. +type APIKeyMutation struct { + config + op Op + typ string + id *int64 + created_at *time.Time + updated_at *time.Time + deleted_at *time.Time + key *string + name *string + status *string + clearedFields map[string]struct{} + user *int64 + cleareduser bool + group *int64 + clearedgroup bool + usage_logs map[int64]struct{} + removedusage_logs map[int64]struct{} + clearedusage_logs bool + done bool + oldValue func(context.Context) (*APIKey, error) + predicates []predicate.APIKey +} + +var _ ent.Mutation = (*APIKeyMutation)(nil) + +// apikeyOption allows management of the mutation configuration using functional options. +type apikeyOption func(*APIKeyMutation) + +// newAPIKeyMutation creates new mutation for the APIKey entity. +func newAPIKeyMutation(c config, op Op, opts ...apikeyOption) *APIKeyMutation { + m := &APIKeyMutation{ + config: c, + op: op, + typ: TypeAPIKey, + clearedFields: make(map[string]struct{}), + } + for _, opt := range opts { + opt(m) + } + return m +} + +// withAPIKeyID sets the ID field of the mutation. +func withAPIKeyID(id int64) apikeyOption { + return func(m *APIKeyMutation) { + var ( + err error + once sync.Once + value *APIKey + ) + m.oldValue = func(ctx context.Context) (*APIKey, error) { + once.Do(func() { + if m.done { + err = errors.New("querying old values post mutation is not allowed") + } else { + value, err = m.Client().APIKey.Get(ctx, id) + } + }) + return value, err + } + m.id = &id + } +} + +// withAPIKey sets the old APIKey of the mutation. +func withAPIKey(node *APIKey) apikeyOption { + return func(m *APIKeyMutation) { + m.oldValue = func(context.Context) (*APIKey, error) { + return node, nil + } + m.id = &node.ID + } +} + +// Client returns a new `ent.Client` from the mutation. If the mutation was +// executed in a transaction (ent.Tx), a transactional client is returned. +func (m APIKeyMutation) Client() *Client { + client := &Client{config: m.config} + client.init() + return client +} + +// Tx returns an `ent.Tx` for mutations that were executed in transactions; +// it returns an error otherwise. +func (m APIKeyMutation) Tx() (*Tx, error) { + if _, ok := m.driver.(*txDriver); !ok { + return nil, errors.New("ent: mutation is not running in a transaction") + } + tx := &Tx{config: m.config} + tx.init() + return tx, nil +} + +// ID returns the ID value in the mutation. Note that the ID is only available +// if it was provided to the builder or after it was returned from the database. +func (m *APIKeyMutation) ID() (id int64, exists bool) { + if m.id == nil { + return + } + return *m.id, true +} + +// IDs queries the database and returns the entity ids that match the mutation's predicate. +// That means, if the mutation is applied within a transaction with an isolation level such +// as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated +// or updated by the mutation. +func (m *APIKeyMutation) IDs(ctx context.Context) ([]int64, error) { + switch { + case m.op.Is(OpUpdateOne | OpDeleteOne): + id, exists := m.ID() + if exists { + return []int64{id}, nil + } + fallthrough + case m.op.Is(OpUpdate | OpDelete): + return m.Client().APIKey.Query().Where(m.predicates...).IDs(ctx) + default: + return nil, fmt.Errorf("IDs is not allowed on %s operations", m.op) + } +} + +// SetCreatedAt sets the "created_at" field. +func (m *APIKeyMutation) SetCreatedAt(t time.Time) { + m.created_at = &t +} + +// CreatedAt returns the value of the "created_at" field in the mutation. +func (m *APIKeyMutation) CreatedAt() (r time.Time, exists bool) { + v := m.created_at + if v == nil { + return + } + return *v, true +} + +// OldCreatedAt returns the old "created_at" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldCreatedAt(ctx context.Context) (v time.Time, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldCreatedAt is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldCreatedAt requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldCreatedAt: %w", err) + } + return oldValue.CreatedAt, nil +} + +// ResetCreatedAt resets all changes to the "created_at" field. +func (m *APIKeyMutation) ResetCreatedAt() { + m.created_at = nil +} + +// SetUpdatedAt sets the "updated_at" field. +func (m *APIKeyMutation) SetUpdatedAt(t time.Time) { + m.updated_at = &t +} + +// UpdatedAt returns the value of the "updated_at" field in the mutation. +func (m *APIKeyMutation) UpdatedAt() (r time.Time, exists bool) { + v := m.updated_at + if v == nil { + return + } + return *v, true +} + +// OldUpdatedAt returns the old "updated_at" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldUpdatedAt(ctx context.Context) (v time.Time, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldUpdatedAt is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldUpdatedAt requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldUpdatedAt: %w", err) + } + return oldValue.UpdatedAt, nil +} + +// ResetUpdatedAt resets all changes to the "updated_at" field. +func (m *APIKeyMutation) ResetUpdatedAt() { + m.updated_at = nil +} + +// SetDeletedAt sets the "deleted_at" field. +func (m *APIKeyMutation) SetDeletedAt(t time.Time) { + m.deleted_at = &t +} + +// DeletedAt returns the value of the "deleted_at" field in the mutation. +func (m *APIKeyMutation) DeletedAt() (r time.Time, exists bool) { + v := m.deleted_at + if v == nil { + return + } + return *v, true +} + +// OldDeletedAt returns the old "deleted_at" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldDeletedAt(ctx context.Context) (v *time.Time, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldDeletedAt is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldDeletedAt requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldDeletedAt: %w", err) + } + return oldValue.DeletedAt, nil +} + +// ClearDeletedAt clears the value of the "deleted_at" field. +func (m *APIKeyMutation) ClearDeletedAt() { + m.deleted_at = nil + m.clearedFields[apikey.FieldDeletedAt] = struct{}{} +} + +// DeletedAtCleared returns if the "deleted_at" field was cleared in this mutation. +func (m *APIKeyMutation) DeletedAtCleared() bool { + _, ok := m.clearedFields[apikey.FieldDeletedAt] + return ok +} + +// ResetDeletedAt resets all changes to the "deleted_at" field. +func (m *APIKeyMutation) ResetDeletedAt() { + m.deleted_at = nil + delete(m.clearedFields, apikey.FieldDeletedAt) +} + +// SetUserID sets the "user_id" field. +func (m *APIKeyMutation) SetUserID(i int64) { + m.user = &i +} + +// UserID returns the value of the "user_id" field in the mutation. +func (m *APIKeyMutation) UserID() (r int64, exists bool) { + v := m.user + if v == nil { + return + } + return *v, true +} + +// OldUserID returns the old "user_id" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldUserID(ctx context.Context) (v int64, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldUserID is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldUserID requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldUserID: %w", err) + } + return oldValue.UserID, nil +} + +// ResetUserID resets all changes to the "user_id" field. +func (m *APIKeyMutation) ResetUserID() { + m.user = nil +} + +// SetKey sets the "key" field. +func (m *APIKeyMutation) SetKey(s string) { + m.key = &s +} + +// Key returns the value of the "key" field in the mutation. +func (m *APIKeyMutation) Key() (r string, exists bool) { + v := m.key + if v == nil { + return + } + return *v, true +} + +// OldKey returns the old "key" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldKey(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldKey is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldKey requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldKey: %w", err) + } + return oldValue.Key, nil +} + +// ResetKey resets all changes to the "key" field. +func (m *APIKeyMutation) ResetKey() { + m.key = nil +} + +// SetName sets the "name" field. +func (m *APIKeyMutation) SetName(s string) { + m.name = &s +} + +// Name returns the value of the "name" field in the mutation. +func (m *APIKeyMutation) Name() (r string, exists bool) { + v := m.name + if v == nil { + return + } + return *v, true +} + +// OldName returns the old "name" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldName(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldName is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldName requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldName: %w", err) + } + return oldValue.Name, nil +} + +// ResetName resets all changes to the "name" field. +func (m *APIKeyMutation) ResetName() { + m.name = nil +} + +// SetGroupID sets the "group_id" field. +func (m *APIKeyMutation) SetGroupID(i int64) { + m.group = &i +} + +// GroupID returns the value of the "group_id" field in the mutation. +func (m *APIKeyMutation) GroupID() (r int64, exists bool) { + v := m.group + if v == nil { + return + } + return *v, true +} + +// OldGroupID returns the old "group_id" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldGroupID(ctx context.Context) (v *int64, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldGroupID is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldGroupID requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldGroupID: %w", err) + } + return oldValue.GroupID, nil +} + +// ClearGroupID clears the value of the "group_id" field. +func (m *APIKeyMutation) ClearGroupID() { + m.group = nil + m.clearedFields[apikey.FieldGroupID] = struct{}{} +} + +// GroupIDCleared returns if the "group_id" field was cleared in this mutation. +func (m *APIKeyMutation) GroupIDCleared() bool { + _, ok := m.clearedFields[apikey.FieldGroupID] + return ok +} + +// ResetGroupID resets all changes to the "group_id" field. +func (m *APIKeyMutation) ResetGroupID() { + m.group = nil + delete(m.clearedFields, apikey.FieldGroupID) +} + +// SetStatus sets the "status" field. +func (m *APIKeyMutation) SetStatus(s string) { + m.status = &s +} + +// Status returns the value of the "status" field in the mutation. +func (m *APIKeyMutation) Status() (r string, exists bool) { + v := m.status + if v == nil { + return + } + return *v, true +} + +// OldStatus returns the old "status" field's value of the APIKey entity. +// If the APIKey object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *APIKeyMutation) OldStatus(ctx context.Context) (v string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldStatus is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldStatus requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldStatus: %w", err) + } + return oldValue.Status, nil +} + +// ResetStatus resets all changes to the "status" field. +func (m *APIKeyMutation) ResetStatus() { + m.status = nil +} + +// ClearUser clears the "user" edge to the User entity. +func (m *APIKeyMutation) ClearUser() { + m.cleareduser = true + m.clearedFields[apikey.FieldUserID] = struct{}{} +} + +// UserCleared reports if the "user" edge to the User entity was cleared. +func (m *APIKeyMutation) UserCleared() bool { + return m.cleareduser +} + +// UserIDs returns the "user" edge IDs in the mutation. +// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use +// UserID instead. It exists only for internal usage by the builders. +func (m *APIKeyMutation) UserIDs() (ids []int64) { + if id := m.user; id != nil { + ids = append(ids, *id) + } + return +} + +// ResetUser resets all changes to the "user" edge. +func (m *APIKeyMutation) ResetUser() { + m.user = nil + m.cleareduser = false +} + +// ClearGroup clears the "group" edge to the Group entity. +func (m *APIKeyMutation) ClearGroup() { + m.clearedgroup = true + m.clearedFields[apikey.FieldGroupID] = struct{}{} +} + +// GroupCleared reports if the "group" edge to the Group entity was cleared. +func (m *APIKeyMutation) GroupCleared() bool { + return m.GroupIDCleared() || m.clearedgroup +} + +// GroupIDs returns the "group" edge IDs in the mutation. +// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use +// GroupID instead. It exists only for internal usage by the builders. +func (m *APIKeyMutation) GroupIDs() (ids []int64) { + if id := m.group; id != nil { + ids = append(ids, *id) + } + return +} + +// ResetGroup resets all changes to the "group" edge. +func (m *APIKeyMutation) ResetGroup() { + m.group = nil + m.clearedgroup = false +} + +// AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by ids. +func (m *APIKeyMutation) AddUsageLogIDs(ids ...int64) { + if m.usage_logs == nil { + m.usage_logs = make(map[int64]struct{}) + } + for i := range ids { + m.usage_logs[ids[i]] = struct{}{} + } +} + +// ClearUsageLogs clears the "usage_logs" edge to the UsageLog entity. +func (m *APIKeyMutation) ClearUsageLogs() { + m.clearedusage_logs = true +} + +// UsageLogsCleared reports if the "usage_logs" edge to the UsageLog entity was cleared. +func (m *APIKeyMutation) UsageLogsCleared() bool { + return m.clearedusage_logs +} + +// RemoveUsageLogIDs removes the "usage_logs" edge to the UsageLog entity by IDs. +func (m *APIKeyMutation) RemoveUsageLogIDs(ids ...int64) { + if m.removedusage_logs == nil { + m.removedusage_logs = make(map[int64]struct{}) + } + for i := range ids { + delete(m.usage_logs, ids[i]) + m.removedusage_logs[ids[i]] = struct{}{} + } +} + +// RemovedUsageLogs returns the removed IDs of the "usage_logs" edge to the UsageLog entity. +func (m *APIKeyMutation) RemovedUsageLogsIDs() (ids []int64) { + for id := range m.removedusage_logs { + ids = append(ids, id) + } + return +} + +// UsageLogsIDs returns the "usage_logs" edge IDs in the mutation. +func (m *APIKeyMutation) UsageLogsIDs() (ids []int64) { + for id := range m.usage_logs { + ids = append(ids, id) + } + return +} + +// ResetUsageLogs resets all changes to the "usage_logs" edge. +func (m *APIKeyMutation) ResetUsageLogs() { + m.usage_logs = nil + m.clearedusage_logs = false + m.removedusage_logs = nil +} + +// Where appends a list predicates to the APIKeyMutation builder. +func (m *APIKeyMutation) Where(ps ...predicate.APIKey) { + m.predicates = append(m.predicates, ps...) +} + +// WhereP appends storage-level predicates to the APIKeyMutation builder. Using this method, +// users can use type-assertion to append predicates that do not depend on any generated package. +func (m *APIKeyMutation) WhereP(ps ...func(*sql.Selector)) { + p := make([]predicate.APIKey, len(ps)) + for i := range ps { + p[i] = ps[i] + } + m.Where(p...) +} + +// Op returns the operation name. +func (m *APIKeyMutation) Op() Op { + return m.op +} + +// SetOp allows setting the mutation operation. +func (m *APIKeyMutation) SetOp(op Op) { + m.op = op +} + +// Type returns the node type of this mutation (APIKey). +func (m *APIKeyMutation) Type() string { + return m.typ +} + +// Fields returns all fields that were changed during this mutation. Note that in +// order to get all numeric fields that were incremented/decremented, call +// AddedFields(). +func (m *APIKeyMutation) Fields() []string { + fields := make([]string, 0, 8) + if m.created_at != nil { + fields = append(fields, apikey.FieldCreatedAt) + } + if m.updated_at != nil { + fields = append(fields, apikey.FieldUpdatedAt) + } + if m.deleted_at != nil { + fields = append(fields, apikey.FieldDeletedAt) + } + if m.user != nil { + fields = append(fields, apikey.FieldUserID) + } + if m.key != nil { + fields = append(fields, apikey.FieldKey) + } + if m.name != nil { + fields = append(fields, apikey.FieldName) + } + if m.group != nil { + fields = append(fields, apikey.FieldGroupID) + } + if m.status != nil { + fields = append(fields, apikey.FieldStatus) + } + return fields +} + +// Field returns the value of a field with the given name. The second boolean +// return value indicates that this field was not set, or was not defined in the +// schema. +func (m *APIKeyMutation) Field(name string) (ent.Value, bool) { + switch name { + case apikey.FieldCreatedAt: + return m.CreatedAt() + case apikey.FieldUpdatedAt: + return m.UpdatedAt() + case apikey.FieldDeletedAt: + return m.DeletedAt() + case apikey.FieldUserID: + return m.UserID() + case apikey.FieldKey: + return m.Key() + case apikey.FieldName: + return m.Name() + case apikey.FieldGroupID: + return m.GroupID() + case apikey.FieldStatus: + return m.Status() + } + return nil, false +} + +// OldField returns the old value of the field from the database. An error is +// returned if the mutation operation is not UpdateOne, or the query to the +// database failed. +func (m *APIKeyMutation) OldField(ctx context.Context, name string) (ent.Value, error) { + switch name { + case apikey.FieldCreatedAt: + return m.OldCreatedAt(ctx) + case apikey.FieldUpdatedAt: + return m.OldUpdatedAt(ctx) + case apikey.FieldDeletedAt: + return m.OldDeletedAt(ctx) + case apikey.FieldUserID: + return m.OldUserID(ctx) + case apikey.FieldKey: + return m.OldKey(ctx) + case apikey.FieldName: + return m.OldName(ctx) + case apikey.FieldGroupID: + return m.OldGroupID(ctx) + case apikey.FieldStatus: + return m.OldStatus(ctx) + } + return nil, fmt.Errorf("unknown APIKey field %s", name) +} + +// SetField sets the value of a field with the given name. It returns an error if +// the field is not defined in the schema, or if the type mismatched the field +// type. +func (m *APIKeyMutation) SetField(name string, value ent.Value) error { + switch name { + case apikey.FieldCreatedAt: + v, ok := value.(time.Time) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetCreatedAt(v) + return nil + case apikey.FieldUpdatedAt: + v, ok := value.(time.Time) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetUpdatedAt(v) + return nil + case apikey.FieldDeletedAt: + v, ok := value.(time.Time) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetDeletedAt(v) + return nil + case apikey.FieldUserID: + v, ok := value.(int64) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetUserID(v) + return nil + case apikey.FieldKey: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetKey(v) + return nil + case apikey.FieldName: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetName(v) + return nil + case apikey.FieldGroupID: + v, ok := value.(int64) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetGroupID(v) + return nil + case apikey.FieldStatus: + v, ok := value.(string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetStatus(v) + return nil + } + return fmt.Errorf("unknown APIKey field %s", name) +} + +// AddedFields returns all numeric fields that were incremented/decremented during +// this mutation. +func (m *APIKeyMutation) AddedFields() []string { + var fields []string + return fields +} + +// AddedField returns the numeric value that was incremented/decremented on a field +// with the given name. The second boolean return value indicates that this field +// was not set, or was not defined in the schema. +func (m *APIKeyMutation) AddedField(name string) (ent.Value, bool) { + switch name { + } + return nil, false +} + +// AddField adds the value to the field with the given name. It returns an error if +// the field is not defined in the schema, or if the type mismatched the field +// type. +func (m *APIKeyMutation) AddField(name string, value ent.Value) error { + switch name { + } + return fmt.Errorf("unknown APIKey numeric field %s", name) +} + +// ClearedFields returns all nullable fields that were cleared during this +// mutation. +func (m *APIKeyMutation) ClearedFields() []string { + var fields []string + if m.FieldCleared(apikey.FieldDeletedAt) { + fields = append(fields, apikey.FieldDeletedAt) + } + if m.FieldCleared(apikey.FieldGroupID) { + fields = append(fields, apikey.FieldGroupID) + } + return fields +} + +// FieldCleared returns a boolean indicating if a field with the given name was +// cleared in this mutation. +func (m *APIKeyMutation) FieldCleared(name string) bool { + _, ok := m.clearedFields[name] + return ok +} + +// ClearField clears the value of the field with the given name. It returns an +// error if the field is not defined in the schema. +func (m *APIKeyMutation) ClearField(name string) error { + switch name { + case apikey.FieldDeletedAt: + m.ClearDeletedAt() + return nil + case apikey.FieldGroupID: + m.ClearGroupID() + return nil + } + return fmt.Errorf("unknown APIKey nullable field %s", name) +} + +// ResetField resets all changes in the mutation for the field with the given name. +// It returns an error if the field is not defined in the schema. +func (m *APIKeyMutation) ResetField(name string) error { + switch name { + case apikey.FieldCreatedAt: + m.ResetCreatedAt() + return nil + case apikey.FieldUpdatedAt: + m.ResetUpdatedAt() + return nil + case apikey.FieldDeletedAt: + m.ResetDeletedAt() + return nil + case apikey.FieldUserID: + m.ResetUserID() + return nil + case apikey.FieldKey: + m.ResetKey() + return nil + case apikey.FieldName: + m.ResetName() + return nil + case apikey.FieldGroupID: + m.ResetGroupID() + return nil + case apikey.FieldStatus: + m.ResetStatus() + return nil + } + return fmt.Errorf("unknown APIKey field %s", name) +} + +// AddedEdges returns all edge names that were set/added in this mutation. +func (m *APIKeyMutation) AddedEdges() []string { + edges := make([]string, 0, 3) + if m.user != nil { + edges = append(edges, apikey.EdgeUser) + } + if m.group != nil { + edges = append(edges, apikey.EdgeGroup) + } + if m.usage_logs != nil { + edges = append(edges, apikey.EdgeUsageLogs) + } + return edges +} + +// AddedIDs returns all IDs (to other nodes) that were added for the given edge +// name in this mutation. +func (m *APIKeyMutation) AddedIDs(name string) []ent.Value { + switch name { + case apikey.EdgeUser: + if id := m.user; id != nil { + return []ent.Value{*id} + } + case apikey.EdgeGroup: + if id := m.group; id != nil { + return []ent.Value{*id} + } + case apikey.EdgeUsageLogs: + ids := make([]ent.Value, 0, len(m.usage_logs)) + for id := range m.usage_logs { + ids = append(ids, id) + } + return ids + } + return nil +} + +// RemovedEdges returns all edge names that were removed in this mutation. +func (m *APIKeyMutation) RemovedEdges() []string { + edges := make([]string, 0, 3) + if m.removedusage_logs != nil { + edges = append(edges, apikey.EdgeUsageLogs) + } + return edges +} + +// RemovedIDs returns all IDs (to other nodes) that were removed for the edge with +// the given name in this mutation. +func (m *APIKeyMutation) RemovedIDs(name string) []ent.Value { + switch name { + case apikey.EdgeUsageLogs: + ids := make([]ent.Value, 0, len(m.removedusage_logs)) + for id := range m.removedusage_logs { + ids = append(ids, id) + } + return ids + } + return nil +} + +// ClearedEdges returns all edge names that were cleared in this mutation. +func (m *APIKeyMutation) ClearedEdges() []string { + edges := make([]string, 0, 3) + if m.cleareduser { + edges = append(edges, apikey.EdgeUser) + } + if m.clearedgroup { + edges = append(edges, apikey.EdgeGroup) + } + if m.clearedusage_logs { + edges = append(edges, apikey.EdgeUsageLogs) + } + return edges +} + +// EdgeCleared returns a boolean which indicates if the edge with the given name +// was cleared in this mutation. +func (m *APIKeyMutation) EdgeCleared(name string) bool { + switch name { + case apikey.EdgeUser: + return m.cleareduser + case apikey.EdgeGroup: + return m.clearedgroup + case apikey.EdgeUsageLogs: + return m.clearedusage_logs + } + return false +} + +// ClearEdge clears the value of the edge with the given name. It returns an error +// if that edge is not defined in the schema. +func (m *APIKeyMutation) ClearEdge(name string) error { + switch name { + case apikey.EdgeUser: + m.ClearUser() + return nil + case apikey.EdgeGroup: + m.ClearGroup() + return nil + } + return fmt.Errorf("unknown APIKey unique edge %s", name) +} + +// ResetEdge resets all changes to the edge with the given name in this mutation. +// It returns an error if the edge is not defined in the schema. +func (m *APIKeyMutation) ResetEdge(name string) error { + switch name { + case apikey.EdgeUser: + m.ResetUser() + return nil + case apikey.EdgeGroup: + m.ResetGroup() + return nil + case apikey.EdgeUsageLogs: + m.ResetUsageLogs() + return nil + } + return fmt.Errorf("unknown APIKey edge %s", name) +} + // AccountMutation represents an operation that mutates the Account nodes in the graph. type AccountMutation struct { config @@ -2426,939 +3359,6 @@ func (m *AccountGroupMutation) ResetEdge(name string) error { return fmt.Errorf("unknown AccountGroup edge %s", name) } -// ApiKeyMutation represents an operation that mutates the ApiKey nodes in the graph. -type ApiKeyMutation struct { - config - op Op - typ string - id *int64 - created_at *time.Time - updated_at *time.Time - deleted_at *time.Time - key *string - name *string - status *string - clearedFields map[string]struct{} - user *int64 - cleareduser bool - group *int64 - clearedgroup bool - usage_logs map[int64]struct{} - removedusage_logs map[int64]struct{} - clearedusage_logs bool - done bool - oldValue func(context.Context) (*ApiKey, error) - predicates []predicate.ApiKey -} - -var _ ent.Mutation = (*ApiKeyMutation)(nil) - -// apikeyOption allows management of the mutation configuration using functional options. -type apikeyOption func(*ApiKeyMutation) - -// newApiKeyMutation creates new mutation for the ApiKey entity. -func newApiKeyMutation(c config, op Op, opts ...apikeyOption) *ApiKeyMutation { - m := &ApiKeyMutation{ - config: c, - op: op, - typ: TypeApiKey, - clearedFields: make(map[string]struct{}), - } - for _, opt := range opts { - opt(m) - } - return m -} - -// withApiKeyID sets the ID field of the mutation. -func withApiKeyID(id int64) apikeyOption { - return func(m *ApiKeyMutation) { - var ( - err error - once sync.Once - value *ApiKey - ) - m.oldValue = func(ctx context.Context) (*ApiKey, error) { - once.Do(func() { - if m.done { - err = errors.New("querying old values post mutation is not allowed") - } else { - value, err = m.Client().ApiKey.Get(ctx, id) - } - }) - return value, err - } - m.id = &id - } -} - -// withApiKey sets the old ApiKey of the mutation. -func withApiKey(node *ApiKey) apikeyOption { - return func(m *ApiKeyMutation) { - m.oldValue = func(context.Context) (*ApiKey, error) { - return node, nil - } - m.id = &node.ID - } -} - -// Client returns a new `ent.Client` from the mutation. If the mutation was -// executed in a transaction (ent.Tx), a transactional client is returned. -func (m ApiKeyMutation) Client() *Client { - client := &Client{config: m.config} - client.init() - return client -} - -// Tx returns an `ent.Tx` for mutations that were executed in transactions; -// it returns an error otherwise. -func (m ApiKeyMutation) Tx() (*Tx, error) { - if _, ok := m.driver.(*txDriver); !ok { - return nil, errors.New("ent: mutation is not running in a transaction") - } - tx := &Tx{config: m.config} - tx.init() - return tx, nil -} - -// ID returns the ID value in the mutation. Note that the ID is only available -// if it was provided to the builder or after it was returned from the database. -func (m *ApiKeyMutation) ID() (id int64, exists bool) { - if m.id == nil { - return - } - return *m.id, true -} - -// IDs queries the database and returns the entity ids that match the mutation's predicate. -// That means, if the mutation is applied within a transaction with an isolation level such -// as sql.LevelSerializable, the returned ids match the ids of the rows that will be updated -// or updated by the mutation. -func (m *ApiKeyMutation) IDs(ctx context.Context) ([]int64, error) { - switch { - case m.op.Is(OpUpdateOne | OpDeleteOne): - id, exists := m.ID() - if exists { - return []int64{id}, nil - } - fallthrough - case m.op.Is(OpUpdate | OpDelete): - return m.Client().ApiKey.Query().Where(m.predicates...).IDs(ctx) - default: - return nil, fmt.Errorf("IDs is not allowed on %s operations", m.op) - } -} - -// SetCreatedAt sets the "created_at" field. -func (m *ApiKeyMutation) SetCreatedAt(t time.Time) { - m.created_at = &t -} - -// CreatedAt returns the value of the "created_at" field in the mutation. -func (m *ApiKeyMutation) CreatedAt() (r time.Time, exists bool) { - v := m.created_at - if v == nil { - return - } - return *v, true -} - -// OldCreatedAt returns the old "created_at" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldCreatedAt(ctx context.Context) (v time.Time, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldCreatedAt is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldCreatedAt requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldCreatedAt: %w", err) - } - return oldValue.CreatedAt, nil -} - -// ResetCreatedAt resets all changes to the "created_at" field. -func (m *ApiKeyMutation) ResetCreatedAt() { - m.created_at = nil -} - -// SetUpdatedAt sets the "updated_at" field. -func (m *ApiKeyMutation) SetUpdatedAt(t time.Time) { - m.updated_at = &t -} - -// UpdatedAt returns the value of the "updated_at" field in the mutation. -func (m *ApiKeyMutation) UpdatedAt() (r time.Time, exists bool) { - v := m.updated_at - if v == nil { - return - } - return *v, true -} - -// OldUpdatedAt returns the old "updated_at" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldUpdatedAt(ctx context.Context) (v time.Time, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldUpdatedAt is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldUpdatedAt requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldUpdatedAt: %w", err) - } - return oldValue.UpdatedAt, nil -} - -// ResetUpdatedAt resets all changes to the "updated_at" field. -func (m *ApiKeyMutation) ResetUpdatedAt() { - m.updated_at = nil -} - -// SetDeletedAt sets the "deleted_at" field. -func (m *ApiKeyMutation) SetDeletedAt(t time.Time) { - m.deleted_at = &t -} - -// DeletedAt returns the value of the "deleted_at" field in the mutation. -func (m *ApiKeyMutation) DeletedAt() (r time.Time, exists bool) { - v := m.deleted_at - if v == nil { - return - } - return *v, true -} - -// OldDeletedAt returns the old "deleted_at" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldDeletedAt(ctx context.Context) (v *time.Time, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldDeletedAt is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldDeletedAt requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldDeletedAt: %w", err) - } - return oldValue.DeletedAt, nil -} - -// ClearDeletedAt clears the value of the "deleted_at" field. -func (m *ApiKeyMutation) ClearDeletedAt() { - m.deleted_at = nil - m.clearedFields[apikey.FieldDeletedAt] = struct{}{} -} - -// DeletedAtCleared returns if the "deleted_at" field was cleared in this mutation. -func (m *ApiKeyMutation) DeletedAtCleared() bool { - _, ok := m.clearedFields[apikey.FieldDeletedAt] - return ok -} - -// ResetDeletedAt resets all changes to the "deleted_at" field. -func (m *ApiKeyMutation) ResetDeletedAt() { - m.deleted_at = nil - delete(m.clearedFields, apikey.FieldDeletedAt) -} - -// SetUserID sets the "user_id" field. -func (m *ApiKeyMutation) SetUserID(i int64) { - m.user = &i -} - -// UserID returns the value of the "user_id" field in the mutation. -func (m *ApiKeyMutation) UserID() (r int64, exists bool) { - v := m.user - if v == nil { - return - } - return *v, true -} - -// OldUserID returns the old "user_id" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldUserID(ctx context.Context) (v int64, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldUserID is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldUserID requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldUserID: %w", err) - } - return oldValue.UserID, nil -} - -// ResetUserID resets all changes to the "user_id" field. -func (m *ApiKeyMutation) ResetUserID() { - m.user = nil -} - -// SetKey sets the "key" field. -func (m *ApiKeyMutation) SetKey(s string) { - m.key = &s -} - -// Key returns the value of the "key" field in the mutation. -func (m *ApiKeyMutation) Key() (r string, exists bool) { - v := m.key - if v == nil { - return - } - return *v, true -} - -// OldKey returns the old "key" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldKey(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldKey is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldKey requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldKey: %w", err) - } - return oldValue.Key, nil -} - -// ResetKey resets all changes to the "key" field. -func (m *ApiKeyMutation) ResetKey() { - m.key = nil -} - -// SetName sets the "name" field. -func (m *ApiKeyMutation) SetName(s string) { - m.name = &s -} - -// Name returns the value of the "name" field in the mutation. -func (m *ApiKeyMutation) Name() (r string, exists bool) { - v := m.name - if v == nil { - return - } - return *v, true -} - -// OldName returns the old "name" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldName(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldName is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldName requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldName: %w", err) - } - return oldValue.Name, nil -} - -// ResetName resets all changes to the "name" field. -func (m *ApiKeyMutation) ResetName() { - m.name = nil -} - -// SetGroupID sets the "group_id" field. -func (m *ApiKeyMutation) SetGroupID(i int64) { - m.group = &i -} - -// GroupID returns the value of the "group_id" field in the mutation. -func (m *ApiKeyMutation) GroupID() (r int64, exists bool) { - v := m.group - if v == nil { - return - } - return *v, true -} - -// OldGroupID returns the old "group_id" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldGroupID(ctx context.Context) (v *int64, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldGroupID is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldGroupID requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldGroupID: %w", err) - } - return oldValue.GroupID, nil -} - -// ClearGroupID clears the value of the "group_id" field. -func (m *ApiKeyMutation) ClearGroupID() { - m.group = nil - m.clearedFields[apikey.FieldGroupID] = struct{}{} -} - -// GroupIDCleared returns if the "group_id" field was cleared in this mutation. -func (m *ApiKeyMutation) GroupIDCleared() bool { - _, ok := m.clearedFields[apikey.FieldGroupID] - return ok -} - -// ResetGroupID resets all changes to the "group_id" field. -func (m *ApiKeyMutation) ResetGroupID() { - m.group = nil - delete(m.clearedFields, apikey.FieldGroupID) -} - -// SetStatus sets the "status" field. -func (m *ApiKeyMutation) SetStatus(s string) { - m.status = &s -} - -// Status returns the value of the "status" field in the mutation. -func (m *ApiKeyMutation) Status() (r string, exists bool) { - v := m.status - if v == nil { - return - } - return *v, true -} - -// OldStatus returns the old "status" field's value of the ApiKey entity. -// If the ApiKey object wasn't provided to the builder, the object is fetched from the database. -// An error is returned if the mutation operation is not UpdateOne, or the database query fails. -func (m *ApiKeyMutation) OldStatus(ctx context.Context) (v string, err error) { - if !m.op.Is(OpUpdateOne) { - return v, errors.New("OldStatus is only allowed on UpdateOne operations") - } - if m.id == nil || m.oldValue == nil { - return v, errors.New("OldStatus requires an ID field in the mutation") - } - oldValue, err := m.oldValue(ctx) - if err != nil { - return v, fmt.Errorf("querying old value for OldStatus: %w", err) - } - return oldValue.Status, nil -} - -// ResetStatus resets all changes to the "status" field. -func (m *ApiKeyMutation) ResetStatus() { - m.status = nil -} - -// ClearUser clears the "user" edge to the User entity. -func (m *ApiKeyMutation) ClearUser() { - m.cleareduser = true - m.clearedFields[apikey.FieldUserID] = struct{}{} -} - -// UserCleared reports if the "user" edge to the User entity was cleared. -func (m *ApiKeyMutation) UserCleared() bool { - return m.cleareduser -} - -// UserIDs returns the "user" edge IDs in the mutation. -// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use -// UserID instead. It exists only for internal usage by the builders. -func (m *ApiKeyMutation) UserIDs() (ids []int64) { - if id := m.user; id != nil { - ids = append(ids, *id) - } - return -} - -// ResetUser resets all changes to the "user" edge. -func (m *ApiKeyMutation) ResetUser() { - m.user = nil - m.cleareduser = false -} - -// ClearGroup clears the "group" edge to the Group entity. -func (m *ApiKeyMutation) ClearGroup() { - m.clearedgroup = true - m.clearedFields[apikey.FieldGroupID] = struct{}{} -} - -// GroupCleared reports if the "group" edge to the Group entity was cleared. -func (m *ApiKeyMutation) GroupCleared() bool { - return m.GroupIDCleared() || m.clearedgroup -} - -// GroupIDs returns the "group" edge IDs in the mutation. -// Note that IDs always returns len(IDs) <= 1 for unique edges, and you should use -// GroupID instead. It exists only for internal usage by the builders. -func (m *ApiKeyMutation) GroupIDs() (ids []int64) { - if id := m.group; id != nil { - ids = append(ids, *id) - } - return -} - -// ResetGroup resets all changes to the "group" edge. -func (m *ApiKeyMutation) ResetGroup() { - m.group = nil - m.clearedgroup = false -} - -// AddUsageLogIDs adds the "usage_logs" edge to the UsageLog entity by ids. -func (m *ApiKeyMutation) AddUsageLogIDs(ids ...int64) { - if m.usage_logs == nil { - m.usage_logs = make(map[int64]struct{}) - } - for i := range ids { - m.usage_logs[ids[i]] = struct{}{} - } -} - -// ClearUsageLogs clears the "usage_logs" edge to the UsageLog entity. -func (m *ApiKeyMutation) ClearUsageLogs() { - m.clearedusage_logs = true -} - -// UsageLogsCleared reports if the "usage_logs" edge to the UsageLog entity was cleared. -func (m *ApiKeyMutation) UsageLogsCleared() bool { - return m.clearedusage_logs -} - -// RemoveUsageLogIDs removes the "usage_logs" edge to the UsageLog entity by IDs. -func (m *ApiKeyMutation) RemoveUsageLogIDs(ids ...int64) { - if m.removedusage_logs == nil { - m.removedusage_logs = make(map[int64]struct{}) - } - for i := range ids { - delete(m.usage_logs, ids[i]) - m.removedusage_logs[ids[i]] = struct{}{} - } -} - -// RemovedUsageLogs returns the removed IDs of the "usage_logs" edge to the UsageLog entity. -func (m *ApiKeyMutation) RemovedUsageLogsIDs() (ids []int64) { - for id := range m.removedusage_logs { - ids = append(ids, id) - } - return -} - -// UsageLogsIDs returns the "usage_logs" edge IDs in the mutation. -func (m *ApiKeyMutation) UsageLogsIDs() (ids []int64) { - for id := range m.usage_logs { - ids = append(ids, id) - } - return -} - -// ResetUsageLogs resets all changes to the "usage_logs" edge. -func (m *ApiKeyMutation) ResetUsageLogs() { - m.usage_logs = nil - m.clearedusage_logs = false - m.removedusage_logs = nil -} - -// Where appends a list predicates to the ApiKeyMutation builder. -func (m *ApiKeyMutation) Where(ps ...predicate.ApiKey) { - m.predicates = append(m.predicates, ps...) -} - -// WhereP appends storage-level predicates to the ApiKeyMutation builder. Using this method, -// users can use type-assertion to append predicates that do not depend on any generated package. -func (m *ApiKeyMutation) WhereP(ps ...func(*sql.Selector)) { - p := make([]predicate.ApiKey, len(ps)) - for i := range ps { - p[i] = ps[i] - } - m.Where(p...) -} - -// Op returns the operation name. -func (m *ApiKeyMutation) Op() Op { - return m.op -} - -// SetOp allows setting the mutation operation. -func (m *ApiKeyMutation) SetOp(op Op) { - m.op = op -} - -// Type returns the node type of this mutation (ApiKey). -func (m *ApiKeyMutation) Type() string { - return m.typ -} - -// Fields returns all fields that were changed during this mutation. Note that in -// order to get all numeric fields that were incremented/decremented, call -// AddedFields(). -func (m *ApiKeyMutation) Fields() []string { - fields := make([]string, 0, 8) - if m.created_at != nil { - fields = append(fields, apikey.FieldCreatedAt) - } - if m.updated_at != nil { - fields = append(fields, apikey.FieldUpdatedAt) - } - if m.deleted_at != nil { - fields = append(fields, apikey.FieldDeletedAt) - } - if m.user != nil { - fields = append(fields, apikey.FieldUserID) - } - if m.key != nil { - fields = append(fields, apikey.FieldKey) - } - if m.name != nil { - fields = append(fields, apikey.FieldName) - } - if m.group != nil { - fields = append(fields, apikey.FieldGroupID) - } - if m.status != nil { - fields = append(fields, apikey.FieldStatus) - } - return fields -} - -// Field returns the value of a field with the given name. The second boolean -// return value indicates that this field was not set, or was not defined in the -// schema. -func (m *ApiKeyMutation) Field(name string) (ent.Value, bool) { - switch name { - case apikey.FieldCreatedAt: - return m.CreatedAt() - case apikey.FieldUpdatedAt: - return m.UpdatedAt() - case apikey.FieldDeletedAt: - return m.DeletedAt() - case apikey.FieldUserID: - return m.UserID() - case apikey.FieldKey: - return m.Key() - case apikey.FieldName: - return m.Name() - case apikey.FieldGroupID: - return m.GroupID() - case apikey.FieldStatus: - return m.Status() - } - return nil, false -} - -// OldField returns the old value of the field from the database. An error is -// returned if the mutation operation is not UpdateOne, or the query to the -// database failed. -func (m *ApiKeyMutation) OldField(ctx context.Context, name string) (ent.Value, error) { - switch name { - case apikey.FieldCreatedAt: - return m.OldCreatedAt(ctx) - case apikey.FieldUpdatedAt: - return m.OldUpdatedAt(ctx) - case apikey.FieldDeletedAt: - return m.OldDeletedAt(ctx) - case apikey.FieldUserID: - return m.OldUserID(ctx) - case apikey.FieldKey: - return m.OldKey(ctx) - case apikey.FieldName: - return m.OldName(ctx) - case apikey.FieldGroupID: - return m.OldGroupID(ctx) - case apikey.FieldStatus: - return m.OldStatus(ctx) - } - return nil, fmt.Errorf("unknown ApiKey field %s", name) -} - -// SetField sets the value of a field with the given name. It returns an error if -// the field is not defined in the schema, or if the type mismatched the field -// type. -func (m *ApiKeyMutation) SetField(name string, value ent.Value) error { - switch name { - case apikey.FieldCreatedAt: - v, ok := value.(time.Time) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetCreatedAt(v) - return nil - case apikey.FieldUpdatedAt: - v, ok := value.(time.Time) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetUpdatedAt(v) - return nil - case apikey.FieldDeletedAt: - v, ok := value.(time.Time) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetDeletedAt(v) - return nil - case apikey.FieldUserID: - v, ok := value.(int64) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetUserID(v) - return nil - case apikey.FieldKey: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetKey(v) - return nil - case apikey.FieldName: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetName(v) - return nil - case apikey.FieldGroupID: - v, ok := value.(int64) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetGroupID(v) - return nil - case apikey.FieldStatus: - v, ok := value.(string) - if !ok { - return fmt.Errorf("unexpected type %T for field %s", value, name) - } - m.SetStatus(v) - return nil - } - return fmt.Errorf("unknown ApiKey field %s", name) -} - -// AddedFields returns all numeric fields that were incremented/decremented during -// this mutation. -func (m *ApiKeyMutation) AddedFields() []string { - var fields []string - return fields -} - -// AddedField returns the numeric value that was incremented/decremented on a field -// with the given name. The second boolean return value indicates that this field -// was not set, or was not defined in the schema. -func (m *ApiKeyMutation) AddedField(name string) (ent.Value, bool) { - switch name { - } - return nil, false -} - -// AddField adds the value to the field with the given name. It returns an error if -// the field is not defined in the schema, or if the type mismatched the field -// type. -func (m *ApiKeyMutation) AddField(name string, value ent.Value) error { - switch name { - } - return fmt.Errorf("unknown ApiKey numeric field %s", name) -} - -// ClearedFields returns all nullable fields that were cleared during this -// mutation. -func (m *ApiKeyMutation) ClearedFields() []string { - var fields []string - if m.FieldCleared(apikey.FieldDeletedAt) { - fields = append(fields, apikey.FieldDeletedAt) - } - if m.FieldCleared(apikey.FieldGroupID) { - fields = append(fields, apikey.FieldGroupID) - } - return fields -} - -// FieldCleared returns a boolean indicating if a field with the given name was -// cleared in this mutation. -func (m *ApiKeyMutation) FieldCleared(name string) bool { - _, ok := m.clearedFields[name] - return ok -} - -// ClearField clears the value of the field with the given name. It returns an -// error if the field is not defined in the schema. -func (m *ApiKeyMutation) ClearField(name string) error { - switch name { - case apikey.FieldDeletedAt: - m.ClearDeletedAt() - return nil - case apikey.FieldGroupID: - m.ClearGroupID() - return nil - } - return fmt.Errorf("unknown ApiKey nullable field %s", name) -} - -// ResetField resets all changes in the mutation for the field with the given name. -// It returns an error if the field is not defined in the schema. -func (m *ApiKeyMutation) ResetField(name string) error { - switch name { - case apikey.FieldCreatedAt: - m.ResetCreatedAt() - return nil - case apikey.FieldUpdatedAt: - m.ResetUpdatedAt() - return nil - case apikey.FieldDeletedAt: - m.ResetDeletedAt() - return nil - case apikey.FieldUserID: - m.ResetUserID() - return nil - case apikey.FieldKey: - m.ResetKey() - return nil - case apikey.FieldName: - m.ResetName() - return nil - case apikey.FieldGroupID: - m.ResetGroupID() - return nil - case apikey.FieldStatus: - m.ResetStatus() - return nil - } - return fmt.Errorf("unknown ApiKey field %s", name) -} - -// AddedEdges returns all edge names that were set/added in this mutation. -func (m *ApiKeyMutation) AddedEdges() []string { - edges := make([]string, 0, 3) - if m.user != nil { - edges = append(edges, apikey.EdgeUser) - } - if m.group != nil { - edges = append(edges, apikey.EdgeGroup) - } - if m.usage_logs != nil { - edges = append(edges, apikey.EdgeUsageLogs) - } - return edges -} - -// AddedIDs returns all IDs (to other nodes) that were added for the given edge -// name in this mutation. -func (m *ApiKeyMutation) AddedIDs(name string) []ent.Value { - switch name { - case apikey.EdgeUser: - if id := m.user; id != nil { - return []ent.Value{*id} - } - case apikey.EdgeGroup: - if id := m.group; id != nil { - return []ent.Value{*id} - } - case apikey.EdgeUsageLogs: - ids := make([]ent.Value, 0, len(m.usage_logs)) - for id := range m.usage_logs { - ids = append(ids, id) - } - return ids - } - return nil -} - -// RemovedEdges returns all edge names that were removed in this mutation. -func (m *ApiKeyMutation) RemovedEdges() []string { - edges := make([]string, 0, 3) - if m.removedusage_logs != nil { - edges = append(edges, apikey.EdgeUsageLogs) - } - return edges -} - -// RemovedIDs returns all IDs (to other nodes) that were removed for the edge with -// the given name in this mutation. -func (m *ApiKeyMutation) RemovedIDs(name string) []ent.Value { - switch name { - case apikey.EdgeUsageLogs: - ids := make([]ent.Value, 0, len(m.removedusage_logs)) - for id := range m.removedusage_logs { - ids = append(ids, id) - } - return ids - } - return nil -} - -// ClearedEdges returns all edge names that were cleared in this mutation. -func (m *ApiKeyMutation) ClearedEdges() []string { - edges := make([]string, 0, 3) - if m.cleareduser { - edges = append(edges, apikey.EdgeUser) - } - if m.clearedgroup { - edges = append(edges, apikey.EdgeGroup) - } - if m.clearedusage_logs { - edges = append(edges, apikey.EdgeUsageLogs) - } - return edges -} - -// EdgeCleared returns a boolean which indicates if the edge with the given name -// was cleared in this mutation. -func (m *ApiKeyMutation) EdgeCleared(name string) bool { - switch name { - case apikey.EdgeUser: - return m.cleareduser - case apikey.EdgeGroup: - return m.clearedgroup - case apikey.EdgeUsageLogs: - return m.clearedusage_logs - } - return false -} - -// ClearEdge clears the value of the edge with the given name. It returns an error -// if that edge is not defined in the schema. -func (m *ApiKeyMutation) ClearEdge(name string) error { - switch name { - case apikey.EdgeUser: - m.ClearUser() - return nil - case apikey.EdgeGroup: - m.ClearGroup() - return nil - } - return fmt.Errorf("unknown ApiKey unique edge %s", name) -} - -// ResetEdge resets all changes to the edge with the given name in this mutation. -// It returns an error if the edge is not defined in the schema. -func (m *ApiKeyMutation) ResetEdge(name string) error { - switch name { - case apikey.EdgeUser: - m.ResetUser() - return nil - case apikey.EdgeGroup: - m.ResetGroup() - return nil - case apikey.EdgeUsageLogs: - m.ResetUsageLogs() - return nil - } - return fmt.Errorf("unknown ApiKey edge %s", name) -} - // GroupMutation represents an operation that mutates the Group nodes in the graph. type GroupMutation struct { config @@ -4178,7 +4178,7 @@ func (m *GroupMutation) ResetDefaultValidityDays() { m.adddefault_validity_days = nil } -// 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 (m *GroupMutation) AddAPIKeyIDs(ids ...int64) { if m.api_keys == nil { m.api_keys = make(map[int64]struct{}) @@ -4188,17 +4188,17 @@ func (m *GroupMutation) AddAPIKeyIDs(ids ...int64) { } } -// ClearAPIKeys clears the "api_keys" edge to the ApiKey entity. +// ClearAPIKeys clears the "api_keys" edge to the APIKey entity. func (m *GroupMutation) ClearAPIKeys() { m.clearedapi_keys = true } -// APIKeysCleared reports if the "api_keys" edge to the ApiKey entity was cleared. +// APIKeysCleared reports if the "api_keys" edge to the APIKey entity was cleared. func (m *GroupMutation) APIKeysCleared() bool { return m.clearedapi_keys } -// RemoveAPIKeyIDs removes the "api_keys" edge to the ApiKey entity by IDs. +// RemoveAPIKeyIDs removes the "api_keys" edge to the APIKey entity by IDs. func (m *GroupMutation) RemoveAPIKeyIDs(ids ...int64) { if m.removedapi_keys == nil { m.removedapi_keys = make(map[int64]struct{}) @@ -4209,7 +4209,7 @@ func (m *GroupMutation) RemoveAPIKeyIDs(ids ...int64) { } } -// RemovedAPIKeys returns the removed IDs of the "api_keys" edge to the ApiKey entity. +// RemovedAPIKeys returns the removed IDs of the "api_keys" edge to the APIKey entity. func (m *GroupMutation) RemovedAPIKeysIDs() (ids []int64) { for id := range m.removedapi_keys { ids = append(ids, id) @@ -9129,13 +9129,13 @@ func (m *UsageLogMutation) ResetUser() { m.cleareduser = false } -// ClearAPIKey clears the "api_key" edge to the ApiKey entity. +// ClearAPIKey clears the "api_key" edge to the APIKey entity. func (m *UsageLogMutation) ClearAPIKey() { m.clearedapi_key = true m.clearedFields[usagelog.FieldAPIKeyID] = struct{}{} } -// APIKeyCleared reports if the "api_key" edge to the ApiKey entity was cleared. +// APIKeyCleared reports if the "api_key" edge to the APIKey entity was cleared. func (m *UsageLogMutation) APIKeyCleared() bool { return m.clearedapi_key } @@ -10737,7 +10737,7 @@ func (m *UserMutation) ResetNotes() { m.notes = nil } -// 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 (m *UserMutation) AddAPIKeyIDs(ids ...int64) { if m.api_keys == nil { m.api_keys = make(map[int64]struct{}) @@ -10747,17 +10747,17 @@ func (m *UserMutation) AddAPIKeyIDs(ids ...int64) { } } -// ClearAPIKeys clears the "api_keys" edge to the ApiKey entity. +// ClearAPIKeys clears the "api_keys" edge to the APIKey entity. func (m *UserMutation) ClearAPIKeys() { m.clearedapi_keys = true } -// APIKeysCleared reports if the "api_keys" edge to the ApiKey entity was cleared. +// APIKeysCleared reports if the "api_keys" edge to the APIKey entity was cleared. func (m *UserMutation) APIKeysCleared() bool { return m.clearedapi_keys } -// RemoveAPIKeyIDs removes the "api_keys" edge to the ApiKey entity by IDs. +// RemoveAPIKeyIDs removes the "api_keys" edge to the APIKey entity by IDs. func (m *UserMutation) RemoveAPIKeyIDs(ids ...int64) { if m.removedapi_keys == nil { m.removedapi_keys = make(map[int64]struct{}) @@ -10768,7 +10768,7 @@ func (m *UserMutation) RemoveAPIKeyIDs(ids ...int64) { } } -// RemovedAPIKeys returns the removed IDs of the "api_keys" edge to the ApiKey entity. +// RemovedAPIKeys returns the removed IDs of the "api_keys" edge to the APIKey entity. func (m *UserMutation) RemovedAPIKeysIDs() (ids []int64) { for id := range m.removedapi_keys { ids = append(ids, id) diff --git a/backend/ent/predicate/predicate.go b/backend/ent/predicate/predicate.go index ae1bf007..87c56902 100644 --- a/backend/ent/predicate/predicate.go +++ b/backend/ent/predicate/predicate.go @@ -6,15 +6,15 @@ import ( "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. type Account func(*sql.Selector) // AccountGroup is the predicate function for accountgroup builders. 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. type Group func(*sql.Selector) diff --git a/backend/ent/runtime/runtime.go b/backend/ent/runtime/runtime.go index 12c3e7e3..517e7195 100644 --- a/backend/ent/runtime/runtime.go +++ b/backend/ent/runtime/runtime.go @@ -25,6 +25,67 @@ import ( // (default values, validators, hooks and policies) and stitches it // to their package variables. 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() accountMixinHooks1 := accountMixin[1].Hooks() account.Hooks[0] = accountMixinHooks1[0] @@ -138,67 +199,6 @@ func init() { accountgroupDescCreatedAt := accountgroupFields[3].Descriptor() // accountgroup.DefaultCreatedAt holds the default value on creation for the created_at field. 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() groupMixinHooks1 := groupMixin[1].Hooks() group.Hooks[0] = groupMixinHooks1[0] diff --git a/backend/ent/schema/api_key.go b/backend/ent/schema/api_key.go index f9ece05e..94e572c5 100644 --- a/backend/ent/schema/api_key.go +++ b/backend/ent/schema/api_key.go @@ -12,25 +12,25 @@ import ( "entgo.io/ent/schema/index" ) -// ApiKey holds the schema definition for the ApiKey entity. -type ApiKey struct { +// APIKey holds the schema definition for the APIKey entity. +type APIKey struct { ent.Schema } -func (ApiKey) Annotations() []schema.Annotation { +func (APIKey) Annotations() []schema.Annotation { return []schema.Annotation{ entsql.Annotation{Table: "api_keys"}, } } -func (ApiKey) Mixin() []ent.Mixin { +func (APIKey) Mixin() []ent.Mixin { return []ent.Mixin{ mixins.TimeMixin{}, mixins.SoftDeleteMixin{}, } } -func (ApiKey) Fields() []ent.Field { +func (APIKey) Fields() []ent.Field { return []ent.Field{ field.Int64("user_id"), 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{ edge.From("user", User.Type). 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{ // key 字段已在 Fields() 中声明 Unique(),无需重复索引 index.Fields("user_id"), diff --git a/backend/ent/schema/group.go b/backend/ent/schema/group.go index 7a8a5345..93dab1ab 100644 --- a/backend/ent/schema/group.go +++ b/backend/ent/schema/group.go @@ -77,7 +77,7 @@ func (Group) Fields() []ent.Field { func (Group) Edges() []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("subscriptions", UserSubscription.Type), edge.To("usage_logs", UsageLog.Type), diff --git a/backend/ent/schema/usage_log.go b/backend/ent/schema/usage_log.go index 6f78e8a9..81effa46 100644 --- a/backend/ent/schema/usage_log.go +++ b/backend/ent/schema/usage_log.go @@ -113,7 +113,7 @@ func (UsageLog) Edges() []ent.Edge { Field("user_id"). Required(). Unique(), - edge.From("api_key", ApiKey.Type). + edge.From("api_key", APIKey.Type). Ref("usage_logs"). Field("api_key_id"). Required(). diff --git a/backend/ent/schema/user.go b/backend/ent/schema/user.go index f29b6123..11fecdfd 100644 --- a/backend/ent/schema/user.go +++ b/backend/ent/schema/user.go @@ -66,7 +66,7 @@ func (User) Fields() []ent.Field { func (User) Edges() []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("subscriptions", UserSubscription.Type), edge.To("assigned_subscriptions", UserSubscription.Type), diff --git a/backend/ent/tx.go b/backend/ent/tx.go index b1bbdfc5..e45204c0 100644 --- a/backend/ent/tx.go +++ b/backend/ent/tx.go @@ -14,12 +14,12 @@ import ( // Tx is a transactional client that is created by calling Client.Tx(). type Tx struct { config + // APIKey is the client for interacting with the APIKey builders. + APIKey *APIKeyClient // Account is the client for interacting with the Account builders. Account *AccountClient // AccountGroup is the client for interacting with the AccountGroup builders. 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 *GroupClient // Proxy is the client for interacting with the Proxy builders. @@ -171,9 +171,9 @@ func (tx *Tx) Client() *Client { } func (tx *Tx) init() { + tx.APIKey = NewAPIKeyClient(tx.config) tx.Account = NewAccountClient(tx.config) tx.AccountGroup = NewAccountGroupClient(tx.config) - tx.ApiKey = NewApiKeyClient(tx.config) tx.Group = NewGroupClient(tx.config) tx.Proxy = NewProxyClient(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. // // If a closed transaction is embedded in one of the generated entities, and the entity -// applies a query, for example: Account.QueryXXX(), the query will be executed +// applies a query, for example: APIKey.QueryXXX(), the query will be executed // through the driver which created this transaction. // // Note that txDriver is not goroutine safe. diff --git a/backend/ent/usagelog.go b/backend/ent/usagelog.go index e01780fe..75e3173d 100644 --- a/backend/ent/usagelog.go +++ b/backend/ent/usagelog.go @@ -83,7 +83,7 @@ type UsageLogEdges struct { // User holds the value of the user edge. User *User `json:"user,omitempty"` // 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 *Account `json:"account,omitempty"` // 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 // 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 { return e.APIKey, nil } else if e.loadedTypes[1] { @@ -359,7 +359,7 @@ func (_m *UsageLog) QueryUser() *UserQuery { } // 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) } diff --git a/backend/ent/usagelog/usagelog.go b/backend/ent/usagelog/usagelog.go index bdc6f7e6..139721c4 100644 --- a/backend/ent/usagelog/usagelog.go +++ b/backend/ent/usagelog/usagelog.go @@ -85,7 +85,7 @@ const ( UserColumn = "user_id" // APIKeyTable is the table that holds the api_key relation/edge. 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. APIKeyInverseTable = "api_keys" // APIKeyColumn is the table column denoting the api_key relation/edge. diff --git a/backend/ent/usagelog/where.go b/backend/ent/usagelog/where.go index 9c260433..9db01140 100644 --- a/backend/ent/usagelog/where.go +++ b/backend/ent/usagelog/where.go @@ -1175,7 +1175,7 @@ func HasAPIKey() predicate.UsageLog { } // 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) { step := newAPIKeyStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { diff --git a/backend/ent/usagelog_create.go b/backend/ent/usagelog_create.go index bcba64b1..36f3d277 100644 --- a/backend/ent/usagelog_create.go +++ b/backend/ent/usagelog_create.go @@ -342,8 +342,8 @@ func (_c *UsageLogCreate) SetUser(v *User) *UsageLogCreate { return _c.SetUserID(v.ID) } -// SetAPIKey sets the "api_key" edge to the ApiKey entity. -func (_c *UsageLogCreate) SetAPIKey(v *ApiKey) *UsageLogCreate { +// SetAPIKey sets the "api_key" edge to the APIKey entity. +func (_c *UsageLogCreate) SetAPIKey(v *APIKey) *UsageLogCreate { return _c.SetAPIKeyID(v.ID) } diff --git a/backend/ent/usagelog_query.go b/backend/ent/usagelog_query.go index 8e5013cc..de64171a 100644 --- a/backend/ent/usagelog_query.go +++ b/backend/ent/usagelog_query.go @@ -28,7 +28,7 @@ type UsageLogQuery struct { inters []Interceptor predicates []predicate.UsageLog withUser *UserQuery - withAPIKey *ApiKeyQuery + withAPIKey *APIKeyQuery withAccount *AccountQuery withGroup *GroupQuery withSubscription *UserSubscriptionQuery @@ -91,8 +91,8 @@ func (_q *UsageLogQuery) QueryUser() *UserQuery { } // QueryAPIKey chains the current query on the "api_key" edge. -func (_q *UsageLogQuery) QueryAPIKey() *ApiKeyQuery { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *UsageLogQuery) QueryAPIKey() *APIKeyQuery { + query := (&APIKeyClient{config: _q.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := _q.prepareQuery(ctx); err != nil { 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 // 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 { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *UsageLogQuery) WithAPIKey(opts ...func(*APIKeyQuery)) *UsageLogQuery { + query := (&APIKeyClient{config: _q.config}).Query() for _, opt := range opts { opt(query) } @@ -548,7 +548,7 @@ func (_q *UsageLogQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*Usa } if query := _q.withAPIKey; query != 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 } } @@ -602,7 +602,7 @@ func (_q *UsageLogQuery) loadUser(ctx context.Context, query *UserQuery, nodes [ } 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)) nodeids := make(map[int64][]*UsageLog) for i := range nodes { diff --git a/backend/ent/usagelog_update.go b/backend/ent/usagelog_update.go index 55b8e234..45ad2e2a 100644 --- a/backend/ent/usagelog_update.go +++ b/backend/ent/usagelog_update.go @@ -509,8 +509,8 @@ func (_u *UsageLogUpdate) SetUser(v *User) *UsageLogUpdate { return _u.SetUserID(v.ID) } -// SetAPIKey sets the "api_key" edge to the ApiKey entity. -func (_u *UsageLogUpdate) SetAPIKey(v *ApiKey) *UsageLogUpdate { +// SetAPIKey sets the "api_key" edge to the APIKey entity. +func (_u *UsageLogUpdate) SetAPIKey(v *APIKey) *UsageLogUpdate { return _u.SetAPIKeyID(v.ID) } @@ -540,7 +540,7 @@ func (_u *UsageLogUpdate) ClearUser() *UsageLogUpdate { 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 { _u.mutation.ClearAPIKey() return _u @@ -1380,8 +1380,8 @@ func (_u *UsageLogUpdateOne) SetUser(v *User) *UsageLogUpdateOne { return _u.SetUserID(v.ID) } -// SetAPIKey sets the "api_key" edge to the ApiKey entity. -func (_u *UsageLogUpdateOne) SetAPIKey(v *ApiKey) *UsageLogUpdateOne { +// SetAPIKey sets the "api_key" edge to the APIKey entity. +func (_u *UsageLogUpdateOne) SetAPIKey(v *APIKey) *UsageLogUpdateOne { return _u.SetAPIKeyID(v.ID) } @@ -1411,7 +1411,7 @@ func (_u *UsageLogUpdateOne) ClearUser() *UsageLogUpdateOne { 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 { _u.mutation.ClearAPIKey() return _u diff --git a/backend/ent/user.go b/backend/ent/user.go index d7e1668d..20036475 100644 --- a/backend/ent/user.go +++ b/backend/ent/user.go @@ -48,7 +48,7 @@ type User struct { // UserEdges holds the relations/edges for other nodes in the graph. type UserEdges struct { // 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 []*RedeemCode `json:"redeem_codes,omitempty"` // 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 // was not loaded in eager-loading. -func (e UserEdges) APIKeysOrErr() ([]*ApiKey, error) { +func (e UserEdges) APIKeysOrErr() ([]*APIKey, error) { if e.loadedTypes[0] { 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. -func (_m *User) QueryAPIKeys() *ApiKeyQuery { +func (_m *User) QueryAPIKeys() *APIKeyQuery { return NewUserClient(_m.config).QueryAPIKeys(_m) } diff --git a/backend/ent/user/user.go b/backend/ent/user/user.go index 9c40ab09..a6871c5d 100644 --- a/backend/ent/user/user.go +++ b/backend/ent/user/user.go @@ -57,7 +57,7 @@ const ( Table = "users" // APIKeysTable is the table that holds the api_keys relation/edge. 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. APIKeysInverseTable = "api_keys" // APIKeysColumn is the table column denoting the api_keys relation/edge. diff --git a/backend/ent/user/where.go b/backend/ent/user/where.go index c3db075e..38812770 100644 --- a/backend/ent/user/where.go +++ b/backend/ent/user/where.go @@ -722,7 +722,7 @@ func HasAPIKeys() predicate.User { } // 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) { step := newAPIKeysStep() sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) { diff --git a/backend/ent/user_create.go b/backend/ent/user_create.go index 6313db5f..4ce48d4b 100644 --- a/backend/ent/user_create.go +++ b/backend/ent/user_create.go @@ -166,14 +166,14 @@ func (_c *UserCreate) SetNillableNotes(v *string) *UserCreate { 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 { _c.mutation.AddAPIKeyIDs(ids...) return _c } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_c *UserCreate) AddAPIKeys(v ...*ApiKey) *UserCreate { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_c *UserCreate) AddAPIKeys(v ...*APIKey) *UserCreate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID diff --git a/backend/ent/user_query.go b/backend/ent/user_query.go index 80b182c1..0d65a2dd 100644 --- a/backend/ent/user_query.go +++ b/backend/ent/user_query.go @@ -30,7 +30,7 @@ type UserQuery struct { order []user.OrderOption inters []Interceptor predicates []predicate.User - withAPIKeys *ApiKeyQuery + withAPIKeys *APIKeyQuery withRedeemCodes *RedeemCodeQuery withSubscriptions *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. -func (_q *UserQuery) QueryAPIKeys() *ApiKeyQuery { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *UserQuery) QueryAPIKeys() *APIKeyQuery { + query := (&APIKeyClient{config: _q.config}).Query() query.path = func(ctx context.Context) (fromU *sql.Selector, err error) { if err := _q.prepareQuery(ctx); err != nil { 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 // 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 { - query := (&ApiKeyClient{config: _q.config}).Query() +func (_q *UserQuery) WithAPIKeys(opts ...func(*APIKeyQuery)) *UserQuery { + query := (&APIKeyClient{config: _q.config}).Query() for _, opt := range opts { opt(query) } @@ -653,8 +653,8 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e } if query := _q.withAPIKeys; query != nil { if err := _q.loadAPIKeys(ctx, query, nodes, - 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) { n.Edges.APIKeys = []*APIKey{} }, + func(n *User, e *APIKey) { n.Edges.APIKeys = append(n.Edges.APIKeys, e) }); err != nil { return nil, err } } @@ -712,7 +712,7 @@ func (_q *UserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*User, e 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)) nodeids := make(map[int64]*User) for i := range nodes { @@ -725,7 +725,7 @@ func (_q *UserQuery) loadAPIKeys(ctx context.Context, query *ApiKeyQuery, nodes if len(query.ctx.Fields) > 0 { 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...)) })) neighbors, err := query.All(ctx) diff --git a/backend/ent/user_update.go b/backend/ent/user_update.go index ed5d3a76..49ddf493 100644 --- a/backend/ent/user_update.go +++ b/backend/ent/user_update.go @@ -186,14 +186,14 @@ func (_u *UserUpdate) SetNillableNotes(v *string) *UserUpdate { 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 { _u.mutation.AddAPIKeyIDs(ids...) return _u } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_u *UserUpdate) AddAPIKeys(v ...*ApiKey) *UserUpdate { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_u *UserUpdate) AddAPIKeys(v ...*APIKey) *UserUpdate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -296,20 +296,20 @@ func (_u *UserUpdate) Mutation() *UserMutation { 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 { _u.mutation.ClearAPIKeys() 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 { _u.mutation.RemoveAPIKeyIDs(ids...) return _u } -// RemoveAPIKeys removes "api_keys" edges to ApiKey entities. -func (_u *UserUpdate) RemoveAPIKeys(v ...*ApiKey) *UserUpdate { +// RemoveAPIKeys removes "api_keys" edges to APIKey entities. +func (_u *UserUpdate) RemoveAPIKeys(v ...*APIKey) *UserUpdate { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -1065,14 +1065,14 @@ func (_u *UserUpdateOne) SetNillableNotes(v *string) *UserUpdateOne { 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 { _u.mutation.AddAPIKeyIDs(ids...) return _u } -// AddAPIKeys adds the "api_keys" edges to the ApiKey entity. -func (_u *UserUpdateOne) AddAPIKeys(v ...*ApiKey) *UserUpdateOne { +// AddAPIKeys adds the "api_keys" edges to the APIKey entity. +func (_u *UserUpdateOne) AddAPIKeys(v ...*APIKey) *UserUpdateOne { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID @@ -1175,20 +1175,20 @@ func (_u *UserUpdateOne) Mutation() *UserMutation { 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 { _u.mutation.ClearAPIKeys() 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 { _u.mutation.RemoveAPIKeyIDs(ids...) return _u } -// RemoveAPIKeys removes "api_keys" edges to ApiKey entities. -func (_u *UserUpdateOne) RemoveAPIKeys(v ...*ApiKey) *UserUpdateOne { +// RemoveAPIKeys removes "api_keys" edges to APIKey entities. +func (_u *UserUpdateOne) RemoveAPIKeys(v ...*APIKey) *UserUpdateOne { ids := make([]int64, len(v)) for i := range v { ids[i] = v[i].ID diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index f22539eb..916efd87 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -1,3 +1,4 @@ +// Package config provides configuration loading, defaults, and validation. package config import ( @@ -139,7 +140,7 @@ type GatewayConfig struct { LogUpstreamErrorBodyMaxBytes int `mapstructure:"log_upstream_error_body_max_bytes"` // API-key 账号在客户端未提供 anthropic-beta 时,是否按需自动补齐(默认关闭以保持兼容) - InjectBetaForApiKey bool `mapstructure:"inject_beta_for_apikey"` + InjectBetaForAPIKey bool `mapstructure:"inject_beta_for_apikey"` // 是否允许对部分 400 错误触发 failover(默认关闭以避免改变语义) FailoverOn400 bool `mapstructure:"failover_on_400"` @@ -241,7 +242,7 @@ type DefaultConfig struct { AdminPassword string `mapstructure:"admin_password"` UserConcurrency int `mapstructure:"user_concurrency"` UserBalance float64 `mapstructure:"user_balance"` - ApiKeyPrefix string `mapstructure:"api_key_prefix"` + APIKeyPrefix string `mapstructure:"api_key_prefix"` RateMultiplier float64 `mapstructure:"rate_multiplier"` } diff --git a/backend/internal/handler/admin/account_handler.go b/backend/internal/handler/admin/account_handler.go index 1d31dd21..e9a27ba6 100644 --- a/backend/internal/handler/admin/account_handler.go +++ b/backend/internal/handler/admin/account_handler.go @@ -1,3 +1,4 @@ +// Package admin provides HTTP handlers for administrative operations. package admin import ( diff --git a/backend/internal/handler/admin/dashboard_handler.go b/backend/internal/handler/admin/dashboard_handler.go index a7dc6c4e..fe54d75f 100644 --- a/backend/internal/handler/admin/dashboard_handler.go +++ b/backend/internal/handler/admin/dashboard_handler.go @@ -75,8 +75,8 @@ func (h *DashboardHandler) GetStats(c *gin.Context) { "active_users": stats.ActiveUsers, // API Key 统计 - "total_api_keys": stats.TotalApiKeys, - "active_api_keys": stats.ActiveApiKeys, + "total_api_keys": stats.TotalAPIKeys, + "active_api_keys": stats.ActiveAPIKeys, // 账户统计 "total_accounts": stats.TotalAccounts, @@ -193,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 // 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) granularity := c.DefaultQuery("granularity", "day") limitStr := c.DefaultQuery("limit", "5") @@ -205,7 +205,7 @@ func (h *DashboardHandler) GetApiKeyUsageTrend(c *gin.Context) { 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 { response.Error(c, 500, "Failed to get API key usage trend") return @@ -273,26 +273,26 @@ func (h *DashboardHandler) GetBatchUsersUsage(c *gin.Context) { response.Success(c, gin.H{"stats": stats}) } -// BatchApiKeysUsageRequest represents the request body for batch api key usage stats -type BatchApiKeysUsageRequest struct { - ApiKeyIDs []int64 `json:"api_key_ids" binding:"required"` +// BatchAPIKeysUsageRequest represents the request body for batch api key usage stats +type BatchAPIKeysUsageRequest struct { + 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 -func (h *DashboardHandler) GetBatchApiKeysUsage(c *gin.Context) { - var req BatchApiKeysUsageRequest +func (h *DashboardHandler) GetBatchAPIKeysUsage(c *gin.Context) { + var req BatchAPIKeysUsageRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "Invalid request: "+err.Error()) return } - if len(req.ApiKeyIDs) == 0 { + if len(req.APIKeyIDs) == 0 { response.Success(c, gin.H{"stats": map[string]any{}}) return } - stats, err := h.dashboardService.GetBatchApiKeyUsageStats(c.Request.Context(), req.ApiKeyIDs) + stats, err := h.dashboardService.GetBatchAPIKeyUsageStats(c.Request.Context(), req.APIKeyIDs) if err != nil { response.Error(c, 500, "Failed to get API key usage stats") return diff --git a/backend/internal/handler/admin/gemini_oauth_handler.go b/backend/internal/handler/admin/gemini_oauth_handler.go index 8b4b13d5..50caaa26 100644 --- a/backend/internal/handler/admin/gemini_oauth_handler.go +++ b/backend/internal/handler/admin/gemini_oauth_handler.go @@ -18,6 +18,7 @@ func NewGeminiOAuthHandler(geminiOAuthService *service.GeminiOAuthService) *Gemi return &GeminiOAuthHandler{geminiOAuthService: geminiOAuthService} } +// GetCapabilities returns the Gemini OAuth configuration capabilities. // GET /api/v1/admin/gemini/oauth/capabilities func (h *GeminiOAuthHandler) GetCapabilities(c *gin.Context) { cfg := h.geminiOAuthService.GetOAuthConfig() diff --git a/backend/internal/handler/admin/group_handler.go b/backend/internal/handler/admin/group_handler.go index 30225b76..1ca54aaf 100644 --- a/backend/internal/handler/admin/group_handler.go +++ b/backend/internal/handler/admin/group_handler.go @@ -237,9 +237,9 @@ func (h *GroupHandler) GetGroupAPIKeys(c *gin.Context) { return } - outKeys := make([]dto.ApiKey, 0, len(keys)) + outKeys := make([]dto.APIKey, 0, len(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) } diff --git a/backend/internal/handler/admin/setting_handler.go b/backend/internal/handler/admin/setting_handler.go index 84f74018..ed8f84be 100644 --- a/backend/internal/handler/admin/setting_handler.go +++ b/backend/internal/handler/admin/setting_handler.go @@ -230,9 +230,9 @@ type TestSMTPRequest struct { SMTPUseTLS bool `json:"smtp_use_tls"` } -// TestSmtpConnection 测试SMTP连接 +// TestSMTPConnection 测试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 if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "Invalid request: "+err.Error()) @@ -246,13 +246,13 @@ func (h *SettingHandler) TestSmtpConnection(c *gin.Context) { // 如果未提供密码,从数据库获取已保存的密码 password := req.SMTPPassword if password == "" { - savedConfig, err := h.emailService.GetSmtpConfig(c.Request.Context()) + savedConfig, err := h.emailService.GetSMTPConfig(c.Request.Context()) if err == nil && savedConfig != nil { password = savedConfig.Password } } - config := &service.SmtpConfig{ + config := &service.SMTPConfig{ Host: req.SMTPHost, Port: req.SMTPPort, Username: req.SMTPUsername, @@ -260,7 +260,7 @@ func (h *SettingHandler) TestSmtpConnection(c *gin.Context) { UseTLS: req.SMTPUseTLS, } - err := h.emailService.TestSmtpConnectionWithConfig(config) + err := h.emailService.TestSMTPConnectionWithConfig(config) if err != nil { response.ErrorFrom(c, err) return @@ -297,13 +297,13 @@ func (h *SettingHandler) SendTestEmail(c *gin.Context) { // 如果未提供密码,从数据库获取已保存的密码 password := req.SMTPPassword if password == "" { - savedConfig, err := h.emailService.GetSmtpConfig(c.Request.Context()) + savedConfig, err := h.emailService.GetSMTPConfig(c.Request.Context()) if err == nil && savedConfig != nil { password = savedConfig.Password } } - config := &service.SmtpConfig{ + config := &service.SMTPConfig{ Host: req.SMTPHost, Port: req.SMTPPort, Username: req.SMTPUsername, @@ -355,10 +355,10 @@ func (h *SettingHandler) SendTestEmail(c *gin.Context) { response.Success(c, gin.H{"message": "Test email sent successfully"}) } -// GetAdminApiKey 获取管理员 API Key 状态 +// GetAdminAPIKey 获取管理员 API Key 状态 // GET /api/v1/admin/settings/admin-api-key -func (h *SettingHandler) GetAdminApiKey(c *gin.Context) { - maskedKey, exists, err := h.settingService.GetAdminApiKeyStatus(c.Request.Context()) +func (h *SettingHandler) GetAdminAPIKey(c *gin.Context) { + maskedKey, exists, err := h.settingService.GetAdminAPIKeyStatus(c.Request.Context()) if err != nil { response.ErrorFrom(c, err) return @@ -370,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 -func (h *SettingHandler) RegenerateAdminApiKey(c *gin.Context) { - key, err := h.settingService.GenerateAdminApiKey(c.Request.Context()) +func (h *SettingHandler) RegenerateAdminAPIKey(c *gin.Context) { + key, err := h.settingService.GenerateAdminAPIKey(c.Request.Context()) if err != nil { response.ErrorFrom(c, err) return @@ -384,10 +384,10 @@ func (h *SettingHandler) RegenerateAdminApiKey(c *gin.Context) { }) } -// DeleteAdminApiKey 删除管理员 API Key +// DeleteAdminAPIKey 删除管理员 API Key // DELETE /api/v1/admin/settings/admin-api-key -func (h *SettingHandler) DeleteAdminApiKey(c *gin.Context) { - if err := h.settingService.DeleteAdminApiKey(c.Request.Context()); err != nil { +func (h *SettingHandler) DeleteAdminAPIKey(c *gin.Context) { + if err := h.settingService.DeleteAdminAPIKey(c.Request.Context()); err != nil { response.ErrorFrom(c, err) return } diff --git a/backend/internal/handler/admin/usage_handler.go b/backend/internal/handler/admin/usage_handler.go index a75948f7..37da93d3 100644 --- a/backend/internal/handler/admin/usage_handler.go +++ b/backend/internal/handler/admin/usage_handler.go @@ -17,14 +17,14 @@ import ( // UsageHandler handles admin usage-related requests type UsageHandler struct { usageService *service.UsageService - apiKeyService *service.ApiKeyService + apiKeyService *service.APIKeyService adminService service.AdminService } // NewUsageHandler creates a new admin usage handler func NewUsageHandler( usageService *service.UsageService, - apiKeyService *service.ApiKeyService, + apiKeyService *service.APIKeyService, adminService service.AdminService, ) *UsageHandler { return &UsageHandler{ @@ -125,7 +125,7 @@ func (h *UsageHandler) List(c *gin.Context) { params := pagination.PaginationParams{Page: page, PageSize: pageSize} filters := usagestats.UsageLogFilters{ UserID: userID, - ApiKeyID: apiKeyID, + APIKeyID: apiKeyID, AccountID: accountID, GroupID: groupID, Model: model, @@ -207,7 +207,7 @@ func (h *UsageHandler) Stats(c *gin.Context) { } 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 { response.ErrorFrom(c, err) return @@ -269,9 +269,9 @@ func (h *UsageHandler) SearchUsers(c *gin.Context) { 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 -func (h *UsageHandler) SearchApiKeys(c *gin.Context) { +func (h *UsageHandler) SearchAPIKeys(c *gin.Context) { userIDStr := c.Query("user_id") keyword := c.Query("q") @@ -285,22 +285,22 @@ func (h *UsageHandler) SearchApiKeys(c *gin.Context) { 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 { response.ErrorFrom(c, err) return } // Return simplified API key list (only id and name) - type SimpleApiKey struct { + type SimpleAPIKey struct { ID int64 `json:"id"` Name string `json:"name"` UserID int64 `json:"user_id"` } - result := make([]SimpleApiKey, len(keys)) + result := make([]SimpleAPIKey, len(keys)) for i, k := range keys { - result[i] = SimpleApiKey{ + result[i] = SimpleAPIKey{ ID: k.ID, Name: k.Name, UserID: k.UserID, diff --git a/backend/internal/handler/admin/user_handler.go b/backend/internal/handler/admin/user_handler.go index 11bdebd2..f8cd1d5a 100644 --- a/backend/internal/handler/admin/user_handler.go +++ b/backend/internal/handler/admin/user_handler.go @@ -243,9 +243,9 @@ func (h *UserHandler) GetUserAPIKeys(c *gin.Context) { return } - out := make([]dto.ApiKey, 0, len(keys)) + out := make([]dto.APIKey, 0, len(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) } diff --git a/backend/internal/handler/api_key_handler.go b/backend/internal/handler/api_key_handler.go index 790f4ac2..09772f22 100644 --- a/backend/internal/handler/api_key_handler.go +++ b/backend/internal/handler/api_key_handler.go @@ -1,3 +1,4 @@ +// Package handler provides HTTP request handlers for the application. package handler import ( @@ -14,11 +15,11 @@ import ( // APIKeyHandler handles API key-related requests type APIKeyHandler struct { - apiKeyService *service.ApiKeyService + apiKeyService *service.APIKeyService } // NewAPIKeyHandler creates a new APIKeyHandler -func NewAPIKeyHandler(apiKeyService *service.ApiKeyService) *APIKeyHandler { +func NewAPIKeyHandler(apiKeyService *service.APIKeyService) *APIKeyHandler { return &APIKeyHandler{ apiKeyService: apiKeyService, } @@ -56,9 +57,9 @@ func (h *APIKeyHandler) List(c *gin.Context) { return } - out := make([]dto.ApiKey, 0, len(keys)) + out := make([]dto.APIKey, 0, len(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) } @@ -90,7 +91,7 @@ func (h *APIKeyHandler) GetByID(c *gin.Context) { return } - response.Success(c, dto.ApiKeyFromService(key)) + response.Success(c, dto.APIKeyFromService(key)) } // Create handles creating a new API key @@ -108,7 +109,7 @@ func (h *APIKeyHandler) Create(c *gin.Context) { return } - svcReq := service.CreateApiKeyRequest{ + svcReq := service.CreateAPIKeyRequest{ Name: req.Name, GroupID: req.GroupID, CustomKey: req.CustomKey, @@ -119,7 +120,7 @@ func (h *APIKeyHandler) Create(c *gin.Context) { return } - response.Success(c, dto.ApiKeyFromService(key)) + response.Success(c, dto.APIKeyFromService(key)) } // Update handles updating an API key @@ -143,7 +144,7 @@ func (h *APIKeyHandler) Update(c *gin.Context) { return } - svcReq := service.UpdateApiKeyRequest{} + svcReq := service.UpdateAPIKeyRequest{} if req.Name != "" { svcReq.Name = &req.Name } @@ -158,7 +159,7 @@ func (h *APIKeyHandler) Update(c *gin.Context) { return } - response.Success(c, dto.ApiKeyFromService(key)) + response.Success(c, dto.APIKeyFromService(key)) } // Delete handles deleting an API key diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index eb7ec867..e449e752 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -1,3 +1,4 @@ +// Package dto provides data transfer objects for HTTP handlers. package dto import "github.com/Wei-Shaw/sub2api/internal/service" @@ -26,11 +27,11 @@ func UserFromService(u *service.User) *User { return nil } out := UserFromServiceShallow(u) - if len(u.ApiKeys) > 0 { - out.ApiKeys = make([]ApiKey, 0, len(u.ApiKeys)) - for i := range u.ApiKeys { - k := u.ApiKeys[i] - out.ApiKeys = append(out.ApiKeys, *ApiKeyFromService(&k)) + if len(u.APIKeys) > 0 { + out.APIKeys = make([]APIKey, 0, len(u.APIKeys)) + for i := range u.APIKeys { + k := u.APIKeys[i] + out.APIKeys = append(out.APIKeys, *APIKeyFromService(&k)) } } if len(u.Subscriptions) > 0 { @@ -43,11 +44,11 @@ func UserFromService(u *service.User) *User { return out } -func ApiKeyFromService(k *service.ApiKey) *ApiKey { +func APIKeyFromService(k *service.APIKey) *APIKey { if k == nil { return nil } - return &ApiKey{ + return &APIKey{ ID: k.ID, UserID: k.UserID, Key: k.Key, @@ -222,7 +223,7 @@ func UsageLogFromService(l *service.UsageLog) *UsageLog { return &UsageLog{ ID: l.ID, UserID: l.UserID, - ApiKeyID: l.ApiKeyID, + APIKeyID: l.APIKeyID, AccountID: l.AccountID, RequestID: l.RequestID, Model: l.Model, @@ -247,7 +248,7 @@ func UsageLogFromService(l *service.UsageLog) *UsageLog { FirstTokenMs: l.FirstTokenMs, CreatedAt: l.CreatedAt, User: UserFromServiceShallow(l.User), - ApiKey: ApiKeyFromService(l.ApiKey), + APIKey: APIKeyFromService(l.APIKey), Account: AccountFromService(l.Account), Group: GroupFromServiceShallow(l.Group), Subscription: UserSubscriptionFromService(l.Subscription), diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index 85d9b9e7..185056c9 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -15,11 +15,11 @@ type User struct { CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` - ApiKeys []ApiKey `json:"api_keys,omitempty"` + APIKeys []APIKey `json:"api_keys,omitempty"` Subscriptions []UserSubscription `json:"subscriptions,omitempty"` } -type ApiKey struct { +type APIKey struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` Key string `json:"key"` @@ -139,7 +139,7 @@ type RedeemCode struct { type UsageLog struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` - ApiKeyID int64 `json:"api_key_id"` + APIKeyID int64 `json:"api_key_id"` AccountID int64 `json:"account_id"` RequestID string `json:"request_id"` Model string `json:"model"` @@ -171,7 +171,7 @@ type UsageLog struct { CreatedAt time.Time `json:"created_at"` User *User `json:"user,omitempty"` - ApiKey *ApiKey `json:"api_key,omitempty"` + APIKey *APIKey `json:"api_key,omitempty"` Account *Account `json:"account,omitempty"` Group *Group `json:"group,omitempty"` Subscription *UserSubscription `json:"subscription,omitempty"` diff --git a/backend/internal/handler/gateway_handler.go b/backend/internal/handler/gateway_handler.go index bbc9c181..ca0d1ad4 100644 --- a/backend/internal/handler/gateway_handler.go +++ b/backend/internal/handler/gateway_handler.go @@ -53,7 +53,7 @@ func NewGatewayHandler( // POST /v1/messages func (h *GatewayHandler) Messages(c *gin.Context) { // 从context获取apiKey和user(ApiKeyAuth中间件已设置) - apiKey, ok := middleware2.GetApiKeyFromContext(c) + apiKey, ok := middleware2.GetAPIKeyFromContext(c) if !ok { h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key") return @@ -259,7 +259,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) { defer cancel() if err := h.gatewayService.RecordUsage(ctx, &service.RecordUsageInput{ Result: result, - ApiKey: apiKey, + APIKey: apiKey, User: apiKey.User, Account: usedAccount, Subscription: subscription, @@ -383,7 +383,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) { defer cancel() if err := h.gatewayService.RecordUsage(ctx, &service.RecordUsageInput{ Result: result, - ApiKey: apiKey, + APIKey: apiKey, User: apiKey.User, Account: usedAccount, Subscription: subscription, @@ -400,7 +400,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) { // Returns models based on account configurations (model_mapping whitelist) // Falls back to default models if no whitelist is configured func (h *GatewayHandler) Models(c *gin.Context) { - apiKey, _ := middleware2.GetApiKeyFromContext(c) + apiKey, _ := middleware2.GetAPIKeyFromContext(c) var groupID *int64 var platform string @@ -458,7 +458,7 @@ func (h *GatewayHandler) AntigravityModels(c *gin.Context) { // Usage handles getting account balance for CC Switch integration // GET /v1/usage func (h *GatewayHandler) Usage(c *gin.Context) { - apiKey, ok := middleware2.GetApiKeyFromContext(c) + apiKey, ok := middleware2.GetAPIKeyFromContext(c) if !ok { h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key") return @@ -628,7 +628,7 @@ func (h *GatewayHandler) errorResponse(c *gin.Context, status int, errType, mess // 特点:校验订阅/余额,但不计算并发、不记录使用量 func (h *GatewayHandler) CountTokens(c *gin.Context) { // 从context获取apiKey和user(ApiKeyAuth中间件已设置) - apiKey, ok := middleware2.GetApiKeyFromContext(c) + apiKey, ok := middleware2.GetAPIKeyFromContext(c) if !ok { h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key") return diff --git a/backend/internal/handler/gemini_v1beta_handler.go b/backend/internal/handler/gemini_v1beta_handler.go index 71678bed..2dbc7660 100644 --- a/backend/internal/handler/gemini_v1beta_handler.go +++ b/backend/internal/handler/gemini_v1beta_handler.go @@ -21,7 +21,7 @@ import ( // GeminiV1BetaListModels proxies: // GET /v1beta/models func (h *GatewayHandler) GeminiV1BetaListModels(c *gin.Context) { - apiKey, ok := middleware.GetApiKeyFromContext(c) + apiKey, ok := middleware.GetAPIKeyFromContext(c) if !ok || apiKey == nil { googleError(c, http.StatusUnauthorized, "Invalid API key") return @@ -67,7 +67,7 @@ func (h *GatewayHandler) GeminiV1BetaListModels(c *gin.Context) { // GeminiV1BetaGetModel proxies: // GET /v1beta/models/{model} func (h *GatewayHandler) GeminiV1BetaGetModel(c *gin.Context) { - apiKey, ok := middleware.GetApiKeyFromContext(c) + apiKey, ok := middleware.GetAPIKeyFromContext(c) if !ok || apiKey == nil { googleError(c, http.StatusUnauthorized, "Invalid API key") return @@ -120,7 +120,7 @@ func (h *GatewayHandler) GeminiV1BetaGetModel(c *gin.Context) { // POST /v1beta/models/{model}:generateContent // POST /v1beta/models/{model}:streamGenerateContent?alt=sse func (h *GatewayHandler) GeminiV1BetaModels(c *gin.Context) { - apiKey, ok := middleware.GetApiKeyFromContext(c) + apiKey, ok := middleware.GetAPIKeyFromContext(c) if !ok || apiKey == nil { googleError(c, http.StatusUnauthorized, "Invalid API key") return @@ -299,7 +299,7 @@ func (h *GatewayHandler) GeminiV1BetaModels(c *gin.Context) { defer cancel() if err := h.gatewayService.RecordUsage(ctx, &service.RecordUsageInput{ Result: result, - ApiKey: apiKey, + APIKey: apiKey, User: apiKey.User, Account: usedAccount, Subscription: subscription, diff --git a/backend/internal/handler/openai_gateway_handler.go b/backend/internal/handler/openai_gateway_handler.go index 9931052d..966cdfc6 100644 --- a/backend/internal/handler/openai_gateway_handler.go +++ b/backend/internal/handler/openai_gateway_handler.go @@ -41,7 +41,7 @@ func NewOpenAIGatewayHandler( // POST /openai/v1/responses func (h *OpenAIGatewayHandler) Responses(c *gin.Context) { // Get apiKey and user from context (set by ApiKeyAuth middleware) - apiKey, ok := middleware2.GetApiKeyFromContext(c) + apiKey, ok := middleware2.GetAPIKeyFromContext(c) if !ok { h.errorResponse(c, http.StatusUnauthorized, "authentication_error", "Invalid API key") return @@ -235,7 +235,7 @@ func (h *OpenAIGatewayHandler) Responses(c *gin.Context) { defer cancel() if err := h.gatewayService.RecordUsage(ctx, &service.OpenAIRecordUsageInput{ Result: result, - ApiKey: apiKey, + APIKey: apiKey, User: apiKey.User, Account: usedAccount, Subscription: subscription, diff --git a/backend/internal/handler/usage_handler.go b/backend/internal/handler/usage_handler.go index a0cf9f2c..9e503d4c 100644 --- a/backend/internal/handler/usage_handler.go +++ b/backend/internal/handler/usage_handler.go @@ -18,11 +18,11 @@ import ( // UsageHandler handles usage-related requests type UsageHandler struct { usageService *service.UsageService - apiKeyService *service.ApiKeyService + apiKeyService *service.APIKeyService } // 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{ usageService: usageService, apiKeyService: apiKeyService, @@ -111,7 +111,7 @@ func (h *UsageHandler) List(c *gin.Context) { params := pagination.PaginationParams{Page: page, PageSize: pageSize} filters := usagestats.UsageLogFilters{ UserID: subject.UserID, // Always filter by current user for security - ApiKeyID: apiKeyID, + APIKeyID: apiKeyID, Model: model, Stream: stream, BillingType: billingType, @@ -235,7 +235,7 @@ func (h *UsageHandler) Stats(c *gin.Context) { var stats *service.UsageStats var err error 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 { 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 -type BatchApiKeysUsageRequest struct { - ApiKeyIDs []int64 `json:"api_key_ids" binding:"required"` +// BatchAPIKeysUsageRequest represents the request for batch API keys usage +type BatchAPIKeysUsageRequest struct { + 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 -func (h *UsageHandler) DashboardApiKeysUsage(c *gin.Context) { +func (h *UsageHandler) DashboardAPIKeysUsage(c *gin.Context) { subject, ok := middleware2.GetAuthSubjectFromContext(c) if !ok { response.Unauthorized(c, "User not authenticated") return } - var req BatchApiKeysUsageRequest + var req BatchAPIKeysUsageRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "Invalid request: "+err.Error()) return } - if len(req.ApiKeyIDs) == 0 { + if len(req.APIKeyIDs) == 0 { response.Success(c, gin.H{"stats": map[string]any{}}) return } // 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)") 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 { response.ErrorFrom(c, err) return } - if len(validApiKeyIDs) == 0 { + if len(validAPIKeyIDs) == 0 { response.Success(c, gin.H{"stats": map[string]any{}}) return } - stats, err := h.usageService.GetBatchApiKeyUsageStats(c.Request.Context(), validApiKeyIDs) + stats, err := h.usageService.GetBatchAPIKeyUsageStats(c.Request.Context(), validAPIKeyIDs) if err != nil { response.ErrorFrom(c, err) return diff --git a/backend/internal/pkg/antigravity/client.go b/backend/internal/pkg/antigravity/client.go index 003398bd..48f6b15d 100644 --- a/backend/internal/pkg/antigravity/client.go +++ b/backend/internal/pkg/antigravity/client.go @@ -1,3 +1,4 @@ +// Package antigravity provides a client for the Antigravity API. package antigravity import ( diff --git a/backend/internal/pkg/claude/constants.go b/backend/internal/pkg/claude/constants.go index 0db3ed4a..d1a56a84 100644 --- a/backend/internal/pkg/claude/constants.go +++ b/backend/internal/pkg/claude/constants.go @@ -1,3 +1,4 @@ +// Package claude provides constants and helpers for Claude API integration. package claude // Claude Code 客户端相关常量 @@ -16,13 +17,13 @@ const DefaultBetaHeader = BetaClaudeCode + "," + BetaOAuth + "," + BetaInterleav // HaikuBetaHeader Haiku 模型使用的 anthropic-beta header(不需要 claude-code beta) const HaikuBetaHeader = BetaOAuth + "," + BetaInterleavedThinking -// ApiKeyBetaHeader API-key 账号建议使用的 anthropic-beta header(不包含 oauth) -const ApiKeyBetaHeader = BetaClaudeCode + "," + BetaInterleavedThinking + "," + BetaFineGrainedToolStreaming +// APIKeyBetaHeader API-key 账号建议使用的 anthropic-beta header(不包含 oauth) +const APIKeyBetaHeader = BetaClaudeCode + "," + BetaInterleavedThinking + "," + BetaFineGrainedToolStreaming -// ApiKeyHaikuBetaHeader Haiku 模型在 API-key 账号下使用的 anthropic-beta header(不包含 oauth / claude-code) -const ApiKeyHaikuBetaHeader = BetaInterleavedThinking +// APIKeyHaikuBetaHeader Haiku 模型在 API-key 账号下使用的 anthropic-beta header(不包含 oauth / claude-code) +const APIKeyHaikuBetaHeader = BetaInterleavedThinking -// Claude Code 客户端默认请求头 +// DefaultHeaders 是 Claude Code 客户端默认请求头。 var DefaultHeaders = map[string]string{ "User-Agent": "claude-cli/2.0.62 (external, cli)", "X-Stainless-Lang": "js", diff --git a/backend/internal/pkg/errors/types.go b/backend/internal/pkg/errors/types.go index dd98f6f5..21dfbeb8 100644 --- a/backend/internal/pkg/errors/types.go +++ b/backend/internal/pkg/errors/types.go @@ -1,3 +1,4 @@ +// Package errors provides application error types and helpers. // nolint:mnd package errors diff --git a/backend/internal/pkg/gemini/models.go b/backend/internal/pkg/gemini/models.go index 2be13c44..e251c8d8 100644 --- a/backend/internal/pkg/gemini/models.go +++ b/backend/internal/pkg/gemini/models.go @@ -1,7 +1,6 @@ -package gemini - -// This package provides minimal fallback model metadata for Gemini native endpoints. +// Package gemini 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). +package gemini type Model struct { Name string `json:"name"` diff --git a/backend/internal/pkg/geminicli/constants.go b/backend/internal/pkg/geminicli/constants.go index 9b5a2b92..6d7e5a5d 100644 --- a/backend/internal/pkg/geminicli/constants.go +++ b/backend/internal/pkg/geminicli/constants.go @@ -1,3 +1,4 @@ +// Package geminicli provides helpers for interacting with Gemini CLI tools. package geminicli import "time" diff --git a/backend/internal/pkg/googleapi/status.go b/backend/internal/pkg/googleapi/status.go index b8def1eb..5eb0c54a 100644 --- a/backend/internal/pkg/googleapi/status.go +++ b/backend/internal/pkg/googleapi/status.go @@ -1,3 +1,4 @@ +// Package googleapi provides helpers for Google-style API responses. package googleapi import "net/http" diff --git a/backend/internal/pkg/oauth/oauth.go b/backend/internal/pkg/oauth/oauth.go index 22dbff3f..d29c2422 100644 --- a/backend/internal/pkg/oauth/oauth.go +++ b/backend/internal/pkg/oauth/oauth.go @@ -1,3 +1,4 @@ +// Package oauth provides helpers for OAuth flows used by this service. package oauth import ( diff --git a/backend/internal/pkg/openai/constants.go b/backend/internal/pkg/openai/constants.go index d97507a8..4fab3359 100644 --- a/backend/internal/pkg/openai/constants.go +++ b/backend/internal/pkg/openai/constants.go @@ -1,3 +1,4 @@ +// Package openai provides helpers and types for OpenAI API integration. package openai import _ "embed" diff --git a/backend/internal/pkg/openai/oauth.go b/backend/internal/pkg/openai/oauth.go index 90d2e001..df972a13 100644 --- a/backend/internal/pkg/openai/oauth.go +++ b/backend/internal/pkg/openai/oauth.go @@ -327,7 +327,7 @@ func ParseIDToken(idToken string) (*IDTokenClaims, error) { return &claims, nil } -// ExtractUserInfo extracts user information from ID Token claims +// UserInfo represents user information extracted from ID Token claims. type UserInfo struct { Email string ChatGPTAccountID string diff --git a/backend/internal/pkg/pagination/pagination.go b/backend/internal/pkg/pagination/pagination.go index 12ff321e..c162588a 100644 --- a/backend/internal/pkg/pagination/pagination.go +++ b/backend/internal/pkg/pagination/pagination.go @@ -1,3 +1,4 @@ +// Package pagination provides types and helpers for paginated responses. package pagination // PaginationParams 分页参数 diff --git a/backend/internal/pkg/response/response.go b/backend/internal/pkg/response/response.go index 87dc4264..a92ff9e8 100644 --- a/backend/internal/pkg/response/response.go +++ b/backend/internal/pkg/response/response.go @@ -1,3 +1,4 @@ +// Package response provides standardized HTTP response helpers. package response import ( diff --git a/backend/internal/pkg/sysutil/restart.go b/backend/internal/pkg/sysutil/restart.go index f390a6cf..2146596f 100644 --- a/backend/internal/pkg/sysutil/restart.go +++ b/backend/internal/pkg/sysutil/restart.go @@ -1,3 +1,4 @@ +// Package sysutil provides system-level utilities for process management. package sysutil import ( diff --git a/backend/internal/pkg/usagestats/usage_log_types.go b/backend/internal/pkg/usagestats/usage_log_types.go index 946501d4..39314602 100644 --- a/backend/internal/pkg/usagestats/usage_log_types.go +++ b/backend/internal/pkg/usagestats/usage_log_types.go @@ -1,3 +1,4 @@ +// Package usagestats provides types for usage statistics and reporting. package usagestats import "time" @@ -10,8 +11,8 @@ type DashboardStats struct { ActiveUsers int64 `json:"active_users"` // 今日有请求的用户数 // API Key 统计 - TotalApiKeys int64 `json:"total_api_keys"` - ActiveApiKeys int64 `json:"active_api_keys"` // 状态为 active 的 API Key 数 + TotalAPIKeys int64 `json:"total_api_keys"` + ActiveAPIKeys int64 `json:"active_api_keys"` // 状态为 active 的 API Key 数 // 账户统计 TotalAccounts int64 `json:"total_accounts"` @@ -82,10 +83,10 @@ type UserUsageTrendPoint struct { ActualCost float64 `json:"actual_cost"` // 实际扣除 } -// ApiKeyUsageTrendPoint represents API key usage trend data point -type ApiKeyUsageTrendPoint struct { +// APIKeyUsageTrendPoint represents API key usage trend data point +type APIKeyUsageTrendPoint struct { Date string `json:"date"` - ApiKeyID int64 `json:"api_key_id"` + APIKeyID int64 `json:"api_key_id"` KeyName string `json:"key_name"` Requests int64 `json:"requests"` Tokens int64 `json:"tokens"` @@ -94,8 +95,8 @@ type ApiKeyUsageTrendPoint struct { // UserDashboardStats 用户仪表盘统计 type UserDashboardStats struct { // API Key 统计 - TotalApiKeys int64 `json:"total_api_keys"` - ActiveApiKeys int64 `json:"active_api_keys"` + TotalAPIKeys int64 `json:"total_api_keys"` + ActiveAPIKeys int64 `json:"active_api_keys"` // 累计 Token 使用统计 TotalRequests int64 `json:"total_requests"` @@ -128,7 +129,7 @@ type UserDashboardStats struct { // UsageLogFilters represents filters for usage log queries type UsageLogFilters struct { UserID int64 - ApiKeyID int64 + APIKeyID int64 AccountID int64 GroupID int64 Model string @@ -157,9 +158,9 @@ type BatchUserUsageStats struct { TotalActualCost float64 `json:"total_actual_cost"` } -// BatchApiKeyUsageStats represents usage stats for a single API key -type BatchApiKeyUsageStats struct { - ApiKeyID int64 `json:"api_key_id"` +// BatchAPIKeyUsageStats represents usage stats for a single API key +type BatchAPIKeyUsageStats struct { + APIKeyID int64 `json:"api_key_id"` TodayActualCost float64 `json:"today_actual_cost"` TotalActualCost float64 `json:"total_actual_cost"` } diff --git a/backend/internal/repository/account_repo_integration_test.go b/backend/internal/repository/account_repo_integration_test.go index 84a88f23..250b141d 100644 --- a/backend/internal/repository/account_repo_integration_test.go +++ b/backend/internal/repository/account_repo_integration_test.go @@ -135,12 +135,12 @@ func (s *AccountRepoSuite) TestListWithFilters() { name: "filter_by_type", setup: func(client *dbent.Client) { 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, validate: func(accounts []service.Account) { - s.Require().Equal(service.AccountTypeApiKey, accounts[0].Type) + s.Require().Equal(service.AccountTypeAPIKey, accounts[0].Type) }, }, { diff --git a/backend/internal/repository/allowed_groups_contract_integration_test.go b/backend/internal/repository/allowed_groups_contract_integration_test.go index 02cde527..0d0f11e5 100644 --- a/backend/internal/repository/allowed_groups_contract_integration_test.go +++ b/backend/internal/repository/allowed_groups_contract_integration_test.go @@ -98,7 +98,7 @@ func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsApiKeys(t *t userRepo := newUserRepositoryWithSQL(entClient, tx) groupRepo := newGroupRepositoryWithSQL(entClient, tx) - apiKeyRepo := NewApiKeyRepository(entClient) + apiKeyRepo := NewAPIKeyRepository(entClient) u := &service.User{ Email: uniqueTestValue(t, "cascade-user") + "@example.com", @@ -110,7 +110,7 @@ func TestGroupRepository_DeleteCascade_RemovesAllowedGroupsAndClearsApiKeys(t *t } require.NoError(t, userRepo.Create(ctx, u)) - key := &service.ApiKey{ + key := &service.APIKey{ UserID: u.ID, Key: uniqueTestValue(t, "sk-test-delete-cascade"), Name: "test key", diff --git a/backend/internal/repository/api_key_cache.go b/backend/internal/repository/api_key_cache.go index 84565b47..73a929c5 100644 --- a/backend/internal/repository/api_key_cache.go +++ b/backend/internal/repository/api_key_cache.go @@ -24,7 +24,7 @@ type apiKeyCache struct { rdb *redis.Client } -func NewApiKeyCache(rdb *redis.Client) service.ApiKeyCache { +func NewAPIKeyCache(rdb *redis.Client) service.APIKeyCache { return &apiKeyCache{rdb: rdb} } diff --git a/backend/internal/repository/api_key_repo.go b/backend/internal/repository/api_key_repo.go index 9fcee1ca..530d86f7 100644 --- a/backend/internal/repository/api_key_repo.go +++ b/backend/internal/repository/api_key_repo.go @@ -16,17 +16,17 @@ type apiKeyRepository struct { client *dbent.Client } -func NewApiKeyRepository(client *dbent.Client) service.ApiKeyRepository { +func NewAPIKeyRepository(client *dbent.Client) service.APIKeyRepository { 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 { - created, err := r.client.ApiKey.Create(). +func (r *apiKeyRepository) Create(ctx context.Context, key *service.APIKey) error { + created, err := r.client.APIKey.Create(). SetUserID(key.UserID). SetKey(key.Key). SetName(key.Name). @@ -38,10 +38,10 @@ func (r *apiKeyRepository) Create(ctx context.Context, key *service.ApiKey) erro key.CreatedAt = created.CreatedAt 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(). Where(apikey.IDEQ(id)). WithUser(). @@ -49,7 +49,7 @@ func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.ApiK Only(ctx) if err != nil { if dbent.IsNotFound(err) { - return nil, service.ErrApiKeyNotFound + return nil, service.ErrAPIKeyNotFound } return nil, err } @@ -59,7 +59,7 @@ func (r *apiKeyRepository) GetByID(ctx context.Context, id int64) (*service.ApiK // GetOwnerID 根据 API Key ID 获取其所有者(用户)的 ID。 // 相比 GetByID,此方法性能更优,因为: // - 使用 Select() 只查询 user_id 字段,减少数据传输量 -// - 不加载完整的 ApiKey 实体及其关联数据(User、Group 等) +// - 不加载完整的 API Key 实体及其关联数据(User、Group 等) // - 适用于权限验证等只需用户 ID 的场景(如删除前的所有权检查) func (r *apiKeyRepository) GetOwnerID(ctx context.Context, id int64) (int64, error) { m, err := r.activeQuery(). @@ -68,14 +68,14 @@ func (r *apiKeyRepository) GetOwnerID(ctx context.Context, id int64) (int64, err Only(ctx) if err != nil { if dbent.IsNotFound(err) { - return 0, service.ErrApiKeyNotFound + return 0, service.ErrAPIKeyNotFound } return 0, err } 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(). Where(apikey.KeyEQ(key)). WithUser(). @@ -83,21 +83,21 @@ func (r *apiKeyRepository) GetByKey(ctx context.Context, key string) (*service.A Only(ctx) if err != nil { if dbent.IsNotFound(err) { - return nil, service.ErrApiKeyNotFound + return nil, service.ErrAPIKeyNotFound } return nil, err } 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,若在两步之间发生软删除, // 则会更新已删除的记录。 // 这里选择 Update().Where(),确保只有未软删除记录能被更新。 // 同时显式设置 updated_at,避免二次查询带来的并发可见性问题。 now := time.Now() - builder := r.client.ApiKey.Update(). + builder := r.client.APIKey.Update(). Where(apikey.IDEQ(key.ID), apikey.DeletedAtIsNil()). SetName(key.Name). SetStatus(key.Status). @@ -114,7 +114,7 @@ func (r *apiKeyRepository) Update(ctx context.Context, key *service.ApiKey) erro } if affected == 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 { // 显式软删除:避免依赖 Hook 行为,确保 deleted_at 一定被设置。 - affected, err := r.client.ApiKey.Update(). + affected, err := r.client.APIKey.Update(). Where(apikey.IDEQ(id), apikey.DeletedAtIsNil()). SetDeletedAt(time.Now()). Save(ctx) if err != nil { if dbent.IsNotFound(err) { - return service.ErrApiKeyNotFound + return service.ErrAPIKeyNotFound } return err } if affected == 0 { - exists, err := r.client.ApiKey.Query(). + exists, err := r.client.APIKey.Query(). Where(apikey.IDEQ(id)). Exist(mixins.SkipSoftDelete(ctx)) if err != nil { @@ -144,12 +144,12 @@ func (r *apiKeyRepository) Delete(ctx context.Context, id int64) error { if exists { return nil } - return service.ErrApiKeyNotFound + return service.ErrAPIKeyNotFound } 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)) total, err := q.Count(ctx) @@ -167,7 +167,7 @@ func (r *apiKeyRepository) ListByUserID(ctx context.Context, userID int64, param return nil, nil, err } - outKeys := make([]service.ApiKey, 0, len(keys)) + outKeys := make([]service.APIKey, 0, len(keys)) for i := range keys { outKeys = append(outKeys, *apiKeyEntityToService(keys[i])) } @@ -180,7 +180,7 @@ func (r *apiKeyRepository) VerifyOwnership(ctx context.Context, userID int64, ap return []int64{}, nil } - ids, err := r.client.ApiKey.Query(). + ids, err := r.client.APIKey.Query(). Where(apikey.UserIDEQ(userID), apikey.IDIn(apiKeyIDs...), apikey.DeletedAtIsNil()). IDs(ctx) if err != nil { @@ -199,7 +199,7 @@ func (r *apiKeyRepository) ExistsByKey(ctx context.Context, key string) (bool, e 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)) total, err := q.Count(ctx) @@ -217,7 +217,7 @@ func (r *apiKeyRepository) ListByGroupID(ctx context.Context, groupID int64, par return nil, nil, err } - outKeys := make([]service.ApiKey, 0, len(keys)) + outKeys := make([]service.APIKey, 0, len(keys)) for i := range keys { 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 } -// 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) { +// 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) { q := r.activeQuery() if userID > 0 { q = q.Where(apikey.UserIDEQ(userID)) @@ -241,7 +241,7 @@ func (r *apiKeyRepository) SearchApiKeys(ctx context.Context, userID int64, keyw return nil, err } - outKeys := make([]service.ApiKey, 0, len(keys)) + outKeys := make([]service.APIKey, 0, len(keys)) for i := range keys { 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 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()). ClearGroupID(). Save(ctx) @@ -263,11 +263,11 @@ func (r *apiKeyRepository) CountByGroupID(ctx context.Context, groupID int64) (i return int64(count), err } -func apiKeyEntityToService(m *dbent.ApiKey) *service.ApiKey { +func apiKeyEntityToService(m *dbent.APIKey) *service.APIKey { if m == nil { return nil } - out := &service.ApiKey{ + out := &service.APIKey{ ID: m.ID, UserID: m.UserID, Key: m.Key, diff --git a/backend/internal/repository/api_key_repo_integration_test.go b/backend/internal/repository/api_key_repo_integration_test.go index 79564ff0..879a0576 100644 --- a/backend/internal/repository/api_key_repo_integration_test.go +++ b/backend/internal/repository/api_key_repo_integration_test.go @@ -12,30 +12,30 @@ import ( "github.com/stretchr/testify/suite" ) -type ApiKeyRepoSuite struct { +type APIKeyRepoSuite struct { suite.Suite ctx context.Context client *dbent.Client repo *apiKeyRepository } -func (s *ApiKeyRepoSuite) SetupTest() { +func (s *APIKeyRepoSuite) SetupTest() { s.ctx = context.Background() tx := testEntTx(s.T()) s.client = tx.Client() - s.repo = NewApiKeyRepository(s.client).(*apiKeyRepository) + s.repo = NewAPIKeyRepository(s.client).(*apiKeyRepository) } -func TestApiKeyRepoSuite(t *testing.T) { - suite.Run(t, new(ApiKeyRepoSuite)) +func TestAPIKeyRepoSuite(t *testing.T) { + suite.Run(t, new(APIKeyRepoSuite)) } // --- Create / GetByID / GetByKey --- -func (s *ApiKeyRepoSuite) TestCreate() { +func (s *APIKeyRepoSuite) TestCreate() { user := s.mustCreateUser("create@test.com") - key := &service.ApiKey{ + key := &service.APIKey{ UserID: user.ID, Key: "sk-create-test", Name: "Test Key", @@ -51,16 +51,16 @@ func (s *ApiKeyRepoSuite) TestCreate() { 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) s.Require().Error(err, "expected error for non-existent ID") } -func (s *ApiKeyRepoSuite) TestGetByKey() { +func (s *APIKeyRepoSuite) TestGetByKey() { user := s.mustCreateUser("getbykey@test.com") group := s.mustCreateGroup("g-key") - key := &service.ApiKey{ + key := &service.APIKey{ UserID: user.ID, Key: "sk-getbykey", Name: "My Key", @@ -78,16 +78,16 @@ func (s *ApiKeyRepoSuite) TestGetByKey() { 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") s.Require().Error(err, "expected error for non-existent key") } // --- Update --- -func (s *ApiKeyRepoSuite) TestUpdate() { +func (s *APIKeyRepoSuite) TestUpdate() { user := s.mustCreateUser("update@test.com") - key := &service.ApiKey{ + key := &service.APIKey{ UserID: user.ID, Key: "sk-update", Name: "Original", @@ -108,10 +108,10 @@ func (s *ApiKeyRepoSuite) TestUpdate() { s.Require().Equal(service.StatusDisabled, got.Status) } -func (s *ApiKeyRepoSuite) TestUpdate_ClearGroupID() { +func (s *APIKeyRepoSuite) TestUpdate_ClearGroupID() { user := s.mustCreateUser("cleargroup@test.com") group := s.mustCreateGroup("g-clear") - key := &service.ApiKey{ + key := &service.APIKey{ UserID: user.ID, Key: "sk-clear-group", Name: "Group Key", @@ -131,9 +131,9 @@ func (s *ApiKeyRepoSuite) TestUpdate_ClearGroupID() { // --- Delete --- -func (s *ApiKeyRepoSuite) TestDelete() { +func (s *APIKeyRepoSuite) TestDelete() { user := s.mustCreateUser("delete@test.com") - key := &service.ApiKey{ + key := &service.APIKey{ UserID: user.ID, Key: "sk-delete", Name: "Delete Me", @@ -150,7 +150,7 @@ func (s *ApiKeyRepoSuite) TestDelete() { // --- ListByUserID / CountByUserID --- -func (s *ApiKeyRepoSuite) TestListByUserID() { +func (s *APIKeyRepoSuite) TestListByUserID() { user := s.mustCreateUser("listbyuser@test.com") s.mustCreateApiKey(user.ID, "sk-list-1", "Key 1", nil) s.mustCreateApiKey(user.ID, "sk-list-2", "Key 2", nil) @@ -161,7 +161,7 @@ func (s *ApiKeyRepoSuite) TestListByUserID() { s.Require().Equal(int64(2), page.Total) } -func (s *ApiKeyRepoSuite) TestListByUserID_Pagination() { +func (s *APIKeyRepoSuite) TestListByUserID_Pagination() { user := s.mustCreateUser("paging@test.com") for i := 0; i < 5; i++ { s.mustCreateApiKey(user.ID, "sk-page-"+string(rune('a'+i)), "Key", nil) @@ -174,7 +174,7 @@ func (s *ApiKeyRepoSuite) TestListByUserID_Pagination() { s.Require().Equal(3, page.Pages) } -func (s *ApiKeyRepoSuite) TestCountByUserID() { +func (s *APIKeyRepoSuite) TestCountByUserID() { user := s.mustCreateUser("count@test.com") s.mustCreateApiKey(user.ID, "sk-count-1", "K1", nil) s.mustCreateApiKey(user.ID, "sk-count-2", "K2", nil) @@ -186,7 +186,7 @@ func (s *ApiKeyRepoSuite) TestCountByUserID() { // --- ListByGroupID / CountByGroupID --- -func (s *ApiKeyRepoSuite) TestListByGroupID() { +func (s *APIKeyRepoSuite) TestListByGroupID() { user := s.mustCreateUser("listbygroup@test.com") group := s.mustCreateGroup("g-list") @@ -202,7 +202,7 @@ func (s *ApiKeyRepoSuite) TestListByGroupID() { s.Require().NotNil(keys[0].User) } -func (s *ApiKeyRepoSuite) TestCountByGroupID() { +func (s *APIKeyRepoSuite) TestCountByGroupID() { user := s.mustCreateUser("countgroup@test.com") group := s.mustCreateGroup("g-count") s.mustCreateApiKey(user.ID, "sk-gc-1", "K1", &group.ID) @@ -214,7 +214,7 @@ func (s *ApiKeyRepoSuite) TestCountByGroupID() { // --- ExistsByKey --- -func (s *ApiKeyRepoSuite) TestExistsByKey() { +func (s *APIKeyRepoSuite) TestExistsByKey() { user := s.mustCreateUser("exists@test.com") s.mustCreateApiKey(user.ID, "sk-exists", "K", nil) @@ -227,41 +227,41 @@ func (s *ApiKeyRepoSuite) TestExistsByKey() { s.Require().False(notExists) } -// --- SearchApiKeys --- +// --- SearchAPIKeys --- -func (s *ApiKeyRepoSuite) TestSearchApiKeys() { +func (s *APIKeyRepoSuite) TestSearchAPIKeys() { user := s.mustCreateUser("search@test.com") s.mustCreateApiKey(user.ID, "sk-search-1", "Production Key", nil) s.mustCreateApiKey(user.ID, "sk-search-2", "Development Key", nil) - found, err := s.repo.SearchApiKeys(s.ctx, user.ID, "prod", 10) - s.Require().NoError(err, "SearchApiKeys") + found, err := s.repo.SearchAPIKeys(s.ctx, user.ID, "prod", 10) + s.Require().NoError(err, "SearchAPIKeys") s.Require().Len(found, 1) s.Require().Contains(found[0].Name, "Production") } -func (s *ApiKeyRepoSuite) TestSearchApiKeys_NoKeyword() { +func (s *APIKeyRepoSuite) TestSearchAPIKeys_NoKeyword() { user := s.mustCreateUser("searchnokw@test.com") s.mustCreateApiKey(user.ID, "sk-nk-1", "K1", 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().Len(found, 2) } -func (s *ApiKeyRepoSuite) TestSearchApiKeys_NoUserID() { +func (s *APIKeyRepoSuite) TestSearchAPIKeys_NoUserID() { user := s.mustCreateUser("searchnouid@test.com") 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().Len(found, 1) } // --- ClearGroupIDByGroupID --- -func (s *ApiKeyRepoSuite) TestClearGroupIDByGroupID() { +func (s *APIKeyRepoSuite) TestClearGroupIDByGroupID() { user := s.mustCreateUser("cleargrp@test.com") group := s.mustCreateGroup("g-clear-bulk") @@ -284,7 +284,7 @@ func (s *ApiKeyRepoSuite) TestClearGroupIDByGroupID() { // --- 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") group := s.mustCreateGroup("g-k") key := s.mustCreateApiKey(user.ID, "sk-test-1", "My Key", &group.ID) @@ -320,8 +320,8 @@ func (s *ApiKeyRepoSuite) TestCRUD_Search_ClearGroupID() { s.Require().NoError(err, "ExistsByKey") s.Require().True(exists, "expected key to exist") - found, err := s.repo.SearchApiKeys(s.ctx, user.ID, "renam", 10) - s.Require().NoError(err, "SearchApiKeys") + found, err := s.repo.SearchAPIKeys(s.ctx, user.ID, "renam", 10) + s.Require().NoError(err, "SearchAPIKeys") s.Require().Len(found, 1) s.Require().Equal(key.ID, found[0].ID) @@ -346,7 +346,7 @@ func (s *ApiKeyRepoSuite) TestCRUD_Search_ClearGroupID() { 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() u, err := s.client.User.Create(). @@ -359,7 +359,7 @@ func (s *ApiKeyRepoSuite) mustCreateUser(email string) *service.User { return userEntityToService(u) } -func (s *ApiKeyRepoSuite) mustCreateGroup(name string) *service.Group { +func (s *APIKeyRepoSuite) mustCreateGroup(name string) *service.Group { s.T().Helper() g, err := s.client.Group.Create(). @@ -370,10 +370,10 @@ func (s *ApiKeyRepoSuite) mustCreateGroup(name string) *service.Group { 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() - k := &service.ApiKey{ + k := &service.APIKey{ UserID: userID, Key: key, Name: name, diff --git a/backend/internal/repository/ent.go b/backend/internal/repository/ent.go index d457ba72..9df74a83 100644 --- a/backend/internal/repository/ent.go +++ b/backend/internal/repository/ent.go @@ -1,4 +1,4 @@ -// Package infrastructure 提供应用程序的基础设施层组件。 +// Package repository 提供应用程序的基础设施层组件。 // 包括数据库连接初始化、ORM 客户端管理、Redis 连接、数据库迁移等核心功能。 package repository diff --git a/backend/internal/repository/fixtures_integration_test.go b/backend/internal/repository/fixtures_integration_test.go index ab8e8a4f..23adb4e4 100644 --- a/backend/internal/repository/fixtures_integration_test.go +++ b/backend/internal/repository/fixtures_integration_test.go @@ -243,7 +243,7 @@ func mustCreateAccount(t *testing.T, client *dbent.Client, a *service.Account) * 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() ctx := context.Background() @@ -257,7 +257,7 @@ func mustCreateApiKey(t *testing.T, client *dbent.Client, k *service.ApiKey) *se k.Name = "default" } - create := client.ApiKey.Create(). + create := client.APIKey.Create(). SetUserID(k.UserID). SetKey(k.Key). SetName(k.Name). diff --git a/backend/internal/repository/group_repo.go b/backend/internal/repository/group_repo.go index 53085247..c4597ce2 100644 --- a/backend/internal/repository/group_repo.go +++ b/backend/internal/repository/group_repo.go @@ -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. // 仅更新未软删除的记录,避免修改已删除数据,保证审计与历史回溯一致性。 - // 与 ApiKeyRepository 的软删除语义保持一致,减少跨模块行为差异。 - if _, err := txClient.ApiKey.Update(). + // 与 APIKeyRepository 的软删除语义保持一致,减少跨模块行为差异。 + if _, err := txClient.APIKey.Update(). Where(apikey.GroupIDEQ(id), apikey.DeletedAtIsNil()). ClearGroupID(). Save(ctx); err != nil { diff --git a/backend/internal/repository/soft_delete_ent_integration_test.go b/backend/internal/repository/soft_delete_ent_integration_test.go index e3560ab5..ef63fbee 100644 --- a/backend/internal/repository/soft_delete_ent_integration_test.go +++ b/backend/internal/repository/soft_delete_ent_integration_test.go @@ -41,8 +41,8 @@ func TestEntSoftDelete_ApiKey_DefaultFilterAndSkip(t *testing.T) { u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user")+"@example.com") - repo := NewApiKeyRepository(client) - key := &service.ApiKey{ + repo := NewAPIKeyRepository(client) + key := &service.APIKey{ UserID: u.ID, Key: uniqueSoftDeleteValue(t, "sk-soft-delete"), Name: "soft-delete", @@ -53,13 +53,13 @@ func TestEntSoftDelete_ApiKey_DefaultFilterAndSkip(t *testing.T) { require.NoError(t, repo.Delete(ctx, key.ID), "soft delete api key") _, 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.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)). Only(mixins.SkipSoftDelete(ctx)) require.NoError(t, err, "SkipSoftDelete should include soft-deleted rows") @@ -73,8 +73,8 @@ func TestEntSoftDelete_ApiKey_DeleteIdempotent(t *testing.T) { u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user2")+"@example.com") - repo := NewApiKeyRepository(client) - key := &service.ApiKey{ + repo := NewAPIKeyRepository(client) + key := &service.APIKey{ UserID: u.ID, Key: uniqueSoftDeleteValue(t, "sk-soft-delete2"), Name: "soft-delete2", @@ -93,8 +93,8 @@ func TestEntSoftDelete_ApiKey_HardDeleteViaSkipSoftDelete(t *testing.T) { u := createEntUser(t, ctx, client, uniqueSoftDeleteValue(t, "sd-user3")+"@example.com") - repo := NewApiKeyRepository(client) - key := &service.ApiKey{ + repo := NewAPIKeyRepository(client) + key := &service.APIKey{ UserID: u.ID, Key: uniqueSoftDeleteValue(t, "sk-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") // 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") - _, err = client.ApiKey.Query(). + _, err = client.APIKey.Query(). Where(apikey.IDEQ(key.ID)). Only(mixins.SkipSoftDelete(ctx)) require.True(t, dbent.IsNotFound(err), "expected row to be hard deleted") diff --git a/backend/internal/repository/usage_log_repo.go b/backend/internal/repository/usage_log_repo.go index 4056431d..aaa38f81 100644 --- a/backend/internal/repository/usage_log_repo.go +++ b/backend/internal/repository/usage_log_repo.go @@ -134,7 +134,7 @@ func (r *usageLogRepository) Create(ctx context.Context, log *service.UsageLog) args := []any{ log.UserID, - log.ApiKeyID, + log.APIKeyID, log.AccountID, requestIDArg, log.Model, @@ -162,7 +162,7 @@ func (r *usageLogRepository) Create(ctx context.Context, log *service.UsageLog) if err := scanSingleRow(ctx, sqlq, query, args, &log.ID, &log.CreatedAt); err != nil { if errors.Is(err, sql.ErrNoRows) && requestID != "" { selectQuery := "SELECT id, created_at FROM usage_logs WHERE request_id = $1 AND api_key_id = $2" - if err := scanSingleRow(ctx, sqlq, selectQuery, []any{requestID, log.ApiKeyID}, &log.ID, &log.CreatedAt); err != nil { + if err := scanSingleRow(ctx, sqlq, selectQuery, []any{requestID, log.APIKeyID}, &log.ID, &log.CreatedAt); err != nil { return false, err } log.RateMultiplier = rateMultiplier @@ -209,7 +209,7 @@ func (r *usageLogRepository) ListByUser(ctx context.Context, userID int64, param return r.listUsageLogsWithPagination(ctx, "WHERE user_id = $1", []any{userID}, params) } -func (r *usageLogRepository) ListByApiKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]service.UsageLog, *pagination.PaginationResult, error) { +func (r *usageLogRepository) ListByAPIKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]service.UsageLog, *pagination.PaginationResult, error) { return r.listUsageLogsWithPagination(ctx, "WHERE api_key_id = $1", []any{apiKeyID}, params) } @@ -296,8 +296,8 @@ func (r *usageLogRepository) GetDashboardStats(ctx context.Context) (*DashboardS r.sql, apiKeyStatsQuery, []any{service.StatusActive}, - &stats.TotalApiKeys, - &stats.ActiveApiKeys, + &stats.TotalAPIKeys, + &stats.ActiveAPIKeys, ); err != nil { return nil, err } @@ -444,8 +444,8 @@ func (r *usageLogRepository) GetUserStatsAggregated(ctx context.Context, userID return &stats, nil } -// GetApiKeyStatsAggregated returns aggregated usage statistics for an API key using database-level aggregation -func (r *usageLogRepository) GetApiKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) { +// GetAPIKeyStatsAggregated returns aggregated usage statistics for an API key using database-level aggregation +func (r *usageLogRepository) GetAPIKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) { query := ` SELECT COUNT(*) as total_requests, @@ -649,7 +649,7 @@ func resolveUsageStatsTimezone() string { return "UTC" } -func (r *usageLogRepository) ListByApiKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]service.UsageLog, *pagination.PaginationResult, error) { +func (r *usageLogRepository) ListByAPIKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]service.UsageLog, *pagination.PaginationResult, error) { query := "SELECT " + usageLogSelectColumns + " FROM usage_logs WHERE api_key_id = $1 AND created_at >= $2 AND created_at < $3 ORDER BY id DESC" logs, err := r.queryUsageLogs(ctx, query, apiKeyID, startTime, endTime) return logs, nil, err @@ -735,11 +735,11 @@ type ModelStat = usagestats.ModelStat // UserUsageTrendPoint represents user usage trend data point type UserUsageTrendPoint = usagestats.UserUsageTrendPoint -// ApiKeyUsageTrendPoint represents API key usage trend data point -type ApiKeyUsageTrendPoint = usagestats.ApiKeyUsageTrendPoint +// APIKeyUsageTrendPoint represents API key usage trend data point +type APIKeyUsageTrendPoint = usagestats.APIKeyUsageTrendPoint -// GetApiKeyUsageTrend returns usage trend data grouped by API key and date -func (r *usageLogRepository) GetApiKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) (results []ApiKeyUsageTrendPoint, err error) { +// GetAPIKeyUsageTrend returns usage trend data grouped by API key and date +func (r *usageLogRepository) GetAPIKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) (results []APIKeyUsageTrendPoint, err error) { dateFormat := "YYYY-MM-DD" if granularity == "hour" { dateFormat = "YYYY-MM-DD HH24:00" @@ -781,10 +781,10 @@ func (r *usageLogRepository) GetApiKeyUsageTrend(ctx context.Context, startTime, } }() - results = make([]ApiKeyUsageTrendPoint, 0) + results = make([]APIKeyUsageTrendPoint, 0) for rows.Next() { - var row ApiKeyUsageTrendPoint - if err = rows.Scan(&row.Date, &row.ApiKeyID, &row.KeyName, &row.Requests, &row.Tokens); err != nil { + var row APIKeyUsageTrendPoint + if err = rows.Scan(&row.Date, &row.APIKeyID, &row.KeyName, &row.Requests, &row.Tokens); err != nil { return nil, err } results = append(results, row) @@ -870,7 +870,7 @@ func (r *usageLogRepository) GetUserDashboardStats(ctx context.Context, userID i r.sql, "SELECT COUNT(*) FROM api_keys WHERE user_id = $1 AND deleted_at IS NULL", []any{userID}, - &stats.TotalApiKeys, + &stats.TotalAPIKeys, ); err != nil { return nil, err } @@ -879,7 +879,7 @@ func (r *usageLogRepository) GetUserDashboardStats(ctx context.Context, userID i r.sql, "SELECT COUNT(*) FROM api_keys WHERE user_id = $1 AND status = $2 AND deleted_at IS NULL", []any{userID, service.StatusActive}, - &stats.ActiveApiKeys, + &stats.ActiveAPIKeys, ); err != nil { return nil, err } @@ -1049,9 +1049,9 @@ func (r *usageLogRepository) ListWithFilters(ctx context.Context, params paginat conditions = append(conditions, fmt.Sprintf("user_id = $%d", len(args)+1)) args = append(args, filters.UserID) } - if filters.ApiKeyID > 0 { + if filters.APIKeyID > 0 { conditions = append(conditions, fmt.Sprintf("api_key_id = $%d", len(args)+1)) - args = append(args, filters.ApiKeyID) + args = append(args, filters.APIKeyID) } if filters.AccountID > 0 { conditions = append(conditions, fmt.Sprintf("account_id = $%d", len(args)+1)) @@ -1171,18 +1171,18 @@ func (r *usageLogRepository) GetBatchUserUsageStats(ctx context.Context, userIDs return result, nil } -// BatchApiKeyUsageStats represents usage stats for a single API key -type BatchApiKeyUsageStats = usagestats.BatchApiKeyUsageStats +// BatchAPIKeyUsageStats represents usage stats for a single API key +type BatchAPIKeyUsageStats = usagestats.BatchAPIKeyUsageStats -// GetBatchApiKeyUsageStats gets today and total actual_cost for multiple API keys -func (r *usageLogRepository) GetBatchApiKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*BatchApiKeyUsageStats, error) { - result := make(map[int64]*BatchApiKeyUsageStats) +// GetBatchAPIKeyUsageStats gets today and total actual_cost for multiple API keys +func (r *usageLogRepository) GetBatchAPIKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*BatchAPIKeyUsageStats, error) { + result := make(map[int64]*BatchAPIKeyUsageStats) if len(apiKeyIDs) == 0 { return result, nil } for _, id := range apiKeyIDs { - result[id] = &BatchApiKeyUsageStats{ApiKeyID: id} + result[id] = &BatchAPIKeyUsageStats{APIKeyID: id} } query := ` @@ -1608,7 +1608,7 @@ func (r *usageLogRepository) hydrateUsageLogAssociations(ctx context.Context, lo if err != nil { return err } - apiKeys, err := r.loadApiKeys(ctx, ids.apiKeyIDs) + apiKeys, err := r.loadAPIKeys(ctx, ids.apiKeyIDs) if err != nil { return err } @@ -1629,8 +1629,8 @@ func (r *usageLogRepository) hydrateUsageLogAssociations(ctx context.Context, lo if user, ok := users[logs[i].UserID]; ok { logs[i].User = user } - if key, ok := apiKeys[logs[i].ApiKeyID]; ok { - logs[i].ApiKey = key + if key, ok := apiKeys[logs[i].APIKeyID]; ok { + logs[i].APIKey = key } if acc, ok := accounts[logs[i].AccountID]; ok { logs[i].Account = acc @@ -1668,7 +1668,7 @@ func collectUsageLogIDs(logs []service.UsageLog) usageLogIDs { for i := range logs { userIDs[logs[i].UserID] = struct{}{} - apiKeyIDs[logs[i].ApiKeyID] = struct{}{} + apiKeyIDs[logs[i].APIKeyID] = struct{}{} accountIDs[logs[i].AccountID] = struct{}{} if logs[i].GroupID != nil { groupIDs[*logs[i].GroupID] = struct{}{} @@ -1702,12 +1702,12 @@ func (r *usageLogRepository) loadUsers(ctx context.Context, ids []int64) (map[in return out, nil } -func (r *usageLogRepository) loadApiKeys(ctx context.Context, ids []int64) (map[int64]*service.ApiKey, error) { - out := make(map[int64]*service.ApiKey) +func (r *usageLogRepository) loadAPIKeys(ctx context.Context, ids []int64) (map[int64]*service.APIKey, error) { + out := make(map[int64]*service.APIKey) if len(ids) == 0 { return out, nil } - models, err := r.client.ApiKey.Query().Where(dbapikey.IDIn(ids...)).All(ctx) + models, err := r.client.APIKey.Query().Where(dbapikey.IDIn(ids...)).All(ctx) if err != nil { return nil, err } @@ -1826,7 +1826,7 @@ func scanUsageLog(scanner interface{ Scan(...any) error }) (*service.UsageLog, e log := &service.UsageLog{ ID: id, UserID: userID, - ApiKeyID: apiKeyID, + APIKeyID: apiKeyID, AccountID: accountID, Model: model, InputTokens: inputTokens, diff --git a/backend/internal/repository/usage_log_repo_integration_test.go b/backend/internal/repository/usage_log_repo_integration_test.go index 05fe984b..7193718f 100644 --- a/backend/internal/repository/usage_log_repo_integration_test.go +++ b/backend/internal/repository/usage_log_repo_integration_test.go @@ -37,10 +37,10 @@ func TestUsageLogRepoSuite(t *testing.T) { suite.Run(t, new(UsageLogRepoSuite)) } -func (s *UsageLogRepoSuite) createUsageLog(user *service.User, apiKey *service.ApiKey, account *service.Account, inputTokens, outputTokens int, cost float64, createdAt time.Time) *service.UsageLog { +func (s *UsageLogRepoSuite) createUsageLog(user *service.User, apiKey *service.APIKey, account *service.Account, inputTokens, outputTokens int, cost float64, createdAt time.Time) *service.UsageLog { log := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, RequestID: uuid.New().String(), // Generate unique RequestID for each log Model: "claude-3", @@ -59,12 +59,12 @@ func (s *UsageLogRepoSuite) createUsageLog(user *service.User, apiKey *service.A func (s *UsageLogRepoSuite) TestCreate() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "create@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-create", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-create", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-create"}) log := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3", InputTokens: 10, @@ -80,7 +80,7 @@ func (s *UsageLogRepoSuite) TestCreate() { func (s *UsageLogRepoSuite) TestGetByID() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "getbyid@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-getbyid", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-getbyid", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-getbyid"}) log := s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -100,7 +100,7 @@ func (s *UsageLogRepoSuite) TestGetByID_NotFound() { func (s *UsageLogRepoSuite) TestDelete() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "delete@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-delete", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-delete", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-delete"}) log := s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -116,7 +116,7 @@ func (s *UsageLogRepoSuite) TestDelete() { func (s *UsageLogRepoSuite) TestListByUser() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "listbyuser@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-listbyuser", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-listbyuser", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-listbyuser"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -128,18 +128,18 @@ func (s *UsageLogRepoSuite) TestListByUser() { s.Require().Equal(int64(2), page.Total) } -// --- ListByApiKey --- +// --- ListByAPIKey --- -func (s *UsageLogRepoSuite) TestListByApiKey() { +func (s *UsageLogRepoSuite) TestListByAPIKey() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "listbyapikey@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-listbyapikey", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-listbyapikey", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-listbyapikey"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) s.createUsageLog(user, apiKey, account, 15, 25, 0.6, time.Now()) - logs, page, err := s.repo.ListByApiKey(s.ctx, apiKey.ID, pagination.PaginationParams{Page: 1, PageSize: 10}) - s.Require().NoError(err, "ListByApiKey") + logs, page, err := s.repo.ListByAPIKey(s.ctx, apiKey.ID, pagination.PaginationParams{Page: 1, PageSize: 10}) + s.Require().NoError(err, "ListByAPIKey") s.Require().Len(logs, 2) s.Require().Equal(int64(2), page.Total) } @@ -148,7 +148,7 @@ func (s *UsageLogRepoSuite) TestListByApiKey() { func (s *UsageLogRepoSuite) TestListByAccount() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "listbyaccount@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-listbyaccount", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-listbyaccount", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-listbyaccount"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -163,7 +163,7 @@ func (s *UsageLogRepoSuite) TestListByAccount() { func (s *UsageLogRepoSuite) TestGetUserStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "userstats@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-userstats", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-userstats", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-userstats"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -183,7 +183,7 @@ func (s *UsageLogRepoSuite) TestGetUserStats() { func (s *UsageLogRepoSuite) TestListWithFilters() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "filters@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-filters", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-filters", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-filters"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -215,8 +215,8 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { }) group := mustCreateGroup(s.T(), s.client, &service.Group{Name: "g-ul"}) - apiKey1 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: userToday.ID, Key: "sk-ul-1", Name: "ul1"}) - mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: userOld.ID, Key: "sk-ul-2", Name: "ul2", Status: service.StatusDisabled}) + apiKey1 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: userToday.ID, Key: "sk-ul-1", Name: "ul1"}) + mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: userOld.ID, Key: "sk-ul-2", Name: "ul2", Status: service.StatusDisabled}) resetAt := now.Add(10 * time.Minute) accNormal := mustCreateAccount(s.T(), s.client, &service.Account{Name: "a-normal", Schedulable: true}) @@ -227,7 +227,7 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { d1, d2, d3 := 100, 200, 300 logToday := &service.UsageLog{ UserID: userToday.ID, - ApiKeyID: apiKey1.ID, + APIKeyID: apiKey1.ID, AccountID: accNormal.ID, Model: "claude-3", GroupID: &group.ID, @@ -245,7 +245,7 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { logOld := &service.UsageLog{ UserID: userOld.ID, - ApiKeyID: apiKey1.ID, + APIKeyID: apiKey1.ID, AccountID: accNormal.ID, Model: "claude-3", InputTokens: 5, @@ -260,7 +260,7 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { logPerf := &service.UsageLog{ UserID: userToday.ID, - ApiKeyID: apiKey1.ID, + APIKeyID: apiKey1.ID, AccountID: accNormal.ID, Model: "claude-3", InputTokens: 1, @@ -279,8 +279,8 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { s.Require().Equal(baseStats.TotalUsers+2, stats.TotalUsers, "TotalUsers mismatch") s.Require().Equal(baseStats.TodayNewUsers+1, stats.TodayNewUsers, "TodayNewUsers mismatch") s.Require().Equal(baseStats.ActiveUsers+1, stats.ActiveUsers, "ActiveUsers mismatch") - s.Require().Equal(baseStats.TotalApiKeys+2, stats.TotalApiKeys, "TotalApiKeys mismatch") - s.Require().Equal(baseStats.ActiveApiKeys+1, stats.ActiveApiKeys, "ActiveApiKeys mismatch") + s.Require().Equal(baseStats.TotalAPIKeys+2, stats.TotalAPIKeys, "TotalAPIKeys mismatch") + s.Require().Equal(baseStats.ActiveAPIKeys+1, stats.ActiveAPIKeys, "ActiveAPIKeys mismatch") s.Require().Equal(baseStats.TotalAccounts+4, stats.TotalAccounts, "TotalAccounts mismatch") s.Require().Equal(baseStats.ErrorAccounts+1, stats.ErrorAccounts, "ErrorAccounts mismatch") s.Require().Equal(baseStats.RateLimitAccounts+1, stats.RateLimitAccounts, "RateLimitAccounts mismatch") @@ -307,14 +307,14 @@ func (s *UsageLogRepoSuite) TestDashboardStats_TodayTotalsAndPerformance() { func (s *UsageLogRepoSuite) TestGetUserDashboardStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "userdash@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-userdash", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-userdash", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-userdash"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) stats, err := s.repo.GetUserDashboardStats(s.ctx, user.ID) s.Require().NoError(err, "GetUserDashboardStats") - s.Require().Equal(int64(1), stats.TotalApiKeys) + s.Require().Equal(int64(1), stats.TotalAPIKeys) s.Require().Equal(int64(1), stats.TotalRequests) } @@ -322,7 +322,7 @@ func (s *UsageLogRepoSuite) TestGetUserDashboardStats() { func (s *UsageLogRepoSuite) TestGetAccountTodayStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "acctoday@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-acctoday", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-acctoday", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-today"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) @@ -338,8 +338,8 @@ func (s *UsageLogRepoSuite) TestGetAccountTodayStats() { func (s *UsageLogRepoSuite) TestGetBatchUserUsageStats() { user1 := mustCreateUser(s.T(), s.client, &service.User{Email: "batch1@test.com"}) user2 := mustCreateUser(s.T(), s.client, &service.User{Email: "batch2@test.com"}) - apiKey1 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user1.ID, Key: "sk-batch1", Name: "k"}) - apiKey2 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user2.ID, Key: "sk-batch2", Name: "k"}) + apiKey1 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user1.ID, Key: "sk-batch1", Name: "k"}) + apiKey2 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user2.ID, Key: "sk-batch2", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-batch"}) s.createUsageLog(user1, apiKey1, account, 10, 20, 0.5, time.Now()) @@ -358,24 +358,24 @@ func (s *UsageLogRepoSuite) TestGetBatchUserUsageStats_Empty() { s.Require().Empty(stats) } -// --- GetBatchApiKeyUsageStats --- +// --- GetBatchAPIKeyUsageStats --- func (s *UsageLogRepoSuite) TestGetBatchApiKeyUsageStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "batchkey@test.com"}) - apiKey1 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-batchkey1", Name: "k1"}) - apiKey2 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-batchkey2", Name: "k2"}) + apiKey1 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-batchkey1", Name: "k1"}) + apiKey2 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-batchkey2", Name: "k2"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-batchkey"}) s.createUsageLog(user, apiKey1, account, 10, 20, 0.5, time.Now()) s.createUsageLog(user, apiKey2, account, 15, 25, 0.6, time.Now()) - stats, err := s.repo.GetBatchApiKeyUsageStats(s.ctx, []int64{apiKey1.ID, apiKey2.ID}) - s.Require().NoError(err, "GetBatchApiKeyUsageStats") + stats, err := s.repo.GetBatchAPIKeyUsageStats(s.ctx, []int64{apiKey1.ID, apiKey2.ID}) + s.Require().NoError(err, "GetBatchAPIKeyUsageStats") s.Require().Len(stats, 2) } func (s *UsageLogRepoSuite) TestGetBatchApiKeyUsageStats_Empty() { - stats, err := s.repo.GetBatchApiKeyUsageStats(s.ctx, []int64{}) + stats, err := s.repo.GetBatchAPIKeyUsageStats(s.ctx, []int64{}) s.Require().NoError(err) s.Require().Empty(stats) } @@ -384,7 +384,7 @@ func (s *UsageLogRepoSuite) TestGetBatchApiKeyUsageStats_Empty() { func (s *UsageLogRepoSuite) TestGetGlobalStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "global@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-global", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-global", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-global"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -409,7 +409,7 @@ func maxTime(a, b time.Time) time.Time { func (s *UsageLogRepoSuite) TestListByUserAndTimeRange() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "timerange@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-timerange", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-timerange", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-timerange"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -424,11 +424,11 @@ func (s *UsageLogRepoSuite) TestListByUserAndTimeRange() { s.Require().Len(logs, 2) } -// --- ListByApiKeyAndTimeRange --- +// --- ListByAPIKeyAndTimeRange --- -func (s *UsageLogRepoSuite) TestListByApiKeyAndTimeRange() { +func (s *UsageLogRepoSuite) TestListByAPIKeyAndTimeRange() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "keytimerange@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-keytimerange", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-keytimerange", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-keytimerange"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -438,8 +438,8 @@ func (s *UsageLogRepoSuite) TestListByApiKeyAndTimeRange() { startTime := base.Add(-1 * time.Hour) endTime := base.Add(2 * time.Hour) - logs, _, err := s.repo.ListByApiKeyAndTimeRange(s.ctx, apiKey.ID, startTime, endTime) - s.Require().NoError(err, "ListByApiKeyAndTimeRange") + logs, _, err := s.repo.ListByAPIKeyAndTimeRange(s.ctx, apiKey.ID, startTime, endTime) + s.Require().NoError(err, "ListByAPIKeyAndTimeRange") s.Require().Len(logs, 2) } @@ -447,7 +447,7 @@ func (s *UsageLogRepoSuite) TestListByApiKeyAndTimeRange() { func (s *UsageLogRepoSuite) TestListByAccountAndTimeRange() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "acctimerange@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-acctimerange", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-acctimerange", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-acctimerange"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -466,7 +466,7 @@ func (s *UsageLogRepoSuite) TestListByAccountAndTimeRange() { func (s *UsageLogRepoSuite) TestListByModelAndTimeRange() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "modeltimerange@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-modeltimerange", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-modeltimerange", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-modeltimerange"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -474,7 +474,7 @@ func (s *UsageLogRepoSuite) TestListByModelAndTimeRange() { // Create logs with different models log1 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-opus", InputTokens: 10, @@ -488,7 +488,7 @@ func (s *UsageLogRepoSuite) TestListByModelAndTimeRange() { log2 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-opus", InputTokens: 15, @@ -502,7 +502,7 @@ func (s *UsageLogRepoSuite) TestListByModelAndTimeRange() { log3 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-sonnet", InputTokens: 20, @@ -525,7 +525,7 @@ func (s *UsageLogRepoSuite) TestListByModelAndTimeRange() { func (s *UsageLogRepoSuite) TestGetAccountWindowStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "windowstats@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-windowstats", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-windowstats", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-windowstats"}) now := time.Now() @@ -545,7 +545,7 @@ func (s *UsageLogRepoSuite) TestGetAccountWindowStats() { func (s *UsageLogRepoSuite) TestGetUserUsageTrendByUserID() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "usertrend@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-usertrend", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-usertrend", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-usertrend"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -562,7 +562,7 @@ func (s *UsageLogRepoSuite) TestGetUserUsageTrendByUserID() { func (s *UsageLogRepoSuite) TestGetUserUsageTrendByUserID_HourlyGranularity() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "usertrendhourly@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-usertrendhourly", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-usertrendhourly", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-usertrendhourly"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -581,7 +581,7 @@ func (s *UsageLogRepoSuite) TestGetUserUsageTrendByUserID_HourlyGranularity() { func (s *UsageLogRepoSuite) TestGetUserModelStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "modelstats@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-modelstats", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-modelstats", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-modelstats"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -589,7 +589,7 @@ func (s *UsageLogRepoSuite) TestGetUserModelStats() { // Create logs with different models log1 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-opus", InputTokens: 100, @@ -603,7 +603,7 @@ func (s *UsageLogRepoSuite) TestGetUserModelStats() { log2 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-sonnet", InputTokens: 50, @@ -630,7 +630,7 @@ func (s *UsageLogRepoSuite) TestGetUserModelStats() { func (s *UsageLogRepoSuite) TestGetUsageTrendWithFilters() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "trendfilters@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-trendfilters", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-trendfilters", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-trendfilters"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -658,7 +658,7 @@ func (s *UsageLogRepoSuite) TestGetUsageTrendWithFilters() { func (s *UsageLogRepoSuite) TestGetUsageTrendWithFilters_HourlyGranularity() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "trendfilters-h@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-trendfilters-h", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-trendfilters-h", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-trendfilters-h"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -677,14 +677,14 @@ func (s *UsageLogRepoSuite) TestGetUsageTrendWithFilters_HourlyGranularity() { func (s *UsageLogRepoSuite) TestGetModelStatsWithFilters() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "modelfilters@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-modelfilters", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-modelfilters", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-modelfilters"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) log1 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-opus", InputTokens: 100, @@ -698,7 +698,7 @@ func (s *UsageLogRepoSuite) TestGetModelStatsWithFilters() { log2 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-sonnet", InputTokens: 50, @@ -733,7 +733,7 @@ func (s *UsageLogRepoSuite) TestGetModelStatsWithFilters() { func (s *UsageLogRepoSuite) TestGetAccountUsageStats() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "accstats@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-accstats", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-accstats", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-accstats"}) base := time.Date(2025, 1, 15, 0, 0, 0, 0, time.UTC) @@ -741,7 +741,7 @@ func (s *UsageLogRepoSuite) TestGetAccountUsageStats() { // Create logs on different days log1 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-opus", InputTokens: 100, @@ -755,7 +755,7 @@ func (s *UsageLogRepoSuite) TestGetAccountUsageStats() { log2 := &service.UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, Model: "claude-3-sonnet", InputTokens: 50, @@ -798,8 +798,8 @@ func (s *UsageLogRepoSuite) TestGetAccountUsageStats_EmptyRange() { func (s *UsageLogRepoSuite) TestGetUserUsageTrend() { user1 := mustCreateUser(s.T(), s.client, &service.User{Email: "usertrend1@test.com"}) user2 := mustCreateUser(s.T(), s.client, &service.User{Email: "usertrend2@test.com"}) - apiKey1 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user1.ID, Key: "sk-usertrend1", Name: "k1"}) - apiKey2 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user2.ID, Key: "sk-usertrend2", Name: "k2"}) + apiKey1 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user1.ID, Key: "sk-usertrend1", Name: "k1"}) + apiKey2 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user2.ID, Key: "sk-usertrend2", Name: "k2"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-usertrends"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -815,12 +815,12 @@ func (s *UsageLogRepoSuite) TestGetUserUsageTrend() { s.Require().GreaterOrEqual(len(trend), 2) } -// --- GetApiKeyUsageTrend --- +// --- GetAPIKeyUsageTrend --- -func (s *UsageLogRepoSuite) TestGetApiKeyUsageTrend() { +func (s *UsageLogRepoSuite) TestGetAPIKeyUsageTrend() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "keytrend@test.com"}) - apiKey1 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-keytrend1", Name: "k1"}) - apiKey2 := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-keytrend2", Name: "k2"}) + apiKey1 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-keytrend1", Name: "k1"}) + apiKey2 := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-keytrend2", Name: "k2"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-keytrends"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -831,14 +831,14 @@ func (s *UsageLogRepoSuite) TestGetApiKeyUsageTrend() { startTime := base.Add(-1 * time.Hour) endTime := base.Add(48 * time.Hour) - trend, err := s.repo.GetApiKeyUsageTrend(s.ctx, startTime, endTime, "day", 10) - s.Require().NoError(err, "GetApiKeyUsageTrend") + trend, err := s.repo.GetAPIKeyUsageTrend(s.ctx, startTime, endTime, "day", 10) + s.Require().NoError(err, "GetAPIKeyUsageTrend") s.Require().GreaterOrEqual(len(trend), 2) } -func (s *UsageLogRepoSuite) TestGetApiKeyUsageTrend_HourlyGranularity() { +func (s *UsageLogRepoSuite) TestGetAPIKeyUsageTrend_HourlyGranularity() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "keytrendh@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-keytrendh", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-keytrendh", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-keytrendh"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -848,8 +848,8 @@ func (s *UsageLogRepoSuite) TestGetApiKeyUsageTrend_HourlyGranularity() { startTime := base.Add(-1 * time.Hour) endTime := base.Add(3 * time.Hour) - trend, err := s.repo.GetApiKeyUsageTrend(s.ctx, startTime, endTime, "hour", 10) - s.Require().NoError(err, "GetApiKeyUsageTrend hourly") + trend, err := s.repo.GetAPIKeyUsageTrend(s.ctx, startTime, endTime, "hour", 10) + s.Require().NoError(err, "GetAPIKeyUsageTrend hourly") s.Require().Len(trend, 2) } @@ -857,12 +857,12 @@ func (s *UsageLogRepoSuite) TestGetApiKeyUsageTrend_HourlyGranularity() { func (s *UsageLogRepoSuite) TestListWithFilters_ApiKeyFilter() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "filterskey@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-filterskey", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-filterskey", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-filterskey"}) s.createUsageLog(user, apiKey, account, 10, 20, 0.5, time.Now()) - filters := usagestats.UsageLogFilters{ApiKeyID: apiKey.ID} + filters := usagestats.UsageLogFilters{APIKeyID: apiKey.ID} logs, page, err := s.repo.ListWithFilters(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, filters) s.Require().NoError(err, "ListWithFilters apiKey") s.Require().Len(logs, 1) @@ -871,7 +871,7 @@ func (s *UsageLogRepoSuite) TestListWithFilters_ApiKeyFilter() { func (s *UsageLogRepoSuite) TestListWithFilters_TimeRange() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "filterstime@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-filterstime", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-filterstime", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-filterstime"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -890,7 +890,7 @@ func (s *UsageLogRepoSuite) TestListWithFilters_TimeRange() { func (s *UsageLogRepoSuite) TestListWithFilters_CombinedFilters() { user := mustCreateUser(s.T(), s.client, &service.User{Email: "filterscombined@test.com"}) - apiKey := mustCreateApiKey(s.T(), s.client, &service.ApiKey{UserID: user.ID, Key: "sk-filterscombined", Name: "k"}) + apiKey := mustCreateApiKey(s.T(), s.client, &service.APIKey{UserID: user.ID, Key: "sk-filterscombined", Name: "k"}) account := mustCreateAccount(s.T(), s.client, &service.Account{Name: "acc-filterscombined"}) base := time.Date(2025, 1, 15, 12, 0, 0, 0, time.UTC) @@ -901,7 +901,7 @@ func (s *UsageLogRepoSuite) TestListWithFilters_CombinedFilters() { endTime := base.Add(2 * time.Hour) filters := usagestats.UsageLogFilters{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, StartTime: &startTime, EndTime: &endTime, } diff --git a/backend/internal/repository/wire.go b/backend/internal/repository/wire.go index 198aed48..f7574563 100644 --- a/backend/internal/repository/wire.go +++ b/backend/internal/repository/wire.go @@ -28,7 +28,7 @@ func ProvideConcurrencyCache(rdb *redis.Client, cfg *config.Config) service.Conc // ProviderSet is the Wire provider set for all repositories var ProviderSet = wire.NewSet( NewUserRepository, - NewApiKeyRepository, + NewAPIKeyRepository, NewGroupRepository, NewAccountRepository, NewProxyRepository, @@ -42,7 +42,7 @@ var ProviderSet = wire.NewSet( // Cache implementations NewGatewayCache, NewBillingCache, - NewApiKeyCache, + NewAPIKeyCache, NewTempUnschedCache, ProvideConcurrencyCache, NewEmailCache, diff --git a/backend/internal/server/api_contract_test.go b/backend/internal/server/api_contract_test.go index 46c3aba9..6b8af91e 100644 --- a/backend/internal/server/api_contract_test.go +++ b/backend/internal/server/api_contract_test.go @@ -91,7 +91,7 @@ func TestAPIContracts(t *testing.T) { name: "GET /api/v1/keys (paginated)", setup: func(t *testing.T, deps *contractDeps) { t.Helper() - deps.apiKeyRepo.MustSeed(&service.ApiKey{ + deps.apiKeyRepo.MustSeed(&service.APIKey{ ID: 100, UserID: 1, Key: "sk_custom_1234567890", @@ -135,7 +135,7 @@ func TestAPIContracts(t *testing.T) { { ID: 1, UserID: 1, - ApiKeyID: 100, + APIKeyID: 100, AccountID: 200, Model: "claude-3", InputTokens: 10, @@ -150,7 +150,7 @@ func TestAPIContracts(t *testing.T) { { ID: 2, UserID: 1, - ApiKeyID: 100, + APIKeyID: 100, AccountID: 200, Model: "claude-3", InputTokens: 5, @@ -188,7 +188,7 @@ func TestAPIContracts(t *testing.T) { { ID: 1, UserID: 1, - ApiKeyID: 100, + APIKeyID: 100, AccountID: 200, RequestID: "req_123", Model: "claude-3", @@ -259,13 +259,13 @@ func TestAPIContracts(t *testing.T) { service.SettingKeyRegistrationEnabled: "true", service.SettingKeyEmailVerifyEnabled: "false", - service.SettingKeySmtpHost: "smtp.example.com", - service.SettingKeySmtpPort: "587", - service.SettingKeySmtpUsername: "user", - service.SettingKeySmtpPassword: "secret", - service.SettingKeySmtpFrom: "no-reply@example.com", - service.SettingKeySmtpFromName: "Sub2API", - service.SettingKeySmtpUseTLS: "true", + service.SettingKeySMTPHost: "smtp.example.com", + service.SettingKeySMTPPort: "587", + service.SettingKeySMTPUsername: "user", + service.SettingKeySMTPPassword: "secret", + service.SettingKeySMTPFrom: "no-reply@example.com", + service.SettingKeySMTPFromName: "Sub2API", + service.SettingKeySMTPUseTLS: "true", service.SettingKeyTurnstileEnabled: "true", service.SettingKeyTurnstileSiteKey: "site-key", @@ -274,9 +274,9 @@ func TestAPIContracts(t *testing.T) { service.SettingKeySiteName: "Sub2API", service.SettingKeySiteLogo: "", service.SettingKeySiteSubtitle: "Subtitle", - service.SettingKeyApiBaseUrl: "https://api.example.com", + service.SettingKeyAPIBaseURL: "https://api.example.com", service.SettingKeyContactInfo: "support", - service.SettingKeyDocUrl: "https://docs.example.com", + service.SettingKeyDocURL: "https://docs.example.com", service.SettingKeyDefaultConcurrency: "5", service.SettingKeyDefaultBalance: "1.25", @@ -371,13 +371,13 @@ func newContractDeps(t *testing.T) *contractDeps { cfg := &config.Config{ Default: config.DefaultConfig{ - ApiKeyPrefix: "sk-", + APIKeyPrefix: "sk-", }, RunMode: config.RunModeStandard, } userService := service.NewUserService(userRepo) - apiKeyService := service.NewApiKeyService(apiKeyRepo, userRepo, groupRepo, userSubRepo, apiKeyCache, cfg) + apiKeyService := service.NewAPIKeyService(apiKeyRepo, userRepo, groupRepo, userSubRepo, apiKeyCache, cfg) usageRepo := newStubUsageLogRepo() usageService := service.NewUsageService(usageRepo, userRepo, nil) @@ -669,20 +669,20 @@ type stubApiKeyRepo struct { now time.Time nextID int64 - byID map[int64]*service.ApiKey - byKey map[string]*service.ApiKey + byID map[int64]*service.APIKey + byKey map[string]*service.APIKey } func newStubApiKeyRepo(now time.Time) *stubApiKeyRepo { return &stubApiKeyRepo{ now: now, nextID: 100, - byID: make(map[int64]*service.ApiKey), - byKey: make(map[string]*service.ApiKey), + byID: make(map[int64]*service.APIKey), + byKey: make(map[string]*service.APIKey), } } -func (r *stubApiKeyRepo) MustSeed(key *service.ApiKey) { +func (r *stubApiKeyRepo) MustSeed(key *service.APIKey) { if key == nil { return } @@ -691,7 +691,7 @@ func (r *stubApiKeyRepo) MustSeed(key *service.ApiKey) { r.byKey[clone.Key] = &clone } -func (r *stubApiKeyRepo) Create(ctx context.Context, key *service.ApiKey) error { +func (r *stubApiKeyRepo) Create(ctx context.Context, key *service.APIKey) error { if key == nil { return errors.New("nil key") } @@ -711,10 +711,10 @@ func (r *stubApiKeyRepo) Create(ctx context.Context, key *service.ApiKey) error return nil } -func (r *stubApiKeyRepo) GetByID(ctx context.Context, id int64) (*service.ApiKey, error) { +func (r *stubApiKeyRepo) GetByID(ctx context.Context, id int64) (*service.APIKey, error) { key, ok := r.byID[id] if !ok { - return nil, service.ErrApiKeyNotFound + return nil, service.ErrAPIKeyNotFound } clone := *key return &clone, nil @@ -723,26 +723,26 @@ func (r *stubApiKeyRepo) GetByID(ctx context.Context, id int64) (*service.ApiKey func (r *stubApiKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error) { key, ok := r.byID[id] if !ok { - return 0, service.ErrApiKeyNotFound + return 0, service.ErrAPIKeyNotFound } return key.UserID, nil } -func (r *stubApiKeyRepo) GetByKey(ctx context.Context, key string) (*service.ApiKey, error) { +func (r *stubApiKeyRepo) GetByKey(ctx context.Context, key string) (*service.APIKey, error) { found, ok := r.byKey[key] if !ok { - return nil, service.ErrApiKeyNotFound + return nil, service.ErrAPIKeyNotFound } clone := *found return &clone, nil } -func (r *stubApiKeyRepo) Update(ctx context.Context, key *service.ApiKey) error { +func (r *stubApiKeyRepo) Update(ctx context.Context, key *service.APIKey) error { if key == nil { return errors.New("nil key") } if _, ok := r.byID[key.ID]; !ok { - return service.ErrApiKeyNotFound + return service.ErrAPIKeyNotFound } if key.UpdatedAt.IsZero() { key.UpdatedAt = r.now @@ -756,14 +756,14 @@ func (r *stubApiKeyRepo) Update(ctx context.Context, key *service.ApiKey) error func (r *stubApiKeyRepo) Delete(ctx context.Context, id int64) error { key, ok := r.byID[id] if !ok { - return service.ErrApiKeyNotFound + return service.ErrAPIKeyNotFound } delete(r.byID, id) delete(r.byKey, key.Key) return nil } -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) { ids := make([]int64, 0, len(r.byID)) for id := range r.byID { if r.byID[id].UserID == userID { @@ -781,7 +781,7 @@ func (r *stubApiKeyRepo) ListByUserID(ctx context.Context, userID int64, params end = len(ids) } - out := make([]service.ApiKey, 0, end-start) + out := make([]service.APIKey, 0, end-start) for _, id := range ids[start:end] { clone := *r.byID[id] out = append(out, clone) @@ -835,11 +835,11 @@ func (r *stubApiKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, err return ok, nil } -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") } -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") } @@ -882,7 +882,7 @@ func (r *stubUsageLogRepo) ListByUser(ctx context.Context, userID int64, params return out, paginationResult(total, params), nil } -func (r *stubUsageLogRepo) ListByApiKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]service.UsageLog, *pagination.PaginationResult, error) { +func (r *stubUsageLogRepo) ListByAPIKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]service.UsageLog, *pagination.PaginationResult, error) { return nil, nil, errors.New("not implemented") } @@ -895,7 +895,7 @@ func (r *stubUsageLogRepo) ListByUserAndTimeRange(ctx context.Context, userID in return logs, paginationResult(int64(len(logs)), pagination.PaginationParams{Page: 1, PageSize: 100}), nil } -func (r *stubUsageLogRepo) ListByApiKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]service.UsageLog, *pagination.PaginationResult, error) { +func (r *stubUsageLogRepo) ListByAPIKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]service.UsageLog, *pagination.PaginationResult, error) { return nil, nil, errors.New("not implemented") } @@ -927,7 +927,7 @@ func (r *stubUsageLogRepo) GetModelStatsWithFilters(ctx context.Context, startTi return nil, errors.New("not implemented") } -func (r *stubUsageLogRepo) GetApiKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.ApiKeyUsageTrendPoint, error) { +func (r *stubUsageLogRepo) GetAPIKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.APIKeyUsageTrendPoint, error) { return nil, errors.New("not implemented") } @@ -980,7 +980,7 @@ func (r *stubUsageLogRepo) GetUserStatsAggregated(ctx context.Context, userID in }, nil } -func (r *stubUsageLogRepo) GetApiKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) { +func (r *stubUsageLogRepo) GetAPIKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) { return nil, errors.New("not implemented") } @@ -1000,7 +1000,7 @@ func (r *stubUsageLogRepo) GetBatchUserUsageStats(ctx context.Context, userIDs [ return nil, errors.New("not implemented") } -func (r *stubUsageLogRepo) GetBatchApiKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchApiKeyUsageStats, error) { +func (r *stubUsageLogRepo) GetBatchAPIKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchAPIKeyUsageStats, error) { return nil, errors.New("not implemented") } @@ -1022,8 +1022,8 @@ func (r *stubUsageLogRepo) ListWithFilters(ctx context.Context, params paginatio // Apply filters var filtered []service.UsageLog for _, log := range logs { - // Apply ApiKeyID filter - if filters.ApiKeyID > 0 && log.ApiKeyID != filters.ApiKeyID { + // Apply APIKeyID filter + if filters.APIKeyID > 0 && log.APIKeyID != filters.APIKeyID { continue } // Apply Model filter @@ -1156,8 +1156,8 @@ func paginationResult(total int64, params pagination.PaginationParams) *paginati // Ensure compile-time interface compliance. var ( _ service.UserRepository = (*stubUserRepo)(nil) - _ service.ApiKeyRepository = (*stubApiKeyRepo)(nil) - _ service.ApiKeyCache = (*stubApiKeyCache)(nil) + _ service.APIKeyRepository = (*stubApiKeyRepo)(nil) + _ service.APIKeyCache = (*stubApiKeyCache)(nil) _ service.GroupRepository = (*stubGroupRepo)(nil) _ service.UserSubscriptionRepository = (*stubUserSubscriptionRepo)(nil) _ service.UsageLogRepository = (*stubUsageLogRepo)(nil) diff --git a/backend/internal/server/http.go b/backend/internal/server/http.go index b64220d9..0239410a 100644 --- a/backend/internal/server/http.go +++ b/backend/internal/server/http.go @@ -1,3 +1,4 @@ +// Package server provides HTTP server initialization and configuration. package server import ( @@ -25,8 +26,8 @@ func ProvideRouter( handlers *handler.Handlers, jwtAuth middleware2.JWTAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware, - apiKeyAuth middleware2.ApiKeyAuthMiddleware, - apiKeyService *service.ApiKeyService, + apiKeyAuth middleware2.APIKeyAuthMiddleware, + apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, ) *gin.Engine { if cfg.Server.Mode == "release" { diff --git a/backend/internal/server/middleware/admin_auth.go b/backend/internal/server/middleware/admin_auth.go index 4f22d80c..e02a7b0a 100644 --- a/backend/internal/server/middleware/admin_auth.go +++ b/backend/internal/server/middleware/admin_auth.go @@ -1,3 +1,4 @@ +// Package middleware provides HTTP middleware for authentication, authorization, and request processing. package middleware import ( @@ -32,7 +33,7 @@ func adminAuth( // 检查 x-api-key header(Admin API Key 认证) apiKey := c.GetHeader("x-api-key") if apiKey != "" { - if !validateAdminApiKey(c, apiKey, settingService, userService) { + if !validateAdminAPIKey(c, apiKey, settingService, userService) { return } c.Next() @@ -57,14 +58,14 @@ func adminAuth( } } -// validateAdminApiKey 验证管理员 API Key -func validateAdminApiKey( +// validateAdminAPIKey 验证管理员 API Key +func validateAdminAPIKey( c *gin.Context, key string, settingService *service.SettingService, userService *service.UserService, ) bool { - storedKey, err := settingService.GetAdminApiKey(c.Request.Context()) + storedKey, err := settingService.GetAdminAPIKey(c.Request.Context()) if err != nil { AbortWithError(c, 500, "INTERNAL_ERROR", "Internal server error") return false diff --git a/backend/internal/server/middleware/api_key_auth.go b/backend/internal/server/middleware/api_key_auth.go index 75e508dd..eb8c2aff 100644 --- a/backend/internal/server/middleware/api_key_auth.go +++ b/backend/internal/server/middleware/api_key_auth.go @@ -11,13 +11,13 @@ import ( "github.com/gin-gonic/gin" ) -// NewApiKeyAuthMiddleware 创建 API Key 认证中间件 -func NewApiKeyAuthMiddleware(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) ApiKeyAuthMiddleware { - return ApiKeyAuthMiddleware(apiKeyAuthWithSubscription(apiKeyService, subscriptionService, cfg)) +// NewAPIKeyAuthMiddleware 创建 API Key 认证中间件 +func NewAPIKeyAuthMiddleware(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) APIKeyAuthMiddleware { + return APIKeyAuthMiddleware(apiKeyAuthWithSubscription(apiKeyService, subscriptionService, cfg)) } // apiKeyAuthWithSubscription API Key认证中间件(支持订阅验证) -func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) gin.HandlerFunc { +func apiKeyAuthWithSubscription(apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config) gin.HandlerFunc { return func(c *gin.Context) { // 尝试从Authorization header中提取API key (Bearer scheme) authHeader := c.GetHeader("Authorization") @@ -60,7 +60,7 @@ func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscripti // 从数据库验证API key apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString) if err != nil { - if errors.Is(err, service.ErrApiKeyNotFound) { + if errors.Is(err, service.ErrAPIKeyNotFound) { AbortWithError(c, 401, "INVALID_API_KEY", "Invalid API key") return } @@ -88,7 +88,7 @@ func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscripti if cfg.RunMode == config.RunModeSimple { // 简易模式:跳过余额和订阅检查,但仍需设置必要的上下文 - c.Set(string(ContextKeyApiKey), apiKey) + c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyUser), AuthSubject{ UserID: apiKey.User.ID, Concurrency: apiKey.User.Concurrency, @@ -146,7 +146,7 @@ func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscripti } // 将API key和用户信息存入上下文 - c.Set(string(ContextKeyApiKey), apiKey) + c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyUser), AuthSubject{ UserID: apiKey.User.ID, Concurrency: apiKey.User.Concurrency, @@ -157,13 +157,13 @@ func apiKeyAuthWithSubscription(apiKeyService *service.ApiKeyService, subscripti } } -// GetApiKeyFromContext 从上下文中获取API key -func GetApiKeyFromContext(c *gin.Context) (*service.ApiKey, bool) { - value, exists := c.Get(string(ContextKeyApiKey)) +// GetAPIKeyFromContext 从上下文中获取API key +func GetAPIKeyFromContext(c *gin.Context) (*service.APIKey, bool) { + value, exists := c.Get(string(ContextKeyAPIKey)) if !exists { return nil, false } - apiKey, ok := value.(*service.ApiKey) + apiKey, ok := value.(*service.APIKey) return apiKey, ok } diff --git a/backend/internal/server/middleware/api_key_auth_google.go b/backend/internal/server/middleware/api_key_auth_google.go index d8f47bd2..f2796db4 100644 --- a/backend/internal/server/middleware/api_key_auth_google.go +++ b/backend/internal/server/middleware/api_key_auth_google.go @@ -11,16 +11,16 @@ import ( "github.com/gin-gonic/gin" ) -// ApiKeyAuthGoogle is a Google-style error wrapper for API key auth. -func ApiKeyAuthGoogle(apiKeyService *service.ApiKeyService, cfg *config.Config) gin.HandlerFunc { - return ApiKeyAuthWithSubscriptionGoogle(apiKeyService, nil, cfg) +// APIKeyAuthGoogle is a Google-style error wrapper for API key auth. +func APIKeyAuthGoogle(apiKeyService *service.APIKeyService, cfg *config.Config) gin.HandlerFunc { + 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"}} // // 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) { apiKeyString := extractAPIKeyFromRequest(c) if apiKeyString == "" { @@ -30,7 +30,7 @@ func ApiKeyAuthWithSubscriptionGoogle(apiKeyService *service.ApiKeyService, subs apiKey, err := apiKeyService.GetByKey(c.Request.Context(), apiKeyString) if err != nil { - if errors.Is(err, service.ErrApiKeyNotFound) { + if errors.Is(err, service.ErrAPIKeyNotFound) { abortWithGoogleError(c, 401, "Invalid API key") return } @@ -53,7 +53,7 @@ func ApiKeyAuthWithSubscriptionGoogle(apiKeyService *service.ApiKeyService, subs // 简易模式:跳过余额和订阅检查 if cfg.RunMode == config.RunModeSimple { - c.Set(string(ContextKeyApiKey), apiKey) + c.Set(string(ContextKeyAPIKey), apiKey) c.Set(string(ContextKeyUser), AuthSubject{ UserID: apiKey.User.ID, 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{ UserID: apiKey.User.ID, Concurrency: apiKey.User.Concurrency, diff --git a/backend/internal/server/middleware/api_key_auth_google_test.go b/backend/internal/server/middleware/api_key_auth_google_test.go index 04d67977..96dcdbb3 100644 --- a/backend/internal/server/middleware/api_key_auth_google_test.go +++ b/backend/internal/server/middleware/api_key_auth_google_test.go @@ -16,53 +16,53 @@ import ( "github.com/stretchr/testify/require" ) -type fakeApiKeyRepo struct { - getByKey func(ctx context.Context, key string) (*service.ApiKey, error) +type fakeAPIKeyRepo struct { + 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") } -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") } -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") } -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 { return nil, errors.New("unexpected call") } 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") } -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") } -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") } -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") } -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") } -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") } -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") } -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") } -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") } -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") } @@ -74,8 +74,8 @@ type googleErrorResponse struct { } `json:"error"` } -func newTestApiKeyService(repo service.ApiKeyRepository) *service.ApiKeyService { - return service.NewApiKeyService( +func newTestAPIKeyService(repo service.APIKeyRepository) *service.APIKeyService { + return service.NewAPIKeyService( repo, nil, // userRepo (unused in GetByKey) nil, // groupRepo @@ -89,12 +89,12 @@ func TestApiKeyAuthWithSubscriptionGoogle_MissingKey(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() - apiKeyService := newTestApiKeyService(fakeApiKeyRepo{ - getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) { + apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ + getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { 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}) }) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) @@ -113,12 +113,12 @@ func TestApiKeyAuthWithSubscriptionGoogle_InvalidKey(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() - apiKeyService := newTestApiKeyService(fakeApiKeyRepo{ - getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) { - return nil, service.ErrApiKeyNotFound + apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ + getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { + 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}) }) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) @@ -138,12 +138,12 @@ func TestApiKeyAuthWithSubscriptionGoogle_RepoError(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() - apiKeyService := newTestApiKeyService(fakeApiKeyRepo{ - getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) { + apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ + getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { 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}) }) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) @@ -163,9 +163,9 @@ func TestApiKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() - apiKeyService := newTestApiKeyService(fakeApiKeyRepo{ - getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) { - return &service.ApiKey{ + apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ + getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { + return &service.APIKey{ ID: 1, Key: key, Status: service.StatusDisabled, @@ -176,7 +176,7 @@ func TestApiKeyAuthWithSubscriptionGoogle_DisabledKey(t *testing.T) { }, 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}) }) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) @@ -196,9 +196,9 @@ func TestApiKeyAuthWithSubscriptionGoogle_InsufficientBalance(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() - apiKeyService := newTestApiKeyService(fakeApiKeyRepo{ - getByKey: func(ctx context.Context, key string) (*service.ApiKey, error) { - return &service.ApiKey{ + apiKeyService := newTestAPIKeyService(fakeAPIKeyRepo{ + getByKey: func(ctx context.Context, key string) (*service.APIKey, error) { + return &service.APIKey{ ID: 1, Key: key, Status: service.StatusActive, @@ -210,7 +210,7 @@ func TestApiKeyAuthWithSubscriptionGoogle_InsufficientBalance(t *testing.T) { }, 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}) }) req := httptest.NewRequest(http.MethodGet, "/v1beta/test", nil) diff --git a/backend/internal/server/middleware/api_key_auth_test.go b/backend/internal/server/middleware/api_key_auth_test.go index 841edd07..d50fb7b2 100644 --- a/backend/internal/server/middleware/api_key_auth_test.go +++ b/backend/internal/server/middleware/api_key_auth_test.go @@ -35,7 +35,7 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) { Balance: 10, Concurrency: 3, } - apiKey := &service.ApiKey{ + apiKey := &service.APIKey{ ID: 100, UserID: user.ID, Key: "test-key", @@ -46,9 +46,9 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) { apiKey.GroupID = &group.ID 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 { - return nil, service.ErrApiKeyNotFound + return nil, service.ErrAPIKeyNotFound } clone := *apiKey return &clone, nil @@ -57,7 +57,7 @@ func TestSimpleModeBypassesQuotaCheck(t *testing.T) { t.Run("simple_mode_bypasses_quota_check", func(t *testing.T) { 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) 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) { 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() sub := &service.UserSubscription{ @@ -110,9 +110,9 @@ 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.Use(gin.HandlerFunc(NewApiKeyAuthMiddleware(apiKeyService, subscriptionService, cfg))) + router.Use(gin.HandlerFunc(NewAPIKeyAuthMiddleware(apiKeyService, subscriptionService, cfg))) router.GET("/t", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"ok": true}) }) @@ -120,14 +120,14 @@ func newAuthTestRouter(apiKeyService *service.ApiKeyService, subscriptionService } 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") } -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") } @@ -135,14 +135,14 @@ func (r *stubApiKeyRepo) GetOwnerID(ctx context.Context, id int64) (int64, error 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 { return r.getByKey(ctx, key) } 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") } @@ -150,7 +150,7 @@ func (r *stubApiKeyRepo) Delete(ctx context.Context, id int64) error { 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") } @@ -166,11 +166,11 @@ func (r *stubApiKeyRepo) ExistsByKey(ctx context.Context, key string) (bool, err 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") } -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") } diff --git a/backend/internal/server/middleware/middleware.go b/backend/internal/server/middleware/middleware.go index 75b9f68e..26572019 100644 --- a/backend/internal/server/middleware/middleware.go +++ b/backend/internal/server/middleware/middleware.go @@ -15,8 +15,8 @@ const ( ContextKeyUser ContextKey = "user" // ContextKeyUserRole 当前用户角色(string) ContextKeyUserRole ContextKey = "user_role" - // ContextKeyApiKey API密钥上下文键 - ContextKeyApiKey ContextKey = "api_key" + // ContextKeyAPIKey API密钥上下文键 + ContextKeyAPIKey ContextKey = "api_key" // ContextKeySubscription 订阅上下文键 ContextKeySubscription ContextKey = "subscription" // ContextKeyForcePlatform 强制平台(用于 /antigravity 路由) diff --git a/backend/internal/server/middleware/wire.go b/backend/internal/server/middleware/wire.go index 3ed79f37..dc01b743 100644 --- a/backend/internal/server/middleware/wire.go +++ b/backend/internal/server/middleware/wire.go @@ -11,12 +11,12 @@ type JWTAuthMiddleware gin.HandlerFunc // AdminAuthMiddleware 管理员认证中间件类型 type AdminAuthMiddleware gin.HandlerFunc -// ApiKeyAuthMiddleware API Key 认证中间件类型 -type ApiKeyAuthMiddleware gin.HandlerFunc +// APIKeyAuthMiddleware API Key 认证中间件类型 +type APIKeyAuthMiddleware gin.HandlerFunc // ProviderSet 中间件层的依赖注入 var ProviderSet = wire.NewSet( NewJWTAuthMiddleware, NewAdminAuthMiddleware, - NewApiKeyAuthMiddleware, + NewAPIKeyAuthMiddleware, ) diff --git a/backend/internal/server/router.go b/backend/internal/server/router.go index 2371dafb..6eebb6d8 100644 --- a/backend/internal/server/router.go +++ b/backend/internal/server/router.go @@ -17,8 +17,8 @@ func SetupRouter( handlers *handler.Handlers, jwtAuth middleware2.JWTAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware, - apiKeyAuth middleware2.ApiKeyAuthMiddleware, - apiKeyService *service.ApiKeyService, + apiKeyAuth middleware2.APIKeyAuthMiddleware, + apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config, ) *gin.Engine { @@ -43,8 +43,8 @@ func registerRoutes( h *handler.Handlers, jwtAuth middleware2.JWTAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware, - apiKeyAuth middleware2.ApiKeyAuthMiddleware, - apiKeyService *service.ApiKeyService, + apiKeyAuth middleware2.APIKeyAuthMiddleware, + apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config, ) { diff --git a/backend/internal/server/routes/admin.go b/backend/internal/server/routes/admin.go index ba883997..663c2d02 100644 --- a/backend/internal/server/routes/admin.go +++ b/backend/internal/server/routes/admin.go @@ -1,3 +1,4 @@ +// Package routes provides HTTP route registration and handlers. package routes import ( @@ -67,10 +68,10 @@ func registerDashboardRoutes(admin *gin.RouterGroup, h *handler.Handlers) { dashboard.GET("/realtime", h.Admin.Dashboard.GetRealtimeMetrics) dashboard.GET("/trend", h.Admin.Dashboard.GetUsageTrend) dashboard.GET("/models", h.Admin.Dashboard.GetModelStats) - dashboard.GET("/api-keys-trend", h.Admin.Dashboard.GetApiKeyUsageTrend) + dashboard.GET("/api-keys-trend", h.Admin.Dashboard.GetAPIKeyUsageTrend) dashboard.GET("/users-trend", h.Admin.Dashboard.GetUserUsageTrend) dashboard.POST("/users-usage", h.Admin.Dashboard.GetBatchUsersUsage) - dashboard.POST("/api-keys-usage", h.Admin.Dashboard.GetBatchApiKeysUsage) + dashboard.POST("/api-keys-usage", h.Admin.Dashboard.GetBatchAPIKeysUsage) } } @@ -205,12 +206,12 @@ func registerSettingsRoutes(admin *gin.RouterGroup, h *handler.Handlers) { { adminSettings.GET("", h.Admin.Setting.GetSettings) adminSettings.PUT("", h.Admin.Setting.UpdateSettings) - adminSettings.POST("/test-smtp", h.Admin.Setting.TestSmtpConnection) + adminSettings.POST("/test-smtp", h.Admin.Setting.TestSMTPConnection) adminSettings.POST("/send-test-email", h.Admin.Setting.SendTestEmail) // Admin API Key 管理 - adminSettings.GET("/admin-api-key", h.Admin.Setting.GetAdminApiKey) - adminSettings.POST("/admin-api-key/regenerate", h.Admin.Setting.RegenerateAdminApiKey) - adminSettings.DELETE("/admin-api-key", h.Admin.Setting.DeleteAdminApiKey) + adminSettings.GET("/admin-api-key", h.Admin.Setting.GetAdminAPIKey) + adminSettings.POST("/admin-api-key/regenerate", h.Admin.Setting.RegenerateAdminAPIKey) + adminSettings.DELETE("/admin-api-key", h.Admin.Setting.DeleteAdminAPIKey) } } @@ -250,7 +251,7 @@ func registerUsageRoutes(admin *gin.RouterGroup, h *handler.Handlers) { usage.GET("", h.Admin.Usage.List) usage.GET("/stats", h.Admin.Usage.Stats) usage.GET("/search-users", h.Admin.Usage.SearchUsers) - usage.GET("/search-api-keys", h.Admin.Usage.SearchApiKeys) + usage.GET("/search-api-keys", h.Admin.Usage.SearchAPIKeys) } } diff --git a/backend/internal/server/routes/gateway.go b/backend/internal/server/routes/gateway.go index 941f1ce9..0b62185e 100644 --- a/backend/internal/server/routes/gateway.go +++ b/backend/internal/server/routes/gateway.go @@ -13,8 +13,8 @@ import ( func RegisterGatewayRoutes( r *gin.Engine, h *handler.Handlers, - apiKeyAuth middleware.ApiKeyAuthMiddleware, - apiKeyService *service.ApiKeyService, + apiKeyAuth middleware.APIKeyAuthMiddleware, + apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, cfg *config.Config, ) { @@ -36,7 +36,7 @@ func RegisterGatewayRoutes( // Gemini 原生 API 兼容层(Gemini SDK/CLI 直连) gemini := r.Group("/v1beta") gemini.Use(bodyLimit) - gemini.Use(middleware.ApiKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg)) + gemini.Use(middleware.APIKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg)) { gemini.GET("/models", h.Gateway.GeminiV1BetaListModels) gemini.GET("/models/:model", h.Gateway.GeminiV1BetaGetModel) @@ -65,7 +65,7 @@ func RegisterGatewayRoutes( antigravityV1Beta := r.Group("/antigravity/v1beta") antigravityV1Beta.Use(bodyLimit) antigravityV1Beta.Use(middleware.ForcePlatform(service.PlatformAntigravity)) - antigravityV1Beta.Use(middleware.ApiKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg)) + antigravityV1Beta.Use(middleware.APIKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg)) { antigravityV1Beta.GET("/models", h.Gateway.GeminiV1BetaListModels) antigravityV1Beta.GET("/models/:model", h.Gateway.GeminiV1BetaGetModel) diff --git a/backend/internal/server/routes/user.go b/backend/internal/server/routes/user.go index 31a354fa..ad2166fe 100644 --- a/backend/internal/server/routes/user.go +++ b/backend/internal/server/routes/user.go @@ -50,7 +50,7 @@ func RegisterUserRoutes( usage.GET("/dashboard/stats", h.Usage.DashboardStats) usage.GET("/dashboard/trend", h.Usage.DashboardTrend) 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) } // 卡密兑换 diff --git a/backend/internal/service/account.go b/backend/internal/service/account.go index 40b765ad..5a2504a8 100644 --- a/backend/internal/service/account.go +++ b/backend/internal/service/account.go @@ -1,3 +1,4 @@ +// Package service provides business logic and domain services for the application. package service import ( @@ -324,7 +325,7 @@ func (a *Account) GetMappedModel(requestedModel string) string { } func (a *Account) GetBaseURL() string { - if a.Type != AccountTypeApiKey { + if a.Type != AccountTypeAPIKey { return "" } baseURL := a.GetCredential("base_url") @@ -347,7 +348,7 @@ func (a *Account) GetExtraString(key string) string { } func (a *Account) IsCustomErrorCodesEnabled() bool { - if a.Type != AccountTypeApiKey || a.Credentials == nil { + if a.Type != AccountTypeAPIKey || a.Credentials == nil { return false } if v, ok := a.Credentials["custom_error_codes_enabled"]; ok { @@ -419,14 +420,14 @@ func (a *Account) IsOpenAIOAuth() bool { } func (a *Account) IsOpenAIApiKey() bool { - return a.IsOpenAI() && a.Type == AccountTypeApiKey + return a.IsOpenAI() && a.Type == AccountTypeAPIKey } func (a *Account) GetOpenAIBaseURL() string { if !a.IsOpenAI() { return "" } - if a.Type == AccountTypeApiKey { + if a.Type == AccountTypeAPIKey { baseURL := a.GetCredential("base_url") if baseURL != "" { return baseURL diff --git a/backend/internal/service/account_test_service.go b/backend/internal/service/account_test_service.go index 4df87e9e..6573be4b 100644 --- a/backend/internal/service/account_test_service.go +++ b/backend/internal/service/account_test_service.go @@ -369,7 +369,7 @@ func (s *AccountTestService) testGeminiAccountConnection(c *gin.Context, account } // For API Key accounts with model mapping, map the model - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { mapping := account.GetModelMapping() if len(mapping) > 0 { if mappedModel, exists := mapping[testModelID]; exists { @@ -393,7 +393,7 @@ func (s *AccountTestService) testGeminiAccountConnection(c *gin.Context, account var err error switch account.Type { - case AccountTypeApiKey: + case AccountTypeAPIKey: req, err = s.buildGeminiAPIKeyRequest(ctx, account, testModelID, payload) case AccountTypeOAuth: req, err = s.buildGeminiOAuthRequest(ctx, account, testModelID, payload) diff --git a/backend/internal/service/account_usage_service.go b/backend/internal/service/account_usage_service.go index 2c27354a..6971fafa 100644 --- a/backend/internal/service/account_usage_service.go +++ b/backend/internal/service/account_usage_service.go @@ -19,11 +19,11 @@ type UsageLogRepository interface { Delete(ctx context.Context, id int64) error ListByUser(ctx context.Context, userID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) - ListByApiKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) + ListByAPIKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) ListByAccount(ctx context.Context, accountID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) ListByUserAndTimeRange(ctx context.Context, userID int64, startTime, endTime time.Time) ([]UsageLog, *pagination.PaginationResult, error) - ListByApiKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]UsageLog, *pagination.PaginationResult, error) + ListByAPIKeyAndTimeRange(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) ([]UsageLog, *pagination.PaginationResult, error) ListByAccountAndTimeRange(ctx context.Context, accountID int64, startTime, endTime time.Time) ([]UsageLog, *pagination.PaginationResult, error) ListByModelAndTimeRange(ctx context.Context, modelName string, startTime, endTime time.Time) ([]UsageLog, *pagination.PaginationResult, error) @@ -34,10 +34,10 @@ type UsageLogRepository interface { GetDashboardStats(ctx context.Context) (*usagestats.DashboardStats, error) GetUsageTrendWithFilters(ctx context.Context, startTime, endTime time.Time, granularity string, userID, apiKeyID int64) ([]usagestats.TrendDataPoint, error) GetModelStatsWithFilters(ctx context.Context, startTime, endTime time.Time, userID, apiKeyID, accountID int64) ([]usagestats.ModelStat, error) - GetApiKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.ApiKeyUsageTrendPoint, error) + GetAPIKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.APIKeyUsageTrendPoint, error) GetUserUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.UserUsageTrendPoint, error) GetBatchUserUsageStats(ctx context.Context, userIDs []int64) (map[int64]*usagestats.BatchUserUsageStats, error) - GetBatchApiKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchApiKeyUsageStats, error) + GetBatchAPIKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchAPIKeyUsageStats, error) // User dashboard stats GetUserDashboardStats(ctx context.Context, userID int64) (*usagestats.UserDashboardStats, error) @@ -53,7 +53,7 @@ type UsageLogRepository interface { // Aggregated stats (optimized) GetUserStatsAggregated(ctx context.Context, userID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) - GetApiKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) + GetAPIKeyStatsAggregated(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) GetAccountStatsAggregated(ctx context.Context, accountID int64, startTime, endTime time.Time) (*usagestats.UsageStats, error) GetModelStatsAggregated(ctx context.Context, modelName string, startTime, endTime time.Time) (*usagestats.UsageStats, error) GetDailyStatsAggregated(ctx context.Context, userID int64, startTime, endTime time.Time) ([]map[string]any, error) diff --git a/backend/internal/service/admin_service.go b/backend/internal/service/admin_service.go index be07f37f..a88e2b4e 100644 --- a/backend/internal/service/admin_service.go +++ b/backend/internal/service/admin_service.go @@ -20,7 +20,7 @@ type AdminService interface { UpdateUser(ctx context.Context, id int64, input *UpdateUserInput) (*User, error) DeleteUser(ctx context.Context, id int64) error UpdateUserBalance(ctx context.Context, userID int64, balance float64, operation string, notes string) (*User, error) - GetUserAPIKeys(ctx context.Context, userID int64, page, pageSize int) ([]ApiKey, int64, error) + GetUserAPIKeys(ctx context.Context, userID int64, page, pageSize int) ([]APIKey, int64, error) GetUserUsageStats(ctx context.Context, userID int64, period string) (any, error) // Group management @@ -31,7 +31,7 @@ type AdminService interface { CreateGroup(ctx context.Context, input *CreateGroupInput) (*Group, error) UpdateGroup(ctx context.Context, id int64, input *UpdateGroupInput) (*Group, error) DeleteGroup(ctx context.Context, id int64) error - GetGroupAPIKeys(ctx context.Context, groupID int64, page, pageSize int) ([]ApiKey, int64, error) + GetGroupAPIKeys(ctx context.Context, groupID int64, page, pageSize int) ([]APIKey, int64, error) // Account management ListAccounts(ctx context.Context, page, pageSize int, platform, accountType, status, search string) ([]Account, int64, error) @@ -66,7 +66,7 @@ type AdminService interface { ExpireRedeemCode(ctx context.Context, id int64) (*RedeemCode, error) } -// Input types for admin operations +// CreateUserInput represents input for creating a new user via admin operations. type CreateUserInput struct { Email string Password string @@ -228,7 +228,7 @@ type adminServiceImpl struct { groupRepo GroupRepository accountRepo AccountRepository proxyRepo ProxyRepository - apiKeyRepo ApiKeyRepository + apiKeyRepo APIKeyRepository redeemCodeRepo RedeemCodeRepository billingCacheService *BillingCacheService proxyProber ProxyExitInfoProber @@ -240,7 +240,7 @@ func NewAdminService( groupRepo GroupRepository, accountRepo AccountRepository, proxyRepo ProxyRepository, - apiKeyRepo ApiKeyRepository, + apiKeyRepo APIKeyRepository, redeemCodeRepo RedeemCodeRepository, billingCacheService *BillingCacheService, proxyProber ProxyExitInfoProber, @@ -438,7 +438,7 @@ func (s *adminServiceImpl) UpdateUserBalance(ctx context.Context, userID int64, return user, nil } -func (s *adminServiceImpl) GetUserAPIKeys(ctx context.Context, userID int64, page, pageSize int) ([]ApiKey, int64, error) { +func (s *adminServiceImpl) GetUserAPIKeys(ctx context.Context, userID int64, page, pageSize int) ([]APIKey, int64, error) { params := pagination.PaginationParams{Page: page, PageSize: pageSize} keys, result, err := s.apiKeyRepo.ListByUserID(ctx, userID, params) if err != nil { @@ -591,7 +591,7 @@ func (s *adminServiceImpl) DeleteGroup(ctx context.Context, id int64) error { return nil } -func (s *adminServiceImpl) GetGroupAPIKeys(ctx context.Context, groupID int64, page, pageSize int) ([]ApiKey, int64, error) { +func (s *adminServiceImpl) GetGroupAPIKeys(ctx context.Context, groupID int64, page, pageSize int) ([]APIKey, int64, error) { params := pagination.PaginationParams{Page: page, PageSize: pageSize} keys, result, err := s.apiKeyRepo.ListByGroupID(ctx, groupID, params) if err != nil { diff --git a/backend/internal/service/api_key.go b/backend/internal/service/api_key.go index e76f0f8e..0cf0f4f9 100644 --- a/backend/internal/service/api_key.go +++ b/backend/internal/service/api_key.go @@ -2,7 +2,7 @@ package service import "time" -type ApiKey struct { +type APIKey struct { ID int64 UserID int64 Key string @@ -15,6 +15,6 @@ type ApiKey struct { Group *Group } -func (k *ApiKey) IsActive() bool { +func (k *APIKey) IsActive() bool { return k.Status == StatusActive } diff --git a/backend/internal/service/api_key_service.go b/backend/internal/service/api_key_service.go index f22c383a..0ffe8821 100644 --- a/backend/internal/service/api_key_service.go +++ b/backend/internal/service/api_key_service.go @@ -14,39 +14,39 @@ import ( ) var ( - ErrApiKeyNotFound = infraerrors.NotFound("API_KEY_NOT_FOUND", "api key not found") + ErrAPIKeyNotFound = infraerrors.NotFound("API_KEY_NOT_FOUND", "api key not found") ErrGroupNotAllowed = infraerrors.Forbidden("GROUP_NOT_ALLOWED", "user is not allowed to bind this group") - ErrApiKeyExists = infraerrors.Conflict("API_KEY_EXISTS", "api key already exists") - ErrApiKeyTooShort = infraerrors.BadRequest("API_KEY_TOO_SHORT", "api key must be at least 16 characters") - ErrApiKeyInvalidChars = infraerrors.BadRequest("API_KEY_INVALID_CHARS", "api key can only contain letters, numbers, underscores, and hyphens") - ErrApiKeyRateLimited = infraerrors.TooManyRequests("API_KEY_RATE_LIMITED", "too many failed attempts, please try again later") + ErrAPIKeyExists = infraerrors.Conflict("API_KEY_EXISTS", "api key already exists") + ErrAPIKeyTooShort = infraerrors.BadRequest("API_KEY_TOO_SHORT", "api key must be at least 16 characters") + ErrAPIKeyInvalidChars = infraerrors.BadRequest("API_KEY_INVALID_CHARS", "api key can only contain letters, numbers, underscores, and hyphens") + ErrAPIKeyRateLimited = infraerrors.TooManyRequests("API_KEY_RATE_LIMITED", "too many failed attempts, please try again later") ) const ( apiKeyMaxErrorsPerHour = 20 ) -type ApiKeyRepository interface { - Create(ctx context.Context, key *ApiKey) error - GetByID(ctx context.Context, id int64) (*ApiKey, error) +type APIKeyRepository interface { + Create(ctx context.Context, key *APIKey) error + GetByID(ctx context.Context, id int64) (*APIKey, error) // GetOwnerID 仅获取 API Key 的所有者 ID,用于删除前的轻量级权限验证 GetOwnerID(ctx context.Context, id int64) (int64, error) - GetByKey(ctx context.Context, key string) (*ApiKey, error) - Update(ctx context.Context, key *ApiKey) error + GetByKey(ctx context.Context, key string) (*APIKey, error) + Update(ctx context.Context, key *APIKey) error Delete(ctx context.Context, id int64) error - ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]ApiKey, *pagination.PaginationResult, error) + ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]APIKey, *pagination.PaginationResult, error) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) CountByUserID(ctx context.Context, userID int64) (int64, error) ExistsByKey(ctx context.Context, key string) (bool, error) - ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]ApiKey, *pagination.PaginationResult, error) - SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]ApiKey, error) + ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]APIKey, *pagination.PaginationResult, error) + SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]APIKey, error) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) CountByGroupID(ctx context.Context, groupID int64) (int64, error) } -// ApiKeyCache defines cache operations for API key service -type ApiKeyCache interface { +// APIKeyCache defines cache operations for API key service +type APIKeyCache interface { GetCreateAttemptCount(ctx context.Context, userID int64) (int, error) IncrementCreateAttemptCount(ctx context.Context, userID int64) error DeleteCreateAttemptCount(ctx context.Context, userID int64) error @@ -55,40 +55,40 @@ type ApiKeyCache interface { SetDailyUsageExpiry(ctx context.Context, apiKey string, ttl time.Duration) error } -// CreateApiKeyRequest 创建API Key请求 -type CreateApiKeyRequest struct { +// CreateAPIKeyRequest 创建API Key请求 +type CreateAPIKeyRequest struct { Name string `json:"name"` GroupID *int64 `json:"group_id"` CustomKey *string `json:"custom_key"` // 可选的自定义key } -// UpdateApiKeyRequest 更新API Key请求 -type UpdateApiKeyRequest struct { +// UpdateAPIKeyRequest 更新API Key请求 +type UpdateAPIKeyRequest struct { Name *string `json:"name"` GroupID *int64 `json:"group_id"` Status *string `json:"status"` } -// ApiKeyService API Key服务 -type ApiKeyService struct { - apiKeyRepo ApiKeyRepository +// APIKeyService API Key服务 +type APIKeyService struct { + apiKeyRepo APIKeyRepository userRepo UserRepository groupRepo GroupRepository userSubRepo UserSubscriptionRepository - cache ApiKeyCache + cache APIKeyCache cfg *config.Config } -// NewApiKeyService 创建API Key服务实例 -func NewApiKeyService( - apiKeyRepo ApiKeyRepository, +// NewAPIKeyService 创建API Key服务实例 +func NewAPIKeyService( + apiKeyRepo APIKeyRepository, userRepo UserRepository, groupRepo GroupRepository, userSubRepo UserSubscriptionRepository, - cache ApiKeyCache, + cache APIKeyCache, cfg *config.Config, -) *ApiKeyService { - return &ApiKeyService{ +) *APIKeyService { + return &APIKeyService{ apiKeyRepo: apiKeyRepo, userRepo: userRepo, groupRepo: groupRepo, @@ -99,7 +99,7 @@ func NewApiKeyService( } // GenerateKey 生成随机API Key -func (s *ApiKeyService) GenerateKey() (string, error) { +func (s *APIKeyService) GenerateKey() (string, error) { // 生成32字节随机数据 bytes := make([]byte, 32) if _, err := rand.Read(bytes); err != nil { @@ -107,7 +107,7 @@ func (s *ApiKeyService) GenerateKey() (string, error) { } // 转换为十六进制字符串并添加前缀 - prefix := s.cfg.Default.ApiKeyPrefix + prefix := s.cfg.Default.APIKeyPrefix if prefix == "" { prefix = "sk-" } @@ -117,10 +117,10 @@ func (s *ApiKeyService) GenerateKey() (string, error) { } // ValidateCustomKey 验证自定义API Key格式 -func (s *ApiKeyService) ValidateCustomKey(key string) error { +func (s *APIKeyService) ValidateCustomKey(key string) error { // 检查长度 if len(key) < 16 { - return ErrApiKeyTooShort + return ErrAPIKeyTooShort } // 检查字符:只允许字母、数字、下划线、连字符 @@ -131,14 +131,14 @@ func (s *ApiKeyService) ValidateCustomKey(key string) error { c == '_' || c == '-' { continue } - return ErrApiKeyInvalidChars + return ErrAPIKeyInvalidChars } return nil } -// checkApiKeyRateLimit 检查用户创建自定义Key的错误次数是否超限 -func (s *ApiKeyService) checkApiKeyRateLimit(ctx context.Context, userID int64) error { +// checkAPIKeyRateLimit 检查用户创建自定义Key的错误次数是否超限 +func (s *APIKeyService) checkAPIKeyRateLimit(ctx context.Context, userID int64) error { if s.cache == nil { return nil } @@ -150,14 +150,14 @@ func (s *ApiKeyService) checkApiKeyRateLimit(ctx context.Context, userID int64) } if count >= apiKeyMaxErrorsPerHour { - return ErrApiKeyRateLimited + return ErrAPIKeyRateLimited } return nil } -// incrementApiKeyErrorCount 增加用户创建自定义Key的错误计数 -func (s *ApiKeyService) incrementApiKeyErrorCount(ctx context.Context, userID int64) { +// incrementAPIKeyErrorCount 增加用户创建自定义Key的错误计数 +func (s *APIKeyService) incrementAPIKeyErrorCount(ctx context.Context, userID int64) { if s.cache == nil { return } @@ -168,7 +168,7 @@ func (s *ApiKeyService) incrementApiKeyErrorCount(ctx context.Context, userID in // canUserBindGroup 检查用户是否可以绑定指定分组 // 对于订阅类型分组:检查用户是否有有效订阅 // 对于标准类型分组:使用原有的 AllowedGroups 和 IsExclusive 逻辑 -func (s *ApiKeyService) canUserBindGroup(ctx context.Context, user *User, group *Group) bool { +func (s *APIKeyService) canUserBindGroup(ctx context.Context, user *User, group *Group) bool { // 订阅类型分组:需要有效订阅 if group.IsSubscriptionType() { _, err := s.userSubRepo.GetActiveByUserIDAndGroupID(ctx, user.ID, group.ID) @@ -179,7 +179,7 @@ func (s *ApiKeyService) canUserBindGroup(ctx context.Context, user *User, group } // Create 创建API Key -func (s *ApiKeyService) Create(ctx context.Context, userID int64, req CreateApiKeyRequest) (*ApiKey, error) { +func (s *APIKeyService) Create(ctx context.Context, userID int64, req CreateAPIKeyRequest) (*APIKey, error) { // 验证用户存在 user, err := s.userRepo.GetByID(ctx, userID) if err != nil { @@ -204,7 +204,7 @@ func (s *ApiKeyService) Create(ctx context.Context, userID int64, req CreateApiK // 判断是否使用自定义Key if req.CustomKey != nil && *req.CustomKey != "" { // 检查限流(仅对自定义key进行限流) - if err := s.checkApiKeyRateLimit(ctx, userID); err != nil { + if err := s.checkAPIKeyRateLimit(ctx, userID); err != nil { return nil, err } @@ -220,8 +220,8 @@ func (s *ApiKeyService) Create(ctx context.Context, userID int64, req CreateApiK } if exists { // Key已存在,增加错误计数 - s.incrementApiKeyErrorCount(ctx, userID) - return nil, ErrApiKeyExists + s.incrementAPIKeyErrorCount(ctx, userID) + return nil, ErrAPIKeyExists } key = *req.CustomKey @@ -235,7 +235,7 @@ func (s *ApiKeyService) Create(ctx context.Context, userID int64, req CreateApiK } // 创建API Key记录 - apiKey := &ApiKey{ + apiKey := &APIKey{ UserID: userID, Key: key, Name: req.Name, @@ -251,7 +251,7 @@ func (s *ApiKeyService) Create(ctx context.Context, userID int64, req CreateApiK } // List 获取用户的API Key列表 -func (s *ApiKeyService) List(ctx context.Context, userID int64, params pagination.PaginationParams) ([]ApiKey, *pagination.PaginationResult, error) { +func (s *APIKeyService) List(ctx context.Context, userID int64, params pagination.PaginationParams) ([]APIKey, *pagination.PaginationResult, error) { keys, pagination, err := s.apiKeyRepo.ListByUserID(ctx, userID, params) if err != nil { return nil, nil, fmt.Errorf("list api keys: %w", err) @@ -259,7 +259,7 @@ func (s *ApiKeyService) List(ctx context.Context, userID int64, params paginatio return keys, pagination, nil } -func (s *ApiKeyService) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) { +func (s *APIKeyService) VerifyOwnership(ctx context.Context, userID int64, apiKeyIDs []int64) ([]int64, error) { if len(apiKeyIDs) == 0 { return []int64{}, nil } @@ -272,7 +272,7 @@ func (s *ApiKeyService) VerifyOwnership(ctx context.Context, userID int64, apiKe } // GetByID 根据ID获取API Key -func (s *ApiKeyService) GetByID(ctx context.Context, id int64) (*ApiKey, error) { +func (s *APIKeyService) GetByID(ctx context.Context, id int64) (*APIKey, error) { apiKey, err := s.apiKeyRepo.GetByID(ctx, id) if err != nil { return nil, fmt.Errorf("get api key: %w", err) @@ -281,7 +281,7 @@ func (s *ApiKeyService) GetByID(ctx context.Context, id int64) (*ApiKey, error) } // GetByKey 根据Key字符串获取API Key(用于认证) -func (s *ApiKeyService) GetByKey(ctx context.Context, key string) (*ApiKey, error) { +func (s *APIKeyService) GetByKey(ctx context.Context, key string) (*APIKey, error) { // 尝试从Redis缓存获取 cacheKey := fmt.Sprintf("apikey:%s", key) @@ -301,7 +301,7 @@ func (s *ApiKeyService) GetByKey(ctx context.Context, key string) (*ApiKey, erro } // Update 更新API Key -func (s *ApiKeyService) Update(ctx context.Context, id int64, userID int64, req UpdateApiKeyRequest) (*ApiKey, error) { +func (s *APIKeyService) Update(ctx context.Context, id int64, userID int64, req UpdateAPIKeyRequest) (*APIKey, error) { apiKey, err := s.apiKeyRepo.GetByID(ctx, id) if err != nil { return nil, fmt.Errorf("get api key: %w", err) @@ -353,8 +353,8 @@ func (s *ApiKeyService) Update(ctx context.Context, id int64, userID int64, req // Delete 删除API Key // 优化:使用 GetOwnerID 替代 GetByID 进行权限验证, -// 避免加载完整 ApiKey 对象及其关联数据(User、Group),提升删除操作的性能 -func (s *ApiKeyService) Delete(ctx context.Context, id int64, userID int64) error { +// 避免加载完整 APIKey 对象及其关联数据(User、Group),提升删除操作的性能 +func (s *APIKeyService) Delete(ctx context.Context, id int64, userID int64) error { // 仅获取所有者 ID 用于权限验证,而非加载完整对象 ownerID, err := s.apiKeyRepo.GetOwnerID(ctx, id) if err != nil { @@ -379,7 +379,7 @@ func (s *ApiKeyService) Delete(ctx context.Context, id int64, userID int64) erro } // ValidateKey 验证API Key是否有效(用于认证中间件) -func (s *ApiKeyService) ValidateKey(ctx context.Context, key string) (*ApiKey, *User, error) { +func (s *APIKeyService) ValidateKey(ctx context.Context, key string) (*APIKey, *User, error) { // 获取API Key apiKey, err := s.GetByKey(ctx, key) if err != nil { @@ -406,7 +406,7 @@ func (s *ApiKeyService) ValidateKey(ctx context.Context, key string) (*ApiKey, * } // IncrementUsage 增加API Key使用次数(可选:用于统计) -func (s *ApiKeyService) IncrementUsage(ctx context.Context, keyID int64) error { +func (s *APIKeyService) IncrementUsage(ctx context.Context, keyID int64) error { // 使用Redis计数器 if s.cache != nil { cacheKey := fmt.Sprintf("apikey:usage:%d:%s", keyID, timezone.Now().Format("2006-01-02")) @@ -423,7 +423,7 @@ func (s *ApiKeyService) IncrementUsage(ctx context.Context, keyID int64) error { // 返回用户可以选择的分组: // - 标准类型分组:公开的(非专属)或用户被明确允许的 // - 订阅类型分组:用户有有效订阅的 -func (s *ApiKeyService) GetAvailableGroups(ctx context.Context, userID int64) ([]Group, error) { +func (s *APIKeyService) GetAvailableGroups(ctx context.Context, userID int64) ([]Group, error) { // 获取用户信息 user, err := s.userRepo.GetByID(ctx, userID) if err != nil { @@ -460,7 +460,7 @@ func (s *ApiKeyService) GetAvailableGroups(ctx context.Context, userID int64) ([ } // canUserBindGroupInternal 内部方法,检查用户是否可以绑定分组(使用预加载的订阅数据) -func (s *ApiKeyService) canUserBindGroupInternal(user *User, group *Group, subscribedGroupIDs map[int64]bool) bool { +func (s *APIKeyService) canUserBindGroupInternal(user *User, group *Group, subscribedGroupIDs map[int64]bool) bool { // 订阅类型分组:需要有效订阅 if group.IsSubscriptionType() { return subscribedGroupIDs[group.ID] @@ -469,8 +469,8 @@ func (s *ApiKeyService) canUserBindGroupInternal(user *User, group *Group, subsc return user.CanBindGroup(group.ID, group.IsExclusive) } -func (s *ApiKeyService) SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]ApiKey, error) { - keys, err := s.apiKeyRepo.SearchApiKeys(ctx, userID, keyword, limit) +func (s *APIKeyService) SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]APIKey, error) { + keys, err := s.apiKeyRepo.SearchAPIKeys(ctx, userID, keyword, limit) if err != nil { return nil, fmt.Errorf("search api keys: %w", err) } diff --git a/backend/internal/service/api_key_service_delete_test.go b/backend/internal/service/api_key_service_delete_test.go index deac8499..7d04c5ac 100644 --- a/backend/internal/service/api_key_service_delete_test.go +++ b/backend/internal/service/api_key_service_delete_test.go @@ -1,7 +1,7 @@ //go:build unit // API Key 服务删除方法的单元测试 -// 测试 ApiKeyService.Delete 方法在各种场景下的行为, +// 测试 APIKeyService.Delete 方法在各种场景下的行为, // 包括权限验证、缓存清理和错误处理 package service @@ -16,12 +16,12 @@ import ( "github.com/stretchr/testify/require" ) -// apiKeyRepoStub 是 ApiKeyRepository 接口的测试桩实现。 -// 用于隔离测试 ApiKeyService.Delete 方法,避免依赖真实数据库。 +// apiKeyRepoStub 是 APIKeyRepository 接口的测试桩实现。 +// 用于隔离测试 APIKeyService.Delete 方法,避免依赖真实数据库。 // // 设计说明: // - ownerID: 模拟 GetOwnerID 返回的所有者 ID -// - ownerErr: 模拟 GetOwnerID 返回的错误(如 ErrApiKeyNotFound) +// - ownerErr: 模拟 GetOwnerID 返回的错误(如 ErrAPIKeyNotFound) // - deleteErr: 模拟 Delete 返回的错误 // - deletedIDs: 记录被调用删除的 API Key ID,用于断言验证 type apiKeyRepoStub struct { @@ -33,11 +33,11 @@ type apiKeyRepoStub struct { // 以下方法在本测试中不应被调用,使用 panic 确保测试失败时能快速定位问题 -func (s *apiKeyRepoStub) Create(ctx context.Context, key *ApiKey) error { +func (s *apiKeyRepoStub) Create(ctx context.Context, key *APIKey) error { panic("unexpected Create call") } -func (s *apiKeyRepoStub) GetByID(ctx context.Context, id int64) (*ApiKey, error) { +func (s *apiKeyRepoStub) GetByID(ctx context.Context, id int64) (*APIKey, error) { panic("unexpected GetByID call") } @@ -47,11 +47,11 @@ func (s *apiKeyRepoStub) GetOwnerID(ctx context.Context, id int64) (int64, error return s.ownerID, s.ownerErr } -func (s *apiKeyRepoStub) GetByKey(ctx context.Context, key string) (*ApiKey, error) { +func (s *apiKeyRepoStub) GetByKey(ctx context.Context, key string) (*APIKey, error) { panic("unexpected GetByKey call") } -func (s *apiKeyRepoStub) Update(ctx context.Context, key *ApiKey) error { +func (s *apiKeyRepoStub) Update(ctx context.Context, key *APIKey) error { panic("unexpected Update call") } @@ -64,7 +64,7 @@ func (s *apiKeyRepoStub) Delete(ctx context.Context, id int64) error { // 以下是接口要求实现但本测试不关心的方法 -func (s *apiKeyRepoStub) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]ApiKey, *pagination.PaginationResult, error) { +func (s *apiKeyRepoStub) ListByUserID(ctx context.Context, userID int64, params pagination.PaginationParams) ([]APIKey, *pagination.PaginationResult, error) { panic("unexpected ListByUserID call") } @@ -80,12 +80,12 @@ func (s *apiKeyRepoStub) ExistsByKey(ctx context.Context, key string) (bool, err panic("unexpected ExistsByKey call") } -func (s *apiKeyRepoStub) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]ApiKey, *pagination.PaginationResult, error) { +func (s *apiKeyRepoStub) ListByGroupID(ctx context.Context, groupID int64, params pagination.PaginationParams) ([]APIKey, *pagination.PaginationResult, error) { panic("unexpected ListByGroupID call") } -func (s *apiKeyRepoStub) SearchApiKeys(ctx context.Context, userID int64, keyword string, limit int) ([]ApiKey, error) { - panic("unexpected SearchApiKeys call") +func (s *apiKeyRepoStub) SearchAPIKeys(ctx context.Context, userID int64, keyword string, limit int) ([]APIKey, error) { + panic("unexpected SearchAPIKeys call") } func (s *apiKeyRepoStub) ClearGroupIDByGroupID(ctx context.Context, groupID int64) (int64, error) { @@ -96,7 +96,7 @@ func (s *apiKeyRepoStub) CountByGroupID(ctx context.Context, groupID int64) (int panic("unexpected CountByGroupID call") } -// apiKeyCacheStub 是 ApiKeyCache 接口的测试桩实现。 +// apiKeyCacheStub 是 APIKeyCache 接口的测试桩实现。 // 用于验证删除操作时缓存清理逻辑是否被正确调用。 // // 设计说明: @@ -142,7 +142,7 @@ func (s *apiKeyCacheStub) SetDailyUsageExpiry(ctx context.Context, apiKey string func TestApiKeyService_Delete_OwnerMismatch(t *testing.T) { repo := &apiKeyRepoStub{ownerID: 1} cache := &apiKeyCacheStub{} - svc := &ApiKeyService{apiKeyRepo: repo, cache: cache} + svc := &APIKeyService{apiKeyRepo: repo, cache: cache} err := svc.Delete(context.Background(), 10, 2) // API Key ID=10, 调用者 userID=2 require.ErrorIs(t, err, ErrInsufficientPerms) @@ -160,7 +160,7 @@ func TestApiKeyService_Delete_OwnerMismatch(t *testing.T) { func TestApiKeyService_Delete_Success(t *testing.T) { repo := &apiKeyRepoStub{ownerID: 7} cache := &apiKeyCacheStub{} - svc := &ApiKeyService{apiKeyRepo: repo, cache: cache} + svc := &APIKeyService{apiKeyRepo: repo, cache: cache} err := svc.Delete(context.Background(), 42, 7) // API Key ID=42, 调用者 userID=7 require.NoError(t, err) @@ -170,17 +170,17 @@ func TestApiKeyService_Delete_Success(t *testing.T) { // TestApiKeyService_Delete_NotFound 测试删除不存在的 API Key 时返回正确的错误。 // 预期行为: -// - GetOwnerID 返回 ErrApiKeyNotFound 错误 -// - 返回 ErrApiKeyNotFound 错误(被 fmt.Errorf 包装) +// - GetOwnerID 返回 ErrAPIKeyNotFound 错误 +// - 返回 ErrAPIKeyNotFound 错误(被 fmt.Errorf 包装) // - Delete 方法不被调用 // - 缓存不被清除 func TestApiKeyService_Delete_NotFound(t *testing.T) { - repo := &apiKeyRepoStub{ownerErr: ErrApiKeyNotFound} + repo := &apiKeyRepoStub{ownerErr: ErrAPIKeyNotFound} cache := &apiKeyCacheStub{} - svc := &ApiKeyService{apiKeyRepo: repo, cache: cache} + svc := &APIKeyService{apiKeyRepo: repo, cache: cache} err := svc.Delete(context.Background(), 99, 1) - require.ErrorIs(t, err, ErrApiKeyNotFound) + require.ErrorIs(t, err, ErrAPIKeyNotFound) require.Empty(t, repo.deletedIDs) require.Empty(t, cache.invalidated) } @@ -198,7 +198,7 @@ func TestApiKeyService_Delete_DeleteFails(t *testing.T) { deleteErr: errors.New("delete failed"), } cache := &apiKeyCacheStub{} - svc := &ApiKeyService{apiKeyRepo: repo, cache: cache} + svc := &APIKeyService{apiKeyRepo: repo, cache: cache} err := svc.Delete(context.Background(), 3, 3) // API Key ID=3, 调用者 userID=3 require.Error(t, err) diff --git a/backend/internal/service/billing_cache_service.go b/backend/internal/service/billing_cache_service.go index 9cdeed7b..86148b37 100644 --- a/backend/internal/service/billing_cache_service.go +++ b/backend/internal/service/billing_cache_service.go @@ -445,7 +445,7 @@ func (s *BillingCacheService) InvalidateSubscription(ctx context.Context, userID // CheckBillingEligibility 检查用户是否有资格发起请求 // 余额模式:检查缓存余额 > 0 // 订阅模式:检查缓存用量未超过限额(Group限额从参数传入) -func (s *BillingCacheService) CheckBillingEligibility(ctx context.Context, user *User, apiKey *ApiKey, group *Group, subscription *UserSubscription) error { +func (s *BillingCacheService) CheckBillingEligibility(ctx context.Context, user *User, apiKey *APIKey, group *Group, subscription *UserSubscription) error { // 简易模式:跳过所有计费检查 if s.cfg.RunMode == config.RunModeSimple { return nil diff --git a/backend/internal/service/crs_sync_service.go b/backend/internal/service/crs_sync_service.go index fd23ecb2..1bf5a11e 100644 --- a/backend/internal/service/crs_sync_service.go +++ b/backend/internal/service/crs_sync_service.go @@ -430,7 +430,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput account := &Account{ Name: defaultName(src.Name, src.ID), Platform: PlatformAnthropic, - Type: AccountTypeApiKey, + Type: AccountTypeAPIKey, Credentials: credentials, Extra: extra, ProxyID: proxyID, @@ -455,7 +455,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput existing.Extra = mergeMap(existing.Extra, extra) existing.Name = defaultName(src.Name, src.ID) existing.Platform = PlatformAnthropic - existing.Type = AccountTypeApiKey + existing.Type = AccountTypeAPIKey existing.Credentials = mergeMap(existing.Credentials, credentials) if proxyID != nil { existing.ProxyID = proxyID @@ -674,7 +674,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput account := &Account{ Name: defaultName(src.Name, src.ID), Platform: PlatformOpenAI, - Type: AccountTypeApiKey, + Type: AccountTypeAPIKey, Credentials: credentials, Extra: extra, ProxyID: proxyID, @@ -699,7 +699,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput existing.Extra = mergeMap(existing.Extra, extra) existing.Name = defaultName(src.Name, src.ID) existing.Platform = PlatformOpenAI - existing.Type = AccountTypeApiKey + existing.Type = AccountTypeAPIKey existing.Credentials = mergeMap(existing.Credentials, credentials) if proxyID != nil { existing.ProxyID = proxyID @@ -893,7 +893,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput account := &Account{ Name: defaultName(src.Name, src.ID), Platform: PlatformGemini, - Type: AccountTypeApiKey, + Type: AccountTypeAPIKey, Credentials: credentials, Extra: extra, ProxyID: proxyID, @@ -918,7 +918,7 @@ func (s *CRSSyncService) SyncFromCRS(ctx context.Context, input SyncFromCRSInput existing.Extra = mergeMap(existing.Extra, extra) existing.Name = defaultName(src.Name, src.ID) existing.Platform = PlatformGemini - existing.Type = AccountTypeApiKey + existing.Type = AccountTypeAPIKey existing.Credentials = mergeMap(existing.Credentials, credentials) if proxyID != nil { existing.ProxyID = proxyID diff --git a/backend/internal/service/dashboard_service.go b/backend/internal/service/dashboard_service.go index 4de4a751..f0b1f2a0 100644 --- a/backend/internal/service/dashboard_service.go +++ b/backend/internal/service/dashboard_service.go @@ -43,8 +43,8 @@ func (s *DashboardService) GetModelStatsWithFilters(ctx context.Context, startTi return stats, nil } -func (s *DashboardService) GetApiKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.ApiKeyUsageTrendPoint, error) { - trend, err := s.usageRepo.GetApiKeyUsageTrend(ctx, startTime, endTime, granularity, limit) +func (s *DashboardService) GetAPIKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.APIKeyUsageTrendPoint, error) { + trend, err := s.usageRepo.GetAPIKeyUsageTrend(ctx, startTime, endTime, granularity, limit) if err != nil { return nil, fmt.Errorf("get api key usage trend: %w", err) } @@ -67,8 +67,8 @@ func (s *DashboardService) GetBatchUserUsageStats(ctx context.Context, userIDs [ return stats, nil } -func (s *DashboardService) GetBatchApiKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchApiKeyUsageStats, error) { - stats, err := s.usageRepo.GetBatchApiKeyUsageStats(ctx, apiKeyIDs) +func (s *DashboardService) GetBatchAPIKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchAPIKeyUsageStats, error) { + stats, err := s.usageRepo.GetBatchAPIKeyUsageStats(ctx, apiKeyIDs) if err != nil { return nil, fmt.Errorf("get batch api key usage stats: %w", err) } diff --git a/backend/internal/service/domain_constants.go b/backend/internal/service/domain_constants.go index 9d3d427f..ec29b84a 100644 --- a/backend/internal/service/domain_constants.go +++ b/backend/internal/service/domain_constants.go @@ -28,7 +28,7 @@ const ( const ( AccountTypeOAuth = "oauth" // OAuth类型账号(full scope: profile + inference) AccountTypeSetupToken = "setup-token" // Setup Token类型账号(inference only scope) - AccountTypeApiKey = "apikey" // API Key类型账号 + AccountTypeAPIKey = "apikey" // API Key类型账号 ) // Redeem type constants @@ -64,13 +64,13 @@ const ( SettingKeyEmailVerifyEnabled = "email_verify_enabled" // 是否开启邮件验证 // 邮件服务设置 - SettingKeySmtpHost = "smtp_host" // SMTP服务器地址 - SettingKeySmtpPort = "smtp_port" // SMTP端口 - SettingKeySmtpUsername = "smtp_username" // SMTP用户名 - SettingKeySmtpPassword = "smtp_password" // SMTP密码(加密存储) - SettingKeySmtpFrom = "smtp_from" // 发件人地址 - SettingKeySmtpFromName = "smtp_from_name" // 发件人名称 - SettingKeySmtpUseTLS = "smtp_use_tls" // 是否使用TLS + SettingKeySMTPHost = "smtp_host" // SMTP服务器地址 + SettingKeySMTPPort = "smtp_port" // SMTP端口 + SettingKeySMTPUsername = "smtp_username" // SMTP用户名 + SettingKeySMTPPassword = "smtp_password" // SMTP密码(加密存储) + SettingKeySMTPFrom = "smtp_from" // 发件人地址 + SettingKeySMTPFromName = "smtp_from_name" // 发件人名称 + SettingKeySMTPUseTLS = "smtp_use_tls" // 是否使用TLS // Cloudflare Turnstile 设置 SettingKeyTurnstileEnabled = "turnstile_enabled" // 是否启用 Turnstile 验证 @@ -81,16 +81,16 @@ const ( SettingKeySiteName = "site_name" // 网站名称 SettingKeySiteLogo = "site_logo" // 网站Logo (base64) SettingKeySiteSubtitle = "site_subtitle" // 网站副标题 - SettingKeyApiBaseUrl = "api_base_url" // API端点地址(用于客户端配置和导入) + SettingKeyAPIBaseURL = "api_base_url" // API端点地址(用于客户端配置和导入) SettingKeyContactInfo = "contact_info" // 客服联系方式 - SettingKeyDocUrl = "doc_url" // 文档链接 + SettingKeyDocURL = "doc_url" // 文档链接 // 默认配置 SettingKeyDefaultConcurrency = "default_concurrency" // 新用户默认并发量 SettingKeyDefaultBalance = "default_balance" // 新用户默认余额 // 管理员 API Key - SettingKeyAdminApiKey = "admin_api_key" // 全局管理员 API Key(用于外部系统集成) + SettingKeyAdminAPIKey = "admin_api_key" // 全局管理员 API Key(用于外部系统集成) // Gemini 配额策略(JSON) SettingKeyGeminiQuotaPolicy = "gemini_quota_policy" @@ -103,5 +103,5 @@ const ( SettingKeyFallbackModelAntigravity = "fallback_model_antigravity" ) -// Admin API Key prefix (distinct from user "sk-" keys) -const AdminApiKeyPrefix = "admin-" +// AdminAPIKeyPrefix is the prefix for admin API keys (distinct from user "sk-" keys). +const AdminAPIKeyPrefix = "admin-" diff --git a/backend/internal/service/email_service.go b/backend/internal/service/email_service.go index 6537b01e..d6a3c05b 100644 --- a/backend/internal/service/email_service.go +++ b/backend/internal/service/email_service.go @@ -40,8 +40,8 @@ const ( maxVerifyCodeAttempts = 5 ) -// SmtpConfig SMTP配置 -type SmtpConfig struct { +// SMTPConfig SMTP配置 +type SMTPConfig struct { Host string Port int Username string @@ -65,16 +65,16 @@ func NewEmailService(settingRepo SettingRepository, cache EmailCache) *EmailServ } } -// GetSmtpConfig 从数据库获取SMTP配置 -func (s *EmailService) GetSmtpConfig(ctx context.Context) (*SmtpConfig, error) { +// GetSMTPConfig 从数据库获取SMTP配置 +func (s *EmailService) GetSMTPConfig(ctx context.Context) (*SMTPConfig, error) { keys := []string{ - SettingKeySmtpHost, - SettingKeySmtpPort, - SettingKeySmtpUsername, - SettingKeySmtpPassword, - SettingKeySmtpFrom, - SettingKeySmtpFromName, - SettingKeySmtpUseTLS, + SettingKeySMTPHost, + SettingKeySMTPPort, + SettingKeySMTPUsername, + SettingKeySMTPPassword, + SettingKeySMTPFrom, + SettingKeySMTPFromName, + SettingKeySMTPUseTLS, } settings, err := s.settingRepo.GetMultiple(ctx, keys) @@ -82,34 +82,34 @@ func (s *EmailService) GetSmtpConfig(ctx context.Context) (*SmtpConfig, error) { return nil, fmt.Errorf("get smtp settings: %w", err) } - host := settings[SettingKeySmtpHost] + host := settings[SettingKeySMTPHost] if host == "" { return nil, ErrEmailNotConfigured } port := 587 // 默认端口 - if portStr := settings[SettingKeySmtpPort]; portStr != "" { + if portStr := settings[SettingKeySMTPPort]; portStr != "" { if p, err := strconv.Atoi(portStr); err == nil { port = p } } - useTLS := settings[SettingKeySmtpUseTLS] == "true" + useTLS := settings[SettingKeySMTPUseTLS] == "true" - return &SmtpConfig{ + return &SMTPConfig{ Host: host, Port: port, - Username: settings[SettingKeySmtpUsername], - Password: settings[SettingKeySmtpPassword], - From: settings[SettingKeySmtpFrom], - FromName: settings[SettingKeySmtpFromName], + Username: settings[SettingKeySMTPUsername], + Password: settings[SettingKeySMTPPassword], + From: settings[SettingKeySMTPFrom], + FromName: settings[SettingKeySMTPFromName], UseTLS: useTLS, }, nil } // SendEmail 发送邮件(使用数据库中保存的配置) func (s *EmailService) SendEmail(ctx context.Context, to, subject, body string) error { - config, err := s.GetSmtpConfig(ctx) + config, err := s.GetSMTPConfig(ctx) if err != nil { return err } @@ -117,7 +117,7 @@ func (s *EmailService) SendEmail(ctx context.Context, to, subject, body string) } // SendEmailWithConfig 使用指定配置发送邮件 -func (s *EmailService) SendEmailWithConfig(config *SmtpConfig, to, subject, body string) error { +func (s *EmailService) SendEmailWithConfig(config *SMTPConfig, to, subject, body string) error { from := config.From if config.FromName != "" { from = fmt.Sprintf("%s <%s>", config.FromName, config.From) @@ -306,8 +306,8 @@ func (s *EmailService) buildVerifyCodeEmailBody(code, siteName string) string { `, siteName, code) } -// TestSmtpConnectionWithConfig 使用指定配置测试SMTP连接 -func (s *EmailService) TestSmtpConnectionWithConfig(config *SmtpConfig) error { +// TestSMTPConnectionWithConfig 使用指定配置测试SMTP连接 +func (s *EmailService) TestSMTPConnectionWithConfig(config *SMTPConfig) error { addr := fmt.Sprintf("%s:%d", config.Host, config.Port) if config.UseTLS { diff --git a/backend/internal/service/gateway_multiplatform_test.go b/backend/internal/service/gateway_multiplatform_test.go index 0c8989fe..6c8198b2 100644 --- a/backend/internal/service/gateway_multiplatform_test.go +++ b/backend/internal/service/gateway_multiplatform_test.go @@ -282,7 +282,7 @@ func TestGatewayService_SelectAccountForModelWithPlatform_GeminiOAuthPreference( repo := &mockAccountRepoForPlatform{ accounts: []Account{ - {ID: 1, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeApiKey}, + {ID: 1, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeAPIKey}, {ID: 2, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeOAuth}, }, accountsByID: map[int64]*Account{}, @@ -623,7 +623,7 @@ func TestGatewayService_selectAccountWithMixedScheduling(t *testing.T) { t.Run("混合调度-Gemini优先选择OAuth账户", func(t *testing.T) { repo := &mockAccountRepoForPlatform{ accounts: []Account{ - {ID: 1, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeApiKey}, + {ID: 1, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeAPIKey}, {ID: 2, Platform: PlatformGemini, Priority: 1, Status: StatusActive, Schedulable: true, Type: AccountTypeOAuth}, }, accountsByID: map[int64]*Account{}, diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index 327f19f9..97e4c2e8 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -907,7 +907,7 @@ func (s *GatewayService) GetAccessToken(ctx context.Context, account *Account) ( case AccountTypeOAuth, AccountTypeSetupToken: // Both oauth and setup-token use OAuth token flow return s.getOAuthToken(ctx, account) - case AccountTypeApiKey: + case AccountTypeAPIKey: apiKey := account.GetCredential("api_key") if apiKey == "" { return "", "", errors.New("api_key not found in credentials") @@ -1045,7 +1045,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A // 应用模型映射(仅对apikey类型账号) originalModel := reqModel - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { mappedModel := account.GetMappedModel(reqModel) if mappedModel != reqModel { // 替换请求体中的模型名 @@ -1223,7 +1223,7 @@ func (s *GatewayService) Forward(ctx context.Context, c *gin.Context, account *A func (s *GatewayService) buildUpstreamRequest(ctx context.Context, c *gin.Context, account *Account, body []byte, token, tokenType, modelID string) (*http.Request, error) { // 确定目标URL targetURL := claudeAPIURL - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { baseURL := account.GetBaseURL() targetURL = baseURL + "/v1/messages" } @@ -1287,10 +1287,10 @@ func (s *GatewayService) buildUpstreamRequest(ctx context.Context, c *gin.Contex // 处理anthropic-beta header(OAuth账号需要特殊处理) if tokenType == "oauth" { req.Header.Set("anthropic-beta", s.getBetaHeader(modelID, c.GetHeader("anthropic-beta"))) - } else if s.cfg != nil && s.cfg.Gateway.InjectBetaForApiKey && req.Header.Get("anthropic-beta") == "" { + } else if s.cfg != nil && s.cfg.Gateway.InjectBetaForAPIKey && req.Header.Get("anthropic-beta") == "" { // API-key:仅在请求显式使用 beta 特性且客户端未提供时,按需补齐(默认关闭) if requestNeedsBetaFeatures(body) { - if beta := defaultApiKeyBetaHeader(body); beta != "" { + if beta := defaultAPIKeyBetaHeader(body); beta != "" { req.Header.Set("anthropic-beta", beta) } } @@ -1357,12 +1357,12 @@ func requestNeedsBetaFeatures(body []byte) bool { return false } -func defaultApiKeyBetaHeader(body []byte) string { +func defaultAPIKeyBetaHeader(body []byte) string { modelID := gjson.GetBytes(body, "model").String() if strings.Contains(strings.ToLower(modelID), "haiku") { - return claude.ApiKeyHaikuBetaHeader + return claude.APIKeyHaikuBetaHeader } - return claude.ApiKeyBetaHeader + return claude.APIKeyBetaHeader } func truncateForLog(b []byte, maxBytes int) string { @@ -1780,7 +1780,7 @@ func (s *GatewayService) replaceModelInResponseBody(body []byte, fromModel, toMo // RecordUsageInput 记录使用量的输入参数 type RecordUsageInput struct { Result *ForwardResult - ApiKey *ApiKey + APIKey *APIKey User *User Account *Account Subscription *UserSubscription // 可选:订阅信息 @@ -1789,7 +1789,7 @@ type RecordUsageInput struct { // RecordUsage 记录使用量并扣费(或更新订阅用量) func (s *GatewayService) RecordUsage(ctx context.Context, input *RecordUsageInput) error { result := input.Result - apiKey := input.ApiKey + apiKey := input.APIKey user := input.User account := input.Account subscription := input.Subscription @@ -1826,7 +1826,7 @@ func (s *GatewayService) RecordUsage(ctx context.Context, input *RecordUsageInpu durationMs := int(result.Duration.Milliseconds()) usageLog := &UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, RequestID: result.RequestID, Model: result.Model, @@ -1914,7 +1914,7 @@ func (s *GatewayService) ForwardCountTokens(ctx context.Context, c *gin.Context, } // 应用模型映射(仅对 apikey 类型账号) - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { if reqModel != "" { mappedModel := account.GetMappedModel(reqModel) if mappedModel != reqModel { @@ -2018,7 +2018,7 @@ func (s *GatewayService) ForwardCountTokens(ctx context.Context, c *gin.Context, func (s *GatewayService) buildCountTokensRequest(ctx context.Context, c *gin.Context, account *Account, body []byte, token, tokenType, modelID string) (*http.Request, error) { // 确定目标 URL targetURL := claudeAPICountTokensURL - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { baseURL := account.GetBaseURL() targetURL = baseURL + "/v1/messages/count_tokens" } @@ -2077,10 +2077,10 @@ func (s *GatewayService) buildCountTokensRequest(ctx context.Context, c *gin.Con // OAuth 账号:处理 anthropic-beta header if tokenType == "oauth" { req.Header.Set("anthropic-beta", s.getBetaHeader(modelID, c.GetHeader("anthropic-beta"))) - } else if s.cfg != nil && s.cfg.Gateway.InjectBetaForApiKey && req.Header.Get("anthropic-beta") == "" { + } else if s.cfg != nil && s.cfg.Gateway.InjectBetaForAPIKey && req.Header.Get("anthropic-beta") == "" { // API-key:与 messages 同步的按需 beta 注入(默认关闭) if requestNeedsBetaFeatures(body) { - if beta := defaultApiKeyBetaHeader(body); beta != "" { + if beta := defaultAPIKeyBetaHeader(body); beta != "" { req.Header.Set("anthropic-beta", beta) } } diff --git a/backend/internal/service/gemini_messages_compat_service.go b/backend/internal/service/gemini_messages_compat_service.go index 69f8a018..a1e3a83e 100644 --- a/backend/internal/service/gemini_messages_compat_service.go +++ b/backend/internal/service/gemini_messages_compat_service.go @@ -273,7 +273,7 @@ func (s *GeminiMessagesCompatService) SelectAccountForAIStudioEndpoints(ctx cont return 999 } switch a.Type { - case AccountTypeApiKey: + case AccountTypeAPIKey: if strings.TrimSpace(a.GetCredential("api_key")) != "" { return 0 } @@ -351,7 +351,7 @@ func (s *GeminiMessagesCompatService) Forward(ctx context.Context, c *gin.Contex originalModel := req.Model mappedModel := req.Model - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { mappedModel = account.GetMappedModel(req.Model) } @@ -374,7 +374,7 @@ func (s *GeminiMessagesCompatService) Forward(ctx context.Context, c *gin.Contex } switch account.Type { - case AccountTypeApiKey: + case AccountTypeAPIKey: buildReq = func(ctx context.Context) (*http.Request, string, error) { apiKey := account.GetCredential("api_key") if strings.TrimSpace(apiKey) == "" { @@ -621,7 +621,7 @@ func (s *GeminiMessagesCompatService) ForwardNative(ctx context.Context, c *gin. } mappedModel := originalModel - if account.Type == AccountTypeApiKey { + if account.Type == AccountTypeAPIKey { mappedModel = account.GetMappedModel(originalModel) } @@ -643,7 +643,7 @@ func (s *GeminiMessagesCompatService) ForwardNative(ctx context.Context, c *gin. var buildReq func(ctx context.Context) (*http.Request, string, error) switch account.Type { - case AccountTypeApiKey: + case AccountTypeAPIKey: buildReq = func(ctx context.Context) (*http.Request, string, error) { apiKey := account.GetCredential("api_key") if strings.TrimSpace(apiKey) == "" { @@ -1790,7 +1790,7 @@ func (s *GeminiMessagesCompatService) ForwardAIStudioGET(ctx context.Context, ac } switch account.Type { - case AccountTypeApiKey: + case AccountTypeAPIKey: apiKey := strings.TrimSpace(account.GetCredential("api_key")) if apiKey == "" { return nil, errors.New("gemini api_key not configured") diff --git a/backend/internal/service/gemini_multiplatform_test.go b/backend/internal/service/gemini_multiplatform_test.go index c9b28a7b..0a434835 100644 --- a/backend/internal/service/gemini_multiplatform_test.go +++ b/backend/internal/service/gemini_multiplatform_test.go @@ -281,7 +281,7 @@ func TestGeminiMessagesCompatService_SelectAccountForModelWithExclusions_OAuthPr repo := &mockAccountRepoForGemini{ accounts: []Account{ - {ID: 1, Platform: PlatformGemini, Type: AccountTypeApiKey, Priority: 1, Status: StatusActive, Schedulable: true, LastUsedAt: nil}, + {ID: 1, Platform: PlatformGemini, Type: AccountTypeAPIKey, Priority: 1, Status: StatusActive, Schedulable: true, LastUsedAt: nil}, {ID: 2, Platform: PlatformGemini, Type: AccountTypeOAuth, Priority: 1, Status: StatusActive, Schedulable: true, LastUsedAt: nil}, }, accountsByID: map[int64]*Account{}, diff --git a/backend/internal/service/gemini_oauth_service.go b/backend/internal/service/gemini_oauth_service.go index 32526e42..1dce9da9 100644 --- a/backend/internal/service/gemini_oauth_service.go +++ b/backend/internal/service/gemini_oauth_service.go @@ -353,7 +353,7 @@ func inferGoogleOneTier(storageBytes int64) string { return GeminiTierGoogleOneUnknown } -// fetchGoogleOneTier fetches Google One tier from Drive API +// FetchGoogleOneTier fetches Google One tier from Drive API. // Note: LoadCodeAssist API is NOT called for Google One accounts because: // 1. It's designed for GCP IAM (enterprise), not personal Google accounts // 2. Personal accounts will get 403/404 from cloudaicompanion.googleapis.com diff --git a/backend/internal/service/openai_gateway_service.go b/backend/internal/service/openai_gateway_service.go index 63166cd2..02f58369 100644 --- a/backend/internal/service/openai_gateway_service.go +++ b/backend/internal/service/openai_gateway_service.go @@ -487,7 +487,7 @@ func (s *OpenAIGatewayService) GetAccessToken(ctx context.Context, account *Acco return "", "", errors.New("access_token not found in credentials") } return accessToken, "oauth", nil - case AccountTypeApiKey: + case AccountTypeAPIKey: apiKey := account.GetOpenAIApiKey() if apiKey == "" { return "", "", errors.New("api_key not found in credentials") @@ -627,7 +627,7 @@ func (s *OpenAIGatewayService) buildUpstreamRequest(ctx context.Context, c *gin. case AccountTypeOAuth: // OAuth accounts use ChatGPT internal API targetURL = chatgptCodexURL - case AccountTypeApiKey: + case AccountTypeAPIKey: // API Key accounts use Platform API or custom base URL baseURL := account.GetOpenAIBaseURL() if baseURL != "" { @@ -946,7 +946,7 @@ func (s *OpenAIGatewayService) replaceModelInResponseBody(body []byte, fromModel // OpenAIRecordUsageInput input for recording usage type OpenAIRecordUsageInput struct { Result *OpenAIForwardResult - ApiKey *ApiKey + APIKey *APIKey User *User Account *Account Subscription *UserSubscription @@ -955,7 +955,7 @@ type OpenAIRecordUsageInput struct { // RecordUsage records usage and deducts balance func (s *OpenAIGatewayService) RecordUsage(ctx context.Context, input *OpenAIRecordUsageInput) error { result := input.Result - apiKey := input.ApiKey + apiKey := input.APIKey user := input.User account := input.Account subscription := input.Subscription @@ -997,7 +997,7 @@ func (s *OpenAIGatewayService) RecordUsage(ctx context.Context, input *OpenAIRec durationMs := int(result.Duration.Milliseconds()) usageLog := &UsageLog{ UserID: user.ID, - ApiKeyID: apiKey.ID, + APIKeyID: apiKey.ID, AccountID: account.ID, RequestID: result.RequestID, Model: result.Model, diff --git a/backend/internal/service/setting_service.go b/backend/internal/service/setting_service.go index 1dd65c9a..b27cfedb 100644 --- a/backend/internal/service/setting_service.go +++ b/backend/internal/service/setting_service.go @@ -61,9 +61,9 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings SettingKeySiteName, SettingKeySiteLogo, SettingKeySiteSubtitle, - SettingKeyApiBaseUrl, + SettingKeyAPIBaseURL, SettingKeyContactInfo, - SettingKeyDocUrl, + SettingKeyDocURL, } settings, err := s.settingRepo.GetMultiple(ctx, keys) @@ -79,9 +79,9 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings SiteName: s.getStringOrDefault(settings, SettingKeySiteName, "Sub2API"), SiteLogo: settings[SettingKeySiteLogo], SiteSubtitle: s.getStringOrDefault(settings, SettingKeySiteSubtitle, "Subscription to API Conversion Platform"), - APIBaseURL: settings[SettingKeyApiBaseUrl], + APIBaseURL: settings[SettingKeyAPIBaseURL], ContactInfo: settings[SettingKeyContactInfo], - DocURL: settings[SettingKeyDocUrl], + DocURL: settings[SettingKeyDocURL], }, nil } @@ -94,15 +94,15 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet updates[SettingKeyEmailVerifyEnabled] = strconv.FormatBool(settings.EmailVerifyEnabled) // 邮件服务设置(只有非空才更新密码) - updates[SettingKeySmtpHost] = settings.SMTPHost - updates[SettingKeySmtpPort] = strconv.Itoa(settings.SMTPPort) - updates[SettingKeySmtpUsername] = settings.SMTPUsername + updates[SettingKeySMTPHost] = settings.SMTPHost + updates[SettingKeySMTPPort] = strconv.Itoa(settings.SMTPPort) + updates[SettingKeySMTPUsername] = settings.SMTPUsername if settings.SMTPPassword != "" { - updates[SettingKeySmtpPassword] = settings.SMTPPassword + updates[SettingKeySMTPPassword] = settings.SMTPPassword } - updates[SettingKeySmtpFrom] = settings.SMTPFrom - updates[SettingKeySmtpFromName] = settings.SMTPFromName - updates[SettingKeySmtpUseTLS] = strconv.FormatBool(settings.SMTPUseTLS) + updates[SettingKeySMTPFrom] = settings.SMTPFrom + updates[SettingKeySMTPFromName] = settings.SMTPFromName + updates[SettingKeySMTPUseTLS] = strconv.FormatBool(settings.SMTPUseTLS) // Cloudflare Turnstile 设置(只有非空才更新密钥) updates[SettingKeyTurnstileEnabled] = strconv.FormatBool(settings.TurnstileEnabled) @@ -115,9 +115,9 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet updates[SettingKeySiteName] = settings.SiteName updates[SettingKeySiteLogo] = settings.SiteLogo updates[SettingKeySiteSubtitle] = settings.SiteSubtitle - updates[SettingKeyApiBaseUrl] = settings.APIBaseURL + updates[SettingKeyAPIBaseURL] = settings.APIBaseURL updates[SettingKeyContactInfo] = settings.ContactInfo - updates[SettingKeyDocUrl] = settings.DocURL + updates[SettingKeyDocURL] = settings.DocURL // 默认配置 updates[SettingKeyDefaultConcurrency] = strconv.Itoa(settings.DefaultConcurrency) @@ -205,8 +205,8 @@ func (s *SettingService) InitializeDefaultSettings(ctx context.Context) error { SettingKeySiteLogo: "", SettingKeyDefaultConcurrency: strconv.Itoa(s.cfg.Default.UserConcurrency), SettingKeyDefaultBalance: strconv.FormatFloat(s.cfg.Default.UserBalance, 'f', 8, 64), - SettingKeySmtpPort: "587", - SettingKeySmtpUseTLS: "false", + SettingKeySMTPPort: "587", + SettingKeySMTPUseTLS: "false", // Model fallback defaults SettingKeyEnableModelFallback: "false", SettingKeyFallbackModelAnthropic: "claude-3-5-sonnet-20241022", @@ -223,23 +223,23 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin result := &SystemSettings{ RegistrationEnabled: settings[SettingKeyRegistrationEnabled] == "true", EmailVerifyEnabled: settings[SettingKeyEmailVerifyEnabled] == "true", - SMTPHost: settings[SettingKeySmtpHost], - SMTPUsername: settings[SettingKeySmtpUsername], - SMTPFrom: settings[SettingKeySmtpFrom], - SMTPFromName: settings[SettingKeySmtpFromName], - SMTPUseTLS: settings[SettingKeySmtpUseTLS] == "true", + SMTPHost: settings[SettingKeySMTPHost], + SMTPUsername: settings[SettingKeySMTPUsername], + SMTPFrom: settings[SettingKeySMTPFrom], + SMTPFromName: settings[SettingKeySMTPFromName], + SMTPUseTLS: settings[SettingKeySMTPUseTLS] == "true", TurnstileEnabled: settings[SettingKeyTurnstileEnabled] == "true", TurnstileSiteKey: settings[SettingKeyTurnstileSiteKey], SiteName: s.getStringOrDefault(settings, SettingKeySiteName, "Sub2API"), SiteLogo: settings[SettingKeySiteLogo], SiteSubtitle: s.getStringOrDefault(settings, SettingKeySiteSubtitle, "Subscription to API Conversion Platform"), - APIBaseURL: settings[SettingKeyApiBaseUrl], + APIBaseURL: settings[SettingKeyAPIBaseURL], ContactInfo: settings[SettingKeyContactInfo], - DocURL: settings[SettingKeyDocUrl], + DocURL: settings[SettingKeyDocURL], } // 解析整数类型 - if port, err := strconv.Atoi(settings[SettingKeySmtpPort]); err == nil { + if port, err := strconv.Atoi(settings[SettingKeySMTPPort]); err == nil { result.SMTPPort = port } else { result.SMTPPort = 587 @@ -259,7 +259,7 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin } // 敏感信息直接返回,方便测试连接时使用 - result.SMTPPassword = settings[SettingKeySmtpPassword] + result.SMTPPassword = settings[SettingKeySMTPPassword] result.TurnstileSecretKey = settings[SettingKeyTurnstileSecretKey] // Model fallback settings @@ -298,28 +298,28 @@ func (s *SettingService) GetTurnstileSecretKey(ctx context.Context) string { return value } -// GenerateAdminApiKey 生成新的管理员 API Key -func (s *SettingService) GenerateAdminApiKey(ctx context.Context) (string, error) { +// GenerateAdminAPIKey 生成新的管理员 API Key +func (s *SettingService) GenerateAdminAPIKey(ctx context.Context) (string, error) { // 生成 32 字节随机数 = 64 位十六进制字符 bytes := make([]byte, 32) if _, err := rand.Read(bytes); err != nil { return "", fmt.Errorf("generate random bytes: %w", err) } - key := AdminApiKeyPrefix + hex.EncodeToString(bytes) + key := AdminAPIKeyPrefix + hex.EncodeToString(bytes) // 存储到 settings 表 - if err := s.settingRepo.Set(ctx, SettingKeyAdminApiKey, key); err != nil { + if err := s.settingRepo.Set(ctx, SettingKeyAdminAPIKey, key); err != nil { return "", fmt.Errorf("save admin api key: %w", err) } return key, nil } -// GetAdminApiKeyStatus 获取管理员 API Key 状态 +// GetAdminAPIKeyStatus 获取管理员 API Key 状态 // 返回脱敏的 key、是否存在、错误 -func (s *SettingService) GetAdminApiKeyStatus(ctx context.Context) (maskedKey string, exists bool, err error) { - key, err := s.settingRepo.GetValue(ctx, SettingKeyAdminApiKey) +func (s *SettingService) GetAdminAPIKeyStatus(ctx context.Context) (maskedKey string, exists bool, err error) { + key, err := s.settingRepo.GetValue(ctx, SettingKeyAdminAPIKey) if err != nil { if errors.Is(err, ErrSettingNotFound) { return "", false, nil @@ -340,10 +340,10 @@ func (s *SettingService) GetAdminApiKeyStatus(ctx context.Context) (maskedKey st return maskedKey, true, nil } -// GetAdminApiKey 获取完整的管理员 API Key(仅供内部验证使用) +// GetAdminAPIKey 获取完整的管理员 API Key(仅供内部验证使用) // 如果未配置返回空字符串和 nil 错误,只有数据库错误时才返回 error -func (s *SettingService) GetAdminApiKey(ctx context.Context) (string, error) { - key, err := s.settingRepo.GetValue(ctx, SettingKeyAdminApiKey) +func (s *SettingService) GetAdminAPIKey(ctx context.Context) (string, error) { + key, err := s.settingRepo.GetValue(ctx, SettingKeyAdminAPIKey) if err != nil { if errors.Is(err, ErrSettingNotFound) { return "", nil // 未配置,返回空字符串 @@ -353,9 +353,9 @@ func (s *SettingService) GetAdminApiKey(ctx context.Context) (string, error) { return key, nil } -// DeleteAdminApiKey 删除管理员 API Key -func (s *SettingService) DeleteAdminApiKey(ctx context.Context) error { - return s.settingRepo.Delete(ctx, SettingKeyAdminApiKey) +// DeleteAdminAPIKey 删除管理员 API Key +func (s *SettingService) DeleteAdminAPIKey(ctx context.Context) error { + return s.settingRepo.Delete(ctx, SettingKeyAdminAPIKey) } // IsModelFallbackEnabled 检查是否启用模型兜底机制 diff --git a/backend/internal/service/token_refresher_test.go b/backend/internal/service/token_refresher_test.go index 0a5135ac..c7505037 100644 --- a/backend/internal/service/token_refresher_test.go +++ b/backend/internal/service/token_refresher_test.go @@ -197,7 +197,7 @@ func TestClaudeTokenRefresher_CanRefresh(t *testing.T) { { name: "anthropic api-key - cannot refresh", platform: PlatformAnthropic, - accType: AccountTypeApiKey, + accType: AccountTypeAPIKey, want: false, }, { diff --git a/backend/internal/service/update_service.go b/backend/internal/service/update_service.go index 0c7e5a20..34ad4610 100644 --- a/backend/internal/service/update_service.go +++ b/backend/internal/service/update_service.go @@ -79,7 +79,7 @@ type ReleaseInfo struct { Name string `json:"name"` Body string `json:"body"` PublishedAt string `json:"published_at"` - HtmlURL string `json:"html_url"` + HTMLURL string `json:"html_url"` Assets []Asset `json:"assets,omitempty"` } @@ -96,13 +96,13 @@ type GitHubRelease struct { Name string `json:"name"` Body string `json:"body"` PublishedAt string `json:"published_at"` - HtmlUrl string `json:"html_url"` + HTMLURL string `json:"html_url"` Assets []GitHubAsset `json:"assets"` } type GitHubAsset struct { Name string `json:"name"` - BrowserDownloadUrl string `json:"browser_download_url"` + BrowserDownloadURL string `json:"browser_download_url"` Size int64 `json:"size"` } @@ -285,7 +285,7 @@ func (s *UpdateService) fetchLatestRelease(ctx context.Context) (*UpdateInfo, er for i, a := range release.Assets { assets[i] = Asset{ Name: a.Name, - DownloadURL: a.BrowserDownloadUrl, + DownloadURL: a.BrowserDownloadURL, Size: a.Size, } } @@ -298,7 +298,7 @@ func (s *UpdateService) fetchLatestRelease(ctx context.Context) (*UpdateInfo, er Name: release.Name, Body: release.Body, PublishedAt: release.PublishedAt, - HtmlURL: release.HtmlUrl, + HTMLURL: release.HTMLURL, Assets: assets, }, Cached: false, diff --git a/backend/internal/service/usage_log.go b/backend/internal/service/usage_log.go index e822cd95..ed0a8eb7 100644 --- a/backend/internal/service/usage_log.go +++ b/backend/internal/service/usage_log.go @@ -10,7 +10,7 @@ const ( type UsageLog struct { ID int64 UserID int64 - ApiKeyID int64 + APIKeyID int64 AccountID int64 RequestID string Model string @@ -42,7 +42,7 @@ type UsageLog struct { CreatedAt time.Time User *User - ApiKey *ApiKey + APIKey *APIKey Account *Account Group *Group Subscription *UserSubscription diff --git a/backend/internal/service/usage_service.go b/backend/internal/service/usage_service.go index 72b050e6..29362cc6 100644 --- a/backend/internal/service/usage_service.go +++ b/backend/internal/service/usage_service.go @@ -19,7 +19,7 @@ var ( // CreateUsageLogRequest 创建使用日志请求 type CreateUsageLogRequest struct { UserID int64 `json:"user_id"` - ApiKeyID int64 `json:"api_key_id"` + APIKeyID int64 `json:"api_key_id"` AccountID int64 `json:"account_id"` RequestID string `json:"request_id"` Model string `json:"model"` @@ -91,7 +91,7 @@ func (s *UsageService) Create(ctx context.Context, req CreateUsageLogRequest) (* // 创建使用日志 usageLog := &UsageLog{ UserID: req.UserID, - ApiKeyID: req.ApiKeyID, + APIKeyID: req.APIKeyID, AccountID: req.AccountID, RequestID: req.RequestID, Model: req.Model, @@ -151,9 +151,9 @@ func (s *UsageService) ListByUser(ctx context.Context, userID int64, params pagi return logs, pagination, nil } -// ListByApiKey 获取API Key的使用日志列表 -func (s *UsageService) ListByApiKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) { - logs, pagination, err := s.usageRepo.ListByApiKey(ctx, apiKeyID, params) +// ListByAPIKey 获取API Key的使用日志列表 +func (s *UsageService) ListByAPIKey(ctx context.Context, apiKeyID int64, params pagination.PaginationParams) ([]UsageLog, *pagination.PaginationResult, error) { + logs, pagination, err := s.usageRepo.ListByAPIKey(ctx, apiKeyID, params) if err != nil { return nil, nil, fmt.Errorf("list usage logs: %w", err) } @@ -188,9 +188,9 @@ func (s *UsageService) GetStatsByUser(ctx context.Context, userID int64, startTi }, nil } -// GetStatsByApiKey 获取API Key的使用统计 -func (s *UsageService) GetStatsByApiKey(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*UsageStats, error) { - stats, err := s.usageRepo.GetApiKeyStatsAggregated(ctx, apiKeyID, startTime, endTime) +// GetStatsByAPIKey 获取API Key的使用统计 +func (s *UsageService) GetStatsByAPIKey(ctx context.Context, apiKeyID int64, startTime, endTime time.Time) (*UsageStats, error) { + stats, err := s.usageRepo.GetAPIKeyStatsAggregated(ctx, apiKeyID, startTime, endTime) if err != nil { return nil, fmt.Errorf("get api key stats: %w", err) } @@ -293,9 +293,9 @@ func (s *UsageService) GetUserModelStats(ctx context.Context, userID int64, star return stats, nil } -// GetBatchApiKeyUsageStats returns today/total actual_cost for given api keys. -func (s *UsageService) GetBatchApiKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchApiKeyUsageStats, error) { - stats, err := s.usageRepo.GetBatchApiKeyUsageStats(ctx, apiKeyIDs) +// GetBatchAPIKeyUsageStats returns today/total actual_cost for given api keys. +func (s *UsageService) GetBatchAPIKeyUsageStats(ctx context.Context, apiKeyIDs []int64) (map[int64]*usagestats.BatchAPIKeyUsageStats, error) { + stats, err := s.usageRepo.GetBatchAPIKeyUsageStats(ctx, apiKeyIDs) if err != nil { return nil, fmt.Errorf("get batch api key usage stats: %w", err) } diff --git a/backend/internal/service/user.go b/backend/internal/service/user.go index 894243df..c565607e 100644 --- a/backend/internal/service/user.go +++ b/backend/internal/service/user.go @@ -21,7 +21,7 @@ type User struct { CreatedAt time.Time UpdatedAt time.Time - ApiKeys []ApiKey + APIKeys []APIKey Subscriptions []UserSubscription } diff --git a/backend/internal/service/wire.go b/backend/internal/service/wire.go index f52c2a4a..d4b984d6 100644 --- a/backend/internal/service/wire.go +++ b/backend/internal/service/wire.go @@ -75,7 +75,7 @@ var ProviderSet = wire.NewSet( // Core services NewAuthService, NewUserService, - NewApiKeyService, + NewAPIKeyService, NewGroupService, NewAccountService, NewProxyService, diff --git a/backend/internal/setup/cli.go b/backend/internal/setup/cli.go index 0d57d93f..03ac3f66 100644 --- a/backend/internal/setup/cli.go +++ b/backend/internal/setup/cli.go @@ -1,3 +1,4 @@ +// Package setup provides CLI commands and application initialization helpers. package setup import ( diff --git a/backend/internal/setup/setup.go b/backend/internal/setup/setup.go index 230d016f..435f6289 100644 --- a/backend/internal/setup/setup.go +++ b/backend/internal/setup/setup.go @@ -345,7 +345,7 @@ func writeConfigFile(cfg *SetupConfig) error { Default struct { UserConcurrency int `yaml:"user_concurrency"` UserBalance float64 `yaml:"user_balance"` - ApiKeyPrefix string `yaml:"api_key_prefix"` + APIKeyPrefix string `yaml:"api_key_prefix"` RateMultiplier float64 `yaml:"rate_multiplier"` } `yaml:"default"` RateLimit struct { @@ -367,12 +367,12 @@ func writeConfigFile(cfg *SetupConfig) error { Default: struct { UserConcurrency int `yaml:"user_concurrency"` UserBalance float64 `yaml:"user_balance"` - ApiKeyPrefix string `yaml:"api_key_prefix"` + APIKeyPrefix string `yaml:"api_key_prefix"` RateMultiplier float64 `yaml:"rate_multiplier"` }{ UserConcurrency: 5, UserBalance: 0, - ApiKeyPrefix: "sk-", + APIKeyPrefix: "sk-", RateMultiplier: 1.0, }, RateLimit: struct { diff --git a/backend/internal/web/embed_off.go b/backend/internal/web/embed_off.go index ac57fb5c..60a42bd3 100644 --- a/backend/internal/web/embed_off.go +++ b/backend/internal/web/embed_off.go @@ -1,5 +1,6 @@ //go:build !embed +// Package web provides embedded web assets for the application. package web import (