From 42d594ccac83b0e8752492384bebdc96f9f02507 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 8 Sep 2020 13:30:28 +0200 Subject: [PATCH] qa: Add todo list on home page --- libfic/db.go | 11 ++++++++ libfic/qa.go | 55 +++++++++++++++++++++++++++++++++++++++ qa/api/todo.go | 49 ++++++++++++++++++++++++++++++++++ qa/static/js/qa.js | 27 +++++++++++++++++++ qa/static/views/home.html | 18 ++++++++++++- 5 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 qa/api/todo.go diff --git a/libfic/db.go b/libfic/db.go index 46bd2c67..fc49decf 100644 --- a/libfic/db.go +++ b/libfic/db.go @@ -446,6 +446,17 @@ CREATE TABLE IF NOT EXISTS qa_comments( FOREIGN KEY(id_qa) REFERENCES exercices_qa(id_qa), FOREIGN KEY(id_team) REFERENCES teams(id_team) ) DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; +`); err != nil { + return err + } + if _, err := db.Exec(` +CREATE TABLE IF NOT EXISTS teams_qa_todo( + id_todo INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + id_team INTEGER NOT NULL, + id_exercice INTEGER NOT NULL, + FOREIGN KEY(id_exercice) REFERENCES exercices(id_exercice), + FOREIGN KEY(id_team) REFERENCES teams(id_team) +) DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; `); err != nil { return err } diff --git a/libfic/qa.go b/libfic/qa.go index 126e61e4..c01e3717 100644 --- a/libfic/qa.go +++ b/libfic/qa.go @@ -64,6 +64,26 @@ func (e Exercice) GetQAQueries() (res []QAQuery, err error) { return } +// GetQAQueries returns a list of all QAQuery registered for the Exercice. +func (t Team) GetQAQueries() (res []QAQuery, err error) { + var rows *sql.Rows + if rows, err = DBQuery("SELECT id_qa, id_exercice, id_team, authuser, creation, state, subject, solved, closed FROM exercices_qa WHERE id_team = ?", t.Id); err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var q QAQuery + if err = rows.Scan(&q.Id, &q.IdExercice, &q.IdTeam, &q.User, &q.Creation, &q.State, &q.Subject, &q.Solved, &q.Closed); err != nil { + return + } + res = append(res, q) + } + err = rows.Err() + + return +} + // GetQAQuery retrieves the query with the given identifier. func (e Exercice) GetQAQuery(id int64) (q QAQuery, err error) { err = DBQueryRow("SELECT id_qa, id_exercice, id_team, authuser, creation, state, subject, solved, closed FROM exercices_qa WHERE id_qa = ? AND id_exercice = ?", id, e.Id).Scan(&q.Id, &q.IdExercice, &q.IdTeam, &q.User, &q.Creation, &q.State, &q.Subject, &q.Solved, &q.Closed) @@ -181,3 +201,38 @@ func (c QAComment) Delete() (int64, error) { return nb, err } } + +type QATodo struct { + Id int64 `json:"id"` + IdTeam int64 `json:"id_team,omitempty"` + IdExercice int64 `json:"id_exercice"` +} + +func (t Team) GetQATodo() (res []QATodo, err error) { + var rows *sql.Rows + if rows, err = DBQuery("SELECT id_todo, id_exercice FROM teams_qa_todo WHERE id_team = ?", t.Id); err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var t QATodo + if err = rows.Scan(&t.Id, &t.IdExercice); err != nil { + return + } + res = append(res, t) + } + err = rows.Err() + + return +} + +func (t Team) NewQATodo(idExercice int64) (QATodo, error) { + if res, err := DBExec("INSERT INTO teams_qa_todo (id_team, id_exercice) VALUES (?, ?)", t.Id, idExercice); err != nil { + return QATodo{}, err + } else if tid, err := res.LastInsertId(); err != nil { + return QATodo{}, err + } else { + return QATodo{tid, t.Id, idExercice}, nil + } +} diff --git a/qa/api/todo.go b/qa/api/todo.go new file mode 100644 index 00000000..94222e93 --- /dev/null +++ b/qa/api/todo.go @@ -0,0 +1,49 @@ +package api + +import ( + "encoding/json" + "errors" + + "srs.epita.fr/fic-server/libfic" + + "github.com/julienschmidt/httprouter" +) + +func init() { + router.GET("/api/qa_mywork.json", apiHandler(getQAWork)) + router.GET("/api/qa_work.json", apiHandler(getQATodo)) + router.POST("/api/qa_work.json", apiHandler(createQATodo)) +} + +func getQAWork(u QAUser, ps httprouter.Params, body []byte) (interface{}, error) { + if team, err := fic.GetTeam(u.TeamId); err != nil { + return nil, err + } else { + return team.GetQAQueries() + } +} + +func getQATodo(u QAUser, ps httprouter.Params, body []byte) (interface{}, error) { + if team, err := fic.GetTeam(u.TeamId); err != nil { + return nil, err + } else { + return team.GetQATodo() + } +} + +func createQATodo(u QAUser, ps httprouter.Params, body []byte) (interface{}, error) { + if u.User != "nemunaire" { + return nil, errors.New("Restricted") + } + + var ut fic.QATodo + if err := json.Unmarshal(body, &ut); err != nil { + return nil, err + } + + if team, err := fic.GetTeam(ut.IdTeam); err != nil { + return nil, err + } else { + return team.NewQATodo(ut.IdExercice) + } +} diff --git a/qa/static/js/qa.js b/qa/static/js/qa.js index 6f0f378d..bfc98a70 100644 --- a/qa/static/js/qa.js +++ b/qa/static/js/qa.js @@ -90,6 +90,12 @@ angular.module("FICApp") .factory("Version", function($resource) { return $resource("/api/version") }) + .factory("Todo", function($resource) { + return $resource("/api/qa_work.json") + }) + .factory("TodoWorked", function($resource) { + return $resource("/api/qa_mywork.json") + }) .factory("Team", function($resource) { return $resource("/api/teams/:teamId", { teamId: '@id' }, { 'update': {method: 'PUT'}, @@ -216,6 +222,20 @@ angular.module("FICApp") $scope.v = Version.get(); }) + .controller("ToDoController", function($scope, Todo, TodoWorked, $location) { + $scope.todos = Todo.query(); + $scope.tododone = {} + $scope.work = TodoWorked.query(function(tw) { + tw.forEach(function(t) { + $scope.tododone[t.id_exercice] = t + }) + }); + + $scope.show = function(id) { + $location.url("/exercices/" + id); + }; + }) + .controller("ThemesListController", function($scope, Theme, $location, $rootScope, $http) { $scope.themes = Theme.query(); $scope.fields = ["name", "authors", "headline"]; @@ -286,6 +306,13 @@ angular.module("FICApp") }; }) + .controller("MyTodoExerciceController", function($scope, Exercice, ExerciceQA, Theme) { + $scope.mytheme = null + $scope.myexercice = Exercice.get({ exerciceId: $scope.todo.id_exercice }, function(e) { + $scope.mytheme = Theme.get({ themeId: e.id_theme }) + }); + }) + .controller("ExerciceController", function($scope, $rootScope, Exercice, ThemedExercice, $routeParams, $location, $http) { if ($routeParams.themeId && $routeParams.exerciceId == "new") { $scope.exercice = new ThemedExercice(); diff --git a/qa/static/views/home.html b/qa/static/views/home.html index 39ee5004..16c4420a 100644 --- a/qa/static/views/home.html +++ b/qa/static/views/home.html @@ -1,7 +1,23 @@

Interface QA du challenge

-
+
+ + + + + + + +
+ À tester + + Testé + + {{ mytheme.name }} + + {{ myexercice.title }} +