diff --git a/api/projects/templates.go b/api/projects/templates.go index e88ead3dd..886fd0b83 100644 --- a/api/projects/templates.go +++ b/api/projects/templates.go @@ -2,11 +2,11 @@ package projects import ( "fmt" - "github.com/semaphoreui/semaphore/util" "net/http" "github.com/semaphoreui/semaphore/api/helpers" "github.com/semaphoreui/semaphore/db" + "github.com/semaphoreui/semaphore/util" ) // TemplatesMiddleware ensures a template exists and loads it to the context @@ -55,7 +55,9 @@ func GetTemplates(w http.ResponseWriter, r *http.Request) { app := db.TemplateApp(r.URL.Query().Get("app")) filter.App = &app } - templates, err := helpers.Store(r).GetTemplates(project.ID, filter, helpers.QueryParams(r.URL)) + + q := helpers.QueryParams(r.URL) + templates, err := helpers.Store(r).GetTemplates(project.ID, filter, q, false) if err != nil { helpers.WriteError(w, err) diff --git a/api/projects/views.go b/api/projects/views.go index 7f1a28cdf..0cdd3c9d6 100644 --- a/api/projects/views.go +++ b/api/projects/views.go @@ -33,7 +33,11 @@ func GetViewTemplates(w http.ResponseWriter, r *http.Request) { project := helpers.GetFromContext(r, "project").(db.Project) view := helpers.GetFromContext(r, "view").(db.View) - templates, err := helpers.Store(r).GetTemplates(project.ID, db.TemplateFilter{ViewID: &view.ID}, helpers.QueryParams(r.URL)) + templates, err := helpers.Store(r).GetTemplates( + project.ID, + db.TemplateFilter{ViewID: &view.ID}, + helpers.QueryParams(r.URL), + false) if err != nil { helpers.WriteError(w, err) diff --git a/db/Store.go b/db/Store.go index 088ce972b..23952c520 100644 --- a/db/Store.go +++ b/db/Store.go @@ -266,7 +266,7 @@ type ProjectInviteRepository interface { // TemplateManager handles template-related operations type TemplateManager interface { - GetTemplates(projectID int, filter TemplateFilter, params RetrieveQueryParams) ([]Template, error) + GetTemplates(projectID int, filter TemplateFilter, params RetrieveQueryParams, loadVaults bool) ([]Template, error) GetTemplateRefs(projectID int, templateID int) (ObjectReferrers, error) CreateTemplate(template Template) (Template, error) UpdateTemplate(template Template) error diff --git a/db/bolt/template.go b/db/bolt/template.go index b07a96b75..057be7607 100644 --- a/db/bolt/template.go +++ b/db/bolt/template.go @@ -69,7 +69,7 @@ func (d *BoltDb) SetTemplateDescription(projectID int, templateID int, descripti return err } -func (d *BoltDb) GetTemplates(projectID int, filter db.TemplateFilter, params db.RetrieveQueryParams) (templates []db.Template, err error) { +func (d *BoltDb) GetTemplates(projectID int, filter db.TemplateFilter, params db.RetrieveQueryParams, loadVaults bool) (templates []db.Template, err error) { var ftr = func(tpl any) bool { template := tpl.(db.Template) var res = true diff --git a/db/sql/project.go b/db/sql/project.go index 8dc0d46a8..a62608753 100644 --- a/db/sql/project.go +++ b/db/sql/project.go @@ -74,13 +74,6 @@ func (d *SqlDb) GetProject(projectID int) (project db.Project, err error) { func (d *SqlDb) DeleteProject(projectID int) error { - //tpls, err := d.GetTemplates(projectID, db.TemplateFilter{}, db.RetrieveQueryParams{}) - // - //if err != nil { - // return err - //} - // TODO: sort projects - tx, err := d.Sql().Begin() if err != nil { diff --git a/db/sql/task.go b/db/sql/task.go index ce205791a..5a0a07ba2 100644 --- a/db/sql/task.go +++ b/db/sql/task.go @@ -231,6 +231,12 @@ func (d *SqlDb) CreateTaskOutput(output db.TaskOutput) (db.TaskOutput, error) { } func (d *SqlDb) getTasks(projectID int, templateID *int, taskIDs []int, params db.RetrieveQueryParams, tasks *[]db.TaskWithTpl) (err error) { + + if taskIDs != nil && len(taskIDs) == 0 { + *tasks = []db.TaskWithTpl{} + return nil + } + fields := "task.*" fields += ", tpl.playbook as tpl_playbook" + ", `user`.name as user_name" + @@ -254,7 +260,7 @@ func (d *SqlDb) getTasks(projectID int, templateID *int, taskIDs []int, params d q = q.Where("tpl.project_id=? AND task.template_id=?", projectID, templateID) } - if len(taskIDs) > 0 { + if taskIDs != nil { q = q.Where(squirrel.Eq{"task.id": taskIDs}) } diff --git a/db/sql/template.go b/db/sql/template.go index d4babea82..3dae19f36 100644 --- a/db/sql/template.go +++ b/db/sql/template.go @@ -153,7 +153,7 @@ func (d *SqlDb) SetTemplateDescription(projectID int, templateID int, descriptio return } -func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db.RetrieveQueryParams) (templates []db.Template, err error) { +func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db.RetrieveQueryParams, loadVaults bool) (templates []db.Template, err error) { pp, err := params.Validate(db.TemplateProps) if err != nil { @@ -234,6 +234,14 @@ func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db. OrderBy("pt.name " + order) } + if params.Count > 0 { + q = q.Limit(uint64(params.Count)) + } + + if params.Offset > 0 { + q = q.Offset(uint64(params.Offset)) + } + query, args, err := q.ToSql() if err != nil { @@ -257,6 +265,7 @@ func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db. } var tasks []db.TaskWithTpl + err = d.getTasks(projectID, nil, taskIDs, db.RetrieveQueryParams{}, &tasks) if err != nil { @@ -269,10 +278,6 @@ func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db. if tpl.LastTaskID != nil { for _, tsk := range tasks { if tsk.ID == *tpl.LastTaskID { - err = tsk.Fill(d) - if err != nil { - return - } template.LastTask = &tsk break } @@ -287,9 +292,11 @@ func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, params db. return } - template.Vaults, err = d.GetTemplateVaults(projectID, template.ID) - if err != nil { - return + if loadVaults { + template.Vaults, err = d.GetTemplateVaults(projectID, template.ID) + if err != nil { + return + } } templates = append(templates, template) diff --git a/services/project/backup.go b/services/project/backup.go index 0672c63a3..476729e3e 100644 --- a/services/project/backup.go +++ b/services/project/backup.go @@ -125,7 +125,7 @@ func (b *BackupDB) makeUniqueNames() { func (b *BackupDB) load(projectID int, store db.Store) (err error) { - b.templates, err = store.GetTemplates(projectID, db.TemplateFilter{}, db.RetrieveQueryParams{}) + b.templates, err = store.GetTemplates(projectID, db.TemplateFilter{}, db.RetrieveQueryParams{}, true) if err != nil { return } diff --git a/services/tasks/TaskRunner.go b/services/tasks/TaskRunner.go index 257118c61..94f6ee1ad 100644 --- a/services/tasks/TaskRunner.go +++ b/services/tasks/TaskRunner.go @@ -235,7 +235,7 @@ func (t *TaskRunner) run() { tpls, err := t.pool.store.GetTemplates(t.Task.ProjectID, db.TemplateFilter{ BuildTemplateID: &t.Task.TemplateID, AutorunOnly: true, - }, db.RetrieveQueryParams{}) + }, db.RetrieveQueryParams{}, true) if err != nil { t.Log("Running app failed: " + err.Error()) diff --git a/web/src/views/project/Templates.vue b/web/src/views/project/Templates.vue index 0bee13385..fd4e2016f 100644 --- a/web/src/views/project/Templates.vue +++ b/web/src/views/project/Templates.vue @@ -129,13 +129,12 @@ --> - - -