From dbc54256a72459567b5915a7160f353b8a1cbf7f Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Tue, 2 Apr 2019 15:43:22 +0200 Subject: [PATCH 01/10] Init --- Groupe/GroupeRepository.php | 2 +- Heure/Repos/ReposEntite.php | 66 +++++++++++ Heure/Repos/ReposRepository.php | 103 ++++++++++++++++++ Tools/App.php | 3 +- .../HeureReposUtilisateurController.php | 87 +++++++++++++++ Tools/Middlewares/AccessChecker.php | 1 + Tools/Route/Absence.php | 1 - Tools/Route/Heure.php | 22 ++++ 8 files changed, 282 insertions(+), 3 deletions(-) create mode 100644 Heure/Repos/ReposEntite.php create mode 100644 Heure/Repos/ReposRepository.php create mode 100644 Tools/Controllers/HeureReposUtilisateurController.php create mode 100644 Tools/Route/Heure.php diff --git a/Groupe/GroupeRepository.php b/Groupe/GroupeRepository.php index 1abb8039..c20a616b 100644 --- a/Groupe/GroupeRepository.php +++ b/Groupe/GroupeRepository.php @@ -10,7 +10,7 @@ * @author Wouldsmina * * @since 0.7 - * @see \LibertAPI\Tests\Units\Planning\PlanningRepository + * @see \LibertAPI\Tests\Units\Groupe\GroupeRepository * * Ne devrait être contacté que par le GroupeController * Ne devrait contacter que le GroupeEntite diff --git a/Heure/Repos/ReposEntite.php b/Heure/Repos/ReposEntite.php new file mode 100644 index 00000000..6d67543c --- /dev/null +++ b/Heure/Repos/ReposEntite.php @@ -0,0 +1,66 @@ + + * @author Wouldsmina + * + * @since 1.8 + * @see \LibertAPI\Tests\Units\Heure\Repos\ReposEntite + * + * Ne devrait être contacté que par le ReposRepository + * Ne devrait contacter personne + */ +class ReposEntite extends \LibertAPI\Tools\Libraries\AEntite +{ + /** + * Retourne la donnée la plus à jour du champ name + * + * @return string + */ + public function getName() + { + return $this->getFreshData('name'); + } + + /** + * Retourne la donnée la plus à jour du champ comment + * + * @return string + */ + public function getComment() + { + return $this->getFreshData('comment'); + } + + /** + * Retourne la donnée la plus à jour du champ de double validation + * + * @return bool + */ + public function isDoubleValidated() + { + return (bool) $this->getFreshData('double_validation'); + } + + /** + * @inheritDoc + */ + public function populate(array $data) + { + } + + /** + * Retourne la liste des champs requis + * + * @return array + */ + private function getListRequired() + { + return []; + } +} diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php new file mode 100644 index 00000000..55f8fa5f --- /dev/null +++ b/Heure/Repos/ReposRepository.php @@ -0,0 +1,103 @@ + + * @author Wouldsmina + * + * @since 0.7 + * @see \LibertAPI\Tests\Units\Heure\Repos\ReposRepository + * + * Ne devrait être contacté que par le HeureReposUtilisateurController + * Ne devrait contacter que le ReposEntite + */ +class ReposRepository extends \LibertAPI\Tools\Libraries\ARepository +{ + final protected function getEntiteClass() : string + { + return GroupeEntite::class; + } + + /** + * @inheritDoc + */ + final protected function getParamsConsumer2Storage(array $paramsConsumer) : array + { + unset($paramsConsumer); + return []; + } + + /** + * @inheritDoc + */ + final protected function getStorage2Entite(array $dataStorage) + { + return [ + 'id' => $dataStorage['g_gid'], + 'name' => $dataStorage['g_groupename'], + 'comment' => $dataStorage['g_comment'], + 'double_validation' => 'Y' === $dataStorage['g_double_valid'] + ]; + } + + /** + * @inheritDoc + */ + final protected function setValues(array $values) + { + $this->queryBuilder->setValue('g_groupename', ':name'); + $this->queryBuilder->setParameter(':name', $values['name']); + $this->queryBuilder->setValue('g_comment', $values['comment']); + $this->queryBuilder->setValue('g_double_valid', $values['double_validation']); + } + + final protected function setSet(array $parametres) + { + } + + /** + * @inheritDoc + */ + final protected function setWhere(array $parametres) + { + if (array_key_exists('id', $parametres)) { + $this->queryBuilder->andWhere('g_gid = :id'); + $this->queryBuilder->setParameter(':id', (int) $parametres['id']); + } + } + + /** + * @inheritDoc + */ + final protected function getEntite2Storage(AEntite $entite) : array + { + return []; + } + + /** + * @inheritDoc + */ + final protected function getTableName() : string + { + return 'heure_repos'; + } + +// +---------------+------------------+------+-----+---------+----------------+ +// | Field | Type | Null | Key | Default | Extra | +// +---------------+------------------+------+-----+---------+----------------+ +// | id_heure | int(10) unsigned | NO | PRI | NULL | auto_increment | +// | login | varbinary(99) | NO | | NULL | | +// | debut | int(11) | NO | | NULL | | +// | fin | int(11) | NO | | NULL | | +// | duree | int(11) | NO | | NULL | | +// | type_periode | int(3) | NO | | NULL | | +// | statut | int(11) | NO | | 0 | | +// | comment | varchar(250) | NO | | | | +// | comment_refus | varchar(250) | NO | | | | +// +---------------+------------------+------+-----+---------+----------------+ + +} diff --git a/Tools/App.php b/Tools/App.php index 66444f90..fc746bf3 100644 --- a/Tools/App.php +++ b/Tools/App.php @@ -29,9 +29,10 @@ return $response->withJson('Hi there !'); }); -require_once ROUTE_PATH . DS. 'Absence.php'; +require_once ROUTE_PATH . DS . 'Absence.php'; require_once ROUTE_PATH . DS . 'Authentification.php'; require_once ROUTE_PATH . DS . 'Groupe.php'; +require_once ROUTE_PATH . DS . 'Heure.php'; require_once ROUTE_PATH . DS . 'Journal.php'; require_once ROUTE_PATH . DS . 'JourFerie.php'; require_once ROUTE_PATH . DS . 'Planning.php'; diff --git a/Tools/Controllers/HeureReposUtilisateurController.php b/Tools/Controllers/HeureReposUtilisateurController.php new file mode 100644 index 00000000..5af2da1f --- /dev/null +++ b/Tools/Controllers/HeureReposUtilisateurController.php @@ -0,0 +1,87 @@ + + * @author Wouldsmina + * + * @since 1.8 + */ +final class HeureReposUtilisateurController extends \LibertAPI\Tools\Libraries\AController +implements Interfaces\IGetable +{ + public function __construct(Periode\PeriodeRepository $repository, IRouter $router) + { + parent::__construct($repository, $router); + } + + + + /** + * {@inheritDoc} + */ + public function get(IRequest $request, IResponse $response, array $arguments) : IResponse + { + return $this->getList($request, $response); + } + + /** + * Retourne un tableau de période d'absence + * + * @param IRequest $request Requête Http + * @param IResponse $response Réponse Http + * + * @return IResponse + */ + private function getList(IRequest $request, IResponse $response) + { + try { + $responseResources = $this->repository->getList( + $request->getQueryParams() + ); + } catch (\UnexpectedValueException $e) { + return $this->getResponseNoContent($response); + } catch (\Exception $e) { + return $this->getResponseError($response, $e); + } + $entites = array_map([$this, 'buildData'], $responseResources); + + return $this->getResponseSuccess($response, $entites, 200); + } + + /** + * Construit le « data » du json + * + * @param Periode\PeriodeEntite $entite Période + * + * @return array + */ + private function buildData(Periode\PeriodeEntite $entite) + { + return [ + 'id' => $entite->getId(), + 'login' => $entite->getLogin(), + 'dateDebut' => $entite->getDateDebut(), + 'demiJourneeDebut' => $entite->getDemiJourneeDebut(), + 'dateFin' => $entite->getDateFin(), + 'demiJourneeFin' => $entite->getDemiJourneeFin(), + 'nombreJours' => $entite->getNombreJours(), + 'type' => $entite->getType(), + 'etat' => $entite->getEtat(), + 'editionId' => $entite->getEditionId(), + 'motifRefus' => $entite->getMotifRefus(), + 'dateDemande' => $entite->getDateDemande(), + 'dateTraitement' => $entite->getDateTraitement(), + 'fermetureId' => $entite->getFermetureId(), + 'num' => $entite->getNum(), + ]; + } +} diff --git a/Tools/Middlewares/AccessChecker.php b/Tools/Middlewares/AccessChecker.php index f7dcdd94..da456a3b 100644 --- a/Tools/Middlewares/AccessChecker.php +++ b/Tools/Middlewares/AccessChecker.php @@ -26,6 +26,7 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) case 'Authentification': case 'HelloWorld': case 'Planning|Creneau': + case 'Heure|Repos|Utilisateur|Me': return $next($request, $response); case 'Groupe': case 'Groupe|GrandResponsable': diff --git a/Tools/Route/Absence.php b/Tools/Route/Absence.php index 54e28fdf..ff5c52b8 100644 --- a/Tools/Route/Absence.php +++ b/Tools/Route/Absence.php @@ -30,6 +30,5 @@ $this->get('/{periodeId:[0-9]+}', [AbsencePeriodeController::class, 'get'])->setName('getAbsencePeriodeDetail'); /* Collection */ $this->get('', [AbsencePeriodeController::class, 'get'])->setName('getAbsencePeriodeListe'); - }); }); diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php new file mode 100644 index 00000000..e27d93ea --- /dev/null +++ b/Tools/Route/Heure.php @@ -0,0 +1,22 @@ +group('/heure', function () { + $this->group('/repos', function () { + $this->get('/utilisateur/me', function (IRequest $request, IResponse $response, array $args) { + $args = array_merge($args, ['currentUser' => $this->get('currentUser')]); + + return $this->get(HeureReposUtilisateurController::class)->get($request, $response, $args); + })->setName('getHeureReposUtilisateurMeListe'); + }); +}); From 5bb0309c97a72227b86f5e352044d86e0bb175fe Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Tue, 2 Apr 2019 21:24:34 +0200 Subject: [PATCH 02/10] Improved make --- Makefile | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index e7fc9b98..0fc51759 100644 --- a/Makefile +++ b/Makefile @@ -11,28 +11,36 @@ define make_version @git tag -a `semver tag` -m "Releasing `semver tag`" endef -default : help +.DEFAULT_GOAL := help + +# +# Thanks to https://blog.theodo.fr/2018/05/why-you-need-a-makefile-on-your-project/ +# help: - @echo 'help' + @grep -E '(^[a-zA-Z_-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}{printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m##/[33m/' + -install: +## Installation +install: ## Installe les dépendances composer php composer.phar install -major: +## Administration +major: ## Monte la version majeure du logiciel $(call make_version,major) -minor: +minor: ## Monte la version mineure du logiciel $(call make_version,minor) -patch: +patch: ## Monte la version patch du logiciel $(call make_version,patch) -test: test-unit test-functional +## CI +test: test-unit test-functional ## Lance tous les tests applicatifs test-unit: ## Lance les tests unitaires Vendor/Bin/atoum -ulr -test-functional: +test-functional: ## Lance les tests fonctionnels cp Tests/Functionals/_data/database.sqlite Tests/Functionals/_data/current.sqlite Vendor/Bin/codecept run api -f From 35442ba3c6ecd54d796cbeeb261ffee1ae068ee9 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Wed, 3 Apr 2019 00:08:14 +0200 Subject: [PATCH 03/10] Component Heure w/ test --- Heure/Repos/ReposEntite.php | 62 ++++++++++++----- Heure/Repos/ReposRepository.php | 39 ++++------- Tests/Units/Heure/Repos/ReposEntite.php | 66 +++++++++++++++++++ Tests/Units/Heure/Repos/ReposRepository.php | 37 +++++++++++ .../HeureReposUtilisateurController.php | 20 ++---- 5 files changed, 168 insertions(+), 56 deletions(-) create mode 100644 Tests/Units/Heure/Repos/ReposEntite.php create mode 100644 Tests/Units/Heure/Repos/ReposRepository.php diff --git a/Heure/Repos/ReposEntite.php b/Heure/Repos/ReposEntite.php index 6d67543c..b4f6ce2f 100644 --- a/Heure/Repos/ReposEntite.php +++ b/Heure/Repos/ReposEntite.php @@ -18,49 +18,79 @@ class ReposEntite extends \LibertAPI\Tools\Libraries\AEntite { /** - * Retourne la donnée la plus à jour du champ name + * Retourne la donnée la plus à jour du champ login * * @return string */ - public function getName() + public function getLogin() { - return $this->getFreshData('name'); + return $this->getFreshData('login'); } /** - * Retourne la donnée la plus à jour du champ comment + * Retourne la donnée la plus à jour du champ debut * * @return string */ - public function getComment() + public function getDebut() { - return $this->getFreshData('comment'); + return $this->getFreshData('debut'); } /** - * Retourne la donnée la plus à jour du champ de double validation + * Retourne la donnée la plus à jour du champ fin * - * @return bool + * @return string */ - public function isDoubleValidated() + public function getFin() { - return (bool) $this->getFreshData('double_validation'); + return $this->getFreshData('fin'); } /** - * @inheritDoc + * Retourne la donnée la plus à jour du champ type_periode + * + * @return string */ - public function populate(array $data) + public function getTypePeriode() + { + return $this->getFreshData('type_periode'); + } + + /** + * Retourne la donnée la plus à jour du champ statut + * + * @return string + */ + public function getStatut() { + return $this->getFreshData('statut'); } /** - * Retourne la liste des champs requis + * Retourne la donnée la plus à jour du champ commentaire * - * @return array + * @return string */ - private function getListRequired() + public function getCommentaire() + { + return $this->getFreshData('commentaire'); + } + + /** + * Retourne la donnée la plus à jour du champ commentaire_refus + * + * @return string + */ + public function getCommentaireRefus() + { + return $this->getFreshData('commentaire_refus'); + } + + /** + * @inheritDoc + */ + public function populate(array $data) { - return []; } } diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php index 55f8fa5f..76012c29 100644 --- a/Heure/Repos/ReposRepository.php +++ b/Heure/Repos/ReposRepository.php @@ -9,7 +9,7 @@ * @author Prytoegrian * @author Wouldsmina * - * @since 0.7 + * @since 1.8 * @see \LibertAPI\Tests\Units\Heure\Repos\ReposRepository * * Ne devrait être contacté que par le HeureReposUtilisateurController @@ -19,7 +19,7 @@ class ReposRepository extends \LibertAPI\Tools\Libraries\ARepository { final protected function getEntiteClass() : string { - return GroupeEntite::class; + return ReposEntite::class; } /** @@ -37,10 +37,15 @@ final protected function getParamsConsumer2Storage(array $paramsConsumer) : arra final protected function getStorage2Entite(array $dataStorage) { return [ - 'id' => $dataStorage['g_gid'], - 'name' => $dataStorage['g_groupename'], - 'comment' => $dataStorage['g_comment'], - 'double_validation' => 'Y' === $dataStorage['g_double_valid'] + 'id' => $dataStorage['id_heure'], + 'login' => $dataStorage['login'], + 'debut' => (int) $dataStorage['debut'], + 'fin' => (int) $dataStorage['fin'], + 'duree' => (int) $dataStorage['duree'], + 'type_periode' => (int) $dataStorage['type_periode'], + 'statut' => $dataStorage['statut'], + 'commentaire' => $dataStorage['comment'], + 'commentaire_refus' => $dataStorage['comment_refus'], ]; } @@ -49,14 +54,12 @@ final protected function getStorage2Entite(array $dataStorage) */ final protected function setValues(array $values) { - $this->queryBuilder->setValue('g_groupename', ':name'); - $this->queryBuilder->setParameter(':name', $values['name']); - $this->queryBuilder->setValue('g_comment', $values['comment']); - $this->queryBuilder->setValue('g_double_valid', $values['double_validation']); + unset($values); } final protected function setSet(array $parametres) { + unset($parametres); } /** @@ -75,6 +78,7 @@ final protected function setWhere(array $parametres) */ final protected function getEntite2Storage(AEntite $entite) : array { + unset($entite); return []; } @@ -85,19 +89,4 @@ final protected function getTableName() : string { return 'heure_repos'; } - -// +---------------+------------------+------+-----+---------+----------------+ -// | Field | Type | Null | Key | Default | Extra | -// +---------------+------------------+------+-----+---------+----------------+ -// | id_heure | int(10) unsigned | NO | PRI | NULL | auto_increment | -// | login | varbinary(99) | NO | | NULL | | -// | debut | int(11) | NO | | NULL | | -// | fin | int(11) | NO | | NULL | | -// | duree | int(11) | NO | | NULL | | -// | type_periode | int(3) | NO | | NULL | | -// | statut | int(11) | NO | | 0 | | -// | comment | varchar(250) | NO | | | | -// | comment_refus | varchar(250) | NO | | | | -// +---------------+------------------+------+-----+---------+----------------+ - } diff --git a/Tests/Units/Heure/Repos/ReposEntite.php b/Tests/Units/Heure/Repos/ReposEntite.php new file mode 100644 index 00000000..ab89d56a --- /dev/null +++ b/Tests/Units/Heure/Repos/ReposEntite.php @@ -0,0 +1,66 @@ + + * @author Wouldsmina + * + * @since 1.8 + */ +final class ReposEntite extends \LibertAPI\Tests\Units\Tools\Libraries\AEntite +{ + /** + * @inheritDoc + */ + public function testConstructWithId() + { + $id = 58; + $commentaire = 'Barry Allen'; + $commentaireRefus = 'Barry Allen 2'; + + $this->newTestedInstance([ + 'id' => $id, + 'login' => 'Abagnale', + 'debut' => 1000, + 'fin' => 1100, + 'duree' => 10, + 'type_periode' => 7, + 'statut' => 10, + 'commentaire' => $commentaire, + 'commentaire_refus' => $commentaireRefus, + ]); + + $this->assertConstructWithId($this->testedInstance, $id); + $this->string($this->testedInstance->getLogin())->isIdenticalTo('Abagnale'); + $this->integer($this->testedInstance->getDebut())->isIdenticalTo(1000); + $this->integer($this->testedInstance->getFin())->isIdenticalTo(1100); + $this->integer($this->testedInstance->getTypePeriode())->isIdenticalTo(7); + $this->integer($this->testedInstance->getStatut())->isIdenticalTo(10); + $this->string($this->testedInstance->getCommentaire())->isIdenticalTo($commentaire); + $this->string($this->testedInstance->getCommentaireRefus())->isIdenticalTo($commentaireRefus); + } + + /** + * @inheritDoc + */ + public function testConstructWithoutId() + { + $this->newTestedInstance([ + 'login' => 'Abagnale', + 'debut' => 1000, + ]); + $this->variable($this->testedInstance->getId())->isNull(); + } + + /** + * @inheritDoc + */ + public function testReset() + { + $this->newTestedInstance(['login' => 'Abagnale', 'debut' => 1000,]); + + $this->assertReset($this->testedInstance); + } +} diff --git a/Tests/Units/Heure/Repos/ReposRepository.php b/Tests/Units/Heure/Repos/ReposRepository.php new file mode 100644 index 00000000..f3509402 --- /dev/null +++ b/Tests/Units/Heure/Repos/ReposRepository.php @@ -0,0 +1,37 @@ + + * @author Wouldsmina + * + * @since 1.8 + */ +final class ReposRepository extends \LibertAPI\Tests\Units\Tools\Libraries\ARepository +{ + final protected function getStorageContent() : array + { + return [ + 'id_heure' => 42, + 'login' => 'Sherlock', + 'debut' => 7427, + 'fin' => 4527, + 'duree' => 78, + 'type_periode' => 26, + 'statut' => 3, + 'comment' => 'Arsène', + 'comment_refus' => 'Lupin', + ]; + } + + protected function getConsumerContent() : array + { + return [ + 'login' => 'Watson', + 'debut' => 77, + 'fin' => 89432, + ]; + } +} diff --git a/Tools/Controllers/HeureReposUtilisateurController.php b/Tools/Controllers/HeureReposUtilisateurController.php index 5af2da1f..347cd230 100644 --- a/Tools/Controllers/HeureReposUtilisateurController.php +++ b/Tools/Controllers/HeureReposUtilisateurController.php @@ -5,7 +5,7 @@ use Psr\Http\Message\ServerRequestInterface as IRequest; use Psr\Http\Message\ResponseInterface as IResponse; use \Slim\Interfaces\RouterInterface as IRouter; -use LibertAPI\Absence\Periode; +use LibertAPI\Heure\Repos; /** * Contrôleur des heures de repos @@ -18,13 +18,11 @@ final class HeureReposUtilisateurController extends \LibertAPI\Tools\Libraries\AController implements Interfaces\IGetable { - public function __construct(Periode\PeriodeRepository $repository, IRouter $router) + public function __construct(Repos\ReposRepository $repository, IRouter $router) { parent::__construct($repository, $router); } - - /** * {@inheritDoc} */ @@ -34,14 +32,10 @@ public function get(IRequest $request, IResponse $response, array $arguments) : } /** - * Retourne un tableau de période d'absence - * - * @param IRequest $request Requête Http - * @param IResponse $response Réponse Http + * Retourne un tableau d'heures de repos * - * @return IResponse */ - private function getList(IRequest $request, IResponse $response) + private function getList(IRequest $request, IResponse $response) : IResponse { try { $responseResources = $this->repository->getList( @@ -59,12 +53,8 @@ private function getList(IRequest $request, IResponse $response) /** * Construit le « data » du json - * - * @param Periode\PeriodeEntite $entite Période - * - * @return array */ - private function buildData(Periode\PeriodeEntite $entite) + private function buildData(Repos\ReposEntite $entite) : array { return [ 'id' => $entite->getId(), From 990d298b619b547c0efa9b39ba6de413e7f85114 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Wed, 3 Apr 2019 00:26:05 +0200 Subject: [PATCH 04/10] Fin de test et bonne sortie --- Heure/Repos/ReposEntite.php | 10 ++++++++++ Heure/Repos/ReposRepository.php | 2 +- Tests/Units/Heure/Repos/ReposEntite.php | 1 + .../HeureReposUtilisateurController.php | 20 +++++++------------ Tools/Route/Heure.php | 3 ++- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Heure/Repos/ReposEntite.php b/Heure/Repos/ReposEntite.php index b4f6ce2f..85c7435a 100644 --- a/Heure/Repos/ReposEntite.php +++ b/Heure/Repos/ReposEntite.php @@ -47,6 +47,16 @@ public function getFin() return $this->getFreshData('fin'); } + /** + * Retourne la donnée la plus à jour du champ duree + * + * @return string + */ + public function getDuree() + { + return $this->getFreshData('duree'); + } + /** * Retourne la donnée la plus à jour du champ type_periode * diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php index 76012c29..8be1195d 100644 --- a/Heure/Repos/ReposRepository.php +++ b/Heure/Repos/ReposRepository.php @@ -43,7 +43,7 @@ final protected function getStorage2Entite(array $dataStorage) 'fin' => (int) $dataStorage['fin'], 'duree' => (int) $dataStorage['duree'], 'type_periode' => (int) $dataStorage['type_periode'], - 'statut' => $dataStorage['statut'], + 'statut' => (int) $dataStorage['statut'], 'commentaire' => $dataStorage['comment'], 'commentaire_refus' => $dataStorage['comment_refus'], ]; diff --git a/Tests/Units/Heure/Repos/ReposEntite.php b/Tests/Units/Heure/Repos/ReposEntite.php index ab89d56a..2f394d22 100644 --- a/Tests/Units/Heure/Repos/ReposEntite.php +++ b/Tests/Units/Heure/Repos/ReposEntite.php @@ -36,6 +36,7 @@ public function testConstructWithId() $this->string($this->testedInstance->getLogin())->isIdenticalTo('Abagnale'); $this->integer($this->testedInstance->getDebut())->isIdenticalTo(1000); $this->integer($this->testedInstance->getFin())->isIdenticalTo(1100); + $this->integer($this->testedInstance->getDuree())->isIdenticalTo(10); $this->integer($this->testedInstance->getTypePeriode())->isIdenticalTo(7); $this->integer($this->testedInstance->getStatut())->isIdenticalTo(10); $this->string($this->testedInstance->getCommentaire())->isIdenticalTo($commentaire); diff --git a/Tools/Controllers/HeureReposUtilisateurController.php b/Tools/Controllers/HeureReposUtilisateurController.php index 347cd230..fdce6660 100644 --- a/Tools/Controllers/HeureReposUtilisateurController.php +++ b/Tools/Controllers/HeureReposUtilisateurController.php @@ -59,19 +59,13 @@ private function buildData(Repos\ReposEntite $entite) : array return [ 'id' => $entite->getId(), 'login' => $entite->getLogin(), - 'dateDebut' => $entite->getDateDebut(), - 'demiJourneeDebut' => $entite->getDemiJourneeDebut(), - 'dateFin' => $entite->getDateFin(), - 'demiJourneeFin' => $entite->getDemiJourneeFin(), - 'nombreJours' => $entite->getNombreJours(), - 'type' => $entite->getType(), - 'etat' => $entite->getEtat(), - 'editionId' => $entite->getEditionId(), - 'motifRefus' => $entite->getMotifRefus(), - 'dateDemande' => $entite->getDateDemande(), - 'dateTraitement' => $entite->getDateTraitement(), - 'fermetureId' => $entite->getFermetureId(), - 'num' => $entite->getNum(), + 'debut' => $entite->getDebut(), + 'fin' => $entite->getFin(), + 'duree' => $entite->getDuree(), + 'type_periode' => $entite->getTypePeriode(), + 'statut' => $entite->getStatut(), + 'commentaire' => $entite->getCommentaire(), + 'commentaire_refus' => $entite->getCommentaireRefus(), ]; } } diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php index e27d93ea..dde1e373 100644 --- a/Tools/Route/Heure.php +++ b/Tools/Route/Heure.php @@ -15,7 +15,8 @@ $this->group('/repos', function () { $this->get('/utilisateur/me', function (IRequest $request, IResponse $response, array $args) { $args = array_merge($args, ['currentUser' => $this->get('currentUser')]); - + + // @TODO: Voir s'il s'agit de la meilleure méthode, vis à vis du métier return $this->get(HeureReposUtilisateurController::class)->get($request, $response, $args); })->setName('getHeureReposUtilisateurMeListe'); }); From 9385f8623b2c05fca493e396f13f53a83ccfa982 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Sat, 6 Apr 2019 11:14:03 +0200 Subject: [PATCH 05/10] Type --- Heure/Repos/ReposEntite.php | 32 +++++-------------- .../HeureReposUtilisateurController.php | 1 - Tools/Route/Heure.php | 7 ++-- 3 files changed, 13 insertions(+), 27 deletions(-) diff --git a/Heure/Repos/ReposEntite.php b/Heure/Repos/ReposEntite.php index 85c7435a..83a33d11 100644 --- a/Heure/Repos/ReposEntite.php +++ b/Heure/Repos/ReposEntite.php @@ -19,80 +19,64 @@ class ReposEntite extends \LibertAPI\Tools\Libraries\AEntite { /** * Retourne la donnée la plus à jour du champ login - * - * @return string */ - public function getLogin() + public function getLogin() : string { return $this->getFreshData('login'); } /** * Retourne la donnée la plus à jour du champ debut - * - * @return string */ - public function getDebut() + public function getDebut() : int { return $this->getFreshData('debut'); } /** * Retourne la donnée la plus à jour du champ fin - * - * @return string */ - public function getFin() + public function getFin() : int { return $this->getFreshData('fin'); } /** * Retourne la donnée la plus à jour du champ duree - * - * @return string */ - public function getDuree() + public function getDuree() : int { return $this->getFreshData('duree'); } /** * Retourne la donnée la plus à jour du champ type_periode - * - * @return string */ - public function getTypePeriode() + public function getTypePeriode() : int { return $this->getFreshData('type_periode'); } /** * Retourne la donnée la plus à jour du champ statut - * - * @return string */ - public function getStatut() + public function getStatut() : int { return $this->getFreshData('statut'); } /** * Retourne la donnée la plus à jour du champ commentaire - * - * @return string */ - public function getCommentaire() + public function getCommentaire() : string { return $this->getFreshData('commentaire'); } /** * Retourne la donnée la plus à jour du champ commentaire_refus - * - * @return string */ - public function getCommentaireRefus() + public function getCommentaireRefus() : string { return $this->getFreshData('commentaire_refus'); } diff --git a/Tools/Controllers/HeureReposUtilisateurController.php b/Tools/Controllers/HeureReposUtilisateurController.php index fdce6660..dbb628d8 100644 --- a/Tools/Controllers/HeureReposUtilisateurController.php +++ b/Tools/Controllers/HeureReposUtilisateurController.php @@ -33,7 +33,6 @@ public function get(IRequest $request, IResponse $response, array $arguments) : /** * Retourne un tableau d'heures de repos - * */ private function getList(IRequest $request, IResponse $response) : IResponse { diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php index dde1e373..de08864c 100644 --- a/Tools/Route/Heure.php +++ b/Tools/Route/Heure.php @@ -10,14 +10,17 @@ * La convention de nommage est de mettre les routes au singulier */ +// Ce sont des routes sur l'heure, oui, mais l'association est à l'envers : je veux les heures qui ME sont associées. C'est donc /employe/me/heure_repos +// Dans tous les cas, c'est une bonne pratique de transmettre l'utilisateur courant dans le controleur + /* Routes sur l'heure */ $app->group('/heure', function () { $this->group('/repos', function () { - $this->get('/utilisateur/me', function (IRequest $request, IResponse $response, array $args) { + $this->get('/employe/me', function (IRequest $request, IResponse $response, array $args) { $args = array_merge($args, ['currentUser' => $this->get('currentUser')]); // @TODO: Voir s'il s'agit de la meilleure méthode, vis à vis du métier - return $this->get(HeureReposUtilisateurController::class)->get($request, $response, $args); + return $this->get(HeureReposEmployeController::class)->get($request, $response, $args); })->setName('getHeureReposUtilisateurMeListe'); }); }); From 11352ca19312d30eb0582208220161d6f74fe42c Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Sat, 6 Apr 2019 13:39:12 +0200 Subject: [PATCH 06/10] currentUser in Request --- Tools/Middlewares/AccessChecker.php | 6 +++--- Tools/Middlewares/Identificator.php | 2 +- Tools/Route/Heure.php | 7 +------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Tools/Middlewares/AccessChecker.php b/Tools/Middlewares/AccessChecker.php index da456a3b..40900e65 100644 --- a/Tools/Middlewares/AccessChecker.php +++ b/Tools/Middlewares/AccessChecker.php @@ -32,7 +32,7 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) case 'Groupe|GrandResponsable': case 'Groupe|Responsable': case 'Groupe|Employe': - $user = $container->get('currentUser'); + $user = $request->getAttribute('currentUser'); if (!$user->isAdmin()) { return call_user_func( $container->get('forbiddenHandler'), @@ -43,7 +43,7 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) return $next($request, $response); case 'JourFerie': - $user = $container->get('currentUser'); + $user = $request->getAttribute('currentUser'); if (!$user->isHautResponsable()) { return call_user_func( $container->get('forbiddenHandler'), @@ -54,7 +54,7 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) return $next($request, $response); case 'Planning': - $user = $container->get('currentUser'); + $user = $request->getAttribute('currentUser'); if (!$user->isResponsable() && !$user->isHautResponsable() && !$user->isAdmin()) { return call_user_func( $container->get('forbiddenHandler'), diff --git a/Tools/Middlewares/Identificator.php b/Tools/Middlewares/Identificator.php index f93394f4..b9831f52 100644 --- a/Tools/Middlewares/Identificator.php +++ b/Tools/Middlewares/Identificator.php @@ -26,8 +26,8 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) } elseif ($this->isIdentificationOK($request, $repoUtilisateur)) { // Ping de last_access $utilisateur = $repoUtilisateur->updateDateLastAccess($this->utilisateur); + $request = $request->withAttribute('currentUser', $utilisateur); - $container->set('currentUser', $utilisateur); return $next($request, $response); } diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php index de08864c..2f666b6f 100644 --- a/Tools/Route/Heure.php +++ b/Tools/Route/Heure.php @@ -16,11 +16,6 @@ /* Routes sur l'heure */ $app->group('/heure', function () { $this->group('/repos', function () { - $this->get('/employe/me', function (IRequest $request, IResponse $response, array $args) { - $args = array_merge($args, ['currentUser' => $this->get('currentUser')]); - - // @TODO: Voir s'il s'agit de la meilleure méthode, vis à vis du métier - return $this->get(HeureReposEmployeController::class)->get($request, $response, $args); - })->setName('getHeureReposUtilisateurMeListe'); + $this->get('/employe/me', [HeureReposEmployeController::class, 'get'])->setName('getHeureReposUtilisateurMeListe'); }); }); From ebd3e8d45b9a5c82ec11870e3a55e7f8acd24de2 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Sat, 6 Apr 2019 13:54:42 +0200 Subject: [PATCH 07/10] Renaming --- Heure/Repos/ReposRepository.php | 2 +- ...Controller.php => HeureReposEmployeController.php} | 11 ++++++----- Tools/Middlewares/AccessChecker.php | 2 +- Tools/Route/Heure.php | 8 ++------ 4 files changed, 10 insertions(+), 13 deletions(-) rename Tools/Controllers/{HeureReposUtilisateurController.php => HeureReposEmployeController.php} (82%) diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php index 8be1195d..20597cb4 100644 --- a/Heure/Repos/ReposRepository.php +++ b/Heure/Repos/ReposRepository.php @@ -12,7 +12,7 @@ * @since 1.8 * @see \LibertAPI\Tests\Units\Heure\Repos\ReposRepository * - * Ne devrait être contacté que par le HeureReposUtilisateurController + * Ne devrait être contacté que par le HeureReposEmployeController * Ne devrait contacter que le ReposEntite */ class ReposRepository extends \LibertAPI\Tools\Libraries\ARepository diff --git a/Tools/Controllers/HeureReposUtilisateurController.php b/Tools/Controllers/HeureReposEmployeController.php similarity index 82% rename from Tools/Controllers/HeureReposUtilisateurController.php rename to Tools/Controllers/HeureReposEmployeController.php index dbb628d8..1fb9978d 100644 --- a/Tools/Controllers/HeureReposUtilisateurController.php +++ b/Tools/Controllers/HeureReposEmployeController.php @@ -8,14 +8,14 @@ use LibertAPI\Heure\Repos; /** - * Contrôleur des heures de repos + * Contrôleur des heures de repos de l'employé courant * * @author Prytoegrian * @author Wouldsmina * * @since 1.8 */ -final class HeureReposUtilisateurController extends \LibertAPI\Tools\Libraries\AController +final class HeureReposEmployeController extends \LibertAPI\Tools\Libraries\AController implements Interfaces\IGetable { public function __construct(Repos\ReposRepository $repository, IRouter $router) @@ -28,6 +28,7 @@ public function __construct(Repos\ReposRepository $repository, IRouter $router) */ public function get(IRequest $request, IResponse $response, array $arguments) : IResponse { + unset($arguments); return $this->getList($request, $response); } @@ -36,10 +37,10 @@ public function get(IRequest $request, IResponse $response, array $arguments) : */ private function getList(IRequest $request, IResponse $response) : IResponse { + $user = $request->getAttribute('currentUser'); + $arguments = array_merge($request->getQueryParams(), ['login' => $user->getLogin()]); try { - $responseResources = $this->repository->getList( - $request->getQueryParams() - ); + $responseResources = $this->repository->getList($arguments); } catch (\UnexpectedValueException $e) { return $this->getResponseNoContent($response); } catch (\Exception $e) { diff --git a/Tools/Middlewares/AccessChecker.php b/Tools/Middlewares/AccessChecker.php index 40900e65..5e839209 100644 --- a/Tools/Middlewares/AccessChecker.php +++ b/Tools/Middlewares/AccessChecker.php @@ -26,7 +26,7 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) case 'Authentification': case 'HelloWorld': case 'Planning|Creneau': - case 'Heure|Repos|Utilisateur|Me': + case 'Employe|Me|Heure|Repos': return $next($request, $response); case 'Groupe': case 'Groupe|GrandResponsable': diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php index 2f666b6f..5f996e15 100644 --- a/Tools/Route/Heure.php +++ b/Tools/Route/Heure.php @@ -1,6 +1,6 @@ group('/heure', function () { - $this->group('/repos', function () { - $this->get('/employe/me', [HeureReposEmployeController::class, 'get'])->setName('getHeureReposUtilisateurMeListe'); - }); -}); +$app->get('/employe/me/heure/repos', [HeureReposEmployeController::class, 'get'])->setName('getHeureReposEmployeMeListe'); From 55bf662a3b197e4e9e425be4ffa8a6a43359a0ec Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Sat, 6 Apr 2019 14:09:42 +0200 Subject: [PATCH 08/10] Doc --- Heure/Repos/ReposRepository.php | 14 +++++++++----- Tools/Middlewares/AccessChecker.php | 11 +++++------ decisions.md | 15 +++++++++++---- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php index 20597cb4..fedb92f6 100644 --- a/Heure/Repos/ReposRepository.php +++ b/Heure/Repos/ReposRepository.php @@ -27,8 +27,12 @@ final protected function getEntiteClass() : string */ final protected function getParamsConsumer2Storage(array $paramsConsumer) : array { - unset($paramsConsumer); - return []; + $results = []; + if (array_key_exists('login', $paramsConsumer)) { + $results['login'] = (string) $paramsConsumer['login']; + } + + return $results; } /** @@ -67,9 +71,9 @@ final protected function setSet(array $parametres) */ final protected function setWhere(array $parametres) { - if (array_key_exists('id', $parametres)) { - $this->queryBuilder->andWhere('g_gid = :id'); - $this->queryBuilder->setParameter(':id', (int) $parametres['id']); + if (array_key_exists('login', $parametres)) { + $this->queryBuilder->andWhere('login = :login'); + $this->queryBuilder->setParameter(':login', (int) $parametres['login']); } } diff --git a/Tools/Middlewares/AccessChecker.php b/Tools/Middlewares/AccessChecker.php index 5e839209..e3d7e47b 100644 --- a/Tools/Middlewares/AccessChecker.php +++ b/Tools/Middlewares/AccessChecker.php @@ -18,20 +18,19 @@ public function __invoke(IRequest $request, IResponse $response, callable $next) $container = $this->getContainer(); switch ($ressourcePath) { - case 'Absence|Type': case 'Absence|Periode': - case 'Utilisateur': - case 'JourFerie': - case 'Journal': + case 'Absence|Type': case 'Authentification': + case 'Employe|Me|Heure|Repos': case 'HelloWorld': + case 'Journal': case 'Planning|Creneau': - case 'Employe|Me|Heure|Repos': + case 'Utilisateur': return $next($request, $response); case 'Groupe': + case 'Groupe|Employe': case 'Groupe|GrandResponsable': case 'Groupe|Responsable': - case 'Groupe|Employe': $user = $request->getAttribute('currentUser'); if (!$user->isAdmin()) { return call_user_func( diff --git a/decisions.md b/decisions.md index 8172bf38..51071434 100644 --- a/decisions.md +++ b/decisions.md @@ -1,15 +1,22 @@ +# 2019-04-06 +* Il me paraît naturel sémantiquement d'avoir l'utilisateur courant dans la request, je l'y place donc. + +~ Prytoegrian + # 2018-12-17 -* Afin de mieux coller aux résultats de `__DIR__` et `dirname()`, je supprime toutes les slashes finaux des constantes `*_PATH` +* Afin de mieux coller aux résultats de `__DIR__` et `dirname()`, je supprime tous les slashes finaux des constantes `*_PATH` + +~ Prytoegrian # 2018-10-20 * Il y a de multiples méthodes de connexion à l'application « libertempo » et l'API commence à les absorber petit à petit. Naturellement, j'ai souhaité que cette diversité de connecteurs soit transparente pour la plus grande partie de l'appli possible. J'ai donc mis en place une Fabrique pour que cette dernière fasse seule le choix du connecteur à sélectionner, ses consommateurs manipulant un contrat. -* À cet effet, le contrôleur d'authentification n'est plus testable unitairement (le statiqu l'en empêche). Je souhaiterais ne pas rester sur un échec et tester cette partie d'une autre manière. -* Pour conserver la séparation stricte entre newable et injectable, j'ai de plus muté la Request serveur pour qu'elle contienne la configuration LDAP ; je ne suis pas trop fan de la solution et aimerait trouver une approche plus élégante et pérenne. +* À cet effet, le contrôleur d'authentification n'est plus testable unitairement (le static l'en empêche). Je souhaiterais ne pas rester sur un échec et tester cette partie d'une autre manière. +* Pour conserver la séparation stricte entre newable et injectable, j'ai de plus muté la Request serveur pour qu'elle contienne la configuration LDAP ; je ne suis pas trop fan de la solution et aimerais trouver une approche plus élégante et pérenne. ~ Prytoegrian ## 2018-06-07 -* J'ai désormais appliqué le paradigme « package by components » attendu que le « package by feature » soulevait des embûches. En effet, le contrôleur ne fait pas parti d'un composant, il est un moyen d'accès vers lui ; je l'ai donc déplacé dans `Tools`. À l'exception des répertoires d'utilitaires, nous aurons ainsi une vision claire des objectifs du logiciel du premier coup d'œil et une place toute trouvée pour les structures applicatives relatives au différents métiers du soft. +* J'ai désormais appliqué le paradigme « package by components » attendu que le « package by feature » soulevait des embûches. En effet, le contrôleur ne fait pas partie d'un composant, il est un moyen d'accès vers lui ; je l'ai donc déplacé dans `Tools`. À l'exception des répertoires d'utilitaires, nous aurons ainsi une vision claire des objectifs du logiciel du premier coup d'œil et une place toute trouvée pour les structures applicatives relatives au différents métiers du soft. * Un framework d'injection de dépendances a également fait son entrée. Il nous aidera à supprimer tout un pan de verbosité, facilite le test et nous permettra d'exprimer le plus précisément possible les interactions entre les structures applicatives. * Le problème des relations N-N n'en est pas encore un. Pour le moment, j'ai créé des entités pour les représentants de ces associations que l'on utilisera côté client. Si besoin il y a, nous créerons des Aggrégats. From 50dad81b5ec0f7a3f683ad475252931e5eebe866 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Sat, 6 Apr 2019 14:19:45 +0200 Subject: [PATCH 09/10] Doc 2 --- Tools/Route/Heure.php | 3 --- decisions.md | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Tools/Route/Heure.php b/Tools/Route/Heure.php index 5f996e15..6f3808ee 100644 --- a/Tools/Route/Heure.php +++ b/Tools/Route/Heure.php @@ -10,8 +10,5 @@ * La convention de nommage est de mettre les routes au singulier */ -// Ce sont des routes sur l'heure, oui, mais l'association est à l'envers : je veux les heures qui ME sont associées. C'est donc /employe/me/heure_repos -// Dans tous les cas, c'est une bonne pratique de transmettre l'utilisateur courant dans le controleur - /* Routes sur l'heure */ $app->get('/employe/me/heure/repos', [HeureReposEmployeController::class, 'get'])->setName('getHeureReposEmployeMeListe'); diff --git a/decisions.md b/decisions.md index 51071434..0ad234f6 100644 --- a/decisions.md +++ b/decisions.md @@ -1,5 +1,6 @@ # 2019-04-06 * Il me paraît naturel sémantiquement d'avoir l'utilisateur courant dans la request, je l'y place donc. +* Nous commençons la création des routes `employe/me/[ressources]` qui fournit des opérations automatiquement filtrées sur l'utilisateur courant. La convention est de décrire ces routes dans le fichier dédié à la ressource (ie. `employe/me/heure/repos` dans `/Tools/Route/Heure.php`). ~ Prytoegrian From b7b69cc5cc7eaf2d3754475a49f332e5686d0ba4 Mon Sep 17 00:00:00 2001 From: Prytoegrian Date: Mon, 6 May 2019 19:09:08 +0200 Subject: [PATCH 10/10] Login isn't an int :| --- Heure/Repos/ReposRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Heure/Repos/ReposRepository.php b/Heure/Repos/ReposRepository.php index fedb92f6..3a5b8e28 100644 --- a/Heure/Repos/ReposRepository.php +++ b/Heure/Repos/ReposRepository.php @@ -73,7 +73,7 @@ final protected function setWhere(array $parametres) { if (array_key_exists('login', $parametres)) { $this->queryBuilder->andWhere('login = :login'); - $this->queryBuilder->setParameter(':login', (int) $parametres['login']); + $this->queryBuilder->setParameter(':login', $parametres['login']); } }