From ad6751df2a0661e54978898226956e70c0d7051d Mon Sep 17 00:00:00 2001 From: Scott McKendry Date: Thu, 30 Apr 2026 18:16:50 +1200 Subject: [PATCH] refactor(db): use new store interface --- internal/assets/assets.go | 2 +- .../{ => sqlite}/000001_init_sqlite.down.sql | 0 .../{ => sqlite}/000001_init_sqlite.up.sql | 0 .../{ => sqlite}/000002_oauth_name.down.sql | 0 .../{ => sqlite}/000002_oauth_name.up.sql | 0 .../{ => sqlite}/000003_oauth_sub.down.sql | 0 .../{ => sqlite}/000003_oauth_sub.up.sql | 0 .../{ => sqlite}/000004_created_at.down.sql | 0 .../{ => sqlite}/000004_created_at.up.sql | 0 .../{ => sqlite}/000005_oidc_session.down.sql | 0 .../{ => sqlite}/000005_oidc_session.up.sql | 0 .../{ => sqlite}/000006_oidc_nonce.down.sql | 0 .../{ => sqlite}/000006_oidc_nonce.up.sql | 0 .../{ => sqlite}/000007_oidc_pkce.down.sql | 0 .../{ => sqlite}/000007_oidc_pkce.up.sql | 0 .../000008_oidc_code_reuse.down.sql | 0 .../000008_oidc_code_reuse.up.sql | 0 .../000009_oidc_userinfo_profile.down.sql | 0 .../000009_oidc_userinfo_profile.up.sql | 0 internal/bootstrap/app_bootstrap.go | 9 +-- internal/bootstrap/db_bootstrap.go | 38 ++++++---- internal/controller/oidc_controller_test.go | 13 +--- internal/controller/proxy_controller_test.go | 13 +--- internal/controller/user_controller_test.go | 17 ++--- .../controller/well_known_controller_test.go | 13 +--- internal/model/config.go | 2 +- internal/repository/models.go | 73 ++++--------------- internal/repository/{ => sqlite}/db.go | 4 +- internal/repository/sqlite/models.go | 64 ++++++++++++++++ .../{ => sqlite}/oidc_queries.sql.go | 4 +- .../{ => sqlite}/session_queries.sql.go | 4 +- internal/repository/store.go | 41 +++++++++++ internal/service/auth_service.go | 4 +- internal/service/oidc_service.go | 4 +- sql/{ => sqlite}/oidc_queries.sql | 0 sql/{ => sqlite}/oidc_schemas.sql | 0 sql/{ => sqlite}/session_queries.sql | 0 sql/{ => sqlite}/session_schemas.sql | 0 sqlc.yml | 8 +- 39 files changed, 174 insertions(+), 139 deletions(-) rename internal/assets/migrations/{ => sqlite}/000001_init_sqlite.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000001_init_sqlite.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000002_oauth_name.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000002_oauth_name.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000003_oauth_sub.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000003_oauth_sub.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000004_created_at.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000004_created_at.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000005_oidc_session.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000005_oidc_session.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000006_oidc_nonce.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000006_oidc_nonce.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000007_oidc_pkce.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000007_oidc_pkce.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000008_oidc_code_reuse.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000008_oidc_code_reuse.up.sql (100%) rename internal/assets/migrations/{ => sqlite}/000009_oidc_userinfo_profile.down.sql (100%) rename internal/assets/migrations/{ => sqlite}/000009_oidc_userinfo_profile.up.sql (100%) rename internal/repository/{ => sqlite}/db.go (93%) create mode 100644 internal/repository/sqlite/models.go rename internal/repository/{ => sqlite}/oidc_queries.sql.go (99%) rename internal/repository/{ => sqlite}/session_queries.sql.go (98%) create mode 100644 internal/repository/store.go rename sql/{ => sqlite}/oidc_queries.sql (100%) rename sql/{ => sqlite}/oidc_schemas.sql (100%) rename sql/{ => sqlite}/session_queries.sql (100%) rename sql/{ => sqlite}/session_schemas.sql (100%) diff --git a/internal/assets/assets.go b/internal/assets/assets.go index 412403c9..a5c3d79d 100644 --- a/internal/assets/assets.go +++ b/internal/assets/assets.go @@ -11,5 +11,5 @@ var FrontendAssets embed.FS // Migrations // -//go:embed migrations/*.sql +//go:embed migrations/sqlite/*.sql var Migrations embed.FS diff --git a/internal/assets/migrations/000001_init_sqlite.down.sql b/internal/assets/migrations/sqlite/000001_init_sqlite.down.sql similarity index 100% rename from internal/assets/migrations/000001_init_sqlite.down.sql rename to internal/assets/migrations/sqlite/000001_init_sqlite.down.sql diff --git a/internal/assets/migrations/000001_init_sqlite.up.sql b/internal/assets/migrations/sqlite/000001_init_sqlite.up.sql similarity index 100% rename from internal/assets/migrations/000001_init_sqlite.up.sql rename to internal/assets/migrations/sqlite/000001_init_sqlite.up.sql diff --git a/internal/assets/migrations/000002_oauth_name.down.sql b/internal/assets/migrations/sqlite/000002_oauth_name.down.sql similarity index 100% rename from internal/assets/migrations/000002_oauth_name.down.sql rename to internal/assets/migrations/sqlite/000002_oauth_name.down.sql diff --git a/internal/assets/migrations/000002_oauth_name.up.sql b/internal/assets/migrations/sqlite/000002_oauth_name.up.sql similarity index 100% rename from internal/assets/migrations/000002_oauth_name.up.sql rename to internal/assets/migrations/sqlite/000002_oauth_name.up.sql diff --git a/internal/assets/migrations/000003_oauth_sub.down.sql b/internal/assets/migrations/sqlite/000003_oauth_sub.down.sql similarity index 100% rename from internal/assets/migrations/000003_oauth_sub.down.sql rename to internal/assets/migrations/sqlite/000003_oauth_sub.down.sql diff --git a/internal/assets/migrations/000003_oauth_sub.up.sql b/internal/assets/migrations/sqlite/000003_oauth_sub.up.sql similarity index 100% rename from internal/assets/migrations/000003_oauth_sub.up.sql rename to internal/assets/migrations/sqlite/000003_oauth_sub.up.sql diff --git a/internal/assets/migrations/000004_created_at.down.sql b/internal/assets/migrations/sqlite/000004_created_at.down.sql similarity index 100% rename from internal/assets/migrations/000004_created_at.down.sql rename to internal/assets/migrations/sqlite/000004_created_at.down.sql diff --git a/internal/assets/migrations/000004_created_at.up.sql b/internal/assets/migrations/sqlite/000004_created_at.up.sql similarity index 100% rename from internal/assets/migrations/000004_created_at.up.sql rename to internal/assets/migrations/sqlite/000004_created_at.up.sql diff --git a/internal/assets/migrations/000005_oidc_session.down.sql b/internal/assets/migrations/sqlite/000005_oidc_session.down.sql similarity index 100% rename from internal/assets/migrations/000005_oidc_session.down.sql rename to internal/assets/migrations/sqlite/000005_oidc_session.down.sql diff --git a/internal/assets/migrations/000005_oidc_session.up.sql b/internal/assets/migrations/sqlite/000005_oidc_session.up.sql similarity index 100% rename from internal/assets/migrations/000005_oidc_session.up.sql rename to internal/assets/migrations/sqlite/000005_oidc_session.up.sql diff --git a/internal/assets/migrations/000006_oidc_nonce.down.sql b/internal/assets/migrations/sqlite/000006_oidc_nonce.down.sql similarity index 100% rename from internal/assets/migrations/000006_oidc_nonce.down.sql rename to internal/assets/migrations/sqlite/000006_oidc_nonce.down.sql diff --git a/internal/assets/migrations/000006_oidc_nonce.up.sql b/internal/assets/migrations/sqlite/000006_oidc_nonce.up.sql similarity index 100% rename from internal/assets/migrations/000006_oidc_nonce.up.sql rename to internal/assets/migrations/sqlite/000006_oidc_nonce.up.sql diff --git a/internal/assets/migrations/000007_oidc_pkce.down.sql b/internal/assets/migrations/sqlite/000007_oidc_pkce.down.sql similarity index 100% rename from internal/assets/migrations/000007_oidc_pkce.down.sql rename to internal/assets/migrations/sqlite/000007_oidc_pkce.down.sql diff --git a/internal/assets/migrations/000007_oidc_pkce.up.sql b/internal/assets/migrations/sqlite/000007_oidc_pkce.up.sql similarity index 100% rename from internal/assets/migrations/000007_oidc_pkce.up.sql rename to internal/assets/migrations/sqlite/000007_oidc_pkce.up.sql diff --git a/internal/assets/migrations/000008_oidc_code_reuse.down.sql b/internal/assets/migrations/sqlite/000008_oidc_code_reuse.down.sql similarity index 100% rename from internal/assets/migrations/000008_oidc_code_reuse.down.sql rename to internal/assets/migrations/sqlite/000008_oidc_code_reuse.down.sql diff --git a/internal/assets/migrations/000008_oidc_code_reuse.up.sql b/internal/assets/migrations/sqlite/000008_oidc_code_reuse.up.sql similarity index 100% rename from internal/assets/migrations/000008_oidc_code_reuse.up.sql rename to internal/assets/migrations/sqlite/000008_oidc_code_reuse.up.sql diff --git a/internal/assets/migrations/000009_oidc_userinfo_profile.down.sql b/internal/assets/migrations/sqlite/000009_oidc_userinfo_profile.down.sql similarity index 100% rename from internal/assets/migrations/000009_oidc_userinfo_profile.down.sql rename to internal/assets/migrations/sqlite/000009_oidc_userinfo_profile.down.sql diff --git a/internal/assets/migrations/000009_oidc_userinfo_profile.up.sql b/internal/assets/migrations/sqlite/000009_oidc_userinfo_profile.up.sql similarity index 100% rename from internal/assets/migrations/000009_oidc_userinfo_profile.up.sql rename to internal/assets/migrations/sqlite/000009_oidc_userinfo_profile.up.sql diff --git a/internal/bootstrap/app_bootstrap.go b/internal/bootstrap/app_bootstrap.go index 3f491fa1..a9fe010d 100644 --- a/internal/bootstrap/app_bootstrap.go +++ b/internal/bootstrap/app_bootstrap.go @@ -43,7 +43,7 @@ type BootstrapApp struct { log *logger.Logger ctx context.Context cancel context.CancelFunc - queries *repository.Queries + queries repository.Store router *gin.Engine db *sql.DB wg sync.WaitGroup @@ -162,7 +162,7 @@ func (app *BootstrapApp) Setup() error { app.runtime.OAuthSessionCookieName = fmt.Sprintf("%s-%s", model.OAuthSessionCookieName, cookieId) // database - err = app.SetupDatabase() + store, err := app.SetupStore() if err != nil { return fmt.Errorf("failed to setup database: %w", err) @@ -176,9 +176,8 @@ func (app *BootstrapApp) Setup() error { app.db.Close() }() - // queries - queries := repository.New(app.db) - app.queries = queries + // store + app.queries = store // services err = app.setupServices() diff --git a/internal/bootstrap/db_bootstrap.go b/internal/bootstrap/db_bootstrap.go index d8572c4c..f4c7994b 100644 --- a/internal/bootstrap/db_bootstrap.go +++ b/internal/bootstrap/db_bootstrap.go @@ -7,6 +7,8 @@ import ( "path/filepath" "github.com/tinyauthapp/tinyauth/internal/assets" + "github.com/tinyauthapp/tinyauth/internal/repository" + "github.com/tinyauthapp/tinyauth/internal/repository/sqlite" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/sqlite3" @@ -14,17 +16,28 @@ import ( _ "modernc.org/sqlite" ) -func (app *BootstrapApp) SetupDatabase() error { - dir := filepath.Dir(app.config.Database.Path) +func (app *BootstrapApp) SetupStore() (repository.Store, error) { + return app.setupSQLite(app.config.Database.Path) +} + +// NewSQLiteStore opens a SQLite database at the given path, runs migrations, and returns a Store. +// Useful for testing or when constructing a store outside of a BootstrapApp. +func NewSQLiteStore(databasePath string) (repository.Store, error) { + app := &BootstrapApp{} + return app.setupSQLite(databasePath) +} + +func (app *BootstrapApp) setupSQLite(databasePath string) (repository.Store, error) { + dir := filepath.Dir(databasePath) if err := os.MkdirAll(dir, 0750); err != nil { - return fmt.Errorf("failed to create database directory %s: %w", dir, err) + return nil, fmt.Errorf("failed to create database directory %s: %w", dir, err) } - db, err := sql.Open("sqlite", app.config.Database.Path) + db, err := sql.Open("sqlite", databasePath) if err != nil { - return fmt.Errorf("failed to open database: %w", err) + return nil, fmt.Errorf("failed to open database: %w", err) } // Close the database if there is an error during migration @@ -38,32 +51,29 @@ func (app *BootstrapApp) SetupDatabase() error { // if the sqlite connection starts being a bottleneck db.SetMaxOpenConns(1) - migrations, err := iofs.New(assets.Migrations, "migrations") + migrations, err := iofs.New(assets.Migrations, "migrations/sqlite") if err != nil { - return fmt.Errorf("failed to create migrations: %w", err) + return nil, fmt.Errorf("failed to create migrations: %w", err) } target, err := sqlite3.WithInstance(db, &sqlite3.Config{}) if err != nil { - return fmt.Errorf("failed to create sqlite3 instance: %w", err) + return nil, fmt.Errorf("failed to create sqlite3 instance: %w", err) } migrator, err := migrate.NewWithInstance("iofs", migrations, "sqlite3", target) if err != nil { - return fmt.Errorf("failed to create migrator: %w", err) + return nil, fmt.Errorf("failed to create migrator: %w", err) } if err := migrator.Up(); err != nil && err != migrate.ErrNoChange { - return fmt.Errorf("failed to migrate database: %w", err) + return nil, fmt.Errorf("failed to migrate database: %w", err) } app.db = db - return nil -} -func (app *BootstrapApp) GetDB() *sql.DB { - return app.db + return sqlite.New(db), nil } diff --git a/internal/controller/oidc_controller_test.go b/internal/controller/oidc_controller_test.go index 9ece2073..73a67a76 100644 --- a/internal/controller/oidc_controller_test.go +++ b/internal/controller/oidc_controller_test.go @@ -18,7 +18,6 @@ import ( "github.com/tinyauthapp/tinyauth/internal/bootstrap" "github.com/tinyauthapp/tinyauth/internal/controller" "github.com/tinyauthapp/tinyauth/internal/model" - "github.com/tinyauthapp/tinyauth/internal/repository" "github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/test" "github.com/tinyauthapp/tinyauth/internal/utils/logger" @@ -839,16 +838,12 @@ func TestOIDCController(t *testing.T) { }, } - app := bootstrap.NewBootstrapApp(cfg) - - err := app.SetupDatabase() + store, err := bootstrap.NewSQLiteStore(cfg.Database.Path) require.NoError(t, err) - queries := repository.New(app.GetDB()) - wg := &sync.WaitGroup{} - oidcService, err := service.NewOIDCService(log, cfg, runtime, queries, context.TODO(), wg) + oidcService, err := service.NewOIDCService(log, cfg, runtime, store, context.TODO(), wg) require.NoError(t, err) for _, test := range tests { @@ -869,8 +864,4 @@ func TestOIDCController(t *testing.T) { test.run(t, router, recorder) }) } - - t.Cleanup(func() { - app.GetDB().Close() - }) } diff --git a/internal/controller/proxy_controller_test.go b/internal/controller/proxy_controller_test.go index 12c3c9f1..1d5d0c19 100644 --- a/internal/controller/proxy_controller_test.go +++ b/internal/controller/proxy_controller_test.go @@ -12,7 +12,6 @@ import ( "github.com/tinyauthapp/tinyauth/internal/bootstrap" "github.com/tinyauthapp/tinyauth/internal/controller" "github.com/tinyauthapp/tinyauth/internal/model" - "github.com/tinyauthapp/tinyauth/internal/repository" "github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/test" "github.com/tinyauthapp/tinyauth/internal/utils/logger" @@ -379,18 +378,14 @@ func TestProxyController(t *testing.T) { }, } - app := bootstrap.NewBootstrapApp(cfg) - - err := app.SetupDatabase() + store, err := bootstrap.NewSQLiteStore(cfg.Database.Path) require.NoError(t, err) - queries := repository.New(app.GetDB()) - wg := &sync.WaitGroup{} ctx := context.TODO() broker := service.NewOAuthBrokerService(log, map[string]model.OAuthServiceConfig{}, ctx) - authService := service.NewAuthService(log, cfg, runtime, ctx, wg, nil, queries, broker) + authService := service.NewAuthService(log, cfg, runtime, ctx, wg, nil, store, broker) aclsService := service.NewAccessControlsService(log, nil, acls) for _, test := range tests { @@ -411,8 +406,4 @@ func TestProxyController(t *testing.T) { test.run(t, router, recorder) }) } - - t.Cleanup(func() { - app.GetDB().Close() - }) } diff --git a/internal/controller/user_controller_test.go b/internal/controller/user_controller_test.go index 10858175..a9e85451 100644 --- a/internal/controller/user_controller_test.go +++ b/internal/controller/user_controller_test.go @@ -73,13 +73,9 @@ func TestUserController(t *testing.T) { }) } - app := bootstrap.NewBootstrapApp(cfg) - - err := app.SetupDatabase() + store, err := bootstrap.NewSQLiteStore(cfg.Database.Path) require.NoError(t, err) - queries := repository.New(app.GetDB()) - type testCase struct { description string middlewares []gin.HandlerFunc @@ -254,7 +250,7 @@ func TestUserController(t *testing.T) { totpCtx, }, run: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) { - _, err := queries.CreateSession(context.TODO(), repository.CreateSessionParams{ + _, err := store.CreateSession(context.TODO(), repository.CreateSessionParams{ UUID: "test-totp-login-uuid", Username: "test", Email: "test@example.com", @@ -378,7 +374,7 @@ func TestUserController(t *testing.T) { totpAttrCtx, }, run: func(t *testing.T, router *gin.Engine, recorder *httptest.ResponseRecorder) { - _, err := queries.CreateSession(context.TODO(), repository.CreateSessionParams{ + _, err := store.CreateSession(context.TODO(), repository.CreateSessionParams{ UUID: "test-totp-login-attributes-uuid", Username: "test", Email: "test@example.com", @@ -420,7 +416,7 @@ func TestUserController(t *testing.T) { wg := &sync.WaitGroup{} broker := service.NewOAuthBrokerService(log, map[string]model.OAuthServiceConfig{}, ctx) - authService := service.NewAuthService(log, cfg, runtime, ctx, wg, nil, queries, broker) + authService := service.NewAuthService(log, cfg, runtime, ctx, wg, nil, store, broker) beforeEach := func() { // Clear failed login attempts before each test @@ -446,8 +442,5 @@ func TestUserController(t *testing.T) { test.run(t, router, recorder) }) } - - t.Cleanup(func() { - app.GetDB().Close() - }) +} } diff --git a/internal/controller/well_known_controller_test.go b/internal/controller/well_known_controller_test.go index e2323da2..8f11537c 100644 --- a/internal/controller/well_known_controller_test.go +++ b/internal/controller/well_known_controller_test.go @@ -13,7 +13,6 @@ import ( "github.com/stretchr/testify/require" "github.com/tinyauthapp/tinyauth/internal/bootstrap" "github.com/tinyauthapp/tinyauth/internal/controller" - "github.com/tinyauthapp/tinyauth/internal/repository" "github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/test" "github.com/tinyauthapp/tinyauth/internal/utils/logger" @@ -92,14 +91,10 @@ func TestWellKnownController(t *testing.T) { ctx := context.TODO() wg := &sync.WaitGroup{} - app := bootstrap.NewBootstrapApp(cfg) - - err := app.SetupDatabase() + store, err := bootstrap.NewSQLiteStore(cfg.Database.Path) require.NoError(t, err) - queries := repository.New(app.GetDB()) - - oidcService, err := service.NewOIDCService(log, cfg, runtime, queries, ctx, wg) + oidcService, err := service.NewOIDCService(log, cfg, runtime, store, ctx, wg) require.NoError(t, err) for _, test := range tests { @@ -114,8 +109,4 @@ func TestWellKnownController(t *testing.T) { test.run(t, router, recorder) }) } - - t.Cleanup(func() { - app.GetDB().Close() - }) } diff --git a/internal/model/config.go b/internal/model/config.go index f5376af2..9b2c245f 100644 --- a/internal/model/config.go +++ b/internal/model/config.go @@ -83,7 +83,7 @@ type Config struct { } type DatabaseConfig struct { - Path string `description:"The path to the database, including file name." yaml:"path"` + Path string `description:"The path to the SQLite database, including file name." yaml:"path"` } type AnalyticsConfig struct { diff --git a/internal/repository/models.go b/internal/repository/models.go index bc2e2c66..0c33e038 100644 --- a/internal/repository/models.go +++ b/internal/repository/models.go @@ -1,64 +1,19 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 - package repository -type OidcCode struct { - Sub string - CodeHash string - Scope string - RedirectURI string - ClientID string - ExpiresAt int64 - Nonce string - CodeChallenge string -} +// This file is a stop-gap until more drivers are added. It re-exports the models from the sqlite package so that the rest +// of the codebase can import them from a single location without needing to know about the underlying database implementation. -type OidcToken struct { - Sub string - AccessTokenHash string - RefreshTokenHash string - CodeHash string - Scope string - ClientID string - TokenExpiresAt int64 - RefreshTokenExpiresAt int64 - Nonce string -} +import "github.com/tinyauthapp/tinyauth/internal/repository/sqlite" -type OidcUserinfo struct { - Sub string - Name string - PreferredUsername string - Email string - Groups string - UpdatedAt int64 - GivenName string - FamilyName string - MiddleName string - Nickname string - Profile string - Picture string - Website string - Gender string - Birthdate string - Zoneinfo string - Locale string - PhoneNumber string - Address string -} +type Session = sqlite.Session +type OidcCode = sqlite.OidcCode +type OidcToken = sqlite.OidcToken +type OidcUserinfo = sqlite.OidcUserinfo -type Session struct { - UUID string - Username string - Email string - Name string - Provider string - TotpPending bool - OAuthGroups string - Expiry int64 - CreatedAt int64 - OAuthName string - OAuthSub string -} +type CreateSessionParams = sqlite.CreateSessionParams +type UpdateSessionParams = sqlite.UpdateSessionParams +type CreateOidcCodeParams = sqlite.CreateOidcCodeParams +type CreateOidcTokenParams = sqlite.CreateOidcTokenParams +type UpdateOidcTokenByRefreshTokenParams = sqlite.UpdateOidcTokenByRefreshTokenParams +type DeleteExpiredOidcTokensParams = sqlite.DeleteExpiredOidcTokensParams +type CreateOidcUserInfoParams = sqlite.CreateOidcUserInfoParams diff --git a/internal/repository/db.go b/internal/repository/sqlite/db.go similarity index 93% rename from internal/repository/db.go rename to internal/repository/sqlite/db.go index 998bfd3b..ee310fc2 100644 --- a/internal/repository/db.go +++ b/internal/repository/sqlite/db.go @@ -1,8 +1,8 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.0 -package repository +package sqlite import ( "context" diff --git a/internal/repository/sqlite/models.go b/internal/repository/sqlite/models.go new file mode 100644 index 00000000..caf37f4c --- /dev/null +++ b/internal/repository/sqlite/models.go @@ -0,0 +1,64 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.0 + +package sqlite + +type OidcCode struct { + Sub string + CodeHash string + Scope string + RedirectURI string + ClientID string + ExpiresAt int64 + Nonce string + CodeChallenge string +} + +type OidcToken struct { + Sub string + AccessTokenHash string + RefreshTokenHash string + CodeHash string + Scope string + ClientID string + TokenExpiresAt int64 + RefreshTokenExpiresAt int64 + Nonce string +} + +type OidcUserinfo struct { + Sub string + Name string + PreferredUsername string + Email string + Groups string + UpdatedAt int64 + GivenName string + FamilyName string + MiddleName string + Nickname string + Profile string + Picture string + Website string + Gender string + Birthdate string + Zoneinfo string + Locale string + PhoneNumber string + Address string +} + +type Session struct { + UUID string + Username string + Email string + Name string + Provider string + TotpPending bool + OAuthGroups string + Expiry int64 + CreatedAt int64 + OAuthName string + OAuthSub string +} diff --git a/internal/repository/oidc_queries.sql.go b/internal/repository/sqlite/oidc_queries.sql.go similarity index 99% rename from internal/repository/oidc_queries.sql.go rename to internal/repository/sqlite/oidc_queries.sql.go index 7caac9d4..027ac421 100644 --- a/internal/repository/oidc_queries.sql.go +++ b/internal/repository/sqlite/oidc_queries.sql.go @@ -1,9 +1,9 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.0 // source: oidc_queries.sql -package repository +package sqlite import ( "context" diff --git a/internal/repository/session_queries.sql.go b/internal/repository/sqlite/session_queries.sql.go similarity index 98% rename from internal/repository/session_queries.sql.go rename to internal/repository/sqlite/session_queries.sql.go index c846c3f9..4271b727 100644 --- a/internal/repository/session_queries.sql.go +++ b/internal/repository/sqlite/session_queries.sql.go @@ -1,9 +1,9 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.30.0 +// sqlc v1.31.0 // source: session_queries.sql -package repository +package sqlite import ( "context" diff --git a/internal/repository/store.go b/internal/repository/store.go new file mode 100644 index 00000000..765df6a5 --- /dev/null +++ b/internal/repository/store.go @@ -0,0 +1,41 @@ +package repository + +import "context" + +// Store is the interface that all storage drivers must implement. +// The sqlc-generated *Queries struct satisfies this interface for SQLite. +// Future drivers (postgres, etc.) must return the shared types defined in this package. +type Store interface { + // Sessions + CreateSession(ctx context.Context, arg CreateSessionParams) (Session, error) + GetSession(ctx context.Context, uuid string) (Session, error) + UpdateSession(ctx context.Context, arg UpdateSessionParams) (Session, error) + DeleteSession(ctx context.Context, uuid string) error + DeleteExpiredSessions(ctx context.Context, expiry int64) error + + // OIDC codes + CreateOidcCode(ctx context.Context, arg CreateOidcCodeParams) (OidcCode, error) + GetOidcCode(ctx context.Context, codeHash string) (OidcCode, error) + GetOidcCodeBySub(ctx context.Context, sub string) (OidcCode, error) + GetOidcCodeUnsafe(ctx context.Context, codeHash string) (OidcCode, error) + GetOidcCodeBySubUnsafe(ctx context.Context, sub string) (OidcCode, error) + DeleteOidcCode(ctx context.Context, codeHash string) error + DeleteOidcCodeBySub(ctx context.Context, sub string) error + DeleteExpiredOidcCodes(ctx context.Context, expiresAt int64) ([]OidcCode, error) + + // OIDC tokens + CreateOidcToken(ctx context.Context, arg CreateOidcTokenParams) (OidcToken, error) + GetOidcToken(ctx context.Context, accessTokenHash string) (OidcToken, error) + GetOidcTokenByRefreshToken(ctx context.Context, refreshTokenHash string) (OidcToken, error) + GetOidcTokenBySub(ctx context.Context, sub string) (OidcToken, error) + UpdateOidcTokenByRefreshToken(ctx context.Context, arg UpdateOidcTokenByRefreshTokenParams) (OidcToken, error) + DeleteOidcToken(ctx context.Context, accessTokenHash string) error + DeleteOidcTokenBySub(ctx context.Context, sub string) error + DeleteOidcTokenByCodeHash(ctx context.Context, codeHash string) error + DeleteExpiredOidcTokens(ctx context.Context, arg DeleteExpiredOidcTokensParams) ([]OidcToken, error) + + // OIDC userinfo + CreateOidcUserInfo(ctx context.Context, arg CreateOidcUserInfoParams) (OidcUserinfo, error) + GetOidcUserInfo(ctx context.Context, sub string) (OidcUserinfo, error) + DeleteOidcUserInfo(ctx context.Context, sub string) error +} diff --git a/internal/service/auth_service.go b/internal/service/auth_service.go index a9139bb3..ca6d4d1b 100644 --- a/internal/service/auth_service.go +++ b/internal/service/auth_service.go @@ -79,7 +79,7 @@ type AuthService struct { context context.Context ldap *LdapService - queries *repository.Queries + queries repository.Store oauthBroker *OAuthBrokerService loginAttempts map[string]*LoginAttempt @@ -100,7 +100,7 @@ func NewAuthService( ctx context.Context, wg *sync.WaitGroup, ldap *LdapService, - queries *repository.Queries, + queries repository.Store, oauthBroker *OAuthBrokerService, ) *AuthService { service := &AuthService{ diff --git a/internal/service/oidc_service.go b/internal/service/oidc_service.go index 92216451..a0d2c5df 100644 --- a/internal/service/oidc_service.go +++ b/internal/service/oidc_service.go @@ -116,7 +116,7 @@ type OIDCService struct { log *logger.Logger config model.Config runtime model.RuntimeConfig - queries *repository.Queries + queries repository.Store context context.Context clients map[string]model.OIDCClientConfig @@ -129,7 +129,7 @@ func NewOIDCService( log *logger.Logger, config model.Config, runtime model.RuntimeConfig, - queries *repository.Queries, + queries repository.Store, ctx context.Context, wg *sync.WaitGroup) (*OIDCService, error) { // If not configured, skip init diff --git a/sql/oidc_queries.sql b/sql/sqlite/oidc_queries.sql similarity index 100% rename from sql/oidc_queries.sql rename to sql/sqlite/oidc_queries.sql diff --git a/sql/oidc_schemas.sql b/sql/sqlite/oidc_schemas.sql similarity index 100% rename from sql/oidc_schemas.sql rename to sql/sqlite/oidc_schemas.sql diff --git a/sql/session_queries.sql b/sql/sqlite/session_queries.sql similarity index 100% rename from sql/session_queries.sql rename to sql/sqlite/session_queries.sql diff --git a/sql/session_schemas.sql b/sql/sqlite/session_schemas.sql similarity index 100% rename from sql/session_schemas.sql rename to sql/sqlite/session_schemas.sql diff --git a/sqlc.yml b/sqlc.yml index de08738a..e7b2c4b4 100644 --- a/sqlc.yml +++ b/sqlc.yml @@ -1,12 +1,12 @@ version: "2" sql: - engine: "sqlite" - queries: "sql/*_queries.sql" - schema: "sql/*_schemas.sql" + queries: "sql/sqlite/*_queries.sql" + schema: "sql/sqlite/*_schemas.sql" gen: go: - package: "repository" - out: "internal/repository" + package: "sqlite" + out: "internal/repository/sqlite" rename: uuid: "UUID" oauth_groups: "OAuthGroups"