diff --git a/api/models.go b/api/models.go index 01d641c..d86bb9b 100644 --- a/api/models.go +++ b/api/models.go @@ -148,6 +148,7 @@ type UpdateProjectRequest struct { Public bool `json:"public"` Hidden bool `json:"hidden"` Chain int64 `json:"chain"` + Paused bool `json:"paused"` } func (req *UpdateProjectRequest) isValid() bool { @@ -204,6 +205,9 @@ func (req *SubmitTaskRequest) IsValid() bool { if req.Hash64 != 0 && req.UniqueString != "" { return false } + if req.Project == 0 { + return false + } return true } diff --git a/api/project.go b/api/project.go index 6b7d598..56ef278 100644 --- a/api/project.go +++ b/api/project.go @@ -158,6 +158,7 @@ func (api *WebAPI) UpdateProject(r *Request) { Public: updateReq.Public, Hidden: updateReq.Hidden, Chain: updateReq.Chain, + Paused: updateReq.Paused, } sess := api.Session.StartFasthttp(r.Ctx) manager := sess.Get("manager") diff --git a/config.yml b/config.yml index b12fccd..867ca8b 100755 --- a/config.yml +++ b/config.yml @@ -2,7 +2,7 @@ server: address: "0.0.0.0:42901" database: - conn_str: "user=task_tracker dbname=task_tracker sslmode=disable" + conn_str: "user=task_tracker password=task_tracker dbname=task_tracker sslmode=disable" # log_levels: ["debug", "error", "trace", "info", "warn"] log_levels: ["error", "info", "warn"] @@ -19,8 +19,8 @@ log: session: cookie_name: "tt" - expiration: "25m" + expiration: "8h" monitoring: - snapshot_interval: "60s" + snapshot_interval: "120s" history_length: "400h" diff --git a/schema.sql b/schema.sql index f5e7581..807ecc9 100755 --- a/schema.sql +++ b/schema.sql @@ -19,6 +19,7 @@ CREATE TABLE project chain INT DEFAULT NULL REFERENCES project (id), public boolean NOT NULL, hidden boolean NOT NULL, + paused boolean NOT NULL, name TEXT UNIQUE NOT NULL, clone_url TEXT NOT NULL, git_repo TEXT UNIQUE NOT NULL, diff --git a/storage/project.go b/storage/project.go index 4e80ed2..01e3713 100644 --- a/storage/project.go +++ b/storage/project.go @@ -17,6 +17,7 @@ type Project struct { Public bool `json:"public"` Hidden bool `json:"hidden"` Chain int64 `json:"chain"` + Paused bool `json:"paused"` } type AssignedTasks struct { @@ -28,10 +29,10 @@ func (database *Database) SaveProject(project *Project) (int64, error) { db := database.getDB() row := db.QueryRow(`INSERT INTO project (name, git_repo, clone_url, version, priority, - motd, public, hidden, chain) - VALUES ($1,$2,$3,$4,$5,$6,$7,$8,NULLIF($9, 0)) RETURNING id`, + motd, public, hidden, chain, paused) + VALUES ($1,$2,$3,$4,$5,$6,$7,$8,NULLIF($9, 0),$10) RETURNING id`, project.Name, project.GitRepo, project.CloneUrl, project.Version, project.Priority, project.Motd, - project.Public, project.Hidden, project.Chain) + project.Public, project.Hidden, project.Chain, project.Paused) var id int64 err := row.Scan(&id) @@ -57,7 +58,7 @@ func (database *Database) GetProject(id int64) *Project { db := database.getDB() row := db.QueryRow(`SELECT id, priority, name, clone_url, git_repo, version, - motd, public, hidden, COALESCE(chain, 0) + motd, public, hidden, COALESCE(chain, 0), paused FROM project WHERE id=$1`, id) project, err := scanProject(row) @@ -80,7 +81,7 @@ func scanProject(row *sql.Row) (*Project, error) { p := &Project{} err := row.Scan(&p.Id, &p.Priority, &p.Name, &p.CloneUrl, &p.GitRepo, &p.Version, - &p.Motd, &p.Public, &p.Hidden, &p.Chain) + &p.Motd, &p.Public, &p.Hidden, &p.Chain, &p.Paused) return p, err } @@ -89,7 +90,7 @@ func (database *Database) GetProjectWithRepoName(repoName string) *Project { db := database.getDB() row := db.QueryRow(`SELECT id, priority, name, clone_url, git_repo, version, - motd, public, hidden, COALESCE(chain, 0) FROM project WHERE LOWER(git_repo)=$1`, + motd, public, hidden, COALESCE(chain, 0), paused FROM project WHERE LOWER(git_repo)=$1`, strings.ToLower(repoName)) project, err := scanProject(row) @@ -108,11 +109,11 @@ func (database *Database) UpdateProject(project *Project) error { db := database.getDB() res, err := db.Exec(`UPDATE project - SET (priority, name, clone_url, git_repo, version, motd, public, hidden, chain) = - ($1,$2,$3,$4,$5,$6,$7,$8,NULLIF($9, 0)) - WHERE id=$10`, + SET (priority, name, clone_url, git_repo, version, motd, public, hidden, chain, paused) = + ($1,$2,$3,$4,$5,$6,$7,$8,NULLIF($9, 0), $10) + WHERE id=$11`, project.Priority, project.Name, project.CloneUrl, project.GitRepo, project.Version, project.Motd, - project.Public, project.Hidden, project.Chain, project.Id) + project.Public, project.Hidden, project.Chain, project.Paused, project.Id) if err != nil { return err } @@ -135,13 +136,13 @@ func (database Database) GetAllProjects(managerId int64) *[]Project { var err error if managerId == 0 { rows, err = db.Query(`SELECT - Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0) + Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0), paused FROM project WHERE NOT hidden ORDER BY name`) } else { rows, err = db.Query(`SELECT - Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0) + Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0), paused FROM project LEFT JOIN manager_has_role_on_project mhrop ON mhrop.project = id AND mhrop.manager=$1 WHERE NOT hidden OR mhrop.role & 1 = 1 OR (SELECT tracker_admin FROM manager WHERE id=$1) @@ -153,7 +154,7 @@ func (database Database) GetAllProjects(managerId int64) *[]Project { p := Project{} err := rows.Scan(&p.Id, &p.Priority, &p.Name, &p.CloneUrl, &p.GitRepo, &p.Version, &p.Motd, &p.Public, &p.Hidden, - &p.Chain) + &p.Chain, &p.Paused) handleErr(err) projects = append(projects, p) } diff --git a/storage/task.go b/storage/task.go index 6ebcfde..1466f77 100644 --- a/storage/task.go +++ b/storage/task.go @@ -82,7 +82,7 @@ func (database *Database) GetTask(worker *Worker) *Task { FROM task INNER JOIN project project on task.project = project.id LEFT JOIN worker_verifies_task wvt on task.id = wvt.task AND wvt.worker=$1 - WHERE assignee IS NULL AND task.status=1 + WHERE NOT project.paused AND assignee IS NULL AND task.status=1 AND (project.public OR ( SELECT a.role_assign FROM worker_access a WHERE a.worker=$1 AND a.project=project.id )) @@ -186,7 +186,7 @@ func (database *Database) GetTaskFromProject(worker *Worker, projectId int64) *T FROM task INNER JOIN project project on task.project = project.id LEFT JOIN worker_verifies_task wvt on task.id = wvt.task AND wvt.worker=$1 - WHERE assignee IS NULL AND project.id=$2 AND status=1 + WHERE NOT project.paused AND assignee IS NULL AND project.id=$2 AND status=1 AND (project.public OR ( SELECT a.role_assign FROM worker_access a WHERE a.worker=$1 AND a.project=$2 )) diff --git a/test/api_project_test.go b/test/api_project_test.go index c5f2a44..e37456d 100644 --- a/test/api_project_test.go +++ b/test/api_project_test.go @@ -142,6 +142,7 @@ func TestUpdateProjectValid(t *testing.T) { Motd: "MotdB", Public: false, Hidden: true, + Paused: true, }, pid, testAdminCtx) if updateResp.Ok != true { @@ -168,6 +169,9 @@ func TestUpdateProjectValid(t *testing.T) { if proj.Project.Hidden != true { t.Error() } + if proj.Project.Paused != true { + t.Error() + } } func TestUpdateProjectInvalid(t *testing.T) { @@ -444,6 +448,42 @@ func TestAdminShouldSeeHiddenProjectInList(t *testing.T) { } } +func TestPausedProjectShouldNotDispatchTasks(t *testing.T) { + + createTask(api.SubmitTaskRequest{ + Project: testProject, + Recipe: "...", + }, testWorker) + createTask(api.SubmitTaskRequest{ + Project: testProject, + Recipe: "...", + }, testWorker) + createTask(api.SubmitTaskRequest{ + Project: testProject, + Recipe: "...", + }, testWorker) + + task1 := getTaskFromProject(testProject, testWorker).Content.Task + if task1 == nil { + t.Error() + } + + updateProject(api.UpdateProjectRequest{ + Paused: true, + Name: "generictestproject", + }, testProject, testAdminCtx) + + task2 := getTaskFromProject(testProject, testWorker).Content.Task + if task2 != nil { + t.Error() + } + + updateProject(api.UpdateProjectRequest{ + Paused: false, + Name: "generictestproject", + }, testProject, testAdminCtx) +} + func createProjectAsAdmin(req api.CreateProjectRequest) CreateProjectAR { return createProject(req, testAdminCtx) } diff --git a/test/config.yml b/test/config.yml index c5c0edc..ae65cb8 100644 --- a/test/config.yml +++ b/test/config.yml @@ -2,7 +2,7 @@ server: address: "127.0.0.1:5001" database: - conn_str: "user=task_tracker dbname=task_tracker_test sslmode=disable" + conn_str: "user=task_tracker password=task_tracker dbname=task_tracker sslmode=disable" log_levels: ["debug", "error", "trace", "info", "warn"] git: diff --git a/test/schema.sql b/test/schema.sql index f5e7581..807ecc9 100755 --- a/test/schema.sql +++ b/test/schema.sql @@ -19,6 +19,7 @@ CREATE TABLE project chain INT DEFAULT NULL REFERENCES project (id), public boolean NOT NULL, hidden boolean NOT NULL, + paused boolean NOT NULL, name TEXT UNIQUE NOT NULL, clone_url TEXT NOT NULL, git_repo TEXT UNIQUE NOT NULL, diff --git a/web/angular/src/app/admin-panel/admin-panel.component.css b/web/angular/src/app/admin-panel/admin-panel.component.css new file mode 100644 index 0000000..e69de29 diff --git a/web/angular/src/app/admin-panel/admin-panel.component.html b/web/angular/src/app/admin-panel/admin-panel.component.html new file mode 100644 index 0000000..e52e6df --- /dev/null +++ b/web/angular/src/app/admin-panel/admin-panel.component.html @@ -0,0 +1,13 @@ +
{{"dialog.are_you_sure"|translate}}
+{{project | json}}
+ {{project | json}}