Skip to content

Commit 7db1de7

Browse files
committed
refactor(db): split store interface
1 parent 1e13324 commit 7db1de7

File tree

1 file changed

+145
-81
lines changed

1 file changed

+145
-81
lines changed

db/Store.go

Lines changed: 145 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"database/sql/driver"
55
"encoding/json"
66
"errors"
7-
"github.com/semaphoreui/semaphore/pkg/task_logger"
87
"reflect"
98
"strings"
109
"time"
1110

11+
"github.com/semaphoreui/semaphore/pkg/task_logger"
12+
1213
log "github.com/sirupsen/logrus"
1314
)
1415

@@ -177,7 +178,8 @@ type TaskStat struct {
177178
AvgDuration int `json:"avg_duration"`
178179
}
179180

180-
type Store interface {
181+
// ConnectionManager handles database connection lifecycle
182+
type ConnectionManager interface {
181183
// Connect connects to the database.
182184
// Token parameter used if PermanentConnection returns false.
183185
// Token used for debugging of session connections.
@@ -188,7 +190,10 @@ type Store interface {
188190
// This mode is suitable for MySQL and Postgres but not for BoltDB.
189191
// For BoltDB we should reconnect for each request because BoltDB support only one connection at time.
190192
PermanentConnection() bool
193+
}
191194

195+
// MigrationManager handles database migrations
196+
type MigrationManager interface {
192197
// IsInitialized indicates is database already initialized, or it is empty.
193198
// The method is useful for creating required entities in database during first run.
194199
IsInitialized() (bool, error)
@@ -200,40 +205,109 @@ type Store interface {
200205
// TryRollbackMigration attempts to roll back the database to an earlier version
201206
// if a rollback exists
202207
TryRollbackMigration(version Migration)
208+
}
203209

210+
// OptionsManager handles system options
211+
type OptionsManager interface {
204212
GetOptions(params RetrieveQueryParams) (map[string]string, error)
205213
GetOption(key string) (string, error)
206214
SetOption(key string, value string) error
207215
DeleteOption(key string) error
208216
DeleteOptions(filter string) error
217+
}
209218

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+
}
217252

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 {
218269
GetInventory(projectID int, inventoryID int) (Inventory, error)
219270
GetInventoryRefs(projectID int, inventoryID int) (ObjectReferrers, error)
220271
GetInventories(projectID int, params RetrieveQueryParams, types []InventoryType) ([]Inventory, error)
221272
UpdateInventory(inventory Inventory) error
222273
CreateInventory(inventory Inventory) (Inventory, error)
223274
DeleteInventory(projectID int, inventoryID int) error
275+
}
224276

277+
// RepositoryManager handles repository-related operations
278+
type RepositoryManager interface {
225279
GetRepository(projectID int, repositoryID int) (Repository, error)
226280
GetRepositoryRefs(projectID int, repositoryID int) (ObjectReferrers, error)
227281
GetRepositories(projectID int, params RetrieveQueryParams) ([]Repository, error)
228282
UpdateRepository(repository Repository) error
229283
CreateRepository(repository Repository) (Repository, error)
230284
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+
}
231297

298+
// AccessKeyManager handles access key-related operations
299+
type AccessKeyManager interface {
232300
GetAccessKey(projectID int, accessKeyID int) (AccessKey, error)
233301
GetAccessKeyRefs(projectID int, accessKeyID int) (ObjectReferrers, error)
234302
GetAccessKeys(projectID int, params RetrieveQueryParams) ([]AccessKey, error)
235303
RekeyAccessKeys(oldKey string) error
304+
UpdateAccessKey(accessKey AccessKey) error
305+
CreateAccessKey(accessKey AccessKey) (AccessKey, error)
306+
DeleteAccessKey(projectID int, accessKeyID int) error
307+
}
236308

309+
// IntegrationManager handles integration-related operations
310+
type IntegrationManager interface {
237311
CreateIntegration(integration Integration) (newIntegration Integration, err error)
238312
GetIntegrations(projectID int, params RetrieveQueryParams) ([]Integration, error)
239313
GetIntegration(projectID int, integrationID int) (integration Integration, err error)
@@ -259,88 +333,36 @@ type Store interface {
259333
GetIntegrationAliases(projectID int, integrationID *int) ([]IntegrationAlias, error)
260334
GetIntegrationsByAlias(alias string) ([]Integration, IntegrationAliasLevel, error)
261335
DeleteIntegrationAlias(projectID int, aliasID int) error
336+
}
262337

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 {
328340
GetSession(userID int, sessionID int) (Session, error)
329341
CreateSession(session Session) (Session, error)
330342
ExpireSession(userID int, sessionID int) error
331343
TouchSession(userID int, sessionID int) error
332344
SetSessionVerificationMethod(userID int, sessionID int, verificationMethod SessionVerificationMethod) error
333345
VerifySession(userID int, sessionID int) error
346+
}
334347

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 {
335359
CreateTask(task Task, maxTasks int) (Task, error)
336360
UpdateTask(task Task) error
337-
338361
GetTemplateTasks(projectID int, templateID int, params RetrieveQueryParams) ([]TaskWithTpl, error)
339362
GetProjectTasks(projectID int, params RetrieveQueryParams) ([]TaskWithTpl, error)
340363
GetTask(projectID int, taskID int) (Task, error)
341364
DeleteTaskWithOutputs(projectID int, taskID int) error
342365
GetTaskOutputs(projectID int, taskID int, params RetrieveQueryParams) ([]TaskOutput, error)
343-
344366
CreateTaskOutput(output TaskOutput) (TaskOutput, error)
345367
CreateTaskStage(stage TaskStage) (TaskStage, error)
346368
EndTaskStage(taskID int, stageID int, end time.Time, endOutputID int) error
@@ -349,18 +371,37 @@ type Store interface {
349371
CreateAnsibleTaskError(error AnsibleTaskError) error
350372
GetAnsibleTaskHosts(projectID int, taskID int) ([]AnsibleTaskHost, error)
351373
GetAnsibleTaskErrors(projectID int, taskID int) ([]AnsibleTaskError, error)
352-
353374
GetTaskStages(projectID int, taskID int) ([]TaskStageWithResult, error)
354375
GetTaskStageResult(projectID int, taskID int, stageID int) (TaskStageResult, error)
355376
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+
}
356392

393+
// ViewManager handles view-related operations
394+
type ViewManager interface {
357395
GetView(projectID int, viewID int) (View, error)
358396
GetViews(projectID int) ([]View, error)
359397
UpdateView(view View) error
360398
CreateView(view View) (View, error)
361399
DeleteView(projectID int, viewID int) error
362400
SetViewPositions(projectID int, viewPositions map[int]int) error
401+
}
363402

403+
// RunnerManager handles runner-related operations
404+
type RunnerManager interface {
364405
GetRunner(projectID int, runnerID int) (Runner, error)
365406
GetRunners(projectID int, activeOnly bool, tag *string) ([]Runner, error)
366407
DeleteRunner(projectID int, runnerID int) error
@@ -373,12 +414,35 @@ type Store interface {
373414
TouchRunner(runner Runner) (err error)
374415
ClearRunnerCache(runner Runner) (err error)
375416
GetRunnerTags(projectID int) ([]RunnerTag, error)
417+
}
376418

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+
}
380425

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
382446
}
383447

384448
var AccessKeyProps = ObjectProps{

0 commit comments

Comments
 (0)