forked from dexidp/dex
/
connector_config.go
137 lines (112 loc) · 2.8 KB
/
connector_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package db
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"github.com/go-gorp/gorp"
"github.com/coreos/dex/connector"
"github.com/coreos/dex/repo"
)
const (
connectorConfigTableName = "connector_config"
)
func init() {
register(table{
name: connectorConfigTableName,
model: connectorConfigModel{},
autoinc: false,
pkey: []string{"id"},
})
}
func newConnectorConfigModel(cfg connector.ConnectorConfig) (*connectorConfigModel, error) {
b, err := json.Marshal(cfg)
if err != nil {
return nil, err
}
m := &connectorConfigModel{
ID: cfg.ConnectorID(),
Type: cfg.ConnectorType(),
Config: string(b),
}
return m, nil
}
type connectorConfigModel struct {
ID string `db:"id"`
Type string `db:"type"`
Config string `db:"config"`
}
func (m *connectorConfigModel) ConnectorConfig() (connector.ConnectorConfig, error) {
cfg, err := connector.NewConnectorConfigFromType(m.Type)
if err != nil {
return nil, err
}
if err = json.Unmarshal([]byte(m.Config), cfg); err != nil {
return nil, err
}
return cfg, nil
}
func NewConnectorConfigRepo(dbm *gorp.DbMap) *ConnectorConfigRepo {
return &ConnectorConfigRepo{&db{dbm}}
}
type ConnectorConfigRepo struct {
*db
}
func (r *ConnectorConfigRepo) All() ([]connector.ConnectorConfig, error) {
qt := r.quote(connectorConfigTableName)
q := fmt.Sprintf("SELECT * FROM %s", qt)
objs, err := r.executor(nil).Select(&connectorConfigModel{}, q)
if err != nil {
return nil, err
}
cfgs := make([]connector.ConnectorConfig, len(objs))
for i, obj := range objs {
m, ok := obj.(*connectorConfigModel)
if !ok {
return nil, errors.New("unable to cast connector to connectorConfigModel")
}
cfg, err := m.ConnectorConfig()
if err != nil {
return nil, err
}
cfgs[i] = cfg
}
return cfgs, nil
}
func (r *ConnectorConfigRepo) GetConnectorByID(tx repo.Transaction, id string) (connector.ConnectorConfig, error) {
qt := r.quote(connectorConfigTableName)
q := fmt.Sprintf("SELECT * FROM %s WHERE id = $1", qt)
var c connectorConfigModel
if err := r.executor(tx).SelectOne(&c, q, id); err != nil {
if err == sql.ErrNoRows {
return nil, connector.ErrorNotFound
}
return nil, err
}
return c.ConnectorConfig()
}
func (r *ConnectorConfigRepo) Set(cfgs []connector.ConnectorConfig) error {
insert := make([]interface{}, len(cfgs))
for i, cfg := range cfgs {
m, err := newConnectorConfigModel(cfg)
if err != nil {
return err
}
insert[i] = m
}
tx, err := r.begin()
if err != nil {
return err
}
defer tx.Rollback()
exec := r.executor(tx)
qt := r.quote(connectorConfigTableName)
q := fmt.Sprintf("DELETE FROM %s", qt)
if _, err = exec.Exec(q); err != nil {
return err
}
if err = exec.Insert(insert...); err != nil {
return fmt.Errorf("DB insert failed %#v: %v", insert, err)
}
return tx.Commit()
}