1 package services
2
3 import (
4 "context"
5 "database/sql"
6 "errors"
7
8 sqlerror "edge-infra.dev/pkg/edge/api/apierror/sql"
9 "edge-infra.dev/pkg/edge/api/graph/model"
10 sqlquery "edge-infra.dev/pkg/edge/api/sql"
11 )
12
13
14 type IAMSettingsService interface {
15 CreateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error)
16 GetSettings(ctx context.Context, bannerID string) (*model.Provider, error)
17 UpdateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error)
18 DeleteSettings(ctx context.Context, bannerID string) (*model.Provider, error)
19 }
20
21 type iamSettingService struct {
22 SQLDB *sql.DB
23 }
24
25 func (o *iamSettingService) CreateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error) {
26 var ps model.Provider
27 tx, err := o.SQLDB.BeginTx(ctx, &sql.TxOptions{})
28 if err != nil {
29 return nil, err
30 }
31
32 defer func() {
33 if err != nil {
34 err = errors.Join(err, tx.Rollback())
35 }
36 }()
37
38 _, errID := o.getProviderSettingsID(ctx, bannerID)
39 if errID == nil {
40 return o.UpdateSettings(ctx, bannerID, providerSettings)
41 }
42
43 row := tx.QueryRowContext(ctx, sqlquery.InsertProviderSettings, providerSettings.PinAttempts, providerSettings.PinExpire, providerSettings.PinHistory,
44 providerSettings.PinLength, providerSettings.BarcodeExpire, providerSettings.BarcodePrefix, providerSettings.BarcodeLength, providerSettings.BcryptCost,
45 providerSettings.ProfileExpire)
46
47 err = row.Scan(&ps.ProviderSettingsID)
48 if err != nil {
49 return nil, sqlerror.Wrap(err)
50 }
51
52 err = o.createProviderOwner(ctx, bannerID, ps.ProviderSettingsID, tx)
53 if err != nil {
54 return nil, sqlerror.Wrap(err)
55 }
56
57 if err = tx.Commit(); err != nil {
58 return nil, err
59 }
60
61 settings, err := o.GetSettings(ctx, bannerID)
62 if err != nil {
63 return nil, sqlerror.Wrap(err)
64 }
65
66 return settings, err
67 }
68
69 func (o *iamSettingService) GetSettings(ctx context.Context, bannerID string) (*model.Provider, error) {
70
71 var settings model.Provider
72
73 providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
74 if errID != nil {
75 return nil, sqlerror.Wrap(errID)
76 }
77
78 row := o.SQLDB.QueryRowContext(ctx, sqlquery.GetProviderSettings, providerSettingsID)
79 err := row.Scan(&settings.ProviderSettingsID, &settings.PinAttempts, &settings.PinHistory, &settings.PinLength,
80 &settings.BarcodePrefix, &settings.BarcodeLength, &settings.BcryptCost, &settings.PinExpire, &settings.BarcodeExpire, &settings.ProfileExpire)
81
82
83 return &settings, err
84 }
85
86
87 func (o *iamSettingService) UpdateSettings(ctx context.Context, bannerID string, providerSettings model.ProviderInput) (*model.Provider, error) {
88 tx, err := o.SQLDB.BeginTx(ctx, &sql.TxOptions{})
89 if err != nil {
90 return nil, err
91 }
92
93 defer func() {
94 if err != nil {
95 err = errors.Join(err, tx.Rollback())
96 }
97 }()
98
99 providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
100 if errID != nil {
101 return nil, sqlerror.Wrap(errID)
102 }
103
104 if providerSettings.PinAttempts != nil {
105 _, err = tx.ExecContext(ctx, sqlquery.UpdatePinAttempts, providerSettings.PinAttempts, providerSettingsID)
106 if err != nil {
107 return nil, sqlerror.Wrap(err)
108 }
109 }
110
111 if providerSettings.PinExpire != nil {
112 _, err = tx.ExecContext(ctx, sqlquery.UpdatePinExpire, providerSettings.PinExpire, providerSettingsID)
113 if err != nil {
114 return nil, sqlerror.Wrap(err)
115 }
116 }
117
118 if providerSettings.PinHistory != nil {
119 _, err = tx.ExecContext(ctx, sqlquery.UpdatePinHistory, providerSettings.PinHistory, providerSettingsID)
120 if err != nil {
121 return nil, sqlerror.Wrap(err)
122 }
123 }
124
125 if providerSettings.PinLength != nil {
126 _, err = tx.ExecContext(ctx, sqlquery.UpdatePinLength, providerSettings.PinLength, providerSettingsID)
127 if err != nil {
128 return nil, sqlerror.Wrap(err)
129 }
130 }
131
132 if providerSettings.BarcodeExpire != nil {
133 _, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodeExpire, providerSettings.BarcodeExpire, providerSettingsID)
134 if err != nil {
135 return nil, sqlerror.Wrap(err)
136 }
137 }
138
139 if providerSettings.BarcodePrefix != nil {
140 _, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodePrefix, providerSettings.BarcodePrefix, providerSettingsID)
141 if err != nil {
142 return nil, sqlerror.Wrap(err)
143 }
144 }
145
146 if providerSettings.BarcodeLength != nil {
147 _, err = tx.ExecContext(ctx, sqlquery.UpdateBarcodeLength, providerSettings.BarcodeLength, providerSettingsID)
148 if err != nil {
149 return nil, sqlerror.Wrap(err)
150 }
151 }
152
153 if providerSettings.BcryptCost != nil {
154 _, err = tx.ExecContext(ctx, sqlquery.UpdateBcryptCost, providerSettings.BcryptCost, providerSettingsID)
155 if err != nil {
156 return nil, sqlerror.Wrap(err)
157 }
158 }
159
160 if providerSettings.ProfileExpire != nil {
161 _, err = tx.ExecContext(ctx, sqlquery.UpdateProfileExpire, providerSettings.ProfileExpire, providerSettingsID)
162 if err != nil {
163 return nil, sqlerror.Wrap(err)
164 }
165 }
166
167 if err = tx.Commit(); err != nil {
168 return nil, err
169 }
170
171 settings, err := o.GetSettings(ctx, bannerID)
172
173 return settings, err
174 }
175
176 func (o *iamSettingService) DeleteSettings(ctx context.Context, bannerID string) (*model.Provider, error) {
177 rowDeleted, err := o.GetSettings(ctx, bannerID)
178 if err != nil {
179 return nil, err
180 }
181
182 providerSettingsID, errID := o.getProviderSettingsID(ctx, bannerID)
183 if errID != nil {
184 return nil, sqlerror.Wrap(errID)
185 }
186
187 _, err = o.SQLDB.ExecContext(ctx, sqlquery.DeleteProviderSettings, providerSettingsID)
188 if err != nil {
189 return nil, sqlerror.Wrap(err)
190 }
191
192
193 err = o.deleteProviderOwner(ctx, providerSettingsID)
194 if err != nil {
195 return nil, sqlerror.Wrap(err)
196 }
197
198 return rowDeleted, nil
199 }
200
201 func (o *iamSettingService) getProviderSettingsID(ctx context.Context, bannerID string) (string, error) {
202 var settingsID string
203 row := o.SQLDB.QueryRowContext(ctx, sqlquery.GetProviderOwner, bannerID)
204 err := row.Scan(&settingsID)
205
206
207 return settingsID, err
208 }
209
210 func (o *iamSettingService) deleteProviderOwner(ctx context.Context, providerSettingsID string) error {
211 _, err := o.SQLDB.ExecContext(ctx, sqlquery.DeleteProviderOwner, providerSettingsID)
212 if err != nil {
213 return sqlerror.Wrap(err)
214 }
215
216 return nil
217 }
218
219 func (o *iamSettingService) createProviderOwner(ctx context.Context, bannerID string, providerSettingsID string, tx *sql.Tx) error {
220 if _, err := tx.ExecContext(ctx, sqlquery.InsertProviderOwner, bannerID, providerSettingsID); err != nil {
221 return sqlerror.Wrap(err)
222 }
223
224 return nil
225 }
226
227 func NewIAMSettingsService(sqlDB *sql.DB) *iamSettingService {
228 return &iamSettingService{
229 SQLDB: sqlDB,
230 }
231 }
232
View as plain text