From 0c0c37b0a19e985037804830481b31c277f59668 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Thu, 15 Mar 2018 19:17:28 +0100 Subject: [PATCH] [repo.cours] fixed + added requests to create|update|delete [module.cours] POST to create + PUT to update (can remove a list of formations, or add a list .., update idProf (-1 to unset), volume) --- build/api/module/ue/coursController.php | 126 ++++++++++++++- build/database/repo/cours.php | 196 +++++++++++++++++++----- config/modules.json | 42 +++++ 3 files changed, 323 insertions(+), 41 deletions(-) diff --git a/build/api/module/ue/coursController.php b/build/api/module/ue/coursController.php index 9ebdef5..f4ecc76 100644 --- a/build/api/module/ue/coursController.php +++ b/build/api/module/ue/coursController.php @@ -11,7 +11,37 @@ use error\core\Err; class coursController{ - /* (1) Get groups for a specific UE + /* (1) Create a new Cours + * + * @code UE code + * + * @return groups The list of groups for this UE + * + ---------------------------------------------------------*/ + public static function post($args){ + $code = ""; + $idProf = null; + $volume = 0; + $formations = []; + extract($args); + + /* Get the cours repo */ + /** @var cours $cours_repo */ + $cours_repo = Repo::getRepo('cours'); + + /* (1) Try to create cours */ + $created_id = $cours_repo->create($code, $idProf, $volume, $formations); + + /* (2) Manage error */ + if( is_null($created_id) || !is_int($created_id) ) + return ['error' => new Error(Err::RepoError)]; + + return ['created_id' => $created_id]; + + } + + + /* (2) Get groups for a specific UE * * @code UE code * @@ -43,4 +73,98 @@ class coursController{ } + /* (3) Updates an existing Cours + * + * @idCours Id of the Cours to update + * @idProf [OPT] The new professor ID (-1 to unset) + * @volume [OPT] The new number of hours for the Cours + * @add_form List of ids of formations to add + * @rem_form List of ids of formations to remove + * + * @return updated Whether the Cours have been updated + * + ---------------------------------------------------------*/ + public static function put($args){ + $idCours = -1; + $idProf = null; + $volume = null; + $add_form = []; + $rem_form = []; + extract($args); + + /* Get the cours repo */ + /** @var cours $cours_repo */ + $cours_repo = Repo::getRepo('cours'); + + /* (1) If nothing to do -> error */ + if( is_null($idProf) && is_null($volume) && count($add_form) + count($rem_form) == 0) + return ['error' => new Error(Err::MissingParam)]; + + /* (2) If have to update @idProf */ + if( !is_null($idProf) ){ + + // call repo + $updated = $cours_repo->updateProf($idCours, $idProf < 0 ? NULL : $idProf ); + + // if error -> dispatch + if( !$updated ) + return ['error' => new Error(Err::RepoError)]; + + } + + /* (3) If have to update @volume */ + if( !is_null($volume) ){ + + // call repo + $updated = $cours_repo->updateVolume($idCours, $volume); + + // if error -> dispatch + if( !$updated ) + return ['error' => new Error(Err::RepoError)]; + + } + + /* (4) If have to add formations -> add them */ + if( count($add_form) > 0 ){ + + foreach($add_form as $id_form) + $cours_repo->linkFormation($id_form, $idCours); + + } + + /* (5) If have to remove formations -> remove them */ + if( count($rem_form) > 0 ){ + + foreach($rem_form as $id_form) + $cours_repo->unlinkFormation($id_form, $idCours); + + } + + + return ['updated' => true]; + + } + + + /* (4) Deletes an existing Cours + * + * @idCours Id of the Cours + * + * @return deleted Whether it has been deleted + * + ---------------------------------------------------------*/ + public static function delete($args){ + $idCours = 0; + extract($args); + + /* Get the cours repo */ + /** @var cours $cours_repo */ + $cours_repo = Repo::getRepo('cours'); + + /* (1) Dispatch response from repo */ + return ['deleted' => $cours_repo->delete($idCours)]; + + } + + } \ No newline at end of file diff --git a/build/database/repo/cours.php b/build/database/repo/cours.php index 4b9c7e8..f05607a 100644 --- a/build/database/repo/cours.php +++ b/build/database/repo/cours.php @@ -13,75 +13,191 @@ use database\core\Repo_i; class cours extends Repo_i { - public function create(string $codeUE, ?int $idProf, float $volume, array $formations) : int{ - //create the group - $st = $this->pdo->prepare("INSERT INTO Cours(UE_code, Professeur_idProfesseur, volume) - VALUE(:UE, :idProf, :vol)"); - $st->execute([ - "UE" => $codeUE, - "idProf" => $idProf, - "vol" => $volume + /* (1) Create a new Cours + * + * @code The code of the UE containing the Cours + * @idProf [OPT] The ID of the prof who teaches the Cours + * @volume The number of hours (float) + * @formations The list of formations for that Cours (list of int) + * @return created_code Code of the created UE (NULL on error) + * + * @return created_id UID of the created Cours (NULL on error) + * + ---------------------------------------------------------*/ + public function create(string $code, ?int $idProf, float $volume, array $formations) : int{ + + /* (1) Prepare statement */ + $st = $this->pdo->prepare('INSERT INTO Cours(UE_code, Professeur_idProfesseur, volume) + VALUE(:UE, :idProf, :vol)'); + + /* (2) Manage statement error */ + if( is_bool($st) ) + return NULL; + + /* (3) Try to execute request */ + $success = $st->execute([ + ':UE' => $code, + ':idProf' => $idProf, + ':vol' => $volume ]); - $idCours = $this->pdo->lastInsertId(); + /* (4) Manage error */ + if( !$success ) + return NULL; - //if there is formations, link them with the group - if(count($formations) > 0){ - $linkSt = $this->pdo->prepare("INSERT INTO GroupeCours(Formation_idFormation, Cours_idCours) - VALUE (:form, :cours)"); - foreach ($formations as $form){ - $linkSt->execute([ - "form" => $form, - "cours" => $idCours - ]); - } + /* (5) Store @created_id */ + $created_id = (int) $this->pdo->lastInsertId(); + + + /* (6) We are done if there is no formations */ + if( count($formations) <= 0) + return $created_id; + + /* (7) Else -> create each formation */ + foreach($formations as $form_id){ + + // 1. Ignore if wrong format + if( !is_int($form_id) || $form_id < 0 ) + continue; + + // 2. Link formation to created Cours + $this->linkFormation($form_id, $created_id); } - return $idCours; + /* (7) Return @created_id */ + return $created_id; } + + /* (2) Unlink a formation from a Cours + * + * @idFormation Id of the formation + * @idCours Id of the Cours + * + * @return unlinked Whether it has been unlinked + * + ---------------------------------------------------------*/ public function unlinkFormation(int $idFormation, int $idCours) : bool{ - $st = $this->pdo->prepare("DELETE FROM GroupeCours WHERE Cours_idCours = :cours AND Formation_idFormation = :form"); + /* (1) Prepare statement */ + $st = $this->pdo->prepare('DELETE FROM GroupeCours WHERE Cours_idCours = :cours AND Formation_idFormation = :form'); + + /* (2) Manage statement error */ + if( is_bool($st) ) + return false; + + /* (3) EXecute and dispatch status */ return $st->execute([ - "cours" => $idCours, - "form" => $idFormation + ':cours' => $idCours, + ':form' => $idFormation ]); + } + + /* (3) Link a formation to a Cours + * + * @idFormation Id of the formation + * @idCours Id of the Cours + * + * @return linked Whether it has been linked + * + ---------------------------------------------------------*/ public function linkFormation(int $idFormation, int $idCours) : bool{ - $st = $this->pdo->prepare("INSERT INTO GroupeCours(Cours_idCours,Formation_idFormation) - VALUE(:cours, :form)"); + /* (1) Try to remove first if it already exists */ + $this->unlinkFormation($idFormation, $idCours); + + /* (2) Prepare statement */ + $st = $this->pdo->prepare('INSERT INTO GroupeCours(Cours_idCours,Formation_idFormation) + VALUE(:cours, :form)'); + + /* (3) Manage statement error */ + if( is_bool($st) ) + return false; + + /* (4) EXecute and dispatch status */ return $st->execute([ - "cours" => $idCours, - "form" => $idFormation + ':cours' => $idCours, + ':form' => $idFormation ]); + } - public function updateProf(?int $prof) : bool { - $st = $this->pdo->prepare("UPDATE Cours SET Professeur_idProfesseur = :prof"); - return $st->execute([ - "prof" => $prof - ]); + + + + /* (4.1) Updates an existing Cours + * + * @idCours Id of the Cours + * @idProf [OPT] Id of the prof (NULL to set to NULL) + * + * @return updated Whether it has been updated + * + ---------------------------------------------------------*/ + public function updateProf(int $idCours, ?int $idProf) : bool { + + /* (1) Prepare statement */ + $st = $this->pdo->prepare('UPDATE Cours + SET Professeur_idProfesseur = :idProf + WHERE idCours = :idCours'); + + /* (2) Manage statement error */ + if( is_bool($st) ) + return false; + + /* (3) Execute and dispatch status */ + return $st->execute([ ':idCours' => $idCours, ':idProf' => $idProf ]); + } - public function updateVolume(float $volume) : bool { - $st = $this->pdo->prepare("UPDATE Cours SET volume = :vol"); + /* (4.2) Updates an existing Cours + * + * @idCours Id of the Cours + * @volume [OPT] The new number of hours + * + * @return updated Whether it has been updated + * + ---------------------------------------------------------*/ + public function updateVolume(int $idCours, float $volume) : bool { + + /* (1) Prepare statement */ + $st = $this->pdo->prepare('UPDATE Cours + SET volume = :volume + WHERE idCours = :idCours'); + + /* (2) Manage statement error */ + if( is_bool($st) ) + return false; + + /* (3) Execute and dispatch status */ + return $st->execute([ ':idCours' => $idCours, ':volume' => $volume ]); - return $st->execute([ - "vol" => $volume - ]); } + + + /* (5) Deletes an existing cours + * + * @idCours Id of the Cours + * + * @return deleted Whether it has been deleted + * + ---------------------------------------------------------*/ public function delete(int $id) :bool { + + /* (1) Prepare statement */ $st = $this->pdo->prepare("DELETE FROM Cours WHERE idCours = :id"); - return $st->execute([ - "id" => $id - ]); + /* (2) Manage statement error */ + if( is_bool($st) ) + return false; + + /* (3) Execute and dispatch status */ + return $st->execute([ ':id' => $id ]); + } diff --git a/config/modules.json b/config/modules.json index e2166da..d1e2262 100644 --- a/config/modules.json +++ b/config/modules.json @@ -1,4 +1,6 @@ { + + "POST": { "des": "Returns the API documentation", "per": [], @@ -251,12 +253,52 @@ "cours": { + "POST": { + "des" : "Creates a new Cours for an UE", + "per": [], + "par": { + "code": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)" }, + "idProf": { "des": "Id of the professor", "typ": "id", "opt": true }, + "volume": { "des": "Number of hours for Cours", "typ": "id", "opt": true, "def": 0 }, + "formations": { "des": "List of formations (ids)", "typ": "array", "opt": true, "def": [] } + }, + "output": { + "created_id" : { "des": "The id of the created Cours", "typ": "id" } + } + }, + "GET": { "des" : "Get all cours data about a given UE", "per": [], "par": { "URL0": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)", "ren": "code" } } + }, + + "PUT": { + "des" : "Updates an existing Cours", + "per": [], + "par": { + "URL0": { "des": "Id of the Cours", "typ": "id", "ren": "idCours" }, + "idProf": { "des": "Id of the professor (-1 to unset)", "typ": "int", "opt": true }, + "volume": { "des": "Number of hours for Cours", "typ": "float", "opt": true }, + "add_form": { "des": "Id of formations to add", "typ": "array", "opt": true, "def": [] }, + "rem_form": { "des": "Id of formations to remove", "typ": "array", "opt": true, "def": [] } + }, + "output": { + "updated" : { "des": "Whether it has been updated", "typ": "bool" } + } + }, + + "DELETE": { + "des" : "Deletes an existing Cours", + "per": [], + "par": { + "URL0": { "des": "Id of the Cours", "typ": "id", "ren": "idCours" } + }, + "output": { + "deleted" : { "des": "Whether it has been deleted", "typ": "bool" } + } } },