Raw
 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}