@@ -4,11 +4,12 @@ import (
4
4
"database/sql/driver"
5
5
"encoding/json"
6
6
"errors"
7
- "github.com/semaphoreui/semaphore/pkg/task_logger"
8
7
"reflect"
9
8
"strings"
10
9
"time"
11
10
11
+ "github.com/semaphoreui/semaphore/pkg/task_logger"
12
+
12
13
log "github.com/sirupsen/logrus"
13
14
)
14
15
@@ -177,7 +178,8 @@ type TaskStat struct {
177
178
AvgDuration int `json:"avg_duration"`
178
179
}
179
180
180
- type Store interface {
181
+ // ConnectionManager handles database connection lifecycle
182
+ type ConnectionManager interface {
181
183
// Connect connects to the database.
182
184
// Token parameter used if PermanentConnection returns false.
183
185
// Token used for debugging of session connections.
@@ -188,7 +190,10 @@ type Store interface {
188
190
// This mode is suitable for MySQL and Postgres but not for BoltDB.
189
191
// For BoltDB we should reconnect for each request because BoltDB support only one connection at time.
190
192
PermanentConnection () bool
193
+ }
191
194
195
+ // MigrationManager handles database migrations
196
+ type MigrationManager interface {
192
197
// IsInitialized indicates is database already initialized, or it is empty.
193
198
// The method is useful for creating required entities in database during first run.
194
199
IsInitialized () (bool , error )
@@ -200,40 +205,109 @@ type Store interface {
200
205
// TryRollbackMigration attempts to roll back the database to an earlier version
201
206
// if a rollback exists
202
207
TryRollbackMigration (version Migration )
208
+ }
203
209
210
+ // OptionsManager handles system options
211
+ type OptionsManager interface {
204
212
GetOptions (params RetrieveQueryParams ) (map [string ]string , error )
205
213
GetOption (key string ) (string , error )
206
214
SetOption (key string , value string ) error
207
215
DeleteOption (key string ) error
208
216
DeleteOptions (filter string ) error
217
+ }
209
218
210
- GetEnvironment (projectID int , environmentID int ) (Environment , error )
211
- GetEnvironmentRefs (projectID int , environmentID int ) (ObjectReferrers , error )
212
- GetEnvironments (projectID int , params RetrieveQueryParams ) ([]Environment , error )
213
- UpdateEnvironment (env Environment ) error
214
- CreateEnvironment (env Environment ) (Environment , error )
215
- DeleteEnvironment (projectID int , templateID int ) error
216
- GetEnvironmentSecrets (projectID int , environmentID int ) ([]AccessKey , error )
219
+ // UserManager handles user-related operations
220
+ type UserManager interface {
221
+ GetProUserCount () (int , error )
222
+ GetUserCount () (int , error )
223
+ GetUsers (params RetrieveQueryParams ) ([]User , error )
224
+ CreateUserWithoutPassword (user User ) (User , error )
225
+ CreateUser (user UserWithPwd ) (User , error )
226
+ DeleteUser (userID int ) error
227
+ UpdateUser (user UserWithPwd ) error
228
+ SetUserPassword (userID int , password string ) error
229
+ AddTotpVerification (userID int , url string , recoveryHash string ) (UserTotp , error )
230
+ DeleteTotpVerification (userID int , totpID int ) error
231
+ AddEmailOtpVerification (userID int , code string ) (UserEmailOtp , error )
232
+ DeleteEmailOtpVerification (userID int , totpID int ) error
233
+ GetUser (userID int ) (User , error )
234
+ GetUserByLoginOrEmail (login string , email string ) (User , error )
235
+ GetAllAdmins () ([]User , error )
236
+ }
237
+
238
+ // ProjectStore handles project-related operations
239
+ type ProjectStore interface {
240
+ GetProject (projectID int ) (Project , error )
241
+ GetAllProjects () ([]Project , error )
242
+ GetProjects (userID int ) ([]Project , error )
243
+ CreateProject (project Project ) (Project , error )
244
+ DeleteProject (projectID int ) error
245
+ UpdateProject (project Project ) error
246
+ GetProjectUsers (projectID int , params RetrieveQueryParams ) ([]UserWithProjectRole , error )
247
+ CreateProjectUser (projectUser ProjectUser ) (ProjectUser , error )
248
+ DeleteProjectUser (projectID int , userID int ) error
249
+ GetProjectUser (projectID int , userID int ) (ProjectUser , error )
250
+ UpdateProjectUser (projectUser ProjectUser ) error
251
+ }
217
252
253
+ // TemplateManager handles template-related operations
254
+ type TemplateManager interface {
255
+ GetTemplates (projectID int , filter TemplateFilter , params RetrieveQueryParams ) ([]Template , error )
256
+ GetTemplateRefs (projectID int , templateID int ) (ObjectReferrers , error )
257
+ CreateTemplate (template Template ) (Template , error )
258
+ UpdateTemplate (template Template ) error
259
+ GetTemplate (projectID int , templateID int ) (Template , error )
260
+ DeleteTemplate (projectID int , templateID int ) error
261
+ SetTemplateDescription (projectID int , templateID int , description string ) error
262
+ GetTemplateVaults (projectID int , templateID int ) ([]TemplateVault , error )
263
+ CreateTemplateVault (vault TemplateVault ) (TemplateVault , error )
264
+ UpdateTemplateVaults (projectID int , templateID int , vaults []TemplateVault ) error
265
+ }
266
+
267
+ // InventoryManager handles inventory-related operations
268
+ type InventoryManager interface {
218
269
GetInventory (projectID int , inventoryID int ) (Inventory , error )
219
270
GetInventoryRefs (projectID int , inventoryID int ) (ObjectReferrers , error )
220
271
GetInventories (projectID int , params RetrieveQueryParams , types []InventoryType ) ([]Inventory , error )
221
272
UpdateInventory (inventory Inventory ) error
222
273
CreateInventory (inventory Inventory ) (Inventory , error )
223
274
DeleteInventory (projectID int , inventoryID int ) error
275
+ }
224
276
277
+ // RepositoryManager handles repository-related operations
278
+ type RepositoryManager interface {
225
279
GetRepository (projectID int , repositoryID int ) (Repository , error )
226
280
GetRepositoryRefs (projectID int , repositoryID int ) (ObjectReferrers , error )
227
281
GetRepositories (projectID int , params RetrieveQueryParams ) ([]Repository , error )
228
282
UpdateRepository (repository Repository ) error
229
283
CreateRepository (repository Repository ) (Repository , error )
230
284
DeleteRepository (projectID int , repositoryID int ) error
285
+ }
286
+
287
+ // EnvironmentManager handles environment-related operations
288
+ type EnvironmentManager interface {
289
+ GetEnvironment (projectID int , environmentID int ) (Environment , error )
290
+ GetEnvironmentRefs (projectID int , environmentID int ) (ObjectReferrers , error )
291
+ GetEnvironments (projectID int , params RetrieveQueryParams ) ([]Environment , error )
292
+ UpdateEnvironment (env Environment ) error
293
+ CreateEnvironment (env Environment ) (Environment , error )
294
+ DeleteEnvironment (projectID int , templateID int ) error
295
+ GetEnvironmentSecrets (projectID int , environmentID int ) ([]AccessKey , error )
296
+ }
231
297
298
+ // AccessKeyManager handles access key-related operations
299
+ type AccessKeyManager interface {
232
300
GetAccessKey (projectID int , accessKeyID int ) (AccessKey , error )
233
301
GetAccessKeyRefs (projectID int , accessKeyID int ) (ObjectReferrers , error )
234
302
GetAccessKeys (projectID int , params RetrieveQueryParams ) ([]AccessKey , error )
235
303
RekeyAccessKeys (oldKey string ) error
304
+ UpdateAccessKey (accessKey AccessKey ) error
305
+ CreateAccessKey (accessKey AccessKey ) (AccessKey , error )
306
+ DeleteAccessKey (projectID int , accessKeyID int ) error
307
+ }
236
308
309
+ // IntegrationManager handles integration-related operations
310
+ type IntegrationManager interface {
237
311
CreateIntegration (integration Integration ) (newIntegration Integration , err error )
238
312
GetIntegrations (projectID int , params RetrieveQueryParams ) ([]Integration , error )
239
313
GetIntegration (projectID int , integrationID int ) (integration Integration , err error )
@@ -259,88 +333,36 @@ type Store interface {
259
333
GetIntegrationAliases (projectID int , integrationID * int ) ([]IntegrationAlias , error )
260
334
GetIntegrationsByAlias (alias string ) ([]Integration , IntegrationAliasLevel , error )
261
335
DeleteIntegrationAlias (projectID int , aliasID int ) error
336
+ }
262
337
263
- UpdateAccessKey (accessKey AccessKey ) error
264
- CreateAccessKey (accessKey AccessKey ) (AccessKey , error )
265
- DeleteAccessKey (projectID int , accessKeyID int ) error
266
-
267
- GetProUserCount () (int , error )
268
- GetUserCount () (int , error )
269
- GetUsers (params RetrieveQueryParams ) ([]User , error )
270
- CreateUserWithoutPassword (user User ) (User , error )
271
- CreateUser (user UserWithPwd ) (User , error )
272
- DeleteUser (userID int ) error
273
-
274
- // UpdateUser updates all fields of the entity except Pwd.
275
- // Pwd should be present of you want update user password. Empty Pwd ignored.
276
- UpdateUser (user UserWithPwd ) error
277
- SetUserPassword (userID int , password string ) error
278
- AddTotpVerification (userID int , url string , recoveryHash string ) (UserTotp , error )
279
- DeleteTotpVerification (userID int , totpID int ) error
280
- AddEmailOtpVerification (userID int , code string ) (UserEmailOtp , error )
281
- DeleteEmailOtpVerification (userID int , totpID int ) error
282
-
283
- GetUser (userID int ) (User , error )
284
- GetUserByLoginOrEmail (login string , email string ) (User , error )
285
-
286
- GetProject (projectID int ) (Project , error )
287
- GetAllProjects () ([]Project , error )
288
- GetProjects (userID int ) ([]Project , error )
289
- CreateProject (project Project ) (Project , error )
290
- DeleteProject (projectID int ) error
291
- UpdateProject (project Project ) error
292
-
293
- GetTemplates (projectID int , filter TemplateFilter , params RetrieveQueryParams ) ([]Template , error )
294
- GetTemplateRefs (projectID int , templateID int ) (ObjectReferrers , error )
295
- CreateTemplate (template Template ) (Template , error )
296
- UpdateTemplate (template Template ) error
297
- GetTemplate (projectID int , templateID int ) (Template , error )
298
- DeleteTemplate (projectID int , templateID int ) error
299
- SetTemplateDescription (projectID int , templateID int , description string ) error
300
-
301
- GetSchedules () ([]Schedule , error )
302
- GetProjectSchedules (projectID int ) ([]ScheduleWithTpl , error )
303
- GetTemplateSchedules (projectID int , templateID int , onlyCommitCheckers bool ) ([]Schedule , error )
304
- CreateSchedule (schedule Schedule ) (Schedule , error )
305
- UpdateSchedule (schedule Schedule ) error
306
- SetScheduleCommitHash (projectID int , scheduleID int , hash string ) error
307
- SetScheduleActive (projectID int , scheduleID int , active bool ) error
308
- GetSchedule (projectID int , scheduleID int ) (Schedule , error )
309
- DeleteSchedule (projectID int , scheduleID int ) error
310
-
311
- GetAllAdmins () ([]User , error )
312
- GetProjectUsers (projectID int , params RetrieveQueryParams ) ([]UserWithProjectRole , error )
313
- CreateProjectUser (projectUser ProjectUser ) (ProjectUser , error )
314
- DeleteProjectUser (projectID int , userID int ) error
315
- GetProjectUser (projectID int , userID int ) (ProjectUser , error )
316
- UpdateProjectUser (projectUser ProjectUser ) error
317
-
318
- CreateEvent (event Event ) (Event , error )
319
- GetUserEvents (userID int , params RetrieveQueryParams ) ([]Event , error )
320
- GetEvents (projectID int , params RetrieveQueryParams ) ([]Event , error )
321
-
322
- GetAPITokens (userID int ) ([]APIToken , error )
323
- CreateAPIToken (token APIToken ) (APIToken , error )
324
- GetAPIToken (tokenID string ) (APIToken , error )
325
- ExpireAPIToken (userID int , tokenID string ) error
326
- DeleteAPIToken (userID int , tokenID string ) error
327
-
338
+ // SessionManager handles session-related operations
339
+ type SessionManager interface {
328
340
GetSession (userID int , sessionID int ) (Session , error )
329
341
CreateSession (session Session ) (Session , error )
330
342
ExpireSession (userID int , sessionID int ) error
331
343
TouchSession (userID int , sessionID int ) error
332
344
SetSessionVerificationMethod (userID int , sessionID int , verificationMethod SessionVerificationMethod ) error
333
345
VerifySession (userID int , sessionID int ) error
346
+ }
334
347
348
+ // TokenManager handles token-related operations
349
+ type TokenManager interface {
350
+ GetAPITokens (userID int ) ([]APIToken , error )
351
+ CreateAPIToken (token APIToken ) (APIToken , error )
352
+ GetAPIToken (tokenID string ) (APIToken , error )
353
+ ExpireAPIToken (userID int , tokenID string ) error
354
+ DeleteAPIToken (userID int , tokenID string ) error
355
+ }
356
+
357
+ // TaskManager handles task-related operations
358
+ type TaskManager interface {
335
359
CreateTask (task Task , maxTasks int ) (Task , error )
336
360
UpdateTask (task Task ) error
337
-
338
361
GetTemplateTasks (projectID int , templateID int , params RetrieveQueryParams ) ([]TaskWithTpl , error )
339
362
GetProjectTasks (projectID int , params RetrieveQueryParams ) ([]TaskWithTpl , error )
340
363
GetTask (projectID int , taskID int ) (Task , error )
341
364
DeleteTaskWithOutputs (projectID int , taskID int ) error
342
365
GetTaskOutputs (projectID int , taskID int , params RetrieveQueryParams ) ([]TaskOutput , error )
343
-
344
366
CreateTaskOutput (output TaskOutput ) (TaskOutput , error )
345
367
CreateTaskStage (stage TaskStage ) (TaskStage , error )
346
368
EndTaskStage (taskID int , stageID int , end time.Time , endOutputID int ) error
@@ -349,18 +371,37 @@ type Store interface {
349
371
CreateAnsibleTaskError (error AnsibleTaskError ) error
350
372
GetAnsibleTaskHosts (projectID int , taskID int ) ([]AnsibleTaskHost , error )
351
373
GetAnsibleTaskErrors (projectID int , taskID int ) ([]AnsibleTaskError , error )
352
-
353
374
GetTaskStages (projectID int , taskID int ) ([]TaskStageWithResult , error )
354
375
GetTaskStageResult (projectID int , taskID int , stageID int ) (TaskStageResult , error )
355
376
GetTaskStageOutputs (projectID int , taskID int , stageID int ) ([]TaskOutput , error )
377
+ GetTaskStats (projectID int , templateID * int , unit TaskStatUnit , filter TaskFilter ) ([]TaskStat , error )
378
+ }
379
+
380
+ // ScheduleManager handles schedule-related operations
381
+ type ScheduleManager interface {
382
+ GetSchedules () ([]Schedule , error )
383
+ GetProjectSchedules (projectID int ) ([]ScheduleWithTpl , error )
384
+ GetTemplateSchedules (projectID int , templateID int , onlyCommitCheckers bool ) ([]Schedule , error )
385
+ CreateSchedule (schedule Schedule ) (Schedule , error )
386
+ UpdateSchedule (schedule Schedule ) error
387
+ SetScheduleCommitHash (projectID int , scheduleID int , hash string ) error
388
+ SetScheduleActive (projectID int , scheduleID int , active bool ) error
389
+ GetSchedule (projectID int , scheduleID int ) (Schedule , error )
390
+ DeleteSchedule (projectID int , scheduleID int ) error
391
+ }
356
392
393
+ // ViewManager handles view-related operations
394
+ type ViewManager interface {
357
395
GetView (projectID int , viewID int ) (View , error )
358
396
GetViews (projectID int ) ([]View , error )
359
397
UpdateView (view View ) error
360
398
CreateView (view View ) (View , error )
361
399
DeleteView (projectID int , viewID int ) error
362
400
SetViewPositions (projectID int , viewPositions map [int ]int ) error
401
+ }
363
402
403
+ // RunnerManager handles runner-related operations
404
+ type RunnerManager interface {
364
405
GetRunner (projectID int , runnerID int ) (Runner , error )
365
406
GetRunners (projectID int , activeOnly bool , tag * string ) ([]Runner , error )
366
407
DeleteRunner (projectID int , runnerID int ) error
@@ -373,12 +414,35 @@ type Store interface {
373
414
TouchRunner (runner Runner ) (err error )
374
415
ClearRunnerCache (runner Runner ) (err error )
375
416
GetRunnerTags (projectID int ) ([]RunnerTag , error )
417
+ }
376
418
377
- GetTemplateVaults (projectID int , templateID int ) ([]TemplateVault , error )
378
- CreateTemplateVault (vault TemplateVault ) (TemplateVault , error )
379
- UpdateTemplateVaults (projectID int , templateID int , vaults []TemplateVault ) error
419
+ // EventManager handles event-related operations
420
+ type EventManager interface {
421
+ CreateEvent (event Event ) (Event , error )
422
+ GetUserEvents (userID int , params RetrieveQueryParams ) ([]Event , error )
423
+ GetEvents (projectID int , params RetrieveQueryParams ) ([]Event , error )
424
+ }
380
425
381
- GetTaskStats (projectID int , templateID * int , unit TaskStatUnit , filter TaskFilter ) ([]TaskStat , error )
426
+ // Store is the main interface that aggregates all specialized interfaces
427
+ type Store interface {
428
+ ConnectionManager
429
+ MigrationManager
430
+ OptionsManager
431
+ UserManager
432
+ ProjectStore
433
+ TemplateManager
434
+ InventoryManager
435
+ RepositoryManager
436
+ EnvironmentManager
437
+ AccessKeyManager
438
+ IntegrationManager
439
+ SessionManager
440
+ TokenManager
441
+ TaskManager
442
+ ScheduleManager
443
+ ViewManager
444
+ RunnerManager
445
+ EventManager
382
446
}
383
447
384
448
var AccessKeyProps = ObjectProps {
0 commit comments