1package dexstore
2
3import (
4 "context"
5 "crypto/sha256"
6 "fmt"
7 "io"
8
9 "entgo.io/ent/dialect"
10 entsql "entgo.io/ent/dialect/sql"
11 dexstorage "github.com/dexidp/dex/storage"
12 "github.com/dexidp/dex/storage/ent/client"
13 "github.com/dexidp/dex/storage/ent/db"
14
15 "tug/internal/storage"
16 "tug/internal/storage/internal/attach"
17)
18
19func Attach(ctx context.Context, store *storage.Store) (dexstorage.Storage, error) {
20 return attachStore(ctx, store, nil)
21}
22
23func attachStore(ctx context.Context, store *storage.Store, wrap func(dialect.Driver) dialect.Driver) (dexstorage.Storage, error) {
24 a := &attacher{wrap: wrap}
25 if err := store.Attach(ctx, a); err != nil {
26 return nil, err
27 }
28 return view{a.database}, nil
29}
30
31type attacher struct {
32 wrap func(dialect.Driver) dialect.Driver
33 database *client.Database
34}
35
36func (a *attacher) Attach(ctx context.Context, pool attach.Pool) (io.Closer, error) {
37 sqlDB, err := pool.Open(ctx)
38 if err != nil {
39 return nil, err
40 }
41 sqlDB.SetMaxOpenConns(0)
42 var driver dialect.Driver = entsql.OpenDB(dialect.SQLite, sqlDB)
43 if a.wrap != nil {
44 driver = a.wrap(driver)
45 }
46 database := client.NewDatabase(
47 client.WithClient(db.NewClient(db.Driver(driver))),
48 client.WithHasher(sha256.New),
49 )
50 if err := database.Schema().Create(ctx); err != nil {
51 database.Close()
52 return nil, fmt.Errorf("create dex schema: %w", err)
53 }
54 a.database = database
55 return database, nil
56}
57
58type storageView = dexstorage.Storage
59
60type view struct {
61 storageView
62}
63
64func (view) Close() error {
65 return nil
66}