diff --git a/api/git.go b/api/git.go index 866ea3a..e37b578 100644 --- a/api/git.go +++ b/api/git.go @@ -134,8 +134,8 @@ func (api *WebAPI) getAssociatedProject(payload *GitPayload) *storage.Project { project := api.Database.GetProjectWithRepoName(payload.Repository.FullName) logrus.WithFields(logrus.Fields{ - "project": project, - }).Trace("Found project associated with WebHook") + "projectChange": project, + }).Trace("Found projectChange associated with WebHook") return project } diff --git a/api/main.go b/api/main.go index 0d0f813..38a928f 100644 --- a/api/main.go +++ b/api/main.go @@ -83,18 +83,18 @@ func New() *WebAPI { api.router.POST("/access/grant", LogRequestMiddleware(api.WorkerGrantAccess)) api.router.POST("/access/remove", LogRequestMiddleware(api.WorkerRemoveAccess)) - api.router.POST("/project/create", LogRequestMiddleware(api.ProjectCreate)) - api.router.GET("/project/get/:id", LogRequestMiddleware(api.ProjectGet)) - api.router.POST("/project/update/:id", LogRequestMiddleware(api.ProjectUpdate)) - api.router.GET("/project/list", LogRequestMiddleware(api.ProjectGetAllProjects)) - api.router.GET("/project/monitoring-between/:id", LogRequestMiddleware(api.GetSnapshotsBetween)) - api.router.GET("/project/monitoring/:id", LogRequestMiddleware(api.GetNSnapshots)) - api.router.GET("/project/assignees/:id", LogRequestMiddleware(api.ProjectGetAssigneeStats)) - api.router.GET("/project/requests/:id", LogRequestMiddleware(api.ProjectGetAccessRequests)) - api.router.GET("/project/request_access/:id", LogRequestMiddleware(api.WorkerRequestAccess)) + api.router.POST("/projectChange/create", LogRequestMiddleware(api.ProjectCreate)) + api.router.GET("/projectChange/get/:id", LogRequestMiddleware(api.ProjectGet)) + api.router.POST("/projectChange/update/:id", LogRequestMiddleware(api.ProjectUpdate)) + api.router.GET("/projectChange/list", LogRequestMiddleware(api.ProjectGetAllProjects)) + api.router.GET("/projectChange/monitoring-between/:id", LogRequestMiddleware(api.GetSnapshotsBetween)) + api.router.GET("/projectChange/monitoring/:id", LogRequestMiddleware(api.GetNSnapshots)) + api.router.GET("/projectChange/assignees/:id", LogRequestMiddleware(api.ProjectGetAssigneeStats)) + api.router.GET("/projectChange/requests/:id", LogRequestMiddleware(api.ProjectGetAccessRequests)) + api.router.GET("/projectChange/request_access/:id", LogRequestMiddleware(api.WorkerRequestAccess)) api.router.POST("/task/create", LogRequestMiddleware(api.TaskCreate)) - api.router.GET("/task/get/:project", LogRequestMiddleware(api.TaskGetFromProject)) + api.router.GET("/task/get/:projectChange", LogRequestMiddleware(api.TaskGetFromProject)) api.router.GET("/task/get", LogRequestMiddleware(api.TaskGet)) api.router.POST("/task/release", LogRequestMiddleware(api.TaskRelease)) diff --git a/api/project.go b/api/project.go index fa1a685..4f4368d 100644 --- a/api/project.go +++ b/api/project.go @@ -16,6 +16,7 @@ type CreateProjectRequest struct { Motd string `json:"motd"` Public bool `json:"public"` Hidden bool `json:"hidden"` + Chain int64 `json:"chain"` } type UpdateProjectRequest struct { @@ -26,6 +27,7 @@ type UpdateProjectRequest struct { Motd string `json:"motd"` Public bool `json:"public"` Hidden bool `json:"hidden"` + Chain int64 `json:"chain"` } type UpdateProjectResponse struct { @@ -42,7 +44,7 @@ type CreateProjectResponse struct { type GetProjectResponse struct { Ok bool `json:"ok"` Message string `json:"message,omitempty"` - Project *storage.Project `json:"project,omitempty"` + Project *storage.Project `json:"projectChange,omitempty"` } type GetAllProjectsResponse struct { @@ -91,28 +93,29 @@ func (api *WebAPI) ProjectCreate(r *Request) { Motd: createReq.Motd, Public: createReq.Public, Hidden: createReq.Hidden, + Chain: createReq.Chain, } if !isValidProject(project) { logrus.WithFields(logrus.Fields{ - "project": project, - }).Warn("Invalid project") + "projectChange": project, + }).Warn("Invalid projectChange") r.Json(CreateProjectResponse{ Ok: false, - Message: "Invalid project", + Message: "Invalid projectChange", }, 400) return } if !isProjectCreationAuthorized(project, manager) { logrus.WithFields(logrus.Fields{ - "project": project, - }).Warn("Unauthorized project creation") + "projectChange": project, + }).Warn("Unauthorized projectChange creation") r.Json(CreateProjectResponse{ Ok: false, - Message: "You are not permitted to create a project with this configuration", + Message: "You are not permitted to create a projectChange with this configuration", }, 400) return } @@ -130,8 +133,8 @@ func (api *WebAPI) ProjectCreate(r *Request) { Id: id, }) logrus.WithFields(logrus.Fields{ - "project": project, - }).Debug("Created project") + "projectChange": project, + }).Debug("Created projectChange") } func (api *WebAPI) ProjectUpdate(r *Request) { @@ -140,7 +143,7 @@ func (api *WebAPI) ProjectUpdate(r *Request) { if err != nil || id <= 0 { r.Json(CreateProjectResponse{ Ok: false, - Message: "Invalid project id", + Message: "Invalid projectChange id", }, 400) return } @@ -163,6 +166,7 @@ func (api *WebAPI) ProjectUpdate(r *Request) { Motd: updateReq.Motd, Public: updateReq.Public, Hidden: updateReq.Hidden, + Chain: updateReq.Chain, } if isValidProject(project) { @@ -175,26 +179,26 @@ func (api *WebAPI) ProjectUpdate(r *Request) { }, 500) logrus.WithError(err).WithFields(logrus.Fields{ - "project": project, - }).Warn("Error during project update") + "projectChange": project, + }).Warn("Error during projectChange update") } else { r.OkJson(UpdateProjectResponse{ Ok: true, }) logrus.WithFields(logrus.Fields{ - "project": project, - }).Debug("Updated project") + "projectChange": project, + }).Debug("Updated projectChange") } } else { logrus.WithFields(logrus.Fields{ - "project": project, - }).Warn("Invalid project") + "projectChange": project, + }).Warn("Invalid projectChange") r.Json(CreateProjectResponse{ Ok: false, - Message: "Invalid project", + Message: "Invalid projectChange", }, 400) } } @@ -349,7 +353,7 @@ func (api *WebAPI) WorkerRequestAccess(r *Request) { r.Json(WorkerRequestAccessResponse{ Ok: false, Message: "Project is public, you already have " + - "an active request or you already have access to this project", + "an active request or you already have access to this projectChange", }, 400) } } diff --git a/api/task.go b/api/task.go index 8728559..d9a59a3 100644 --- a/api/task.go +++ b/api/task.go @@ -14,7 +14,7 @@ import ( ) type CreateTaskRequest struct { - Project int64 `json:"project"` + Project int64 `json:"projectChange"` MaxRetries int64 `json:"max_retries"` Recipe string `json:"recipe"` Priority int64 `json:"priority"` @@ -123,7 +123,7 @@ func (api *WebAPI) TaskGetFromProject(r *Request) { return } - project, err := strconv.ParseInt(r.Ctx.UserValue("project").(string), 10, 64) + project, err := strconv.ParseInt(r.Ctx.UserValue("projectChange").(string), 10, 64) handleErr(err, r) task := api.Database.GetTaskFromProject(worker, project) @@ -254,12 +254,7 @@ func (api *WebAPI) TaskRelease(r *Request) { } if !res { - response.Message = "Could not find a task with the specified Id assigned to this workerId" - - logrus.WithFields(logrus.Fields{ - "releaseTaskRequest": req, - "taskUpdated": res, - }).Warn("Release task: NOT FOUND") + response.Message = "Task was not marked as closed" } else { logrus.WithFields(logrus.Fields{ diff --git a/api/worker.go b/api/worker.go index 83492d5..15ac642 100644 --- a/api/worker.go +++ b/api/worker.go @@ -146,7 +146,7 @@ func (api *WebAPI) WorkerGrantAccess(r *Request) { } else { r.OkJson(WorkerAccessResponse{ Ok: false, - Message: "Worker already has access to this project", + Message: "Worker already has access to this projectChange", }) } } @@ -171,7 +171,7 @@ func (api *WebAPI) WorkerRemoveAccess(r *Request) { } else { r.OkJson(WorkerAccessResponse{ Ok: false, - Message: "Worker did not have access to this project", + Message: "Worker did not have access to this projectChange", }) } } diff --git a/schema.sql b/schema.sql index bc45ffd..b7fbafe 100755 --- a/schema.sql +++ b/schema.sql @@ -18,6 +18,7 @@ CREATE TABLE project id SERIAL PRIMARY KEY NOT NULL, priority INTEGER DEFAULT 0 NOT NULL, closed_task_count INT DEFAULT 0 NOT NULL, + chain INT DEFAULT NULL REFERENCES project (id), public boolean NOT NULL, hidden boolean NOT NULL, name TEXT UNIQUE NOT NULL, @@ -101,9 +102,18 @@ CREATE TABLE worker_requests_access_to_project CREATE OR REPLACE FUNCTION on_task_delete_proc() RETURNS TRIGGER AS $$ +DECLARE + chain INTEGER; BEGIN - UPDATE project SET closed_task_count=closed_task_count + 1 WHERE id = OLD.project; + UPDATE project SET closed_task_count=closed_task_count + 1 WHERE id = OLD.project returning project.chain into chain; UPDATE worker SET closed_task_count=closed_task_count + 1 WHERE id = OLD.assignee; + IF chain != 0 THEN + INSERT into task (hash64, project, assignee, max_assign_time, assign_time, verification_count, + priority, retries, max_retries, status, recipe) + VALUES (old.hash64, chain, NULL, old.max_assign_time, NULL, + old.verification_count, old.priority, 0, old.max_retries, 1, + old.recipe); + end if; RETURN OLD; END; $$ LANGUAGE 'plpgsql'; diff --git a/storage/auth.go b/storage/auth.go index 1a5f3f4..dab9b96 100644 --- a/storage/auth.go +++ b/storage/auth.go @@ -131,7 +131,7 @@ func (database *Database) ManagerHasRoleOn(manager *Manager, projectId int64) Ma db := database.getDB() row := db.QueryRow(`SELECT role FROM manager_has_role_on_project - WHERE project=$1 AND manager=$2`, projectId, manager.Id) + WHERE projectChange=$1 AND manager=$2`, projectId, manager.Id) var role ManagerRole err := row.Scan(&role) diff --git a/storage/monitoring.go b/storage/monitoring.go index 978bdac..35b173f 100644 --- a/storage/monitoring.go +++ b/storage/monitoring.go @@ -22,19 +22,19 @@ func (database *Database) MakeProjectSnapshots() { insertRes, err := db.Exec(` INSERT INTO project_monitoring_snapshot - (project, new_task_count, failed_task_count, closed_task_count, worker_access_count, + (projectChange, new_task_count, failed_task_count, closed_task_count, worker_access_count, awaiting_verification_task_count, timestamp) SELECT id, (SELECT COUNT(*) FROM task LEFT JOIN worker_verifies_task wvt on task.id = wvt.task - WHERE task.project = project.id AND status = 1 AND wvt.task IS NULL), - (SELECT COUNT(*) FROM task WHERE task.project = project.id AND status = 2), + WHERE task.projectChange = projectChange.id AND status = 1 AND wvt.task IS NULL), + (SELECT COUNT(*) FROM task WHERE task.projectChange = projectChange.id AND status = 2), closed_task_count, - (SELECT COUNT(*) FROM worker_has_access_to_project wa WHERE wa.project = project.id), + (SELECT COUNT(*) FROM worker_has_access_to_project wa WHERE wa.projectChange = projectChange.id), (SELECT COUNT(*) FROM worker_verifies_task INNER JOIN task t on worker_verifies_task.task = t.id - WHERE t.project = project.id), + WHERE t.projectChange = projectChange.id), extract(epoch from now() at time zone 'utc') - FROM project`) + FROM projectChange`) handleErr(err) inserted, _ := insertRes.RowsAffected() @@ -47,7 +47,7 @@ func (database *Database) MakeProjectSnapshots() { "took": time.Now().Sub(startTime), "add": inserted, "remove": deleted, - }).Trace("Took project monitoring snapshot") + }).Trace("Took projectChange monitoring snapshot") } func (database *Database) GetMonitoringSnapshotsBetween(pid int64, from int, to int) (ss *[]ProjectMonitoringSnapshot) { @@ -58,7 +58,7 @@ func (database *Database) GetMonitoringSnapshotsBetween(pid int64, from int, to rows, err := db.Query(`SELECT new_task_count, failed_task_count, closed_task_count, worker_access_count, awaiting_verification_task_count, timestamp FROM project_monitoring_snapshot - WHERE project=$1 AND timestamp BETWEEN $2 AND $3 ORDER BY TIMESTAMP DESC `, pid, from, to) + WHERE projectChange=$1 AND timestamp BETWEEN $2 AND $3 ORDER BY TIMESTAMP DESC `, pid, from, to) handleErr(err) for rows.Next() { @@ -89,7 +89,7 @@ func (database *Database) GetNMonitoringSnapshots(pid int64, count int) (ss *[]P rows, err := db.Query(`SELECT new_task_count, failed_task_count, closed_task_count, worker_access_count, awaiting_verification_task_count, timestamp FROM project_monitoring_snapshot - WHERE project=$1 ORDER BY TIMESTAMP DESC LIMIT $2`, pid, count) + WHERE projectChange=$1 ORDER BY TIMESTAMP DESC LIMIT $2`, pid, count) handleErr(err) for rows.Next() { diff --git a/storage/project.go b/storage/project.go index 05a21dd..f4722f3 100644 --- a/storage/project.go +++ b/storage/project.go @@ -16,6 +16,7 @@ type Project struct { Motd string `json:"motd"` Public bool `json:"public"` Hidden bool `json:"hidden"` + Chain int64 `json:"chain"` } type AssignedTasks struct { @@ -25,34 +26,29 @@ type AssignedTasks struct { func (database *Database) SaveProject(project *Project) (int64, error) { db := database.getDB() - id, projectErr := saveProject(project, db) - return id, projectErr -} - -func saveProject(project *Project, db *sql.DB) (int64, error) { - - row := db.QueryRow(`INSERT INTO project (name, git_repo, clone_url, version, priority, motd, public, hidden) - VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING id`, + row := db.QueryRow(`INSERT INTO projectChange (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`, project.Name, project.GitRepo, project.CloneUrl, project.Version, project.Priority, project.Motd, - project.Public, project.Hidden) + project.Public, project.Hidden, project.Chain) var id int64 err := row.Scan(&id) if err != nil { logrus.WithError(err).WithFields(logrus.Fields{ - "project": project, - }).Warn("Database.saveProject INSERT project ERROR") + "projectChange": project, + }).Warn("Database.saveProject INSERT projectChange ERROR") return -1, err } project.Id = id logrus.WithFields(logrus.Fields{ - "id": id, - "project": project, - }).Trace("Database.saveProject INSERT project") + "id": id, + "projectChange": project, + }).Trace("Database.saveProject INSERT projectChange") return id, nil } @@ -60,52 +56,47 @@ func saveProject(project *Project, db *sql.DB) (int64, error) { func (database *Database) GetProject(id int64) *Project { db := database.getDB() - project := getProject(id, db) - return project -} - -func getProject(id int64, db *sql.DB) *Project { - - row := db.QueryRow(`SELECT id, priority, name, clone_url, git_repo, version, motd, public, hidden - FROM project WHERE id=$1`, id) + row := db.QueryRow(`SELECT id, priority, name, clone_url, git_repo, version, + motd, public, hidden, COALESCE(chain, 0) + FROM projectChange WHERE id=$1`, id) project, err := scanProject(row) if err != nil { logrus.WithError(err).WithFields(logrus.Fields{ "id": id, - }).Warn("Database.getProject SELECT project NOT FOUND") + }).Warn("Database.getProject SELECT projectChange NOT FOUND") return nil } logrus.WithFields(logrus.Fields{ - "id": id, - "project": project, - }).Trace("Database.saveProject SELECT project") + "id": id, + "projectChange": project, + }).Trace("Database.saveProject SELECT projectChange") return project } func scanProject(row *sql.Row) (*Project, error) { - project := &Project{} - err := row.Scan(&project.Id, &project.Priority, &project.Name, &project.CloneUrl, - &project.GitRepo, &project.Version, &project.Motd, &project.Public, &project.Hidden) + 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) - return project, err + return p, err } 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 - FROM project WHERE LOWER(git_repo)=$1`, + row := db.QueryRow(`SELECT id, priority, name, clone_url, git_repo, version, + motd, public, hidden, COALESCE(chain, 0) FROM projectChange WHERE LOWER(git_repo)=$1`, strings.ToLower(repoName)) project, err := scanProject(row) if err != nil { logrus.WithError(err).WithFields(logrus.Fields{ "repoName": repoName, - }).Warn("Database.getProjectWithRepoName SELECT project NOT FOUND") + }).Warn("Database.getProjectWithRepoName SELECT projectChange NOT FOUND") return nil } @@ -116,10 +107,12 @@ 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) = ($1,$2,$3,$4,$5,$6,$7,$8) WHERE id=$9`, + res, err := db.Exec(`UPDATE projectChange + 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`, project.Priority, project.Name, project.CloneUrl, project.GitRepo, project.Version, project.Motd, - project.Public, project.Hidden, project.Id) + project.Public, project.Hidden, project.Chain, project.Id) if err != nil { return err } @@ -127,9 +120,9 @@ func (database *Database) UpdateProject(project *Project) error { rowsAffected, _ := res.RowsAffected() logrus.WithFields(logrus.Fields{ - "project": project, - "rowsAffected": rowsAffected, - }).Trace("Database.updateProject UPDATE project") + "projectChange": project, + "rowsAffected": rowsAffected, + }).Trace("Database.updateProject UPDATE projectChange") return nil } @@ -142,15 +135,15 @@ func (database Database) GetAllProjects(workerId int64) *[]Project { var err error if workerId == 0 { rows, err = db.Query(`SELECT - Id, priority, name, clone_url, git_repo, version, motd, public, hidden - FROM project + Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0) + FROM projectChange WHERE NOT hidden ORDER BY name`) } else { rows, err = db.Query(`SELECT - Id, priority, name, clone_url, git_repo, version, motd, public, hidden - FROM project - LEFT JOIN worker_has_access_to_project whatp ON whatp.project = id + Id, priority, name, clone_url, git_repo, version, motd, public, hidden, COALESCE(chain,0) + FROM projectChange + LEFT JOIN worker_has_access_to_project whatp ON whatp.projectChange = id WHERE NOT hidden OR whatp.worker = $1 ORDER BY name`, workerId) } @@ -159,13 +152,14 @@ func (database Database) GetAllProjects(workerId int64) *[]Project { for rows.Next() { p := Project{} err := rows.Scan(&p.Id, &p.Priority, &p.Name, &p.CloneUrl, - &p.GitRepo, &p.Version, &p.Motd, &p.Public, &p.Hidden) + &p.GitRepo, &p.Version, &p.Motd, &p.Public, &p.Hidden, + &p.Chain) handleErr(err) projects = append(projects, p) } logrus.WithFields(logrus.Fields{ - "projects": projects, + "projects": len(projects), }).Trace("Get all projects stats") return &projects @@ -177,7 +171,7 @@ func (database *Database) GetAssigneeStats(pid int64, count int64) *[]AssignedTa assignees := make([]AssignedTasks, 0) rows, err := db.Query(`SELECT worker.alias, COUNT(*) as wc FROM TASK - LEFT JOIN worker ON TASK.assignee = worker.id WHERE project=$1 + LEFT JOIN worker ON TASK.assignee = worker.id WHERE projectChange=$1 GROUP BY worker.id ORDER BY wc LIMIT $2`, pid, count) handleErr(err) diff --git a/storage/task.go b/storage/task.go index eaf75aa..2891ec0 100644 --- a/storage/task.go +++ b/storage/task.go @@ -9,7 +9,7 @@ import ( type Task struct { Id int64 `json:"id"` Priority int64 `json:"priority"` - Project *Project `json:"project"` + Project *Project `json:"projectChange"` Assignee int64 `json:"assignee"` Retries int64 `json:"retries"` MaxRetries int64 `json:"max_retries"` @@ -41,7 +41,7 @@ func (database *Database) SaveTask(task *Task, project int64, hash64 int64) erro //TODO: For some reason it refuses to insert the 64-bit value unless I do that... res, err := db.Exec(fmt.Sprintf(` - INSERT INTO task (project, max_retries, recipe, priority, max_assign_time, hash64,verification_count) + INSERT INTO task (projectChange, max_retries, recipe, priority, max_assign_time, hash64,verification_count) VALUES ($1,$2,$3,$4,$5,NULLIF(%d, 0),$6)`, hash64), project, task.MaxRetries, task.Recipe, task.Priority, task.MaxAssignTime, task.VerificationCount) if err != nil { @@ -73,14 +73,14 @@ func (database *Database) GetTask(worker *Worker) *Task { ( SELECT task.id FROM task - INNER JOIN project p on task.project = p.id + INNER JOIN projectChange project on task.projectChange = 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 - AND (p.public OR EXISTS ( - SELECT 1 FROM worker_has_access_to_project a WHERE a.worker=$1 AND a.project=p.id + AND (project.public OR EXISTS ( + SELECT 1 FROM worker_has_access_to_project a WHERE a.worker=$1 AND a.projectChange=project.id )) AND wvt.task IS NULL - ORDER BY p.priority DESC, task.priority DESC + ORDER BY project.priority DESC, task.priority DESC LIMIT 1 ) RETURNING id`, worker.Id) @@ -107,10 +107,10 @@ func (database *Database) GetTask(worker *Worker) *Task { func getTaskById(id int64, db *sql.DB) *Task { row := db.QueryRow(` - SELECT task.id, task.priority, task.project, assignee, retries, max_retries, - status, recipe, max_assign_time, assign_time, verification_count, p.priority, p.name, - p.clone_url, p.git_repo, p.version, p.motd, p.public FROM task - INNER JOIN project p ON task.project = p.id + SELECT task.id, task.priority, task.projectChange, assignee, retries, max_retries, + status, recipe, max_assign_time, assign_time, verification_count, project.priority, project.name, + project.clone_url, project.git_repo, project.version, project.motd, project.public, COALESCE(project.chain,0) FROM task + INNER JOIN projectChange project ON task.projectChange = project.id WHERE task.id=$1`, id) project := &Project{} task := &Task{} @@ -119,7 +119,8 @@ func getTaskById(id int64, db *sql.DB) *Task { err := row.Scan(&task.Id, &task.Priority, &project.Id, &task.Assignee, &task.Retries, &task.MaxRetries, &task.Status, &task.Recipe, &task.MaxAssignTime, &task.AssignTime, &task.VerificationCount, &project.Priority, &project.Name, - &project.CloneUrl, &project.GitRepo, &project.Version, &project.Motd, &project.Public) + &project.CloneUrl, &project.GitRepo, &project.Version, &project.Motd, &project.Public, + &project.Chain) handleErr(err) logrus.WithFields(logrus.Fields{ @@ -175,11 +176,11 @@ func (database *Database) GetTaskFromProject(worker *Worker, projectId int64) *T ( SELECT task.id FROM task - INNER JOIN project p on task.project = p.id + INNER JOIN projectChange project on task.projectChange = project.id LEFT JOIN worker_verifies_task wvt on task.id = wvt.task AND wvt.worker=$1 - WHERE assignee IS NULL AND p.id=$2 AND status=1 - AND (p.public OR EXISTS ( - SELECT 1 FROM worker_has_access_to_project a WHERE a.worker=$1 AND a.project=$2 + WHERE assignee IS NULL AND project.id=$2 AND status=1 + AND (project.public OR EXISTS ( + SELECT 1 FROM worker_has_access_to_project a WHERE a.worker=$1 AND a.projectChange=$2 )) AND wvt.task IS NULL ORDER BY task.priority DESC diff --git a/storage/worker.go b/storage/worker.go index 100c950..86942db 100644 --- a/storage/worker.go +++ b/storage/worker.go @@ -56,7 +56,7 @@ func (database *Database) GetWorker(id int64) *Worker { func (database *Database) GrantAccess(workerId int64, projectId int64) bool { db := database.getDB() - res, err := db.Exec(`INSERT INTO worker_has_access_to_project (worker, project) VALUES ($1,$2) + res, err := db.Exec(`INSERT INTO worker_has_access_to_project (worker, projectChange) VALUES ($1,$2) ON CONFLICT DO NOTHING`, workerId, projectId) if err != nil { @@ -81,7 +81,7 @@ func (database *Database) GrantAccess(workerId int64, projectId int64) bool { func (database *Database) RemoveAccess(workerId int64, projectId int64) bool { db := database.getDB() - res, err := db.Exec(`DELETE FROM worker_has_access_to_project WHERE worker=$1 AND project=$2`, + res, err := db.Exec(`DELETE FROM worker_has_access_to_project WHERE worker=$1 AND projectChange=$2`, workerId, projectId) handleErr(err) @@ -118,8 +118,8 @@ func (database *Database) SaveAccessRequest(worker *Worker, projectId int64) boo db := database.getDB() res, err := db.Exec(`INSERT INTO worker_requests_access_to_project - SELECT $1, id FROM project WHERE id=$2 AND NOT project.public - AND NOT EXISTS(SELECT * FROM worker_has_access_to_project WHERE worker=$1 AND project=$2)`, + SELECT $1, id FROM projectChange WHERE id=$2 AND NOT projectChange.public + AND NOT EXISTS(SELECT * FROM worker_has_access_to_project WHERE worker=$1 AND projectChange=$2)`, worker.Id, projectId) if err != nil { return false @@ -139,13 +139,13 @@ func (database *Database) AcceptAccessRequest(worker *Worker, projectId int64) b db := database.getDB() res, err := db.Exec(`DELETE FROM worker_requests_access_to_project - WHERE worker=$1 AND project=$2`) + WHERE worker=$1 AND projectChange=$2`) handleErr(err) rowsAffected, _ := res.RowsAffected() if rowsAffected == 1 { _, err := db.Exec(`INSERT INTO worker_has_access_to_project - (worker, project) VALUES ($1,$2)`, + (worker, projectChange) VALUES ($1,$2)`, worker.Id, projectId) handleErr(err) } @@ -162,7 +162,7 @@ func (database *Database) RejectAccessRequest(worker *Worker, projectId int64) b db := database.getDB() res, err := db.Exec(`DELETE FROM worker_requests_access_to_project - WHERE worker=$1 AND project=$2`, worker.Id, projectId) + WHERE worker=$1 AND projectChange=$2`, worker.Id, projectId) handleErr(err) rowsAffected, _ := res.RowsAffected() @@ -180,7 +180,7 @@ func (database *Database) GetAllAccessRequests(projectId int64) *[]Worker { rows, err := db.Query(`SELECT id, alias, created FROM worker_requests_access_to_project INNER JOIN worker w on worker_requests_access_to_project.worker = w.id - WHERE project=$1`, + WHERE projectChange=$1`, projectId) handleErr(err) diff --git a/test/api_project_test.go b/test/api_project_test.go index cac4703..3e52ed5 100644 --- a/test/api_project_test.go +++ b/test/api_project_test.go @@ -245,7 +245,7 @@ func TestUpdateProjectConstraintFail(t *testing.T) { func createProject(req api.CreateProjectRequest) *api.CreateProjectResponse { - r := Post("/project/create", req, nil) + r := Post("/projectChange/create", req, nil) var resp api.CreateProjectResponse data, _ := ioutil.ReadAll(r.Body) @@ -257,7 +257,7 @@ func createProject(req api.CreateProjectRequest) *api.CreateProjectResponse { func getProject(id int64) (*api.GetProjectResponse, *http.Response) { - r := Get(fmt.Sprintf("/project/get/%d", id), nil) + r := Get(fmt.Sprintf("/projectChange/get/%d", id), nil) var getResp api.GetProjectResponse data, _ := ioutil.ReadAll(r.Body) @@ -269,7 +269,7 @@ func getProject(id int64) (*api.GetProjectResponse, *http.Response) { func updateProject(request api.UpdateProjectRequest, pid int64) *api.UpdateProjectResponse { - r := Post(fmt.Sprintf("/project/update/%d", pid), request, nil) + r := Post(fmt.Sprintf("/projectChange/update/%d", pid), request, nil) var resp api.UpdateProjectResponse data, _ := ioutil.ReadAll(r.Body) diff --git a/test/api_task_test.go b/test/api_task_test.go index 2a4c4a7..8506a5e 100644 --- a/test/api_task_test.go +++ b/test/api_task_test.go @@ -11,7 +11,7 @@ import ( func TestCreateTaskValid(t *testing.T) { - //Make sure there is always a project for id:1 + //Make sure there is always a projectChange for id:1 createProject(api.CreateProjectRequest{ Name: "Some Test name", Version: "Test Version", @@ -132,9 +132,9 @@ func TestCreateTaskInvalidRecipe(t *testing.T) { func TestCreateGetTask(t *testing.T) { - //Make sure there is always a project for id:1 + //Make sure there is always a projectChange for id:1 resp := createProject(api.CreateProjectRequest{ - Name: "My project", + Name: "My projectChange", Version: "1.0", CloneUrl: "http://github.com/test/test", GitRepo: "myrepo", @@ -639,6 +639,57 @@ func TestReleaseTaskFail(t *testing.T) { } +func TestTaskChain(t *testing.T) { + + w := genWid() + + p1 := createProject(api.CreateProjectRequest{ + Name: "testtaskchain1", + Public: true, + GitRepo: "testtaskchain1", + CloneUrl: "testtaskchain1", + }).Id + + p2 := createProject(api.CreateProjectRequest{ + Name: "testtaskchain2", + Public: true, + GitRepo: "testtaskchain2", + CloneUrl: "testtaskchain2", + Chain: p1, + }).Id + + createTask(api.CreateTaskRequest{ + Project: p2, + Recipe: "###", + VerificationCount: 0, + }, w) + + t1 := getTaskFromProject(p2, w).Task + + releaseTask(api.ReleaseTaskRequest{ + TaskId: t1.Id, + Result: storage.TR_OK, + }, w) + + chained := getTaskFromProject(p1, w).Task + + if chained.VerificationCount != t1.VerificationCount { + t.Error() + } + if chained.Recipe != t1.Recipe { + t.Error() + } + if chained.MaxRetries != t1.MaxRetries { + t.Error() + } + if chained.Priority != t1.Priority { + t.Error() + } + if chained.Status != storage.NEW { + t.Error() + } +} + func createTask(request api.CreateTaskRequest, worker *storage.Worker) *api.CreateTaskResponse { r := Post("/task/create", request, worker) diff --git a/test/common.go b/test/common.go index d063835..62b4f9d 100644 --- a/test/common.go +++ b/test/common.go @@ -6,7 +6,6 @@ import ( "crypto/hmac" "encoding/hex" "encoding/json" - "fmt" "github.com/simon987/task_tracker/config" "github.com/simon987/task_tracker/storage" "io" @@ -51,12 +50,10 @@ func Get(path string, worker *storage.Worker) *http.Response { if worker != nil { - fmt.Println(worker.Secret) mac := hmac.New(crypto.SHA256.New, worker.Secret) mac.Write([]byte(path)) sig := hex.EncodeToString(mac.Sum(nil)) - fmt.Println(strconv.FormatInt(worker.Id, 10)) req.Header.Add("X-Worker-Id", strconv.FormatInt(worker.Id, 10)) req.Header.Add("X-Signature", sig) } diff --git a/test/schema.sql b/test/schema.sql index bc45ffd..b7fbafe 100755 --- a/test/schema.sql +++ b/test/schema.sql @@ -18,6 +18,7 @@ CREATE TABLE project id SERIAL PRIMARY KEY NOT NULL, priority INTEGER DEFAULT 0 NOT NULL, closed_task_count INT DEFAULT 0 NOT NULL, + chain INT DEFAULT NULL REFERENCES project (id), public boolean NOT NULL, hidden boolean NOT NULL, name TEXT UNIQUE NOT NULL, @@ -101,9 +102,18 @@ CREATE TABLE worker_requests_access_to_project CREATE OR REPLACE FUNCTION on_task_delete_proc() RETURNS TRIGGER AS $$ +DECLARE + chain INTEGER; BEGIN - UPDATE project SET closed_task_count=closed_task_count + 1 WHERE id = OLD.project; + UPDATE project SET closed_task_count=closed_task_count + 1 WHERE id = OLD.project returning project.chain into chain; UPDATE worker SET closed_task_count=closed_task_count + 1 WHERE id = OLD.assignee; + IF chain != 0 THEN + INSERT into task (hash64, project, assignee, max_assign_time, assign_time, verification_count, + priority, retries, max_retries, status, recipe) + VALUES (old.hash64, chain, NULL, old.max_assign_time, NULL, + old.verification_count, old.priority, 0, old.max_retries, 1, + old.recipe); + end if; RETURN OLD; END; $$ LANGUAGE 'plpgsql'; diff --git a/web/angular/e2e/src/app.e2e-spec.ts b/web/angular/e2e/src/app.e2e-spec.ts index 3c41391..c1b437e 100755 --- a/web/angular/e2e/src/app.e2e-spec.ts +++ b/web/angular/e2e/src/app.e2e-spec.ts @@ -1,7 +1,7 @@ import {AppPage} from './app.po'; import {browser, logging} from 'protractor'; -describe('workspace-project App', () => { +describe('workspace-projectChange App', () => { let page: AppPage; beforeEach(() => { diff --git a/web/angular/src/app/app.module.ts b/web/angular/src/app/app.module.ts index 98cb5a0..2a423b8 100755 --- a/web/angular/src/app/app.module.ts +++ b/web/angular/src/app/app.module.ts @@ -49,6 +49,7 @@ import {AccountDetailsComponent} from './account-details/account-details.compone import {WorkerDashboardComponent} from './worker-dashboard/worker-dashboard.component'; import {ProjectPermsComponent} from './project-perms/project-perms.component'; import {ManagerListComponent} from './manager-list/manager-list.component'; +import {ProjectSelectComponent} from './project-select/project-select.component'; export function createTranslateLoader(http: HttpClient) { @@ -70,6 +71,7 @@ export function createTranslateLoader(http: HttpClient) { WorkerDashboardComponent, ProjectPermsComponent, ManagerListComponent, + ProjectSelectComponent, ], imports: [ BrowserModule, diff --git a/web/angular/src/app/create-project/create-project.component.html b/web/angular/src/app/create-project/create-project.component.html index f9575ff..8c8be77 100644 --- a/web/angular/src/app/create-project/create-project.component.html +++ b/web/angular/src/app/create-project/create-project.component.html @@ -1,36 +1,37 @@
{{"project.git_repo" | translate}}: @@ -54,6 +54,7 @@