feat: add Google Sign-In with JWT auth and Neon DB persistence
This commit is contained in:
@@ -2,19 +2,38 @@ package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
_ "embed"
|
||||
"embed"
|
||||
"fmt"
|
||||
"path"
|
||||
"sort"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
//go:embed migrations/001_init.sql
|
||||
var initSQL string
|
||||
//go:embed migrations/*.sql
|
||||
var migrationsFS embed.FS
|
||||
|
||||
func Migrate(pool *pgxpool.Pool) error {
|
||||
_, err := pool.Exec(context.Background(), initSQL)
|
||||
files, err := migrationsFS.ReadDir("migrations")
|
||||
if err != nil {
|
||||
return fmt.Errorf("run migration: %w", err)
|
||||
return fmt.Errorf("read migrations dir: %w", err)
|
||||
}
|
||||
|
||||
sort.Slice(files, func(i, j int) bool {
|
||||
return files[i].Name() < files[j].Name()
|
||||
})
|
||||
|
||||
for _, f := range files {
|
||||
if path.Ext(f.Name()) != ".sql" {
|
||||
continue
|
||||
}
|
||||
data, err := migrationsFS.ReadFile("migrations/" + f.Name())
|
||||
if err != nil {
|
||||
return fmt.Errorf("read migration %s: %w", f.Name(), err)
|
||||
}
|
||||
if _, err := pool.Exec(context.Background(), string(data)); err != nil {
|
||||
return fmt.Errorf("run migration %s: %w", f.Name(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
10
internal/db/migrations/002_auth.sql
Normal file
10
internal/db/migrations/002_auth.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
-- Auth: users table
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
email TEXT UNIQUE NOT NULL,
|
||||
display_name TEXT NOT NULL,
|
||||
provider TEXT NOT NULL DEFAULT 'google',
|
||||
provider_subject TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
Reference in New Issue
Block a user