@@ -6,15 +6,18 @@ import (
66 "os"
77 "path/filepath"
88
9- "github.com/tinyauthapp/tinyauth/internal/assets"
10- "github.com/tinyauthapp/tinyauth/internal/repository"
11- "github.com/tinyauthapp/tinyauth/internal/repository/memory"
12- "github.com/tinyauthapp/tinyauth/internal/repository/sqlite"
13-
149 "github.com/golang-migrate/migrate/v4"
10+ pgxmigrate "github.com/golang-migrate/migrate/v4/database/pgx/v5"
1511 "github.com/golang-migrate/migrate/v4/database/sqlite3"
1612 "github.com/golang-migrate/migrate/v4/source/iofs"
13+ _ "github.com/jackc/pgx/v5/stdlib"
1714 _ "modernc.org/sqlite"
15+
16+ "github.com/tinyauthapp/tinyauth/internal/assets"
17+ "github.com/tinyauthapp/tinyauth/internal/repository"
18+ "github.com/tinyauthapp/tinyauth/internal/repository/memory"
19+ "github.com/tinyauthapp/tinyauth/internal/repository/postgres"
20+ "github.com/tinyauthapp/tinyauth/internal/repository/sqlite"
1821)
1922
2023func (app * BootstrapApp ) SetupStore () (repository.Store , error ) {
@@ -23,8 +26,10 @@ func (app *BootstrapApp) SetupStore() (repository.Store, error) {
2326 return memory .New (), nil
2427 case "sqlite" , "" :
2528 return app .setupSQLite (app .config .Database .Path )
29+ case "postgres" :
30+ return app .setupPostgres (app .config .Database .Path )
2631 default :
27- return nil , fmt .Errorf ("unknown database driver %q: valid values are sqlite, memory" , app .config .Database .Driver )
32+ return nil , fmt .Errorf ("unknown database driver %q: valid values are sqlite, postgres, memory" , app .config .Database .Driver )
2833 }
2934}
3035
@@ -41,9 +46,9 @@ func (app *BootstrapApp) setupSQLite(databasePath string) (repository.Store, err
4146 return nil , fmt .Errorf ("failed to open database: %w" , err )
4247 }
4348
44- // Close the database if there is an error during migration
49+ cleanup := true
4550 defer func () {
46- if err != nil {
51+ if cleanup {
4752 db .Close ()
4853 }
4954 }()
@@ -70,11 +75,54 @@ func (app *BootstrapApp) setupSQLite(databasePath string) (repository.Store, err
7075 return nil , fmt .Errorf ("failed to create migrator: %w" , err )
7176 }
7277
73- if err : = migrator .Up (); err != nil && err != migrate .ErrNoChange {
78+ if err = migrator .Up (); err != nil && err != migrate .ErrNoChange {
7479 return nil , fmt .Errorf ("failed to migrate database: %w" , err )
7580 }
7681
82+ cleanup = false
7783 app .db = db
7884
7985 return sqlite .NewStore (sqlite .New (db )), nil
8086}
87+
88+ func (app * BootstrapApp ) setupPostgres (databaseURL string ) (repository.Store , error ) {
89+ db , err := sql .Open ("pgx" , databaseURL )
90+
91+ if err != nil {
92+ return nil , fmt .Errorf ("failed to open database: %w" , err )
93+ }
94+
95+ cleanup := true
96+ defer func () {
97+ if cleanup {
98+ db .Close ()
99+ }
100+ }()
101+
102+ migrations , err := iofs .New (assets .Migrations , "migrations/postgres" )
103+
104+ if err != nil {
105+ return nil , fmt .Errorf ("failed to create migrations: %w" , err )
106+ }
107+
108+ target , err := pgxmigrate .WithInstance (db , & pgxmigrate.Config {})
109+
110+ if err != nil {
111+ return nil , fmt .Errorf ("failed to create postgres instance: %w" , err )
112+ }
113+
114+ migrator , err := migrate .NewWithInstance ("iofs" , migrations , "pgx" , target )
115+
116+ if err != nil {
117+ return nil , fmt .Errorf ("failed to create migrator: %w" , err )
118+ }
119+
120+ if err = migrator .Up (); err != nil && err != migrate .ErrNoChange {
121+ return nil , fmt .Errorf ("failed to migrate database: %w" , err )
122+ }
123+
124+ cleanup = false
125+ app .db = db
126+
127+ return postgres .NewStore (postgres .New (db )), nil
128+ }
0 commit comments