Compare commits

...

272 Commits

Author SHA1 Message Date
dorian.hodin a230ceb8bb Change Controller to access admin
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9b33a0207f Add .htaccess rule 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 01aca47283 Add .htaccess rule 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 094c67736b Add .htaccess rule
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin e76e6ee056 Try to change route 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f7dcfd2839 Try to change route
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 65b79cd8e7 Change every file 6
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin b49ee87474 Change every file 5
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 06b4aa2f8e Change every file 4
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 7a51b1979b Change every file 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 678d8d35ad Change every file 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 65e4ee21d2 Change every file 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 589803ec21 Change container name path
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 61395e5fd9 Try to add container name env var 5
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 86829153c8 Try to add container name env var 4
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 8c2745c8f6 Try to add container name env var 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 439ccf8be7 Try to add container name env var 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f7cbc30ea1 Try to add container name env var 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 1e8584899f Change default path, add / at the beginning of the url, change env var
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin bf44841669 Add working path to css and js files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 273f34a188 Try to display container name
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 86f91a5140 Add new secret, try to add container name in base url
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis e17eeeb98b Code smells and bugs resolve 15
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 21980efc86 Code smells and bugs resolve 14
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis aaba66ff5e Code smells and bugs resolve 13
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 329f6da171 Code smells and bugs resolve 12
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 85fac9b09e Code smells and bugs resolve 11
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 966e961c1b Code smells and bugs resolve 10
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 071b3f4fd4 Code smells and bugs resolve 9
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 321c3b9ee9 Code smells and bugs resolve 8
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 5a4066bb34 Code smells and bugs resolve 7
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7ab85d2050 Code smells and bugs resolve 6
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7663ee93ac Code smells and bugs resolve 5
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 96cb672063 Code smells and bugs resolve 4
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis c08ea82208 Code smells and bugs resolve 3
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 00f3aa0e91 Code smells and bugs resolve 2
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 03d6a3c253 Code smells and bugs resolve 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 13522ef57f Add gitignore configuration
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 05235c2b34 Add Autoload Files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin a4d7ce9a1e Change many file for Tests, Tests working, can create a good coverage.xml file for now
2 years ago
Johan LACHENAL 56f8668424 Mise à jour de 'Source/Tests/TestModel/testModelAdmin.php'
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 377307362c Add unitary tests for the modelAdmin class
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL d20cc43d9a Add unitary tests for the modelAdmin class
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 80a95da97c Try to get the container name 7
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin b70338974e Try to get the container name 6
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin c678bd14b5 Try to get the container name 5
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 76ebc3a884 Try to get the container name 4
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 524f98b3ca Try to get the container name 3
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin ee9a1900b0 Try to get the container name 2
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 3ca03c3110 Add some autoloader files, so code can work, try 2, adding all composer file (just testing)
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin e3e7f502be Add some autoloader files, so code can work, try 4
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin d5874a315b Add some autoloader files, so code can work, try 2, adding all composer file (just testing)
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin a5718f524f Add some autoloader files, so code can wor, try 2
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 5781777849 Add some autoloader files, so code can wor, try 1
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 1855a2b288 Try to deploy 3, change Dockerfile
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 4a66c343ef Try to deploy 2, change Dockerfile
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin 9d77a37a1a Try to deploy, change Dockerfile place
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 16b932e47c Modification od Models, can now call APi without error in URL
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 332628d5b5 Back to old version, try to deploy 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9fe0dfe3f4 Back to old version, try to deploy 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 81f1010eec Back to old version, try to deploy
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 76c6702e14 Change name and remove tree
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 811d7c2f5b Try to display tree
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 18319f0ac5 Modification of the url to xml file for coverage, change image name
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin b6009ebba9 Dockefile work fine, image created 5
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 32984fcf6d Dockefile work fine, image created 3
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin c883dcaf3e Dockefile work fine, image created 3
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin f99b0594d9 Dockefile work fine, image created 2
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin 08306cda9e Dockefile work fine, image created
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 6d1b72a67c Change Source path 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 953bf14737 Change Source path 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 91eab376f4 Change Source path
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 9f7d2dd03f Try to add Dockerfile to root
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin b1bb513c5d Come back to old version
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin e168d3667e Add Source directory
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 3006c49904 Add zip package download
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 29afcbad3f Modification of some file to get good results from API, add Dockerfile to deploy, try to deploy in .drone.yml, try to add text/css type to css import because server cant load CSS, still not working
continuous-integration/drone/push Build was killed Details
2 years ago
dorian.hodin 3ee2764220 Merging Unit Test into Master
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9617eb8074 Merge branch 'unit_test'
2 years ago
johan 4ab9c2dafb ajout du nettoyage et validation des données suer master
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin cab838d546 Merge remote-tracking branch 'origin/unit_test' into unit_test
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin c2ed845163 Add coverage.xml
2 years ago
dorian.hodin 9354970ff7 Add verify = false so guzzle can accessed to API
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 5f65190572 Change curl link
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin cb16bf96a9 Go back to old version 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 5ff21c02a7 Go back to old version 2
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin c29e64b212 Go back to old version
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin 0e1b927405 Revert "Add coverage.xml generation file 5"
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 96922a09b9 Modification of Dockerfile 4
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 560c43ab80 Modification of Dockerfile 4
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 7fc4fc073c Modification of Dockerfile 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin c2f7b9775b Modification of Dockerfile 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin f867fd4dc3 Modification of Dockerfile
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 694669addf Modification of .drone.yml 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 625ca1f868 Modification of .drone.yml
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 2689ab74d6 Move every code file in Code folder
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 72729cfbfb Try to deploy app 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin dd991c7a98 Try to deploy app 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin f3bfdc49b7 Try to deploy app
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin d8fd415086 Modifictaion of Dockerfile, now in root
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 0e2f091251 Modifictaion of Dockerfile
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 0f9cb8bfe2 Deploy all app 2
continuous-integration/drone/push Build was killed Details
2 years ago
dorian.hodin a5ad586c15 Deploy all app
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin 848a4550ad Add coverage.xml generation file 5
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 76fb461513 Add coverage.xml generation file 4
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 744377ed97 Add coverage.xml generation file 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin a23c042b48 Add coverage.xml generation file 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f2a588f494 Add coverage.xml generation file 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin d875f89f4a Add coverage.xml generation file
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin e4f77c2556 Try to add coverage.xml to sonarQube 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 517c44c560 Try to add coverage.xml to sonarQube 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 6ac322c235 Try to add coverage.xml to sonarQube
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin 05f1737251 Try to deploy coverage.xml
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 922e2f8256 ajout d'autres validations
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL efae1c1720 Ajout d'autres validations
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 2872f25859 Nettoyage et validation des données version 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f14c6b07df SonarQube verify only PHP files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 929220c981 Merging delete function onto master, api call are now effective on delete
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 25fe072a12 Merge branch 'delete'
2 years ago
dorian.hodin f06fec639e Delete Gateway, call API on delete function
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 847813de2c Add verification of status code return by api, throw error if != 200
continuous-integration/drone/push Build is passing Details
2 years ago
Dorian HODIN ea46ead3b1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 49149ab1c1 Almost every test are here, still Model Test missing, many tests don't work cause of API is not deploy anymore
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 53dd1f49cf Try to deploy 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 8dcbc89028 Merge remote-tracking branch 'origin/unit_test' into unit_test
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 4fa7cfb9c3 Try to deploy 2
2 years ago
dorian.hodin b90ba093e1 Try to deploy
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin f6bfd4eea7 Add some Unit tests, not all test are here, still cant link coverage.xml to SonarQube
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin b29f7a0ad9 Try to deploy from another PC
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 840beee66a Add api_call branch on Master
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster dbffb4bfac ajout des bouttons de suppression de données et ajustement des Gateway
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 1553784e6f ajout des bouttons de suppression de données et ajustement des Gateway
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 81ab5d5019 Try to add coverage.xml file to SonarQube 4, try to find where is sonarqube directory, addWorkspace workspace
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 1d982037a1 Try to add coverage.xml file to SonarQube 4, try to find where is sonarqube directory, remove workspace
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 0ce405fbcc Try to add coverage.xml file to SonarQube 4, try to find where is sonarqube directory
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 4325cc4117 Try to add coverage.xml file to SonarQube 4, add workspace
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin acbffe8413 Try to add coverage.xml file to SonarQube 3, add workspace
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f3a0b9c67a Try to add coverage.xml file to SonarQube 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin a4778da132 Try to add coverage.xml file to SonarQube
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin baa37082a3 Try First Tests on Form.php
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 5f13e26ddd Finalize call of API in ModelCandidate.php, modify GitIgnore
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin aac0f99592 Finalize call of API from ModelAdmin.php, cant test yet, remove Gateway
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 5872130e9c Merge branch 'master' into api_call
2 years ago
dorian.hodin 3246a60cb3 Modification of ModelAdmin.php with call of the Gateways
continuous-integration/drone/push Build is passing Details
2 years ago
johan 21f090e916 Correction du chemin de bootsrap
continuous-integration/drone/push Build is passing Details
2 years ago
johan ce842fbd07 Correction de l'écrasement du fichier de config
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 68993d513a Merge branch 'printResponsesOfCandidates'
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 6b53c75b82 add bootstrap for Admin view
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 56f8913847 Ajout de l'image du logo
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 5a460e70da Correction du get des
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 0cbe16a3c1 correction du merge avecv login
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 88aa7f88e7 Merge branch 'printResponsesOfCandidates'
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis ec0d578f4b finish Bootstrap for Form
continuous-integration/drone/push Build is passing Details
2 years ago
johan c501609093 Correction du merge
continuous-integration/drone/push Build is passing Details
2 years ago
johan b02c9b3edd Correction suite au merge
continuous-integration/drone/push Build is passing Details
2 years ago
johan ea9c6b5407 Merging with admin login corrections
continuous-integration/drone/push Build is passing Details
2 years ago
johan 305f58c7c7 Ajout de la page de login
continuous-integration/drone/push Build is passing Details
2 years ago
johan f2e61dfb1f Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
2 years ago
johan 9218fa0495 Ajout de la page de login
2 years ago
johan 35d9d19646 Ajout de la page de login
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 9aeca91803 add bootstrap for Form view
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 6cf3254c07 Merge branch 'printResponsesOfCandidates'
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 1454ca5fcc bug correction
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 2765111df8 Correction de bug de l'insertion des réponses dans la base de donnée
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 9f728edf8a New view for form and admin
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 0c9fa8e0ec Add a menu into Administration View
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis af0fe2fe0d Print responses and categories into Admin Page without CSS
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 9e077c8939 Print responses and categories into Admin Page without CSS
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 8f92afa994 Merge remote-tracking branch 'origin/Gateway' into printResponsesOfCandidates
2 years ago
Alexis d1f8f345c0 Code Smells Resolve
continuous-integration/drone/push Build was killed Details
2 years ago
Alexis fd65b34749 Merge ResponseCandidate into Master
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 6551febec6 commencement des commentaires et correction de méthode
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 0057b45129 Add correct image for SonarQube
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin c65d78d33c Delete API Folder, update .drone.yml (removing API Part)
continuous-integration/drone/push Build is failing Details
2 years ago
Johan LACHENAL 5393854b13 Changement du FrontController pour que les camarades de projets puissent à nouveau accéder à la page d'administration
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster a15369f9a8 commencement des commentaires et correction de méthode
2 years ago
johan 9cca9bbe68 Modification du frontController pour la gestion des rôles, il faut encore créer la connexion pour pouvoir accéder à la page de gestion du formulaire
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 4f9ab8264c Add GatewayAdmin.php
2 years ago
alexi 2ba46b4171 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi d27c5dde63 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 9236f70b15 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 752f3ca068 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 6dc815a6f0 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi dd0eec1970 sonar resolve bugs
continuous-integration/drone/push Build is passing Details
2 years ago
alexi f2853c65f6 Merge branch 'JS_addQuestion'
2 years ago
dorian.hodin bb6644d1b9 Correct some minor warnings and delete useless file
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 8df64ef1e1 add documentation
2 years ago
alexi cbb9677250 finish "add question" with responses and categories
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL ea54dc6789 Ajout de la classe clean pour nettoyer les données
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL c29fd28877 Merge branch 'Validate'
2 years ago
Johan LACHENAL 5755fe4469 Ajout de fonctions de validation pour chaque attribut avec un nom différents dans les tables de la base de données, auparavant il n'y avit que celle pour la connection de l'administrateur du formulaire
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 238a111a6b Ajout de la classe Validate.php
continuous-integration/drone/push Build is passing Details
2 years ago
alexi e9cf2b055c add possible response form
continuous-integration/drone/push Build is passing Details
2 years ago
alexi 3977b4c01e add question form
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 8ca6d3d021 "add a question" with java script front-end
continuous-integration/drone/push Build is passing Details
2 years ago
alexi e7e2fd4e97 to fetch code on my second computer
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 907c68e282 Add category and question list for Administrator
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 3e95d6aeb5 Installing NodeJs and NPM
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 97a64fcdd4 Try code coverage with SonarQube 10
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 6dcc291910 Try code coverage with SonarQube 9
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 4453d14dc0 Try code coverage with SonarQube 8
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 79bbc395b0 Try code coverage with SonarQube 7
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 6be4a50b61 Try code coverage with SonarQube 6
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9de3d8a4b3 Try code coverage with SonarQube 5
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 61793c477b Try code coverage with SonarQube 4
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 3c71d8c04a Try code coverage with SonarQube 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 668965a2f4 Try code coverage with SonarQube 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin c9ecf67252 Try code coverage with SonarQube
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis dd49e9fdd4 SonarQube code smells resolve Num52
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis f09c849a96 SonarQube code smells resolve Num51
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis fa1dcf138a SonarQube code smells resolve Num50
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7db9a3b7a8 SonarQube code smells resolve Num49
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis cd10f7962a SonarQube code smells resolve Num48
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis e260cfc6ec SonarQube code smells resolve Num47
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 5e87d34992 SonarQube code smells resolve Num46
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis b8b7697db7 SonarQube code smells resolve Num45
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis c3025a6402 SonarQube code smells resolve Num44
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 3d81445e34 SonarQube code smells resolve Num43
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 2c96a16f9e SonarQube code smells resolve Num42
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 52d0e359a6 SonarQube code smells resolve Num41
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 4b8bf962a5 SonarQube code smells resolve Num40
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 2c423ce0ef SonarQube code smells resolve Num39
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 6ef521d1c3 SonarQube code smells resolve #38
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 087b91917b SonarQube code smells resolve #37
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis f4f1db606f SonarQube code smells resolve #36
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis f5d9267200 SonarQube code smells resolve #35
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 9da2e2df9a SonarQube code smells resolve #34
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 2c84154d6e SonarQube code smells resolve #33
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 89a12c02cb SonarQube code smells resolve #32
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 0e43ca7f40 SonarQube code smells resolve #31
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 3f7171c9ba SonarQube code smells resolve #30
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 92e9ccb998 SonarQube code smells resolve #29
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 3d7a139d69 SonarQube code smells resolve #28
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 568cbe7b08 SonarQube code smells resolve #27
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 968ff5261e SonarQube code smells resolve #26
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 33e0115b98 SonarQube code smells resolve #25
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis ad69255b81 SonarQube code smells resolve #24
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis eeb1f7b552 SonarQube code smells resolve #23
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 99f9f15e6d SonarQube code smells resolve #22
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 0cd93fd938 SonarQube code smells resolve #21
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis dabe17588a SonarQube code smells resolve #20
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 4be8d2ab4f SonarQube code smells resolve #19
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 8bb42f5b93 SonarQube code smells resolve #18
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 09606c28a1 SonarQube code smells resolve #17
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis cfcf77c40c SonarQube code smells resolve #16
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 761ced2237 SonarQube code smells resolve #15
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 2988f8e46f SonarQube code smells resolve #14
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 6e8f736302 SonarQube code smells resolve #13
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7711053798 SonarQube code smells resolve #12
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 78c19fde0d SonarQube code smells resolve #11
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 904291e907 SonarQube code smells resolve #10
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis d7adcdfaa0 SonarQube code smells resolve #9
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 75e978d4e9 SonarQube code smells resolve #8
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 75ff5632cf SonarQube code smells resolve #7
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 1a95ced37b SonarQube bug resolve #6
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 92a54f09a2 SonarQube bug resolve #5
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 40190cb496 SonarQube bug resolve #4
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis f07ab49620 SonarQube bug resolve #3
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 2a98500daf SonarQube bug resolve #2
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 680420d437 SonarQube bug resolve #1
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 64afd8f5da SonarQube security resolve
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis e3f64c9d14 Merge FactoryQuestion
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis d44e655d8e Test the merge
continuous-integration/drone/push Build is passing Details
2 years ago
alexi c3e28166b6 Marge Gateway into FactoryQuestion
continuous-integration/drone/push Build is passing Details
2 years ago
alexi cdf2bcac4f Merge remote-tracking branch 'origin/Gateway' into FactoryQuestion
2 years ago
Ness Gaster cb5df46a94 gateway List Response
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 6ee05447aa gateway response getByListCandidate insert delete
2 years ago
Alexis 9b0a096bd6 Add FactoryQuestion
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis b59fc21b42 Add Response class
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 22f7ea87fd User can submit a form, and admin can add keywords
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 2b21d0e039 Merge branch 'Model' into GatewayForm
2 years ago
Ness Gaster 43a09cf6cf gatewayForm updateTitleToForm updateDescriptionToForm deleteDescriptionToForm
2 years ago

@ -2,33 +2,17 @@ kind: pipeline
type: docker
name: Témoignages_Formulaire
trigger:
event:
- push
steps:
- name: setup_PHP_for_SonarQube
image: php:8.1
environment:
SONAR_TOKEN:
from_secret: SONARQ_TOKEN
commands:
- apt-get update && apt-get install -y unzip
- export SONAR_SCANNER_VERSION=4.7.0.2747
- export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux
- curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip
- unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
- export PATH=$SONAR_SCANNER_HOME/bin:$PATH
- export SONAR_SCANNER_OPTS="-server"
- sonar-scanner -D sonar.projectKey=SAE4.01_FORMULAIRE -D sonar.sources=. -D sonar.host.url=https://codefirst.iut.uca.fr/sonar
# docker image build
- name: set_api_form
- name: formulaire
image: plugins/docker
settings:
dockerfile: ./Source/API/Dockerfile
context: Source/API
dockerfile: ./Source/Dockerfile
context: ./Source
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/dorian.hodin/sae4.01_formulaire
username:
@ -36,39 +20,30 @@ steps:
password:
from_secret: SECRET_PASSWD
# conteneur deployment
- name: deploy_api_form
- name: deploy-form
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
environment:
IMAGENAME: hub.codefirst.iut.uca.fr/dorian.hodin/sae4.01_formulaire:latest
CONTAINERNAME: deploy_api_form
CONTAINERNAME:
from_secret : CONTAINER_NAME
COMMAND: create
OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_HOST:
from_secret: db_host
CODEFIRST_CLIENTDRONE_ENV_DATABASE:
from_secret: db_database
CODEFIRST_CLIENTDRONE_ENV_USER:
from_secret: db_user
CODEFIRST_CLIENTDRONE_ENV_PASSWORD:
from_secret: db_password
CODEFIRST_CLIENTDRONE_ENV_ROOT_PASSWORD:
from_secret: db_root_password
depends_on: [ set_api_form ]
ADMINS: dorianhodin,alexislamande,baptistebaverel,johanlachenal
depends_on: [ formulaire ]
# database container deployment
- name: db_form
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
- name: setup_PHP_for_SonarQube
image: sonarsource/sonar-scanner-cli
environment:
IMAGENAME: mariadb:10.5
CONTAINERNAME: db_form
COMMAND: create
CODEFIRST_CLIENTDRONE_ENV_MARIADB_ROOT_PASSWORD:
from_secret: db_root_password
CODEFIRST_CLIENTDRONE_ENV_MARIADB_DATABASE:
from_secret: db_database
CODEFIRST_CLIENTDRONE_ENV_MARIADB_USER:
from_secret: db_user
CODEFIRST_CLIENTDRONE_ENV_MARIADB_PASSWORD:
from_secret: db_password
depends_on: [ deploy_api_form ]
SONAR_TOKEN:
from_secret: SONARQ_TOKEN
commands:
- curl https://codefirst.iut.uca.fr/containers/Temoignages-Formulaire/Source/Tests/coverage.xml -o /drone/src/coverage.xml
- sonar-scanner -Dsonar.projectKey=SAE4.01_FORMULAIRE
-Dsonar.sources=.
-Dsonar.inclusions=**/*.php
-Dsonar.login=$${SONAR_TOKEN}
-Dsonar.language=php
-Dsonar.host.url=https://codefirst.iut.uca.fr/sonar
-Dsonar.php.coverage.reportPaths=coverage.xml
depends_on: [ deploy-form ]

15
.gitignore vendored

@ -0,0 +1,15 @@
/Source/.phpunit.cache/
/Source/Config/vendor/bin/
/Source/Config/vendor/guzzlehttp/
/Source/Config/vendor/myclabs/
/Source/Config/vendor/nikic/
/Source/Config/vendor/phar-io/
/Source/Config/vendor/phpunit/
/Source/Config/vendor/psr/
/Source/Config/vendor/ralouphie/
/Source/Config/vendor/sebastian/
/Source/Config/vendor/symfony/
/Source/Config/vendor/theseer/
/Source/Config/vendor/composer/pcre/
/Source/Config/vendor/composer/xdebug-handler/
/Source/Config/vendor/doctrine/

@ -1,8 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/Source" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Source/Tests" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="bootstrap-icons" level="application" />
<orderEntry type="library" name="bootstrap" level="application" />
<orderEntry type="library" name="font-awesome" level="application" />
<orderEntry type="library" name="jquery" level="application" />
<orderEntry type="library" name="bootstrap.bundle" level="application" />
<orderEntry type="library" name="font-awesome" level="application" />
<orderEntry type="library" name="bootstrap" level="application" />
<orderEntry type="library" name="bootstrap-icons" level="application" />
</component>
</module>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="@localhost" uuid="31f3a16e-d54b-4596-809a-37bbd2defc86">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://localhost:3306</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

@ -0,0 +1,29 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="68" name="HTML" />
</Languages>
</inspection_tool>
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="10">
<item index="0" class="java.lang.String" itemvalue="nobr" />
<item index="1" class="java.lang.String" itemvalue="noembed" />
<item index="2" class="java.lang.String" itemvalue="comment" />
<item index="3" class="java.lang.String" itemvalue="noscript" />
<item index="4" class="java.lang.String" itemvalue="embed" />
<item index="5" class="java.lang.String" itemvalue="script" />
<item index="6" class="java.lang.String" itemvalue="li" />
<item index="7" class="java.lang.String" itemvalue="form" />
<item index="8" class="java.lang.String" itemvalue="p" />
<item index="9" class="java.lang.String" itemvalue="option" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile>
</component>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="PROJECT" libraries="{bootstrap, bootstrap-icons, font-awesome}" />
</component>
</project>

@ -9,7 +9,7 @@
<component name="PHPCodeSnifferOptionsConfiguration">
<option name="transferred" value="true" />
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />
<component name="PhpProjectSharedConfiguration" php_language_level="8.1" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>

@ -0,0 +1,2 @@
[![Build Status](https://codefirst.iut.uca.fr/api/badges/Temoignages/SAE4.01_FORMULAIRE/status.svg)](https://codefirst.iut.uca.fr/Temoignages/SAE4.01_FORMULAIRE)

@ -0,0 +1,32 @@
RewriteEngine on
# Vérifier si le serveur est MAMP ou WAMP
RewriteCond %{DOCUMENT_ROOT} /Applications/MAMP/htdocs/
RewriteRule .* - [E=APP_ROOT:/SAE4.01_FORMULAIRE/]
RewriteCond %{DOCUMENT_ROOT} /
RewriteRule .* - [E=APP_ROOT:]
# Redirection des URLs
RewriteRule ^/$ %{ENV:APP_ROOT}index.php?page=goToForm [L]
RewriteRule ^goToForm$ %{ENV:APP_ROOT}index.php?page=goToForm [L]
RewriteRule ^submitForm$ %{ENV:APP_ROOT}index.php?page=submitForm [L]
RewriteRule ^addQuestion$ %{ENV:APP_ROOT}index.php?page=addQuestion [L]
RewriteRule ^addResponse$ %{ENV:APP_ROOT}index.php?page=addResponse [L]
RewriteRule ^continueResponse$ %{ENV:APP_ROOT}index.php?page=continueResponse [L]
RewriteRule ^createForm$ %{ENV:APP_ROOT}index.php?page=createForm [L]
RewriteRule ^addKeyword$ %{ENV:APP_ROOT}index.php?page=addKeyword [L]
RewriteRule "goToAdmin" %{ENV:APP_ROOT}index.php?page=goToAdmin [L]
RewriteRule ^goToAdminLogin$ %{ENV:APP_ROOT}index.php?page=goToAdminLogin [L]
RewriteRule ^login$ %{ENV:APP_ROOT}index.php?page=login [L]
RewriteRule ^goToCategories$ %{ENV:APP_ROOT}index.php?page=goToCategories [L]
RewriteRule ^goToQuestions$ %{ENV:APP_ROOT}index.php?page=goToQuestions [L]
RewriteRule ^goToResponses$ %{ENV:APP_ROOT}index.php?page=goToResponses [L]
RewriteRule ^deleteQuestion$ %{ENV:APP_ROOT}index.php?page=deleteQuestion [L]
RewriteRule ^deleteResponse$ %{ENV:APP_ROOT}index.php?page=deleteResponse [L]
RewriteRule ^deleteKeyword$ %{ENV:APP_ROOT}index.php?page=deleteKeyword [L]
RewriteRule ^deleteResponsesCandidate$ %{ENV:APP_ROOT}index.php?page=deleteResponsesCandidate [L]
AddType text/css .css
AddType text/javascript .js
AddType application/javascript .js

@ -1,4 +0,0 @@
FROM php:8.0-apache
RUN apt-get update && apt-get upgrade -y
RUN docker-php-ext-install pdo pdo_mysql
COPY ./script /var/www/html

@ -1,32 +0,0 @@
<?php
class APIController
{
// private ScriptDatabase $script;
function __construct()
{
// $this->script = new ScriptDatabase();
// $this->script->executeScript();
try {
if (empty($_REQUEST['action'])) {
$action = NULL;
} else {
$action = $_REQUEST['action'];
}
$listGateway = array("\\Gateway\\GatewayForm", "\\Gateway\\GatewayKeyword", "\\Gateway\\GatewayQuestion");
foreach ($listGateway as $gateway) // Pour chaque Gateway
{
/* On regarde si elle implémente une fonction du même nom que l'action reçue */
if(method_exists($gateway, $action))
{
(new $gateway)->$action(); // Si oui, on appelle cette fonction
}
}
} catch (PDOException) {
return http_response_code(404);
}
exit(0);
}
}

@ -1,38 +0,0 @@
<?php
namespace API\script\Config;
use PDO;
use PDOStatement;
class Connection extends PDO
{
private PDOStatement $stmt;
public function __construct(string $dsn, string $username, string $password)
{
parent::__construct($dsn, $username, $password);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
/** * @param string $query
* @param array $parameters *
* @return bool Returns `true` on success, `false` otherwise
*/
public function executeQuery(string $query, array $parameters = []): bool
{
$this->stmt = parent::prepare($query);
foreach ($parameters as $name => $value) {
$this->stmt->bindValue($name, $value[0], $value[1]);
}
return $this->stmt->execute();
}
public function getResults(): array
{
return $this->stmt->fetchAll();
}
}

@ -1,23 +0,0 @@
<?php
use API\script\Config\Connection;
require_once __DIR__ ."/Connection.php";
function connect()
{
$dsn = "mysql:host=localhost;dbname=formulaire;charset=utf8";
$login = "root";
$password = "root";
try {
$connection = new Connection($dsn,$login,$password);
} catch (PDOException $e){
http_response_code(404);
return http_response_code();
}
return $connection;
}

@ -1,122 +0,0 @@
<?php
class ScriptDatabase {
private Connection $con;
public function __construct() {
$this->con = connect();
}
public function executeScript(): void
{
$queryScript = 'CREATE TABLE `Categorize` (
`response` int(11) NOT NULL,
`keyword` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Form` (
`id` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`description` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Keyword` (
`id` int(11) NOT NULL,
`word` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `ListResponsesOfCandidate` (
`id` int(11) NOT NULL,
`date` datetime NOT NULL,
`titleForm` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `PossibleResponse` (
`id` int(11) NOT NULL,
`content` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Propose` (
`question` int(11) NOT NULL,
`possibleResponse` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Question` (
`id` int(11) NOT NULL,
`content` text NOT NULL,
`type` varchar(50) NOT NULL,
`form` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Reference` (
`possibleResponse` int(11) NOT NULL,
`keyword` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Response` (
`id` int(11) NOT NULL,
`content` varchar(200) NOT NULL,
`questionContent` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `Submit` (
`responsesCandidate` int(11) NOT NULL,
`response` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `Categorize`
ADD PRIMARY KEY (`response`,`keyword`),
ADD KEY `keyword` (`keyword`);
ALTER TABLE `Form`
ADD PRIMARY KEY (`id`);
ALTER TABLE `Keyword`
ADD PRIMARY KEY (`id`);
ALTER TABLE `ListResponsesOfCandidate`
ADD PRIMARY KEY (`id`);
ALTER TABLE `PossibleResponse`
ADD PRIMARY KEY (`id`);
ALTER TABLE `Propose`
ADD PRIMARY KEY (`question`,`possibleResponse`),
ADD KEY `possibleResponse` (`possibleResponse`);
ALTER TABLE `Question`
ADD PRIMARY KEY (`id`),
ADD KEY `form` (`form`);
ALTER TABLE `Reference`
ADD PRIMARY KEY (`possibleResponse`,`keyword`),
ADD KEY `keyword` (`keyword`);
ALTER TABLE `Response`
ADD PRIMARY KEY (`id`);
ALTER TABLE `Submit`
ADD PRIMARY KEY (`responsesCandidate`,`response`),
ADD KEY `response` (`response`);
ALTER TABLE `Form`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `Keyword`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `ListResponsesOfCandidate`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `PossibleResponse`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `Question`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `Response`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `Categorize`
ADD CONSTRAINT `Categorize_ibfk_1` FOREIGN KEY (`keyword`) REFERENCES `Keyword` (`id`),
ADD CONSTRAINT `Categorize_ibfk_2` FOREIGN KEY (`response`) REFERENCES `Response` (`id`);
ALTER TABLE `Propose`
ADD CONSTRAINT `Propose_ibfk_1` FOREIGN KEY (`possibleResponse`) REFERENCES `PossibleResponse` (`id`),
ADD CONSTRAINT `Propose_ibfk_2` FOREIGN KEY (`question`) REFERENCES `Question` (`id`);
ALTER TABLE `Question`
ADD CONSTRAINT `Question_ibfk_1` FOREIGN KEY (`form`) REFERENCES `Form` (`id`);
ALTER TABLE `Reference`
ADD CONSTRAINT `Reference_ibfk_1` FOREIGN KEY (`keyword`) REFERENCES `Keyword` (`id`),
ADD CONSTRAINT `Reference_ibfk_2` FOREIGN KEY (`possibleResponse`) REFERENCES `PossibleResponse` (`id`);
ALTER TABLE `Submit`
ADD CONSTRAINT `Submit_ibfk_1` FOREIGN KEY (`response`) REFERENCES `Response` (`id`),
ADD CONSTRAINT `Submit_ibfk_2` FOREIGN KEY (`responsesCandidate`) REFERENCES `ListResponsesOfCandidate` (`id`);
COMMIT;';
$this->con->executeQuery($queryScript);
try {
$test = "SELECT * FROM Categorize;";
$this->con->executeQuery($test);
}catch (Exception $e){
echo $e->getMessage();
}
}
}

@ -1,75 +0,0 @@
<?php
namespace API\script\Gateway;
use API\script\Config\Connection;
use BusinessClass\Form;
use BusinessClass\Keyword;
use BusinessClass\Question;
use PDO;
class GatewayForm
{
private Connection $connection;
public function __construct()
{
$this->connection = connect();
}
public function insertForm(Form $form): void
{
if(empty($this->getForm()))
{
$query = "INSERT INTO Form(title, description) VALUES(:title, :description)";
$this->connection->executeQuery($query, array(
':title' => array($form->getTitle(), PDO::PARAM_STR),
':description' => array($form->getDescription(), PDO::PARAM_STR)
));
}
}
public function getForm(): array
{
$query = "SELECT * FROM Form";
$this->connection->executeQuery($query);
return $this->connection->getResults();
}
public function assignKeywordToQuestion(string $keyword, string $response, int $idQuestion)
{
echo $keyword;
$query = "SELECT pr.id FROM Propose p, PossibleResponse pr WHERE p.question = :id AND p.possibleResponse = pr.id AND pr.content = :response";
$this->connection->executeQuery($query, array(
':id' => array($idQuestion, PDO::PARAM_STR),
':response' => array($response, PDO::PARAM_STR)
));
$idPossibleResponse = $this->connection->getResults()[0][0];
$query = "INSERT INTO Reference(possibleResponse, keyword) VALUES(:possibleResponse, :keyword)";
$this->connection->executeQuery($query, array(
':possibleResponse' => array($idPossibleResponse, PDO::PARAM_INT),
':keyword' => array($keyword, PDO::PARAM_STR)
));
}
public function deleteKeywordFromQuestion(string $keyword, string $response, Question $question)
{
$query = "SELECT pr.id FROM Propose p, PossibleResponse r WHERE p.question = :id AND p.possibleResponse = pr.id AND pr.content = :response";
$this->connection->executeQuery($query, array(
':id' => array($question->getId(), PDO::PARAM_STR),
':response' => array($response, PDO::PARAM_STR)
));
$idPossibleResponse = $this->connection->getResults()[0][0];
$query = "DELETE FROM Reference WHERE response = :idResponse AND keyword = :idKeword";
$this->connection->executeQuery($query, array(
':idResponse' => array($idPossibleResponse, PDO::PARAM_INT),
':idKeword' => array($keyword->getId(), PDO::PARAM_INT)
));
}
}

@ -1,41 +0,0 @@
<?php
namespace API\script\Gateway;
use API\script\Config\Connection;
use BusinessClass\Keyword;
class GatewayKeyword
{
private Connection $connection;
public function __construct()
{
$this->connection = connect();
}
public function insertKeyword(Keyword $keyword)
{
$query = "INSERT INTO Keyword(id, word) VALUES(:id, :word)";
$this->connection->executeQuery($query, array(
':id' => array($keyword->getId(), PDO::PARAM_INT),
':word' => array($keyword->getWord(), PDO::PARAM_INT)
));
}
public function deleteKeyword(Keyword $keyword)
{
$query = "DELETE FROM Keyword WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($keyword->getId(), PDO::PARAM_INT)
));
}
public function getAllKeyword(): array
{
$query = "SELECT * FROM Keyword";
$this->connection->executeQuery($query);
return $this->connection->getResults();
}
}

@ -1,190 +0,0 @@
<?php
namespace API\script\Gateway;
use API\script\Config\Connection;
use BusinessClass\BoxQuestion;
use BusinessClass\Question;
use BusinessClass\TextQuestion;
use PDO;
class GatewayQuestion
{
private Connection $connection;
public function __construct()
{
$this->connection = connect();
}
public function insertQuestion(Question $question, int $idForm): void
{
$query = "INSERT INTO Question(content, type, form) VALUES(:content, :type, :form)";
$this->connection->executeQuery($query, array(
':content' => array($question->getContent(), PDO::PARAM_STR),
':type' => array(get_class($question), PDO::PARAM_STR),
':form' => array($idForm, PDO::PARAM_INT)
));
$idQuestion = $this->connection->lastInsertId();
if(get_class($question) != TextQuestion::class){
$listPossibleResponse = $question->getPossibleResponses();
for($i = 0; $i < count($listPossibleResponse); $i++){
$query = "INSERT INTO PossibleResponse(content) VALUES(:content)";
$this->connection->executeQuery($query, array(
':content' => array($listPossibleResponse[$i], PDO::PARAM_STR)
));
$idPossibleResponse = $this->connection->lastInsertId();
$query = "INSERT INTO Propose(question, possibleResponse) VALUES(:question, :possibleResponse)";
$this->connection->executeQuery($query, array(
':question' => array($idQuestion, PDO::PARAM_INT),
':possibleResponse' => array($idPossibleResponse, PDO::PARAM_INT)
));
foreach ($question->getCategories()[$i] as $keyword){
$gatewayForm = new GatewayForm();
$gatewayForm->assignKeywordToQuestion($keyword, $listPossibleResponse[$i], $idQuestion);
}
}
}
}
public function deleteQuestion(Question $question): void
{
if(get_class($question) == BoxQuestion::class) {
$query = "DELETE FROM Propose WHERE question = :id";
$this->connection->executeQuery($query, array(
':id' => array($question->getId(), PDO::PARAM_INT)
));
$listPossibleResponse = $question->getPossibleResponses();
for ($i = 0; $i < count($listPossibleResponse); $i++){
$query = "DELETE FROM Reference WHERE response = :id";
$this->connection->executeQuery($query, array(
':id' => array($listPossibleResponse[$i]->getId(), PDO::PARAM_INT)
));
$query = "DELETE FROM PossibleResponse WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($listPossibleResponse[$i]->getId(), PDO::PARAM_INT)
));
}
}
$query = "DELETE FROM Question WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($question->getId(), PDO::PARAM_INT)
));
}
public function updateQuestion(Question $question): void
{
$query = "UPDATE Question SET content = :content, type = :type, form = :form WHERE id = :id";
$this->connection->executeQuery($query, array(
':content' => array($question->getContent(), PDO::PARAM_STR),
':type' => array(get_class($question), PDO::PARAM_STR),
':form' => array($question->getForm(), PDO::PARAM_STR),
':id' => array($question->getId(), PDO::PARAM_STR)
));
}
public function getAllQuestions(string $idForm): array //revoie un array contenant trois qui pour chaque indice commun de ces 3 array une question, sa liste de reponse possible et sa liste de keyword associer au réponse. les deux autres sont null si c'est une textBox
{
$query = "SELECT * FROM Question WHERE form = :form";
$this->connection->executeQuery($query, array(
':form' => array($idForm, PDO::PARAM_INT)
));
$listQuestions = $this->connection->getResults();
$possibleResponses = [];
$possibleResponsesContent = [];
$keywordsResponses = [];
if(!empty($listQuestions)) {
for ($i = 0; $i < count($listQuestions); $i++) {
if ($listQuestions[$i]["type"] != "BusinessClass/TextQuestion") {
$query = "SELECT pr.* FROM Propose p, PossibleResponse pr
WHERE p.question = :questionId AND p.possibleResponse = pr.id";
$this->connection->executeQuery($query, array(
':questionId' => array($listQuestions[$i]["id"], PDO::PARAM_INT)
));
$possibleResponses[] = $this->connection->getResults();
$tmpTabKeyword = [];
$tmpTabPossibleResponse = [];
foreach ($possibleResponses[$i] as $row){
$query = "SELECT k.* FROM Keyword k, Reference r
WHERE k.word = r.keyword AND r.possibleResponse = :id";
$this->connection->executeQuery($query, array(
':id' => array($row["id"], PDO::PARAM_INT)
));
$tabTmp = [];
foreach ($this->connection->getResults() as $keywords)
{
$tabTmp[] = $keywords["word"];
}
$tmpTabKeyword[] = $tabTmp;
$tmpTabPossibleResponse[] = $row["content"];
}
$possibleResponsesContent[] = $tmpTabPossibleResponse;
$keywordsResponses[] = $tmpTabKeyword;
}
else{
$possibleResponsesContent[] = null;
$keywordsResponses[] = null;
}
}
return array($listQuestions, $possibleResponsesContent, $keywordsResponses);
}
return array();
/*
if(!empty($resultQuestion))
{
for ($i=0; $i < count($resultQuestion); $i++)
{
if($resultQuestion[$i]["type"]!="BusinessClass/TextQuestion")
{
$tmpTab = [];
foreach ($possibleResponse[$i] as $row){
$query = "SELECT k.* FROM Keyword k, Reference r
WHERE k.word = r.keyword AND r.possibleResponse = :id";
$this->connection->executeQuery($query, array(
':id' => array($row["id"], PDO::PARAM_INT)
));
$tmpTab[] = $this->connection->getResults();
var_dump($tmpTab);
$possibleResponsesContent[] = $row["content"];
}
$keywordResponse[] = $tmpTab["word"];
}
else{
$possibleResponse[] = null;
$keywordResponse[] = null;
}
}
return array($resultQuestion, $possibleResponsesContent, $keywordResponse);
}
return array();
*/
}
}

@ -2,28 +2,43 @@
namespace BusinessClass;
/**
* Définit une question avec plusieurs réponses.
*/
abstract class BoxQuestion extends Question
{
private array $possibleResponses; // un dictionnaire qui associe chaque réponse
// possible à un ou plusieurs objets Category
private array $categories;
/**
* @param array $possibleResponses
* @param string $content
* @param array $categories
* @param int $id
* @var array|mixed
*/
public function __construct(array $possibleResponses, string $content, array $categories, int $id)
private array $possibleResponses;
/**
* @var array|mixed
*/
private array $categories;
public function __construct(int $ctp, array $args)
{
parent::__construct($id, $content);
$this->categories = $categories;
$this->possibleResponses = $possibleResponses;
switch ($ctp) {
case 4:
parent::__construct($args[3], $args[1]);
$this->categories = $args[2];
$this->possibleResponses = $args[0];
break;
case 2:
parent::__construct($args[0], $args[1]);
break;
default:
break;
}
}
public abstract function responseStrategy();
public abstract function printStrategy(): string;
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
abstract public function printStrategy(): string;
/**
* @return array
@ -56,4 +71,4 @@ abstract class BoxQuestion extends Question
{
$this->categories = $categories;
}
}
}

@ -2,45 +2,42 @@
namespace BusinessClass;
/**
* Définit une question à choix multiples.
*/
class CheckBoxQuestion extends BoxQuestion
{
/**
* @param array $possibleResponses
* @param string $content
* @param array $categories
* @param int $id
*/
public function __construct(array $possibleResponses, string $content, array $categories, int $id)
public function __construct()
{
parent::__construct($possibleResponses, $content, $categories, $id);
parent::__construct(func_num_args(), func_get_args());
}
public function responseStrategy()
{
// TODO: Implement responseStrategy() method.
}
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
public function printStrategy(): string
{
$id = $this->getId();
$content = $this->getContent();
$possibleResponses = $this->getPossibleResponses();
$categories = $this->getCategories();
$html = "\t\t\t<div class='question'>
<label>$content</label>\n";
$html = "<div class='tab'>
<h6>$content</h6>";
for($i = 0; $i < count($possibleResponses); $i++)
{
$categoriesSplit = $possibleResponses[$i]."||";
foreach ($categories[$i] as $category)
{
for ($i = 0; $i < count($possibleResponses); $i++) {
$categoriesSplit = $id."||".$possibleResponses[$i]."||";
foreach ($categories[$i] as $category) {
$categoriesSplit.= $category."_";
}
$html.= "\t\t\t\t<input type='checkbox' name='answers[]' value='$categoriesSplit' />
<label>$possibleResponses[$i]</label>\n";
$html.= "<p><input style='-webkit-appearance: checkbox;' type='checkbox' name='answers[]' value='$categoriesSplit' />
<label>$possibleResponses[$i]</label></p>";
}
$html.= "\t\t\t</div>\n";
return $html;
}
}
}

@ -2,11 +2,29 @@
namespace BusinessClass;
/**
* Définit un formulaire.
*/
class Form
{
/**
* @var int
*/
private int $id;
/**
* @var string
*/
private string $title;
/**
* @var string
*/
private string $description;
/**
* @var array
*/
private array $questions; // La liste des questions dans un formulaire
/**

@ -2,7 +2,15 @@
namespace BusinessClass;
/**
* Définit l'affiche d'une question.
*/
interface IPrintQuestionStrategy
{
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
public function printStrategy(): string;
}
}

@ -1,8 +0,0 @@
<?php
namespace BusinessClass;
interface IResponseProcessingStrategy
{
public function responseStrategy();
}

@ -2,9 +2,19 @@
namespace BusinessClass;
/**
* Définit une catégorie associable à une réponse.
*/
class Keyword
{
/**
* @var int
*/
private int $id;
/**
* @var string
*/
private string $word;
/**
@ -17,6 +27,7 @@ class Keyword
$this->word = $word;
}
/**
* @return string
*/
@ -40,4 +51,4 @@ class Keyword
{
return $this->id;
}
}
}

@ -2,42 +2,41 @@
namespace BusinessClass;
/**
* Définit une question avec plusieurs réponses, mais une seule possible.
*/
class ListBoxQuestion extends BoxQuestion
{
/**
* @param array $possibleResponses
* @param string $content
* @param array $categories
* @param int $id
*/
public function __construct(array $possibleResponses, string $content, array $categories, int $id)
public function __construct()
{
parent::__construct($possibleResponses, $content, $categories, $id);
parent::__construct(func_num_args(), func_get_args());
}
public function responseStrategy()
{
// TODO: Implement responseStrategy() method.
}
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
public function printStrategy(): string
{
$id = $this->getId();
$content = $this->getContent();
$possibleResponses = $this->getPossibleResponses();
$categories = $this->getCategories();
$html = "\t\t\t<div class='question'>
<label>$content</label>
<select name='answers[]'>\n";
for($i = 0; $i < count($possibleResponses); $i++)
{
$categoriesAndResponsesSplit = $possibleResponses[$i]."_";
foreach ($categories[$i] as $category)
{
$categoriesAndResponsesSplit.= $category."_";
$html = "<div class='tab'>
<h6>$content</h6>
<select name='answers[]'>";
for ($i = 0; $i < count($possibleResponses); $i++) {
$categoriesSplit = $id."||".$possibleResponses[$i]."||";
foreach ($categories[$i] as $category) {
$categoriesSplit.= $category."_";
}
$html.= "\t\t\t\t\t<option value='$categoriesAndResponsesSplit'>$possibleResponses[$i]</option>\n";
$html.= "<p> <option value='$categoriesSplit'>$possibleResponses[$i]</option> </p>";
}
$html.= "\t\t\t\t</select>
</div>\n";

@ -2,11 +2,22 @@
namespace BusinessClass;
abstract class Question implements IResponseProcessingStrategy, IPrintQuestionStrategy
/**
* Définit une question.
*/
abstract class Question implements IPrintQuestionStrategy
{
/**
* @var int
*/
private int $id;
/**
* @var string
*/
private string $content;
/**
* @param int $id
* @param string $content
@ -17,9 +28,13 @@ abstract class Question implements IResponseProcessingStrategy, IPrintQuestionSt
$this->content = $content;
}
public abstract function responseStrategy();
public abstract function printStrategy(): string;
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
abstract public function printStrategy(): string;
/**
* @return string

@ -0,0 +1,99 @@
<?php
namespace BusinessClass;
/**
* Définit une possibilité de réponse à une question.
*/
class Response
{
/**
* @var int
*/
private int $id;
/**
* @var string
*/
private string $date;
/**
* @var string
*/
private string $titleForm;
/**
* @var array
*/
private array $questionsResponses;
/**
* @param int $id
* @param string $date
* @param string $titleForm
* @param array $questionsResponses
*/
public function __construct(int $id, string $date, string $titleForm, array $questionsResponses)
{
$this->id = $id;
$this->date = $date;
$this->titleForm = $titleForm;
$this->questionsResponses = $questionsResponses;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return string
*/
public function getDate(): string
{
return $this->date;
}
/**
* @param string $date
*/
public function setDate(string $date): void
{
$this->date = $date;
}
/**
* @return string
*/
public function getTitleForm(): string
{
return $this->titleForm;
}
/**
* @param string $titleForm
*/
public function setTitleForm(string $titleForm): void
{
$this->titleForm = $titleForm;
}
/**
* @return array
*/
public function getQuestionsResponses(): array
{
return $this->questionsResponses;
}
/**
* @param array $questionsResponses
*/
public function setQuestionsResponses(array $questionsResponses): void
{
$this->questionsResponses = $questionsResponses;
}
}

@ -2,32 +2,26 @@
namespace BusinessClass;
/**
* Définit une question qui propose d'écrire du texte en guise de réponse
*/
class TextQuestion extends Question
{
/**
* @param string $content
* @param int $id
*/
public function __construct(string $content, int $id)
{
parent::__construct($id, $content);
}
public function responseStrategy()
{
// TODO: Implement responseStrategy() method.
}
/**
* Permet de définir la manière dont la question doit s'afficher en HTML.
*
* @return string
*/
public function printStrategy(): string // Possibilité de rajouter l'id de la question en parametre
{ // pour la mettre en id du input afin de la lier à ça question
public function printStrategy(): string
{
$content = $this->getContent();
$id = $this->getId();
return "\t\t\t<div class='question'>
<label>$content</label>
<input type='text' name='answers[]' />
</div>\n";
return "<div class='tab'>
<h6>$content</h6>
<p>
<input data-id='$id' placeholder='...' oninput='this.className = '''' type='text' name='answers[]'>
</p>
</div>\n";
}
}
}

@ -0,0 +1,319 @@
<?php
namespace Config;
use Exception;
use RuntimeException;
use Traversable;
class AltoRouter
{
/**
* @var array Array of all routes (incl. named routes).
*/
protected array $routes = [];
/**
* @var array Array of all named routes.
*/
protected array $namedRoutes = [];
/**
* @var string Can be used to ignore leading part of the Request URL (if main file lives in subdirectory of host)
*/
protected string $basePath = '';
/**
* @var array Array of default match types (regex helpers)
*/
protected array $matchTypes = [
'i' => '[0-9]++',
'a' => '[0-9A-Za-z]++',
'h' => '[0-9A-Fa-f]++',
'*' => '.+?',
'**' => '.++',
'' => '[^/\.]++'
];
/**
* Create router in one call from config.
*
* @param array $routes
* @param string $basePath
* @param array $matchTypes
* @throws Exception
*/
public function __construct(array $routes = [], string $basePath = '', array $matchTypes = [])
{
$this->addRoutes($routes);
$this->setBasePath($basePath);
$this->addMatchTypes($matchTypes);
}
/**
* @return string
*/
public function getBasePath(): string
{
return $this->basePath;
}
/**
* @return array
*/
public function getMatchTypes(): array
{
return $this->matchTypes;
}
/**
* @return array
*/
public function getNamedRoutes(): array
{
return $this->namedRoutes;
}
/**
* Retrieves all routes.
* Useful if you want to process or display routes.
* @return array All routes.
*/
public function getRoutes(): array
{
return $this->routes;
}
/**
* Add multiple routes at once from array in the following format:
*
* $routes = [
* [$method, $route, $target, $name]
* ];
*
* @param array $routes
* @return void
* @throws Exception
*@author Koen Punt
*/
public function addRoutes(mixed $routes): void
{
if (!is_array($routes) && !$routes instanceof Traversable) {
throw new RuntimeException('Routes should be an array or an instance of Traversable');
}
foreach ($routes as $route) {
call_user_func_array([$this, 'map'], $route);
}
}
/**
* Set the base path.
* Useful if you are running your application from a subdirectory.
* @param string $basePath
*/
public function setBasePath(string $basePath): void
{
$this->basePath = $basePath;
}
/**
* Add named match types. It uses array_merge so keys can be overwritten.
*
* @param array $matchTypes The key is the name and the value is the regex.
*/
public function addMatchTypes(array $matchTypes): void
{
$this->matchTypes = array_merge($this->matchTypes, $matchTypes);
}
/**
* Map a route to a target
*
* @param string $method One of 5 HTTP Methods, or a pipe-separated list of multiple HTTP Methods (GET|POST|PATCH|PUT|DELETE)
* @param string $route The route regex, custom regex must start with an @. You can use multiple pre-set regex filters, like [i:id]
* @param mixed $target The target where this route should point to. Can be anything.
* @param string|null $name Optional name of this route. Supply if you want to reverse route this url in your application.
* @throws Exception
*/
public function map(string $method, string $route, mixed $target, string $name = null): void
{
$this->routes[] = [$method, $route, $target, $name];
if ($name) {
if (isset($this->namedRoutes[$name])) {
throw new RuntimeException("Can not redeclare route ".$name);
}
$this->namedRoutes[$name] = $route;
}
}
/**
* Reversed routing
*
* Generate the URL for a named route. Replace regexes with supplied parameters
*
* @param string $routeName The name of the route.
* @param array $params @params Associative array of parameters to replace placeholders with.
* @return string The URL of the route with named parameters in place.
* @throws Exception
*/
public function generate(string $routeName, array $params = []): string
{
// Check if named route exists
if (!isset($this->namedRoutes[$routeName])) {
throw new RuntimeException("Route ".$routeName." does not exist.");
}
// Replace named parameters
$route = $this->namedRoutes[$routeName];
// prepend base path to route url again
$url = $this->basePath . $route;
if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) {
foreach ($matches as $index => $match) {
list($block, $pre, $type, $param, $optional) = $match;
if ($pre) {
$block = substr($block, 1);
}
if (isset($params[$param])) {
// Part is found, replace for param value
$url = str_replace($block, $params[$param], $url);
} elseif ($optional && $index !== 0) {
// Only strip preceding slash if it's not at the base
$url = str_replace($pre . $block, '', $url);
} else {
// Strip match block
$url = str_replace($block, '', $url);
}
}
}
return $url;
}
/**
* Match a given Request Url against stored routes
* @param string|null $requestUrl
* @param string|null $requestMethod
* @return array|boolean Array with route information on success, false on failure (no match).
*/
public function match(string $requestUrl = null, string $requestMethod = null): bool|array
{
$params = [];
// set Request Url if it isn't passed as parameter
if ($requestUrl === null) {
$requestUrl = $_SERVER['REQUEST_URI'] ?? '/';
}
// strip base path from request url
$requestUrl = substr($requestUrl, strlen($this->basePath));
// Strip query string (?a=b) from Request Url
if (($strpos = strpos($requestUrl, '?')) !== false) {
$requestUrl = substr($requestUrl, 0, $strpos);
}
$lastRequestUrlChar = $requestUrl ? $requestUrl[strlen($requestUrl)-1] : '';
// set Request Method if it isn't passed as a parameter
if ($requestMethod === null) {
$requestMethod = $_SERVER['REQUEST_METHOD'] ?? 'GET';
}
foreach ($this->routes as $handler) {
list($methods, $route, $target, $name) = $handler;
$method_match = (stripos($methods, $requestMethod) !== false);
// Method did not match, continue to next route.
if (!$method_match) {
continue;
}
if ($route === '*') {
// * wildcard (matches all)
$match = true;
} elseif (isset($route[0]) && $route[0] === '@') {
// @ regex delimiter
$pattern = '`' . substr($route, 1) . '`u';
$match = preg_match($pattern, $requestUrl, $params) === 1;
} elseif (($position = strpos($route, '[')) === false) {
// No params in url, do string comparison
$match = strcmp($requestUrl, $route) === 0;
} else {
// Compare longest non-param string with url before moving on to regex
// Check if last character before param is a slash, because it could be optional if param is optional too (see https://github.com/dannyvankooten/AltoRouter/issues/241)
if (strncmp($requestUrl, $route, $position) !== 0 && ($lastRequestUrlChar === '/' || $route[$position-1] !== '/')) {
continue;
}
$regex = $this->compileRoute($route);
$match = preg_match($regex, $requestUrl, $params) === 1;
}
if ($match) {
if ($params) {
foreach ($params as $key => $value) {
if (is_numeric($key)) {
unset($params[$key]);
}
}
}
return [
'target' => $target,
'params' => $params,
'name' => $name
];
}
}
return false;
}
/**
* Compile the regex for a given route (EXPENSIVE)
* @param $route
* @return string
*/
protected function compileRoute($route): string
{
if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) {
$matchTypes = $this->matchTypes;
foreach ($matches as $match) {
list($block, $pre, $type, $param, $optional) = $match;
if (isset($matchTypes[$type])) {
$type = $matchTypes[$type];
}
if ($pre === '.') {
$pre = '\.';
}
$optional = $optional !== '' ? '?' : null;
//Older versions of PCRE require the 'P' in (?P<named>)
$pattern = '(?:'
. ($pre !== '' ? $pre : null)
. '('
. ($param !== '' ? "?P<$param>" : null)
. $type
. ')'
. $optional
. ')'
. $optional;
$route = str_replace($block, $pattern, $route);
}
}
return "`^$route$`u";
}
}

@ -1,40 +1,51 @@
<?php
//prs0 compliant
namespace Config;
use RuntimeException;
require_once(__DIR__.'/vendor/autoload.php');
class Autoload
{
private static $_instance = null;
private static mixed $instance = null;
/**
* @return mixed
*/
public static function getInstance(): mixed
{
return self::$instance;
}
public static function charger()
public static function charger(): void
{
if(null !== self::$_instance) {
if (null !== self::$instance) {
throw new RuntimeException(sprintf('%s is already started', __CLASS__));
}
self::$_instance = new self();
self::$instance = new self();
if(!spl_autoload_register(array(self::$_instance, '_autoload'), false)) {
throw RuntimeException(sprintf('%s : Could not start the autoload', __CLASS__));
if (!spl_autoload_register(array(self::$instance, 'autoloader'))) {
throw new RuntimeException(sprintf('%s : Could not start the autoload', __CLASS__));
}
}
public static function shutDown()
public static function shutDown(): void
{
if(null !== self::$_instance) {
if (null !== self::$instance) {
if(!spl_autoload_unregister(array(self::$_instance, '_autoload'))) {
if (!spl_autoload_unregister(array(self::$instance, 'autoloader'))) {
throw new RuntimeException('Could not stop the autoload');
}
self::$_instance = null;
self::$instance = null;
}
}
private static function _autoload($className)
private static function autoloader($className): void
{
// echo $className;
$folder = "./";
$className = ltrim($className, '\\');
$fileName = '';
@ -46,10 +57,6 @@ class Autoload
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
include $folder . $fileName;
require_once $folder.$fileName;
}
}
?>

@ -0,0 +1,82 @@
<?php
namespace Config;
class Clean
{
/**
* Cette fonction prend une chaîne de caractères en entrée et retourne une version nettoyée de cette chaîne.
* Elle supprime les espaces de début et de fin, ainsi que toutes les balises HTML et encode les
* caractères spéciaux.
*
* @param string $string La chaîne à nettoyer
* @return string La chaîne nettoyée
*/
public static function simpleString(string $string): string
{
$string = strip_tags($string);
$string = trim($string);
return htmlspecialchars($string);
}
/**
* Cette fonction prend un tableau de chaînes de caractères en entrée et retourne un tableau de chaînes
* nettoyées.
* Elle supprime les espaces de début et de fin, ainsi que toutes les balises HTML, et encode les
* caractères spéciaux.
*
* @param array $array Le tableau de chaînes à nettoyer
* @return array Le tableau de chaînes nettoyées
*/
public static function simpleStringArray(array $array): array
{
$array = array_map('htmlspecialchars', $array);
$array = array_map('trim', $array);
$array = array_map('strip_tags', $array);
$array = array_map(function ($element) {
return trim(preg_replace('/\s+/', ' ', $element));
}, $array);
return array_map('trim', $array);
}
/**
* Cette fonction prend une chaîne de caractères en entrée et retourne une version nettoyée de cette chaîne.
* Elle supprime les espaces de début et de fin, ainsi que toutes les balises HTML et encode les
* caractères spéciaux.
* @param $email
* @return string La chaîne nettoyée
*/
public static function email($email): string
{
// Vérifier si l'adresse e-mail est valide
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// Supprimer les caractères incorrects
$email = preg_replace('/[^a-zA-Z0-9.@]/', '', $email);
}
return filter_var($email, FILTER_SANITIZE_EMAIL);
}
/**
* Cette fonction prend un nombre entier en entrée, nettoie et retourne une version formatée de l'entier.
* Elle applique la fonction filter_var avec le filtre FILTER_SANITIZE_NUMBER_INT.
* @param int $int Le nombre entier à nettoyer et formater
* @return int Le nombre entier formaté
*/
public static function int(mixed $int): int
{
if (!is_int($int)) {
$cleaned = preg_replace('/[^0-9]/', '', $int);
return filter_var(intval($cleaned), FILTER_SANITIZE_NUMBER_INT);
}
return filter_var($int, FILTER_SANITIZE_NUMBER_INT);
}
}

@ -1,5 +1,7 @@
<?php
namespace Config;
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@ -29,7 +31,7 @@
* $classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine');
* $classLoader->register();
*
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @author Jonathan H. Wage <jonwage@gmail.com>
* @author Roman S. Borschel <roman@code-factory.org>
* @author Matthew Weier O'Phinney <matthew@zend.com>
@ -38,21 +40,22 @@
*/
class SplClassLoader
{
private $_fileExtension = '.php';
private $_namespace;
private $_includePath;
private $_namespaceSeparator = '\\';
private string $fileExtension = '.php';
private ?string $namespace;
private ?string $includePath;
private string $namespaceSeparator = '\\';
/**
* Creates a new <tt>SplClassLoader</tt> that loads classes of the
* specified namespace.
*
* @param string $ns The namespace to use.
* @param string|null $ns The namespace to use.
* @param string|null $includePath
*/
public function __construct(string $ns = null, string $includePath = null)
{
$this->_namespace = $ns;
$this->_includePath = $includePath;
$this->namespace = $ns;
$this->includePath = $includePath;
}
/**
@ -60,19 +63,19 @@ class SplClassLoader
*
* @param string $sep The separator to use.
*/
public function setNamespaceSeparator(string $sep)
public function setNamespaceSeparator(string $sep): void
{
$this->_namespaceSeparator = $sep;
$this->namespaceSeparator = $sep;
}
/**
* Gets the namespace seperator used by classes in the namespace of this class loader.
* Gets the namespace separator used by classes in the namespace of this class loader.
*
* @return void
* @return string
*/
public function getNamespaceSeparator()
public function getNamespaceSeparator(): string
{
return $this->_namespaceSeparator;
return $this->namespaceSeparator;
}
/**
@ -80,9 +83,9 @@ class SplClassLoader
*
* @param string $includePath
*/
public function setIncludePath(string $includePath)
public function setIncludePath(string $includePath): void
{
$this->_includePath = $includePath;
$this->includePath = $includePath;
}
/**
@ -90,9 +93,9 @@ class SplClassLoader
*
* @return string $includePath
*/
public function getIncludePath()
public function getIncludePath(): string
{
return $this->_includePath;
return $this->includePath;
}
/**
@ -100,9 +103,9 @@ class SplClassLoader
*
* @param string $fileExtension
*/
public function setFileExtension($fileExtension)
public function setFileExtension(string $fileExtension): void
{
$this->_fileExtension = $fileExtension;
$this->fileExtension = $fileExtension;
}
/**
@ -110,15 +113,15 @@ class SplClassLoader
*
* @return string $fileExtension
*/
public function getFileExtension()
public function getFileExtension(): string
{
return $this->_fileExtension;
return $this->fileExtension;
}
/**
* Installs this class loader on the SPL autoload stack.
*/
public function register()
public function register(): void
{
spl_autoload_register(array($this, 'loadClass'));
}
@ -126,7 +129,7 @@ class SplClassLoader
/**
* Uninstalls this class loader from the SPL autoloader stack.
*/
public function unregister()
public function unregister(): void
{
spl_autoload_unregister(array($this, 'loadClass'));
}
@ -137,19 +140,21 @@ class SplClassLoader
* @param string $className The name of the class to load.
* @return void
*/
public function loadClass(string $className)
public function loadClass(string $className): void
{
if (null === $this->_namespace || $this->_namespace.$this->_namespaceSeparator === substr($className, 0, strlen($this->_namespace.$this->_namespaceSeparator))) {
$concatenateNamespace = $this->namespace . $this->namespaceSeparator;
if (null === $this->namespace || str_starts_with($className, $concatenateNamespace)) {
$fileName = '';
$namespace = '';
if (false !== ($lastNsPos = strripos($className, $this->_namespaceSeparator))) {
if (false !== ($lastNsPos = strripos($className, $this->namespaceSeparator))) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
$fileName = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $namespace);
$fileName .= DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->_fileExtension;
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->fileExtension;
require ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName;
require_once ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') . $fileName;
}
}
}
}

@ -0,0 +1,134 @@
<?php
namespace Config;
require_once "config.php";
class Validate
{
/**
* Valide une adresse e-mail en utilisant la fonction filter_var() de PHP et une
* longueur maximale définie globalement.
*
* @param string $email L'adresse e-mail à valider.
* @return bool Vrai si l'adresse e-mail est valide et respecte la longueur maximale définie, faux sinon.
*/
public static function email(String $email): bool
{
// Vérifier si l'adresse e-mail est valide
return filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($email) <= $GLOBALS['emailMaxLength'];
}
/**
* Valide un pseudo en vérifiant que la longueur est suffisante, qu'il contient uniquement des
* caractères alphanumériques, et qu'il respecte la longueur maximale définie globalement.
*
* @param string $login
* @return bool Vrai si le pseudo est valide, faux sinon.
*/
public static function login(string $login) : bool
{
// Vérifier si la longueur est supérieure à 3.
if (strlen($login) <= 3 || !ctype_alnum($login) || strlen($login) >= $GLOBALS['pseudoMaxLength']) {
return false;
}
return true;
}
/**
* Valide un mot de passe en vérifiant que la longueur est suffisante, qu'il contient au moins un chiffre
* et une lettre, et qu'il respecte la longueur maximale définie globalement.
*
* @param string $password Le mot de passe à valider.
* @return bool Vrai si le mot de passe est valide, faux sinon.
*/
public static function password(string $password) : bool
{
return (strlen($password) >= 8 && strlen($password) <=$GLOBALS['passwordMaxLength'] &&
preg_match("/\d/", $password) && preg_match("#[a-zA-Z]+#", $password));
}
/**
* Vérifie si le mot-clé est valide.
*
* @param string $keyword Le mot-clé à vérifier
* @return bool Vrai si le mot-clé est valide, faux sinon.
*/
public static function keyWord(string $keyword) : bool
{
return (strlen($keyword) <= $GLOBALS['keyWordMaxLength'] && strlen($keyword) >= 3);
}
/**
* Vérifie si le titre est valide.
*
* @param string $title Le titre à vérifier
* @return bool Vrai si le titre est valide, faux sinon.
*/
public static function title(string $title) : bool
{
return (strlen($title) <= $GLOBALS['titleMaxLength'] && strlen($title) >= 3);
}
/**
* Vérifie si le type est valide.
*
* @param string $type Le type à vérifier
* @return bool Vrai si le type est valide, faux sinon.
*/
public static function type(string $type) : bool
{
return (strlen($type) <= $GLOBALS['typeMaxLength'] && strlen($type) >=3);
}
/**
* Vérifie si la réponse est valide.
*
* @param string $response La réponse à vérifier
* @return bool Vrai si la réponse est valide, faux sinon.
*/
public static function response(string $response) : bool
{
return (strlen($response) <= $GLOBALS['responseMaxLength'] && !empty($response));
}
/**
* Vérifie si le nom est valide.
*
* @param string $username
* @return bool Vrai si le nom est valide, faux sinon.
*/
public static function username(string $username): bool
{
if (strlen($username) <= 3 || !ctype_alnum($username) || strlen($username) >= $GLOBALS['usernameMaxLength']) {
return false;
}
return true;
}
/**
* Vérifie si la description est valide.
*
* @param array $categories
* @return bool Vrai si la description est valide, faux sinon.
*/
public static function categories(array $categories): bool
{
foreach ($categories as $category) {
if (strlen($category) > $GLOBALS['categoriesMaxLength']) {
return false;
}
}
return true;
}
}

@ -0,0 +1,22 @@
{
"name": "dorian/config",
"description": "composer for guzzle client",
"require": {
"guzzlehttp/psr7": "^2.4",
"guzzlehttp/guzzle": "^7.5",
"composer/xdebug-handler": "^3.0"
},
"autoload": {
"classmap": [
"../../Source/"
],
"psr-4": {
"BusinessClass\\" : "../BusinessClass",
"Config\\" : "../Config"
}
},
"require-dev": {
"phpunit/phpunit": "^9.0"
}
}

File diff suppressed because it is too large Load Diff

@ -1,8 +1,42 @@
<?php
$rep = __DIR__ . '/../';
// Vues
$views['form'] = 'Views/HTML/form.php';
$views['admin'] = 'Views/HTML/admin.php';
$views['adminLogin'] = 'Views/HTML/adminLogin.php';
$views['possibleResponsesForm'] = 'Views/HTML/possibleResponsesForm.php';
$views['continue'] = 'Views/HTML/continue.php';
$views['categories'] = 'Views/HTML/categories.php';
$views['questions'] = 'Views/HTML/questions.php';
$views['responses'] = 'Views/HTML/responses.php';
$views['thanks'] = 'Views/HTML/thanks.php';
$views['error'] = 'Views/HTML/error.php';
$_SERVER['BASE_URI'] = '';
$controller['Candidate'] = 'ControllerCandidate';
$controller['Admin'] = 'ControllerAdmin';
$googleApis = "https://fonts.googleapis.com";
$googleStatic = "https://fonts.gstatic.com";
$poppins = "https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap";
$icon = "https://cdn.uca.fr/images/favicon/favicon.ico";
$logoUCA = "https://cdn.uca.fr/images/logos/logo_uca_mini_light.png";
$bootstrapIcon = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css";
$bootstrapMin = "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css";
$awesomeFont = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";
$jQueryMin = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js";
$bundle4 = "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js";
$bundle5 = "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js";
$GLOBALS['emailMaxLength']=150;
$GLOBALS['pseudoMaxLength']=50;
$GLOBALS['passwordMaxLength']=500;
$GLOBALS['keyWordMaxLength']=50;
$GLOBALS['titleMaxLength']=50;
$GLOBALS['typeMaxLength']=50;
$GLOBALS['responseMaxLength']=200;
$GLOBALS['usernameMaxLength']=50;
$GLOBALS["categoriesMaxLength"]=50;

@ -0,0 +1,25 @@
<?php
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitba6de0cdeee1f31262e2b2ebc31bffbe::getLoader();

@ -0,0 +1,585 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see https://www.php-fig.org/psr/psr-0/
* @see https://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var ?string */
private $apcuPrefix;
/**
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return string[]
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
}
return array();
}
/**
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
(array) $paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
self::$registeredLoaders[$this->vendorDir] = $this;
}
}
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
/**
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return self[]
*/
public static function getRegisteredLoaders()
{
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}

@ -0,0 +1,352 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer;
use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
/**
* @var bool|null
*/
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
/**
* Returns a list of all package names which are present, either by being installed, replaced or provided
*
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}
if (1 === \count($packages)) {
return $packages[0];
}
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName, $includeDevRequirements = true)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
}
}
return false;
}
/**
* Checks whether the given package satisfies a version constraint
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
/**
* Returns a version constraint representing all the range(s) which are installed for a given package
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
* whether a given version of a package is installed, and not just whether it exists
*
* @param string $packageName
* @return string Version constraint usable with composer/semver
*/
public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}
return $installed['versions'][$packageName]['version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return $installed['versions'][$packageName]['pretty_version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
*/
public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}
return $installed['versions'][$packageName]['reference'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/
public static function getRootPackage()
{
$installed = self::getInstalled();
return $installed[0]['root'];
}
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
*
* This is only useful for complex integrations in which a project needs to use
* this class but then also needs to execute another project's autoloader in process,
* and wants to ensure both projects have access to their version of installed.php.
*
* A typical case would be PHPUnit, where it would need to make sure it reads all
* the data it needs from this class, then call reload() with
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
* the project in which it runs can then also use this class safely, without
* interference between PHPUnit's dependencies and the project's dependencies.
*
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/
public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();
}
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}
$installed = array();
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = require __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
$installed[] = self::$installed;
return $installed;
}
}

@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,15 @@
<?php
// autoload_files.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
);

@ -0,0 +1,9 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
);

@ -0,0 +1,22 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Psr\\Log\\' => array($vendorDir . '/psr/log/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
'Config\\' => array($baseDir . '/'),
'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'),
'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'),
'BusinessClass\\' => array($baseDir . '/../BusinessClass'),
);

@ -0,0 +1,50 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitba6de0cdeee1f31262e2b2ebc31bffbe
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInitba6de0cdeee1f31262e2b2ebc31bffbe', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitba6de0cdeee1f31262e2b2ebc31bffbe', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitba6de0cdeee1f31262e2b2ebc31bffbe::getInitializer($loader));
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInitba6de0cdeee1f31262e2b2ebc31bffbe::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
}
}, null, null);
foreach ($filesToLoad as $fileIdentifier => $file) {
$requireFile($fileIdentifier, $file);
}
return $loader;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,392 @@
<?php return array(
'root' => array(
'name' => 'dorian/config',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'a4d7ce9a1ea5c39ecbf197122819a06b451efef2',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev' => true,
),
'versions' => array(
'composer/pcre' => array(
'pretty_version' => '3.1.0',
'version' => '3.1.0.0',
'reference' => '4bff79ddd77851fe3cdd11616ed3f92841ba5bd2',
'type' => 'library',
'install_path' => __DIR__ . '/./pcre',
'aliases' => array(),
'dev_requirement' => false,
),
'composer/xdebug-handler' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => 'ced299686f41dce890debac69273b47ffe98a40c',
'type' => 'library',
'install_path' => __DIR__ . '/./xdebug-handler',
'aliases' => array(),
'dev_requirement' => false,
),
'doctrine/instantiator' => array(
'pretty_version' => '2.0.0',
'version' => '2.0.0.0',
'reference' => 'c6222283fa3f4ac679f8b9ced9a4e23f163e80d0',
'type' => 'library',
'install_path' => __DIR__ . '/../doctrine/instantiator',
'aliases' => array(),
'dev_requirement' => true,
),
'dorian/config' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'a4d7ce9a1ea5c39ecbf197122819a06b451efef2',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
'pretty_version' => '7.5.0',
'version' => '7.5.0.0',
'reference' => 'b50a2a1251152e43f6a37f0fa053e730a67d25ba',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
'pretty_version' => '1.5.2',
'version' => '1.5.2.0',
'reference' => 'b94b2807d85443f9719887892882d0329d1e2598',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/psr7' => array(
'pretty_version' => '2.4.4',
'version' => '2.4.4.0',
'reference' => '3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(),
'dev_requirement' => false,
),
'myclabs/deep-copy' => array(
'pretty_version' => '1.11.1',
'version' => '1.11.1.0',
'reference' => '7284c22080590fb39f2ffa3e9057f10a4ddd0e0c',
'type' => 'library',
'install_path' => __DIR__ . '/../myclabs/deep-copy',
'aliases' => array(),
'dev_requirement' => true,
),
'nikic/php-parser' => array(
'pretty_version' => 'v4.15.4',
'version' => '4.15.4.0',
'reference' => '6bb5176bc4af8bcb7d926f88718db9b96a2d4290',
'type' => 'library',
'install_path' => __DIR__ . '/../nikic/php-parser',
'aliases' => array(),
'dev_requirement' => true,
),
'phar-io/manifest' => array(
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
'type' => 'library',
'install_path' => __DIR__ . '/../phar-io/manifest',
'aliases' => array(),
'dev_requirement' => true,
),
'phar-io/version' => array(
'pretty_version' => '3.2.1',
'version' => '3.2.1.0',
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
'type' => 'library',
'install_path' => __DIR__ . '/../phar-io/version',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/php-code-coverage' => array(
'pretty_version' => '9.2.26',
'version' => '9.2.26.0',
'reference' => '443bc6912c9bd5b409254a40f4b0f4ced7c80ea1',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/php-file-iterator' => array(
'pretty_version' => '3.0.6',
'version' => '3.0.6.0',
'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-file-iterator',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/php-invoker' => array(
'pretty_version' => '3.1.1',
'version' => '3.1.1.0',
'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-invoker',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/php-text-template' => array(
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-text-template',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/php-timer' => array(
'pretty_version' => '5.0.3',
'version' => '5.0.3.0',
'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-timer',
'aliases' => array(),
'dev_requirement' => true,
),
'phpunit/phpunit' => array(
'pretty_version' => '9.6.6',
'version' => '9.6.6.0',
'reference' => 'b65d59a059d3004a040c16a82e07bbdf6cfdd115',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/phpunit',
'aliases' => array(),
'dev_requirement' => true,
),
'psr/http-client' => array(
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-client',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-client-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0',
),
),
'psr/http-factory' => array(
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-factory',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-factory-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0',
),
),
'psr/http-message' => array(
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-message',
'aliases' => array(),
'dev_requirement' => false,
),
'psr/http-message-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '1.0',
),
),
'psr/log' => array(
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/log',
'aliases' => array(),
'dev_requirement' => false,
),
'ralouphie/getallheaders' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
'type' => 'library',
'install_path' => __DIR__ . '/../ralouphie/getallheaders',
'aliases' => array(),
'dev_requirement' => false,
),
'sebastian/cli-parser' => array(
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/cli-parser',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/code-unit' => array(
'pretty_version' => '1.0.8',
'version' => '1.0.8.0',
'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/code-unit',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/code-unit-reverse-lookup' => array(
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/comparator' => array(
'pretty_version' => '4.0.8',
'version' => '4.0.8.0',
'reference' => 'fa0f136dd2334583309d32b62544682ee972b51a',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/comparator',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/complexity' => array(
'pretty_version' => '2.0.2',
'version' => '2.0.2.0',
'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/complexity',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/diff' => array(
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/diff',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/environment' => array(
'pretty_version' => '5.1.5',
'version' => '5.1.5.0',
'reference' => '830c43a844f1f8d5b7a1f6d6076b784454d8b7ed',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/environment',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/exporter' => array(
'pretty_version' => '4.0.5',
'version' => '4.0.5.0',
'reference' => 'ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/exporter',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/global-state' => array(
'pretty_version' => '5.0.5',
'version' => '5.0.5.0',
'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/global-state',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/lines-of-code' => array(
'pretty_version' => '1.0.3',
'version' => '1.0.3.0',
'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/lines-of-code',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/object-enumerator' => array(
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/object-enumerator',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/object-reflector' => array(
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/object-reflector',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/recursion-context' => array(
'pretty_version' => '4.0.5',
'version' => '4.0.5.0',
'reference' => 'e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/recursion-context',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/resource-operations' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/resource-operations',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/type' => array(
'pretty_version' => '3.2.1',
'version' => '3.2.1.0',
'reference' => '75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/type',
'aliases' => array(),
'dev_requirement' => true,
),
'sebastian/version' => array(
'pretty_version' => '3.0.2',
'version' => '3.0.2.0',
'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/version',
'aliases' => array(),
'dev_requirement' => true,
),
'symfony/deprecation-contracts' => array(
'pretty_version' => 'v3.2.1',
'version' => '3.2.1.0',
'reference' => 'e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'theseer/tokenizer' => array(
'pretty_version' => '1.2.1',
'version' => '1.2.1.0',
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
'type' => 'library',
'install_path' => __DIR__ . '/../theseer/tokenizer',
'aliases' => array(),
'dev_requirement' => true,
),
),
);

@ -0,0 +1,26 @@
<?php
// platform_check.php @generated by Composer
$issues = array();
if (!(PHP_VERSION_ID >= 80100)) {
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.';
}
if ($issues) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
} elseif (!headers_sent()) {
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
}
}
trigger_error(
'Composer detected issues in your platform: ' . implode(' ', $issues),
E_USER_ERROR
);
}

@ -2,23 +2,203 @@
namespace Controller;
use Exception;
use InvalidArgumentException;
use Model\ModelAdmin;
use Config\Clean;
use Config\Validate;
/**
* Permet de controller les réponses à fournir en fonction des actions passer dans l'URL
* par l'administrateur
*/
class ControllerAdmin
{
/**
* Ajoute une question grâce à son contenu et son type récupéré dans le tableau $_POST
* Si la question n'est pas une question texte, on appelle un nouveau formulaire permettant
* d'ajouter des réponses prédéfinies à la question.
*
* @return void
* @throws Exception
*/
public function addQuestion(): void
{
(new ModelAdmin())->addQuestion();
$type = Clean::simpleString($_POST['type']);
if (empty($_POST['type'])) {
throw new InvalidArgumentException('$_POST[\'type\'] is empty');
}
$idQuestion = (new ModelAdmin())->addQuestion();
if (strcmp($type, "BusinessClass\TextQuestion") == 0) {
$this->goToQuestions();
} else {
$categories = (new ModelAdmin())->getCategories();
$questionContent = $_POST['question'];
global $rep, $views;
require_once($rep.$views['possibleResponsesForm']);
}
}
/**
* Supprime une question par son id récupéré par le tableau $_POST ainsi que les possibles réponses associées
*
* @return void
* @throws Exception
*/
public function deleteQuestion(): void
{
(new ModelAdmin)->deleteQuestion();
$this->goToQuestions();
}
/**
* Ajoute une possibilité de réponse à une question, on assigne également cette réponse
* à des catégories. On propose ensuite à l'utilisateur de continuer l'ajout d'autres réponses.
*
* @return void
* @throws Exception
*/
public function addResponse(): void
{
if (empty($_POST['idQuestion'] || empty($_POST['question']) || empty($_POST['type']))) {
throw new InvalidArgumentException('$_POST parameters is missing');
}
(new ModelAdmin())->addResponse();
$categories = (new ModelAdmin())->getCategories();
$idQuestion = Clean::int($_POST['idQuestion']);
$questionContent = Clean::simpleString($_POST['question']);
$type = Clean::simpleString($_POST['type']);
global $rep, $views;
require_once($rep.$views['continue']);
}
/**
* Permet de supprimer une possible réponse par son id récupéré par le tableau $_POST
*
* @return void
* @throws Exception
*/
public function deleteResponse(): void
{
(new ModelAdmin)->deleteResponse();
$this->goToQuestions();
}
/**
* Permet de proposer à l'utiliser de continuer ou non à ajouter des possibilités de réponses à l'aide
* de la fonction addResponse(). Sinon, il retourne à la page administration.
*
* @return void
* @throws Exception
*/
public function continueResponse(): void
{
$choose = Clean::simpleString($_POST['choose']);
if (empty($_POST['choose'] || empty($_POST['idQuestion']) || empty($_POST['type']) || empty($_POST['question']))) {
throw new InvalidArgumentException('$_POST parameters is missing');
}
if ($choose == "Oui") {
$idQuestion = Clean::int($_POST['idQuestion']);
$categories = (new ModelAdmin())->getCategories();
$questionContent = Clean::simpleString($_POST['question']);
$type = Clean::simpleString($_POST['type']);
global $rep, $views;
require_once($rep.$views['possibleResponsesForm']);
} else {
$this->goToQuestions();
}
}
/**
* Permet de créer un nouveau formulaire avec un titre et une description.
*
* @return void
* @throws Exception
*/
public function createForm(): void
{
(new ModelAdmin())->createForm();
}
public function goToAdminPage(): void
/**
* Permet d'ajouter une catégorie (mot-clef) à notre application
*
* @return void
* @throws Exception
*/
public function addKeyword(): void
{
(new ModelAdmin())->addKeyword();
$this->goToCategories();
}
/**
* Permet de supprimer un mot clef qui sera récupéré par le tableau $_POST
*
* @return void
* @throws Exception
*/
public function deleteKeyword(): void
{
(new ModelAdmin)->deleteKeyword();
$this->goToCategories();
}
/**
* Permet de naviguer jusqu'à la page de gestion des catégories
*
* @return void
* @throws Exception
*/
public function goToCategories(): void
{
$categories = (new ModelAdmin)->getCategories();
global $rep, $views;
require_once($rep.$views['categories']);
}
/**
* Permet de naviguer jusqu'à la page de gestion des questions
*
* @return void
* @throws Exception
*/
public function goToQuestions(): void
{
$questions = (new ModelAdmin())->getQuestions();
global $rep, $views;
require($rep.$views['admin']);
require_once($rep.$views['questions']);
}
/**
* Permet de naviguer jusqu'à la page de gestion des réponses
*
* @return void
* @throws Exception
*/
public function goToResponses(): void
{
$responsesCandidate = (new ModelAdmin)->getResponsesCandidate();
global $rep, $views;
require_once($rep.$views['responses']);
}
public function goToAdministration(): void
{
global $rep, $views;
require_once($rep.$views['admin']);
}
/**
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
(new ModelAdmin)->deleteResponsesCandidate();
$this->goToResponses();
}
}

@ -3,19 +3,66 @@
namespace Controller;
use Model\ModelCandidate;
use Exception;
/**
* Permet de controller les réponses à fournir en fonction des actions passer dans l'URL
* par l'utilisateur
*/
class ControllerCandidate
{
/**
* Permet de naviguer jusqu'au formulaire.
*
* @return void
* @throws Exception
*/
public function goToForm(): void
{
global $rep, $views;
$html = (new ModelCandidate())->getForm();
require($rep.$views['form']);
require_once($rep.$views['form']);
}
public function goToAdminLogin(): void
{
global $rep, $views;
require_once($rep.$views['adminLogin']);
}
/**
* Permet de finaliser la saisie du formulaire et de le soumettre.
*
* @return void
* @throws Exception
*/
public function submitForm(): void
{
(new ModelCandidate())->submitForm();
$this->goToThanks();
}
public function goToThanks(): void
{
global $rep, $views;
require_once($rep.$views['thanks']);
}
public function login(): void
{
global $rep,$views;
try {
$model= new ModelCandidate();
$model->login();
if ($_SESSION['role'] == "Admin") {
require_once($rep . $views['admin']);
} else {
require_once($rep . $views['adminLogin']);
}
} catch (Exception $e) {
$error = $e->getMessage();
require_once($rep . $views['adminLogin']);
}
}
}
}

@ -3,37 +3,103 @@
namespace Controller;
use Exception;
use PDOException;
use Config\Clean;
use Config\AltoRouter;
/**
* Permet de gérer l'appel des controllers en fonction de l'action et du rôle de l'utilisateur
*/
class FrontController
{
function __construct()
private AltoRouter $router;
private array $rights;
/**
* @throws Exception
*/
public function __construct()
{
$this->router = new AltoRouter();
$this->router->setBasePath($_SERVER['BASE_URI']);
$this->mapRoutes();
$this->rights = array (
'Candidate' => array('ControllerCandidate'),
'Admin' => array('ControllerCandidate','ControllerAdmin')
);
}
/**
* @return array
*/
public function getRights(): array
{
return $this->rights;
}
/**
* @return AltoRouter
*/
public function getRouter(): AltoRouter
{
/* La liste de tous les Controller */
$listControllers = array("\\Controller\\ControllerCandidate", "\\Controller\\ControllerAdmin");
global $rep, $views; // Chemin d'accès + Vues
$dVueError = array(); // Vue d'erreur
try
{
/* Si l'action est NULL on appelle goToTestimony(), sinon on nettoie l'action */
$action = $_REQUEST['action'] ? $action = $_REQUEST['action'] : (new ControllerCandidate())->goToForm();
foreach ($listControllers as $controller) // Pour chaque Controller
{
/* On regarde s'il implémente une fonction du même nom que l'action reçue */
if(method_exists($controller, $action))
{
(new $controller)->$action(); // Si oui, on appelle cette fonction
return $this->router;
}
public function run(): void
{
global $error,$rep,$views;
$exists=false;
$match = $this->router->match();
if ($match) {
$target = $match['target'];
$params = $match['params'];
if (!isset($_SESSION['role']) || ($_SESSION['role']!="Admin" && $_SESSION['role']!="Candidate")) {
$_SESSION['role'] = 'Candidate';
}
$role = Clean::simpleString($_SESSION['role']);
foreach ($this->rights[$role] as $controllerName) {
if (strcmp($controllerName, $target[0])===0) {
$controllerClass = '\Controller\\' . $target[0];
$controller = new $controllerClass();
$controller->{$target[1]}($params);
$exists=true;
}
}
} catch (PDOException|Exception $e)
{
$dVueError[] = "Erreur innatendue !"; // Ecriture du message d'erreur
echo "ERREUUUUUR";
if (!$exists) {
$error = '403';
require_once($rep . $views['error']);
}
} else {
// no route was matched
$error = '404';
require_once($rep . $views['error']);
}
}
exit(0);
/**
* @throws Exception
*/
protected function mapRoutes(): void
{
global $controller;
$this->router->map('GET', '/', array($controller['Candidate'], 'goToForm'), 'goToForm');
$this->router->map('POST', '/submitForm', array($controller['Candidate'], 'submitForm'), 'submitForm');
$this->router->map('POST', '/addQuestion', array($controller['Admin'], 'addQuestion'), 'addQuestion');
$this->router->map('POST', '/addResponse', array($controller['Admin'], 'addResponse'), 'addResponse');
$this->router->map('POST', '/continueResponse', array($controller['Admin'], 'continueResponse'), 'continueResponse');
$this->router->map('POST', '/createForm', array($controller['Admin'], 'createForm'), 'createForm');
$this->router->map('POST', '/addKeyword', array($controller['Admin'], 'addKeyword'), 'addKeyword');
$this->router->map('GET', '/goToAdmin', array($controller['Admin'], 'goToAdmin'), 'goToAdmin');
$this->router->map('GET', '/goToAdminLogin', array($controller['Candidate'], 'goToAdminLogin'), 'goToLogin');
$this->router->map('POST', '/login', array($controller['Candidate'], 'login'), 'login');
$this->router->map('GET', '/logout', array($controller['Admin'], 'logout'), 'logout');
$this->router->map('GET', '/goToCategories', array($controller['Admin'], 'goToCategories'), 'goToCategories');
$this->router->map('GET', '/goToQuestions', array($controller['Admin'], 'goToQuestions'), 'goToQuestions');
$this->router->map('GET', '/goToResponses', array($controller['Admin'], 'goToResponses'), 'goToResponses');
$this->router->map('POST', '/deleteQuestion', array($controller['Admin'], 'deleteQuestion'), 'deleteQuestion');
$this->router->map('POST', '/deleteResponse', array($controller['Admin'], 'deleteResponse'), 'deleteResponse');
$this->router->map('POST', '/deleteKeyword', array($controller['Admin'], 'deleteKeyword'), 'deleteKeyword');
$this->router->map('POST', '/deleteResponsesCandidate', array($controller['Admin'], 'deleteResponsesCandidate'), 'deleteResponsesCandidate');
}
}

@ -0,0 +1,10 @@
FROM php:8.1-apache
RUN apt-get update && apt-get install -y git zip
COPY . /var/www/html
WORKDIR /var/www/html/Config
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer update --no-autoloader && composer install --no-autoloader
RUN a2enmod rewrite
RUN a2enmod actions
RUN service apache2 restart

@ -0,0 +1,13 @@
<?php
namespace Exceptions;
use Exception;
class InexistantLoginException extends Exception
{
public function __construct()
{
parent::__construct("Identifiant inexistant");
}
}

@ -0,0 +1,13 @@
<?php
namespace Exceptions;
use Exception;
class InvalidLoginOrPasswordException extends Exception
{
public function __construct()
{
parent::__construct("Identifiant ou mot de passe invalide");
}
}

@ -0,0 +1,13 @@
<?php
namespace Exceptions;
use Exception;
class InvalidUsernameOrPasswordException extends Exception
{
public function __construct($message = "Nom d'utilisateur ou mot de passe invalide", $code = 0, Exception $previous = null)
{
parent::__construct($message, $code, $previous);
}
}

@ -0,0 +1,35 @@
<?php
namespace Model;
use BusinessClass\Question;
/**
* Décrit les fonctionnalités principales d'une fabrique
*/
abstract class Factory
{
/**
* Permet de créer un objet grâce au retour d'une Gateway.
*
* @param array $results
*
* @return array
*/
abstract public function create(array $results): array;
/**
* Permet de récupérer les objets créés par la fonction create().
*
* @param array $results
* @param string $type
*
* @return array
*/
public static function getBuiltObjects(array $results, string $type): array
{
$type = "\\Model\\Factory" . $type;
return (new $type())->create($results);
}
}

@ -0,0 +1,40 @@
<?php
namespace Model;
use BusinessClass\Question;
use BusinessClass\TextQuestion;
/**
* Décrit une fabrique de questions
*/
class FactoryQuestion extends Factory
{
/**
* Permet de créer une liste de question en fonction du retour d'une gateway
* passer en paramètre. On prend en compte les différents types de question.
*
* @param array $results
*
* @return array
*/
public function create(array $results): array
{
$questions = [];
if ($results[0] != null) {
for ($i = 0; $i < count($results[0]); $i++) {
if (strcmp($results[0][$i]->type, "BusinessClass/TextQuestion") == 0) {
$questions[] = new TextQuestion($results[0][$i]->id, $results[0][$i]->content);
} else {
$possiblesResponses = $results[1][$i];
$content = $results[0][$i]->content;
$categories = $results[2][$i];
$id = $results[0][$i]->id;
$questions[] = new $results[0][$i]->type($possiblesResponses, $content, $categories, $id);
}
}
}
return $questions;
}
}

@ -2,55 +2,351 @@
namespace Model;
use API\script\Gateway\GatewayForm;
use API\script\Gateway\GatewayQuestion;
use BusinessClass\Form;
use BusinessClass\ListBoxQuestion;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
use PDOException;
use Config\Validate;
use Config\Clean;
/**
* Permet de développer les fonctions appelées par le controllerAdmin pour gérer
* les actions de l'administrateur
*/
class ModelAdmin
{
public function addQuestion(): void
private Client $client;
public function __construct()
{
$questionContent = $_POST['question'];
$type = $_POST['type'];
$responses = $_POST['responses'];
$categories = $_POST['categories'];
$this->client = new Client(['headers' => ['Content-Type' => 'application/json'], 'verify' => false]);
}
$responses = explode(";", $responses);
array_pop($responses);
$categories = explode(";", $categories);
public function goToAdmin(): void
{
global $rep, $views;
try {
require_once($rep . $views['admin']);
} catch (PDOException $e) {
$error = $e->getMessage();
require_once($rep . $views['form']);
}
}
/**
* Permet de créer et d'ajouter une question et de retourner son ID afin de la
* reconnaitre facilement dans la suite du code.
*
* @return int
* @throws Exception
*/
public function addQuestion(): int
{
$questionContent = Clean::simpleString($_POST['question']);
$type = Clean::simpleString($_POST['type']);
try {
if (validate::type($type)) {
$question = new $type(0, $questionContent);
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$form = json_decode($res->getBody());
echo $form;
if (!empty($form)) {
$res = $this->client->request(
'POST',
'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/addQuestion?'.
'content='.$questionContent.'&'.
'classQuestion='.get_class($question).'&'.
'idForm='.$form[0]['id']
);
if ($res->getStatusCode() != 200) {
throw new Exception('AddQuestion failed');
}
return json_decode($res->getBody());
}
} else {
throw new Exception('Type de question invalide');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
return -1;
}
$tmp = [];
foreach($categories as $category)
{
$tmp[] = explode(",", $category);
/**
* Permet de supprimer une question du formulaire
*
* @return void
* @throws Exception
*/
public function deleteQuestion():void
{
$idQuestion = Clean::int($_POST["idQuestion"]);
$type = Clean::simpleString($_POST["type"]);
try {
if (!validate::type($type)) {
throw new Exception('Type de question invalide');
}
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteQuestion?'.
'classQuestion='.$type.'&'.
'id='.$idQuestion
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteQuestion failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
$categories = $tmp;
array_pop($categories);
}
if(strcmp($type,"BusinessClass\TextQuestion") == 0)
{
$question = new $type($questionContent, 0);
/**
* Permet d'ajouter une possibilité de réponse à une question en l'assignant à des catégories.
*
* @return void
* @throws Exception
*/
public function addResponse(): void
{
$idQuestion = Clean::int($_POST['idQuestion']);
$response = Clean::simpleString($_POST['response']);
$categories = Clean::simpleStringArray($_POST['categories']);
if ($categories == null) {
$categories = [];
}
else
{
$question = new $type($responses, $questionContent, $categories, 0);
try {
if (!validate::categories($categories)) {
throw new Exception('Categories invalides');
}
$res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertResponseInQuestion?'.
'response='.$response.'&'.
'categories='.json_encode($categories).'&'.
'idQuestion='.$idQuestion
);
if ($res->getStatusCode() != 200) {
throw new Exception('InsertResponseInQuestion failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
$form = (new GatewayForm())->getForm();
if(!empty($form))
{
(new GatewayQuestion())->insertQuestion($question, $form[0]['id']);
/**
* Permet de supprimer une possible réponse à une question
*
* @return void
* @throws Exception
*/
public function deleteResponse(): void
{
try {
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deletePossibleResponse?'.
'id='.$_POST["possibleResponse"]
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeletePossibleResponse failed');
}
} catch (GuzzleException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de créer un nouveau formulaire en précisant son titre et sa description.
*
* @return void
* @throws Exception
*/
public function createForm(): void
{
if(empty((new GatewayForm())->getForm()))
{
$form = new Form(0, "Votre avis nous intéresse !!!", "Description de notrer formulaire", array());
(new GatewayForm())->insertForm($form);
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$formulaire = json_decode($res->getBody());
if (empty($formulaire)) {
$form = new Form(0, "Votre avis nous intéresse !!!", "Description de notre formulaire", array());
$res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertForm?'.
'title='.$form->getTitle().'&'.
'description='.$form->getDescription()
);
if ($res->getStatusCode() != 200) {
throw new Exception('InsertForm failed');
}
}
} catch (GuzzleException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet d'ajouter une nouvelle catégorie (mot-clef)
*
* @return void
* @throws Exception
*/
public function addKeyword(): void
{
$keyword = Clean::simpleString($_POST['keyword']);
try {
if (!validate::keyword($keyword)) {
throw new Exception('Mot-clef invalide');
}
$res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertKeyword?'.
'keyword='.$keyword
);
if ($res->getStatusCode() != 200) {
throw new Exception('InsertKeyword failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de supprimer une catégorie (mot-clef)
*
* @return void
* @throws Exception
*/
public function deleteKeyword(): void
{
try {
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteKeyword?'.
'keyword='.$_POST["idCateg"]
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteKeyword failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de récupérer toutes les catégories existantes.
*
* @return array
* @throws Exception
*/
public function getCategories(): array
{
$categories = [];
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllKeyword');
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllKeyword failed');
}
$res = json_decode($res->getBody());
foreach ($res as $category) {
$categories[] = $category["word"];
}
} catch (GuzzleException $g) {
echo "Error : ".$g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
return $categories;
}
/**
* Permet de récupérer toutes les questions existantes.
*
* @return array
* @throws Exception
*/
public function getQuestions(): array
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/existsForm');
if ($res->getStatusCode() != 200) {
throw new Exception('Exists failed');
}
if (json_decode($res->getBody())) {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$idForm = json_decode($res->getBody())[0]->id;
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllQuestions?'.
'idForm='.$idForm
);
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllQuestions failed');
}
$questionsArray = json_decode($res->getBody());
return Factory::getBuiltObjects($questionsArray, "Question");
} else {
return array();
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de récupérer toutes les réponses existantes.
*
* @return array
* @throws Exception
*/
public function getResponsesCandidate(): array
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllListResponseOfCandidate');
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllListResponsesOfCandidate failed');
}
$responsesCandidate = json_decode($res->getBody());
$results = [];
foreach ($responsesCandidate as $response) {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getDetailsListResponseOfCandidate?'.
'id='.$response->id
);
if ($res->getStatusCode() != 200) {
throw new Exception('GetDetailsListResponsesOfCandidate failed');
}
$results[] =json_decode($res->getBody());
}
return $results;
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de supprimer les réponses d'une personne d'un formulaire
*
* @return void
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
try {
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteListResponseOfCandidate?'.
'id='.Clean::int($_POST["idResponseCandidate"])
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteListResponseOfCandidate failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
}

@ -2,90 +2,196 @@
namespace Model;
use API\script\Gateway\GatewayForm;
use API\script\Gateway\GatewayQuestion;
use BusinessClass\TextQuestion;
use Config\Clean;
use Config\Validate;
use Exception;
use Exceptions\InvalidLoginOrPasswordException;
use Exceptions\InexistantLoginException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
/**
* Permet de développer les fonctions appelées par le controllerCandidate pour gérer
* les actions de l'utilisateur
*/
class ModelCandidate
{
private Client $client;
public function __construct()
{
$this->client = new Client(['headers' => ['Content-Type' => 'application/json'], 'verify' => false]);
}
/**
* Permet de soumettre et d'envoyer la réponse à un formulaire.
*
* @return void
* @throws Exception
*/
public function submitForm(): void
{
$answersAndCategories = $_POST['answers'];
$dataIds = null;
if (isset($_POST['action']) && Clean::simpleString($_POST['action']) === 'submitForm') {
$dataIdsJson = $_POST['data_ids'];
$dataIds = json_decode($dataIdsJson);
}
$answers = array();
foreach ($answersAndCategories as $answerAndCategory)
{
$answer = explode("_", $answerAndCategory);
$answer = reset($answer);
$answers[] = $answer;
$answer = [];
$category = [];
$questionsId = [];
foreach ($answersAndCategories as $answerAndCategory) {
$exploded = explode("||", $answerAndCategory);
if (count($exploded) == 3) {
$questionsId[] = Clean::int($exploded[0]);
$answer[] = Clean::simpleString($exploded[1]);
$categs = Clean::simpleString($exploded[2]);
$categs = explode("_", $categs);
array_pop($categs);
$category[] = $categs;
} else {
$questionsId[] = array_shift($dataIds);
$answer[] = $answerAndCategory;
$category[] = [];
}
}
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$form = json_decode($res->getBody());
$title = $form[0]->title;
$cate = "[".implode(',', array_map(function ($subArray) {return implode(',', $subArray);}, $category))."]";
$res =$this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertListResponseOfCandidate?'.
'id=' . implode(",", $questionsId) . '&'.
'answer=' . implode(",", $answer) . '&'.
'category=' . $cate . '&'.
'titleForm=' . $title
);
if ($res->getStatusCode() != 200) {
throw new Exception('InsertListResponsesOfCandidate failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de récupérer le code html à afficher dans la page du formulaire,
* on récupère donc le formulaire et toutes les questions qu'il contient.
* On les traduit en code HTML puis on le retourne. On utilise une Factory
* pour récupérer les questions.
*
* @return string
* @throws Exception
*/
public function getForm(): string
{
/*
$title = "Candidature à un témoignage";
$description = "Ce formulaire vous permet de candidater à un potentiel témoignage vidéo.";
$questions = array(
new TextQuestion("Décrivez-nous votre parcours en quelques lignes :"),
new ListBoxQuestion(array("Oui", "Non"), "Êtes-vous originaire de Clermont et ses alentours ? (- de 2 heures de trajet)", array(array("Clermont"), array("OrigineLointaine"))),
new ListBoxQuestion(array("BAC Général", "BAC Pro", "Étude supérieure"), "Quel étude avez-vous réalisé avant l'IUT?", array(array("Général"), array("Pro"), array("EtudSupp"))),
new CheckBoxQuestion(array("Mathématiques", "Web", "Mobile", "Gestion"), "Quels matières appréciez-vous ?", array(array("Maths", "Maths2", "Maths3"), array("Web"), array(""), array("Gestion", "Gestion2"))),
);
$form = new Form($title, $description, $questions);
*/
$form = (new GatewayForm())->getForm();
if(empty($form))
{
return "PAS DE FORMULAIRE\n";
}
$title = $form[0]['title'];
$description = $form[0]['description'];
$questionsTab = (new GatewayQuestion())->getAllQuestions($form[0]['id']);
$questions = [];
for($i = 0; $i < count($questionsTab[0]); $i++)
{
if(strcmp($questionsTab[0][$i]['type'], "BusinessClass\TextQuestion") == 0)
{
$questions[] = new TextQuestion($questionsTab[0][$i]['content'], $questionsTab[0][$i]['id']);
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$form = json_decode($res->getBody());
if (empty($form)) {
return "PAS DE FORMULAIRE\n";
}
else
{
$possiblesResponses = $questionsTab[1][$i];
$content = $questionsTab[0][$i]['content'];
$categories = $questionsTab[2][$i];
$id = $questionsTab[0][$i]['id'];
$questions[] = new $questionsTab[0][$i]['type']($possiblesResponses, $content, $categories, $id);
$title = $form[0]->title;
$description = $form[0]->description;
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllQuestions?'.
'idForm='.$form[0]->id
);
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllQuestion failed');
}
$questionsTab = json_decode($res->getBody());
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
$html = "
<h1>$title</h1>\n
<h3>$description</h3>\n
<div id='container_form'>\n
<form method='post'>\n";
$questions = Factory::getBuiltObjects($questionsTab, "Question");
$nbQuestions = count($questions);
$time = round(($nbQuestions * 20) / 60);
$html = "<div class='container mt-5'>
<div class='row d-flex justify-content-center align-items-center'>
<div class='col-md-8'>
<form id='regForm' method='post' action='submitForm'>
<h1 id='register'>$title</h1>
<div class='all-steps' id='all-steps'>";
foreach ($questions as $question)
{
$html.= $question->printStrategy()."\n";
$html .= str_repeat("<span class='step'><i class='fa'></i></span>", sizeof($questions));
$html.= "</div>";
foreach ($questions as $question) {
$html .= $question->printStrategy() . "\n";
}
$html.= "\t\t\t<input type='submit'>\n
\t\t\t<input type='hidden' name='action' value='submitForm'>
\t\t</form>\n
if (count($questions) > 0) {
$html .= "<div class='thanks-message text-center' id='text-message'> <img src='https://i.imgur.com/O18mJ1K.png' alt='text-message' width='100' class='mb-4' >
<h3>Souhaitez-vous envoyer vos réponses ?</span>
<input type='hidden' name='data_ids' value=''>
<input type='submit' value='Envoyer' id='button'>\n
<input type='hidden' name='action' value='submitForm'>
</div>
<div style='overflow:auto;' id='nextprevious'>
<div style='float:right;'>
<button type='button' id='prevBtn' onclick='nextPrev(-1)'><i class='fa fa-angle-double-left'></i></button>
<button type='button' id='nextBtn' onclick='nextPrev(1)'><i class='fa fa-angle-double-right'></i></button> </div>
</div>
</form>
</div>
</div>
</div>";
} else {
$html .= "\t\t</form>\n
\t</div>\n";
}
return $html;
}
}
/**
* @throws InvalidLoginOrPasswordException
* @throws InexistantLoginException
* @throws Exception
*/
public function login(): void
{
global $rep, $views, $sel;
$password = Clean::simpleString($_REQUEST['password']);
$identifiant = Clean::simpleString($_REQUEST['login']);
try {
if (Validate::login($identifiant) && Validate::password($password)) {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getPasswordWithLogin?'.
'login='.$identifiant
);
if ($res->getStatusCode() != 200) {
throw new Exception('GetPasswordWithLogin failed');
}
$passwordbdd = json_decode($res->getBody());
if ($passwordbdd == null) {
throw new InexistantLoginException();
}
if (password_verify($sel . $password, $passwordbdd)) {
$_SESSION['role'] = 'Admin';
} else {
$_SESSION['role'] = 'Visitor';
}
} else {
throw new InvalidLoginOrPasswordException();
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
}

@ -0,0 +1,65 @@
<?php
namespace TestBusinessClass;
use BusinessClass\BoxQuestion;
use PHPUnit\Framework\TestCase;
class BoxQuestionTest extends TestCase
{
/**
* @covers BoxQuestion::__construct
*/
public function testConstructorWithFourArguments()
{
$args = [['response1', 'response2'], 'question', ['category1', 'category2'], 1];
$boxQuestion = new class(4, $args) extends BoxQuestion {
public function printStrategy(): string
{
return '';
}
};
$this->assertEquals($args[0], $boxQuestion->getPossibleResponses());
$this->assertEquals($args[2], $boxQuestion->getCategories());
}
/**
* @covers BoxQuestion::setPossibleResponses
*/
public function testSetPossibleResponses()
{
$args = [1, 'question'];
$possibleResponses = ['response1', 'response2'];
$boxQuestion = new class(2, $args) extends BoxQuestion {
public function printStrategy(): string
{
return '';
}
};
$boxQuestion->setPossibleResponses($possibleResponses);
$this->assertEquals($possibleResponses, $boxQuestion->getPossibleResponses());
}
/**
* @covers BoxQuestion::setCategories
*/
public function testSetCategories()
{
$args = [1, 'question'];
$categories = ['category1', 'category2'];
$boxQuestion = new class(2, $args) extends BoxQuestion {
public function printStrategy(): string
{
return '';
}
};
$boxQuestion->setCategories($categories);
$this->assertEquals($categories, $boxQuestion->getCategories());
}
}

@ -0,0 +1,87 @@
<?php
namespace TestBusinessClass;
use BusinessClass\Form;
use PHPUnit\Framework\TestCase;
class FormTest extends TestCase
{
/**
* @covers Form::getTitle
*/
public function testGetTitleReturnsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$this->assertEquals('Titre du formulaire', $form->getTitle());
}
/**
* @covers Form::setTitle
*/
public function testSetTitleSetsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$form->setTitle('Nouveau titre');
$this->assertEquals('Nouveau titre', $form->getTitle());
}
/**
* @covers Form::getDescription
*/
public function testGetDescriptionReturnsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$this->assertEquals('Description du formulaire', $form->getDescription());
}
/**
* @covers Form::setDescription
*/
public function testSetDescriptionSetsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$form->setDescription('Nouvelle description');
$this->assertEquals('Nouvelle description', $form->getDescription());
}
/**
* @covers Form::getQuestions
*/
public function testGetQuestionsReturnsCorrectValue()
{
$questions = [
'Question 1',
'Question 2',
'Question 3'
];
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', $questions);
$this->assertEquals($questions, $form->getQuestions());
}
/**
* @covers Form::setQuestions
*/
public function testSetQuestionsSetsCorrectValue()
{
$questions = [
'Question 1',
'Question 2',
'Question 3'
];
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$form->setQuestions($questions);
$this->assertEquals($questions, $form->getQuestions());
}
/**
* @covers Form::getId
*/
public function testGetIdReturnsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);
$this->assertEquals(1, $form->getId());
}
}

@ -0,0 +1,24 @@
<?php
namespace TestBusinessClass;
use BusinessClass\IPrintQuestionStrategy;
use PHPUnit\Framework\TestCase;
class IPrintQuestionStrategyTest extends TestCase
{
/**
* @covers IPrintQuestionStrategy::printStrategy
*/
public function testPrintStrategy()
{
$strategy = new class implements IPrintQuestionStrategy {
public function printStrategy(): string
{
return '<div>Question</div>';
}
};
$this->assertEquals('<div>Question</div>', $strategy->printStrategy());
}
}

@ -0,0 +1,37 @@
<?php
namespace TestBusinessClass;
use BusinessClass\Keyword;
use PHPUnit\Framework\TestCase;
class KeywordTest extends TestCase
{
/**
* @covers Keyword::construct
*/
public function testConstructor()
{
$id = 1;
$word = 'example';
$keyword = new Keyword($id, $word);
$this->assertEquals($id, $keyword->getId());
$this->assertEquals($word, $keyword->getWord());
}
/**
* @covers Keyword::setWord
*/
public function testSetWord()
{
$id = 1;
$word = 'example';
$newWord = 'new example';
$keyword = new Keyword($id, $word);
$keyword->setWord($newWord);
$this->assertEquals($newWord, $keyword->getWord());
}
}

@ -0,0 +1,45 @@
<?php
namespace TestBusinessClass;
use BusinessClass\Question;
use PHPUnit\Framework\TestCase;
class QuestionTest extends TestCase
{
/**
* @covers Question::constructor
*/
public function testConstructor()
{
$id = 1;
$content = 'What is your name?';
$question = new class($id, $content) extends Question {
public function printStrategy(): string
{
return '';
}
};
$this->assertEquals($id, $question->getId());
$this->assertEquals($content, $question->getContent());
}
/**
* @covers Question::setContent
*/
public function testSetContent()
{
$content = 'What is your age?';
$question = new class(1, 'question') extends Question {
public function printStrategy(): string
{
return '';
}
};
$question->setContent($content);
$this->assertEquals($content, $question->getContent());
}
}

@ -0,0 +1,63 @@
<?php
namespace TestBusinessClass;
use BusinessClass\Response;
use PHPUnit\Framework\TestCase;
class ResponseTest extends TestCase
{
private int $id = 1;
private string $date = "2022-03-18";
private string $titleForm = "My Form";
private array $questionsResponses = [
"Question 1" => "Response 1",
"Question 2" => "Response 2"
];
/**
* @covers Response::getId
* @covers Response::getDate
* @covers Response::getTitleForm
* @covers Response::getQuestionsResponses
*
*/
public function testGetters()
{
$response = new Response($this->id, $this->date, $this->titleForm, $this->questionsResponses);
$this->assertEquals($this->id, $response->getId());
$this->assertEquals($this->date, $response->getDate());
$this->assertEquals($this->titleForm, $response->getTitleForm());
$this->assertEquals($this->questionsResponses, $response->getQuestionsResponses());
}
/**
* @covers Response::setDate
* @covers Response::setTitleForm
* @covers Response::setQuestionsResponses
*
*/
public function testSetters()
{
$response = new Response($this->id, $this->date, $this->titleForm, $this->questionsResponses);
$newDate = "2023-03-18";
$response->setDate($newDate);
$this->assertEquals($newDate, $response->getDate());
$newTitleForm = "New Form";
$response->setTitleForm($newTitleForm);
$this->assertEquals($newTitleForm, $response->getTitleForm());
$newQuestionsResponses = [
"Question 1" => "New Response 1",
"Question 2" => "New Response 2"
];
$response->setQuestionsResponses($newQuestionsResponses);
$this->assertEquals($newQuestionsResponses, $response->getQuestionsResponses());
}
}

@ -0,0 +1,29 @@
<?php
namespace TestBusinessClass;
use BusinessClass\TextQuestion;
use PHPUnit\Framework\TestCase;
class TextQuestionTest extends TestCase
{
/**
* @covers TextQuestion::printStrategy
*
*/
public function testPrintStrategy()
{
$content = 'What is your name?';
$id = 1;
$textQuestion = new TextQuestion($id, $content);
$expectedOutput = "<div class='tab'>
<h6>$content</h6>
<p>
<input data-id='$id' placeholder='...' oninput='this.className = '''' type='text' name='answers[]'>
</p>
</div>\n";
$this->assertEquals($expectedOutput, $textQuestion->printStrategy());
}
}

@ -0,0 +1,89 @@
<?php
namespace TestConfig;
use Config\AltoRouter;
use Exception;
use PHPUnit\Framework\TestCase;
use RuntimeException;
class AltoRouterTest extends TestCase
{
protected AltoRouter $router;
public function setUp(): void
{
$this->router = new AltoRouter();
}
/**
* @throws Exception
* @covers AltoRouter::addRoutes
*/
public function testAddRoutesThrowsExceptionForInvalidInput()
{
$this->expectException(RuntimeException::class);
$this->router->addRoutes('invalid input');
}
/**
* @covers AltoRouter::getRoutes
*/
public function testGetRoutesReturnsArrayOfRoutes()
{
$this->assertIsArray($this->router->getRoutes());
}
/**
* @covers AltoRouter::setBasePath
*/
public function testSetBasePathSetsBasePath()
{
$this->router->setBasePath('/test');
$this->assertEquals('/test', $this->router->getBasePath());
}
/**
* @covers AltoRouter::getMatchTypes
*/
public function testAddMatchTypesAddsMatchTypes()
{
$this->router->addMatchTypes(['test' => 'regex']);
$this->assertArrayHasKey('test', $this->router->getMatchTypes());
}
/**
* @throws Exception
* @covers AltoRouter::map
* @covers AltoRouter::getRoutes
*/
public function testMapAddsRouteToRoutesArray()
{
$this->router->map('GET', '/test', 'handler');
$this->assertEquals([['GET', '/test', 'handler', null]], $this->router->getRoutes());
}
/**
* @throws Exception
* @covers AltoRouter::map
* @covers AltoRouter::getNamedRoutes
*/
public function testMapAddsNamedRouteToNamedRoutesArray()
{
$this->router->map('GET', '/test', 'handler', 'test');
$this->assertEquals('/test', $this->router->getNamedRoutes()['test']);
}
/**
* @throws Exception
* @covers AltoRouter::map
*/
public function testMapThrowsExceptionForDuplicateNamedRoutes()
{
$this->expectException(RuntimeException::class);
$this->router->map('GET', '/test', 'handler', 'test');
$this->router->map('GET', '/test2', 'handler', 'test');
}
}

@ -0,0 +1,67 @@
<?php
namespace TestConfig;
use Config\Clean;
use PHPUnit\Framework\TestCase;
class CleanTest extends TestCase
{
/**
* @covers Clean::simpleString
*/
public function testSimpleString()
{
// Test avec une chaîne de caractères qui contient des balises HTML et des espaces
$string = '<p> Test avec des espaces ! </p>';
$expected = 'Test avec des espaces !';
$this->assertEquals($expected, Clean::simpleString($string));
// Test avec une chaîne de caractères qui contient des caractères spéciaux
$string = 'Ceci est une chaîne & avec des "caractères" spéciaux !';
$expected = 'Ceci est une chaîne &amp; avec des &quot;caractères&quot; spéciaux !';
$this->assertEquals($expected, Clean::simpleString($string));
}
/**
* @covers Clean::simpleStringArray
*/
public function testSimpleStringArray()
{
// Test avec une chaîne de caractères qui contient des balises HTML et des espaces
$array = ['Test ','avec ','des ','trucs !'];
$expected = ['Test','avec','des','trucs !'];
$this->assertEquals($expected, Clean::simpleStringArray($array));
}
/**
* @covers Clean::email
*/
public function testEmail()
{
// Test avec une adresse email valide
$email = 'john.doe@example.com';
$expected = 'john.doe@example.com';
$this->assertEquals($expected, Clean::email($email));
// Test avec une adresse email invalide
$email = 'john.doe@<??|||""__##:;>example.com';
$this->assertEquals($expected, Clean::email($email));
}
/**
* @covers Clean::int
*/
public function testInt()
{
// Test avec un entier valide
$int = '1234';
$expected = 1234;
$this->assertEquals($expected, Clean::int($int));
// Test avec un entier invalide
$int = '1234abc';
$this->assertEquals($expected, Clean::int($int));
}
}

@ -0,0 +1,94 @@
<?php
namespace TestConfig;
use PHPUnit\Framework\TestCase;
use Config\Validate;
class ValidateTest extends TestCase
{
/**
* @covers Validate::email
*/
public function testEmail()
{
$this->assertTrue(Validate::email('john.doe@example.com'));
$this->assertFalse(Validate::email('john.doe@'));
$this->assertFalse(Validate::email('john.doe@example.commmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'));
}
/**
* @covers Validate::login
*/
public function testLogin()
{
$this->assertTrue(Validate::login('john123'));
$this->assertFalse(Validate::login('joh'));
$this->assertFalse(Validate::login('joh!'));
$this->assertFalse(Validate::login('john123456789012345555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555'));
}
/**
* @covers Validate::password
*/
public function testPassword()
{
$this->assertTrue(Validate::password('Pa$$w0rd'));
$this->assertFalse(Validate::password('password'));
$this->assertFalse(Validate::password('12345678'));
$this->assertFalse(Validate::password('pa$$word'));
$this->assertFalse(Validate::password('P@$$worddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::keyWord
*/
public function testKeyWord()
{
$this->assertTrue(Validate::keyWord('keyword'));
$this->assertFalse(Validate::keyWord('ke'));
$this->assertFalse(Validate::keyWord('keyworddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::title
*/
public function testTitle()
{
$this->assertTrue(Validate::title('Title'));
$this->assertFalse(Validate::title('Ti'));
$this->assertFalse(Validate::title('titleddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::type
*/
public function testType()
{
$this->assertTrue(Validate::type('Type'));
$this->assertFalse(Validate::type('Ty'));
$this->assertFalse(Validate::type('typeddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::response
*/
public function testResponse()
{
$this->assertTrue(Validate::response('Response'));
$this->assertFalse(Validate::response(''));
$this->assertFalse(Validate::response('responseddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::username
*/
public function testUsername()
{
$this->assertTrue(Validate::username('john123'));
$this->assertFalse(Validate::username('jo'));
$this->assertFalse(Validate::username('joh!'));
$this->assertFalse(Validate::username('john1234567890123455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555'));
}
}

@ -0,0 +1,21 @@
<?php
namespace TestException;
use Exception;
use Exceptions\InexistantLoginException;
use PHPUnit\Framework\TestCase;
class InexistantLoginExceptionTest extends TestCase
{
/**
* @covers InexistantLoginException::constructor
*/
public function testConstructor()
{
$exception = new InexistantLoginException();
$this->assertInstanceOf(InexistantLoginException::class, $exception);
$this->assertInstanceOf(Exception::class, $exception);
$this->assertEquals("Identifiant inexistant", $exception->getMessage());
}
}

@ -0,0 +1,21 @@
<?php
namespace TestException;
use Exception;
use PHPUnit\Framework\TestCase;
use Exceptions\InvalidLoginOrPasswordException;
class InvalidLoginOrPasswordExceptionTest extends TestCase
{
/**
* @covers InvalidLoginOrPasswordException::constructor
*/
public function testConstructor()
{
$exception = new InvalidLoginOrPasswordException();
$this->assertInstanceOf(InvalidLoginOrPasswordException::class, $exception);
$this->assertInstanceOf(Exception::class, $exception);
$this->assertEquals("Identifiant ou mot de passe invalide", $exception->getMessage());
}
}

@ -0,0 +1,24 @@
<?php
namespace TestException;
use Exception;
use Exceptions\InvalidUsernameOrPasswordException;
use PHPUnit\Framework\TestCase;
use Exceptions\InvalidLoginOrPasswordException;
class InvalidUsernameOrPasswordExceptionTest extends TestCase
{
/**
* @covers InvalidUsernameOrPasswordException::constructor
* @covers InvalidUsernameOrPasswordException::constructor
*/
public function testConstructor()
{
$exception = new InvalidUsernameOrPasswordException();
$this->assertInstanceOf(InvalidUsernameOrPasswordException::class, $exception);
$this->assertInstanceOf(Exception::class, $exception);
$this->assertEquals("Nom d'utilisateur ou mot de passe invalide", $exception->getMessage());
}
}

@ -0,0 +1,97 @@
<?php
namespace TestModel;
use PHPUnit\Framework\TestCase;
use Model\ModelAdmin;
use Exception;
class ModelAdminTest extends TestCase
{
/**
* @covers \Model\ModelAdmin::__construct
*/
public function testConstructor()
{
$model = new ModelAdmin();
$this->assertInstanceOf(ModelAdmin::class, $model);
}
/**
* @covers ModelAdmin::addQuestion
*/
public function testAddQuestionInvalidType()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage("Type de question invalide");
$_POST['type']="JeSuisUnTypeInvalideDePlusDe50CaracteresEtJeSuisTropLongPourEtreUnTypeDeQuestionValide";
$_POST['question']="Suis-je une question valide ?";
(new ModelAdmin())->addQuestion();
}
/**
* @covers ModelAdmin::deleteQuestion
*/
public function testDeleteQuestionInvalidType()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage("Type de question invalide");
$_POST['type']="JeSuisUnTypeInvalideDePlusDe50CaracteresEtJeSuisTropLongPourEtreUnTypeDeQuestionValide";
$_POST['idQuestion']="Suis-je une question valide ?";
(new ModelAdmin())->deleteQuestion();
}
/**
* @covers ModelAdmin::addResponse
*/
public function testAddResponseInvalidCategories()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Categories invalides');
$_POST['categories']=['JeSuisUneCategorieInvalideDePlusDe50CaracteresEtJeSuisTropLonguePourEtreUneCategorieValide'];
$_POST['response']="Suis-je une réponse valide ?";
$_POST['idQuestion']=1;
(new ModelAdmin())->addResponse();
}
/**
* @covers ModelAdmin::addKeyword
*/
public function testAddKeywordInvalidKeyword()
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('Mot-clef invalide');
$_POST['keyword']="JeSuisUnMotCleInvalideDePlusDe50CaracteresEtJeSuisTropLonguePourEtreUnMotCleValide";
(new ModelAdmin())->addKeyword();
}
/**
* @covers ModelAdmin::getCategories
* @throws Exception
*/
public function testGetCategories()
{
$categories = (new ModelAdmin())->getCategories();
$this->assertIsArray($categories);
}
/**
* @covers ModelAdmin::getQuestions
* @throws Exception
*/
public function testGetQuestions()
{
$questions = (new ModelAdmin())->getQuestions();
$this->assertIsArray($questions);
}
/**
* @covers ModelAdmin::getResponsesCandidate
* @throws Exception
*/
public function testGetResponsesCandidate()
{
$responses = (new ModelAdmin())->getResponsesCandidate();
$this->assertIsArray($responses);
}
}

@ -0,0 +1,34 @@
<?php
namespace TestModel;
use Exception;
use Model\ModelCandidate;
use PHPUnit\Framework\TestCase;
class ModelCandidateTest extends TestCase
{
/**
* @covers ModelCandidate::submitForm
* @throws Exception
*/
public function testSubmitForm()
{
$_POST['answers'] = ['1||Answer1||Category1', '2||Answer2||Category2', '3||Answer3||Category3'];
$_POST['action'] = 'submitForm';
$_POST['data_ids'] = json_encode([4, 5]);
$this->expectOutputString('');
(new ModelCandidate())->submitForm();
}
/**
* @covers ModelCandidate::getForm
* @throws Exception
*/
public function testGetForm()
{
$this->assertIsString((new ModelCandidate())->getForm());
}
}

@ -0,0 +1,75 @@
.acolorba {
background-color: #006D82;
}
.logo {
width: auto;
height: 100px;
padding: 24px 0;
}
.card {
width: 450px;
margin: 0 auto;
background: white;
border-radius: 24px;
padding: 24px;
}
#main-content {
margin-right: 10px;
margin-left: 10px;
}
.content {
box-shadow: none !important;
}
input {
max-width: 350px;
padding: 12px 16px;
height: 48px;
background: #ffffff;
border: 1px solid #CACAC9;
border-radius: 12px;
color: #4A4A49;
}
h3 {
font-size: 24px;
line-height: 150%;
color: #6D6D6C;
text-align: center;
margin: 0 0 24px;
font-weight: bold;
}
body, p, span, div, a, h1, h2, h3, h4, h5, h6{
font-family: 'Barlow', sans-serif;
}
.margin-space {
margin: 12px;
}
button{
padding: 12px 32px;
background: #006D82 !important;
border-radius: 12px;
height: 48px;
border: none;
color: white;
font-weight: 700;
}
a {
text-decoration: none;
background-color: transparent;
color: #018786 !important;
margin: 10px;
font-weight: bold;
}
a:hover {
color: #006D82 !important;
}

@ -1,8 +1,3 @@
* {
margin: 0;
padding: 0;
}
body {
background-image: url('../IMAGES/background_uca.png');
background-attachment: fixed;
@ -10,22 +5,3 @@ body {
background-repeat: no-repeat;
font-family : 'Poppins', 'Signika', sans-serif;
}
h1 {
text-align: center;
font-weight: bold;
font-size: 200%;
padding: 1.5%;
color: white;
background-color: rgb(23,143,150);
}
:not(h1) {
color: #5e5c5c;
}
#logoUCA {
position: absolute;
padding-left: 3%;
padding-top: 2%;
}

@ -1,18 +1,27 @@
h3 {
text-align: center;
}
h4 {
text-align: center;
font-weight: normal;
}
#container_form {
display: flex;
flex-direction: row;
justify-content: center;
margin-top: 5%;
margin-top: 3%;
}
#container_form h2{
padding-top: 1%;
}
#container_form #button {
#button {
margin-top: 5%;
width: 20%;
height: 5%;
width: 15%;
height: 3%;
margin-left: 79%;
margin-bottom: 10%;
cursor: pointer;
@ -21,8 +30,8 @@
border-radius: 20px;
}
#container_form #button:hover {
background-color: rgb(23,143,150);
#button:hover {
background-color: rgba(23, 143, 150, 0.7);
}
#container_testimony, #container_personalInfos {

@ -0,0 +1,126 @@
@charset "UTF-8";
@import url("styles.css") screen;
/* Déclaration de la directive Content-Type */
/* Le reste de votre code CSS ici */
#regForm {
background-color: #ffffff;
margin: 0 auto;
font-family: Poppins, serif;
padding: 40px;
border-radius: 30px;
background-color: rgba(23,143,150,0.7);
}
#register{
color: white;
}
h1 {
text-align: center;
font-family: Poppins, serif;
}
h6 {
font-size: 1.5rem;
}
input {
padding: 10px;
width: 100%;
font-size: 17px;
font-family: Raleway, serif;
border: 1px solid #aaaaaa;
border-radius: 10px;
-webkit-appearance: none;
}
.tab input:focus{
border:1px solid #6a1b9a !important;
outline: none;
}
input.invalid {
border:1px solid #e03a0666;
}
.tab {
display: none
}
button {
background-color: #6A1B9A;
color: #ffffff;
border: none;
border-radius: 50%;
padding: 10px 20px;
font-size: 17px;
font-family: Raleway, serif;
cursor: pointer
}
button:hover {
opacity: 0.8
}
button:focus{
outline: none !important;
}
#prevBtn {
background-color: #bbbbbb
}
.all-steps{
text-align: center;
margin-top: 30px;
margin-bottom: 30px;
width: 100%;
display: inline-flex;
justify-content: center;
}
.step {
height: 10px;
width: 10px;
margin: 0 2px;
background-color: #bbbbbb;
border: none;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 15px;
color: #6a1b9a;
opacity: 0.5;
}
.step.active {
opacity: 1
}
.step.finish {
color: #fff;
background: green;
opacity: 1;
}
.all-steps {
text-align: center;
margin-top: 30px;
margin-bottom: 30px
}
.thanks-message {
display: none
}

File diff suppressed because it is too large Load Diff

@ -1,59 +1,109 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $awesomeFont, $bootstrapMin, $bootstrapIcon, $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/base.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<link href="<?php echo $bootstrapIcon; ?>" rel="stylesheet" />
<link href="<?php echo $bootstrapMin; ?>" rel="stylesheet" />
<link href="<?php echo $awesomeFont; ?>" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="Views/CSS/styles.css" />
<link rel="stylesheet" type="text/css" href="Views/CSS/stylesForm.css" />
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<title>Formulaire de témoignage</title>
</head>
<body>
<!-- La barre bleue située en tête de page -->
<img id="logoUCA" src="https://cdn.uca.fr/images/logos/logo_uca_mini_light.png" height="35px" alt="logo UCA">
<h1>Administration</h1>
<h2>Ajouter une question :</h2>
<form method="post">
<label>Écrivez la question :</label>
<br>
<input name="question" type="text" size="100">
<br><br>
<label>Séléctionnez le type de question souhaitée :
<br>- Text permet à l'utilisateur d'écrire lui même la réponse.
<br>- ListBox permet à l'utilisateur de choisir une réponse parmis plusieurs possibilités.
<br>- CheckBox permet à l'utilisateur de choisir une ou plusieurs réponses parmis plusieurs possibilités.
</label>
<br>
<select name="type">
<option value="BusinessClass\ListBoxQuestion">ListBox</option>
<option value="BusinessClass\CheckBoxQuestion">CheckBox</option>
<option value="BusinessClass\TextQuestion">Text</option>
</select>
<br><br>
<label>Écrivez la liste des réponses possibles en les séparant comme cela :
<br>Réponse1; Réponse2; Réponse3;
</label>
<br>
<input name="responses" type="text" size="100">
<br><br>
<label>Écrivez la liste des catégories associée à chaque question comme cela :
<br>Catégorie1.1,Catégorié1.2; Catégorie2.1; Catégorié3.1,Catégorie3.2,Catégorie3.3;
</label>
<br>
<input name="categories" type="text" size="100">
<br><br>
<input type="submit" value="Confirmer">
<input type="hidden" name="action" value="addQuestion">
</form>
<header class="py-1">
<div class="container px-4 px-lg-5 my-5">
<div class="text-center text-white">
<h1 class="display-4 fw-bolder">Les Témoignages</h1>
<p class="lead fw-normal text-white-50 mb-0">IUT Informatique de Clermont-Ferrand</p>
</div>
</div>
</header>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Administration</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="/index.php?action=GoToAddTestimony">Témoignages</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-5">
<div class="row d-flex justify-content-center align-items-center">
<div class="col-md-8">
<form id="regForm" method="post" action="addQuestion">
<h1 id="register">Ajout d'une question</h1>
<div class="all-steps" id="all-steps">
<span class="step"><i class="fa"></i></span>
<span class="step"><i class="fa"></i></span>
</div>
<div class="tab">
<h6>Écrivez la question : </h6>
<p>
<label>
<input placeholder="Question..." oninput="this.className = ''" name="question">
</label>
</p>
</div>
<div class="tab">
<h6>Séléctionnez le type de question souhaitée :
<br>- Text permet d'écrire la réponse librement.
<br>- ListBox permet de choisir une réponse parmi plusieurs possibilités.
<br>- CheckBox permet de choisir une ou plusieurs réponses parmi plusieurs possibilités.</h6>
<label>
<select name="type">
<p> <option value="BusinessClass\TextQuestion">Text</option> </p>
<p> <option value="BusinessClass\ListBoxQuestion">ListBox</option> </p>
<p> <option value="BusinessClass\CheckBoxQuestion">CheckBox</option> </p>
</select>
</label>
</div>
<div class="thanks-message text-center" id="text-message"> <img src="https://i.imgur.com/O18mJ1K.png" width="100" height="100" class="mb-4" alt="">
<h3>Souhaitez-vous ajouter votre question ?</h3>
<input type='submit' value='Ajouter' id='button'>
<input type='hidden' name='action' value='addQuestion'>
</div>
<div style="overflow:auto;" id="nextprevious">
<div style="float:right;">
<button type="button" id="prevBtn" onclick="nextPrev(-1)"><i class="fa fa-angle-double-left"></i></button>
<button type="button" id="nextBtn" onclick="nextPrev(1)"><i class="fa fa-angle-double-right"></i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<br><br>
<script src="<?php echo $jQueryMin; ?>"></script>
<script src="<?php echo $bundle4; ?>"></script>
<script src="<?php echo $bundle5; ?>"></script>
<script src="Views/JS/scripts.js"></script>
</body>

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.grid-min.css">
<link rel="stylesheet" href="Views/CSS/adminLogin.css">
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Barlow&display=swap" rel="stylesheet">
<title>Admin Login Page</title>
</head>
<body class="acolorba d-flex flex-column align-items-center">
<img src="Views/IMAGES/logoUca.png" class="logo" alt="logo" height="auto" width="auto">
<article class="card">
<main id="main-content">
<section id="content">
<form method="post" action="login" class="d-flex flex-column align-items-center">
<h3>Service d'authentification</h3>
<div id="adminRegistrationErrorPanel" class="margin-space">
<?php
if (isset($error)) {
echo $error;
}
?>
</div>
<label class="margin-space" for="login">
<input type="text" name="login" id="login" placeholder="Identifiant" required>
</label>
<label class="margin-space" for="password">
<input type="password" name="password" id="password" placeholder="Mot de passe" required>
</label>
<button class="margin-space" name="submitBtn" type="submit">Se connecter</button>
</form>
</section>
</main>
</article>
</body>
</html>

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="Views/CSS/base.css" />
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<title>Formulaire de témoignage</title>
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
</head>
<body>
<img id="logoUCA" src="<?php echo $logoUCA; ?>" height="35px" width="auto" alt="logo UCA">
<h1>Administration</h1>
<div class="form-center">
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
</div>
<br>
<div class="form-center">
<h3>Les catégories :</h3>
<form method="post" action="addKeyword">
<label for="keyword"></label><input id="keyword" name="keyword" type="text" size="25" placeholder="...">
<input type="submit" value="Ajouter">
<input type="hidden" name="action" value="addKeyword">
</form>
<br>
<ul class="form-center">
<form method="post" action="deleteKeyword">
<?php
/** @var array $categories */
foreach ($categories as $category) {
?> <li><?php
echo '<form method="post" action="deleteKeyword">';
echo $category;
echo ' <input type="submit" value="Delete">';
echo ' <input type="hidden" name="idCateg" value="'.$category.'">';
echo ' <input type="hidden" name="page" value="deleteQuestion">';
echo '</form>';
}
?>
</li>
</ul>
</div>
</body>
</html>

@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link type="text/css" href="Views/CSS/styles.css" rel="stylesheet" />
<link type="text/css" href="Views/CSS/stylesForm.css" rel="stylesheet" />
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<title>Formulaire de témoignage</title>
</head>
<body>
<header class="py-1">
<div class="container px-4 px-lg-5 my-5">
<div class="text-center text-white">
<h1 class="display-4 fw-bolder">Les Témoignages</h1>
<p class="lead fw-normal text-white-50 mb-0">IUT Informatique de Clermont-Ferrand</p>
</div>
</div>
</header>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Administration</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="index.php?action=GoToAddTestimony">Témoignages</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="text-center">
<h2>Continuer d'ajouter des possibilités de réponses ?</h2>
<form method="post" action="continueResponse">
<input name="idQuestion" type="hidden" value="<?php /** @var int $idQuestion */
echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php /** @var string $questionContent */
echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php /** @var string $type */
echo $type; ?>">
<br>
<input type="submit" name="choose" value="Oui" style="width: 20%">
<br>
<input type="submit" name="choose" value="Non" style="width: 20%">
<input type="hidden" name="action" value="continueResponse">
</form>
</div>
<script src="<?php echo $jQueryMin; ?>"></script>
<script src="<?php echo $bundle4; ?>"></script>
<script src="<?php echo $bundle5; ?>"></script>
<script src="Views/JS/scripts.js"></script>
</body>
</html>

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="Views/CSS/common.css">
<link type="text/css" rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
<title>Error Page</title>
<body class="d-flex flex-column align-items-center">
<h1>
<?php if (empty($error)) {
echo "Erreur";
} else {
echo $error;
}
?>
</h1>
</body>
</html>

@ -1,21 +1,45 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/form.css" />
<link rel="stylesheet" href="Views/CSS/base.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap" rel="stylesheet">
<link type="text/css" rel="stylesheet" href="Views/CSS/styles.css" />
<link type="text/css" rel="stylesheet" href="Views/CSS/stylesForm.css" />
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<link type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<link type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" />
<link type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<title>Formulaire de témoignage</title>
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
</head>
<body>
<header class="py-1">
<div class="container px-4 px-lg-5 my-5">
<div class="text-center text-white">
<h1 class="display-4 fw-bolder">Les Témoignages</h1>
<p class="lead fw-normal text-white-50 mb-0">IUT Informatique de Clermont-Ferrand</p>
</div>
</div>
</header>
<!-- La barre bleue située en tête de page -->
<img id="logoUCA" src="https://cdn.uca.fr/images/logos/logo_uca_mini_light.png" height="35px" alt="logo UCA">
<?php /** @var string $html */
echo $html;
?>
<?php echo $html; ?>
<br><br>
<script src="<?php echo $jQueryMin; ?>"></script>
<script src="<?php echo $bundle4; ?>"></script>
<script src="<?php echo $bundle5; ?>"></script>
<script type="text/javascript" src="Views/JS/scripts.js"></script>
<script type="text/javascript" src="Views/JS/getData-Ids.js"></script>
</body>

@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link type="text/css" href="Views/CSS/styles.css" rel="stylesheet" />
<link type="text/css" href="Views/CSS/stylesForm.css" rel="stylesheet" />
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<title>Formulaire de témoignage</title>
</head>
<body>
<header class="py-1">
<div class="container px-4 px-lg-5 my-5">
<div class="text-center text-white">
<h1 class="display-4 fw-bolder">Les Témoignages</h1>
<p class="lead fw-normal text-white-50 mb-0">IUT Informatique de Clermont-Ferrand</p>
</div>
</div>
</header>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Administration</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="index.php?action=GoToAddTestimony">Témoignages</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-5">
<div class="row d-flex justify-content-center align-items-center">
<div class="col-md-8">
<form id="regForm" method="post" action="addResponse">
<input name="idQuestion" type="hidden" value="<?php /** @var int $idQuestion */
echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php /** @var string $questionContent */
echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php /** @var string $type */
echo $type; ?>">
<h1 id="register">Ajout de réponse possible pour votre question : <?php echo $questionContent;?> </h1>
<div class="all-steps" id="all-steps">
<span class="step"><i class="fa"></i></span>
<span class="step"><i class="fa"></i></span>
</div>
<div class="tab">
<h6>Entrez une réponse : </h6>
<p>
<label>
<input placeholder="Réponse..." oninput="this.className = ''" name="response">
</label>
</p>
</div>
<div class="tab">
<h6>Sélectionnez les catégories associées à cette réponse : </h6>
<?php /** @var array $categories */
foreach ($categories as $category) { ?>
<p>
<label for="category"><?php echo $category ?></label>
<input style='-webkit-appearance: checkbox;' id="category" type="checkbox" name="categories[]" value="<?php echo $category ?>">
</p>
<?php } ?>
</div>
<div class="thanks-message text-center" id="text-message"> <img src="https://i.imgur.com/O18mJ1K.png" width="100" class="mb-4" alt="">
<h3>Souhaitez-vous ajouter votre réponse ?</h3>
<input type='submit' value='Ajouter' id='button'>
<input type='hidden' name='action' value='addResponse'>
</div>
<div style="overflow:auto;" id="nextprevious">
<div style="float:right;">
<button type="button" id="prevBtn" onclick="nextPrev(-1)"><i class="fa fa-angle-double-left"></i></button>
<button type="button" id="nextBtn" onclick="nextPrev(1)"><i class="fa fa-angle-double-right"></i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<br><br>
<script src="<?php echo $jQueryMin; ?>"></script>
<script src="<?php echo $bundle4; ?>"></script>
<script src="<?php echo $bundle5; ?>"></script>
<script src="Views/JS/scripts.js"></script>
</body>
</html>

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="Views/CSS/base.css" />
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<title>Formulaire de témoignage</title>
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
</head>
<body>
<img id="logoUCA" src="<?php echo $logoUCA; ?>" height="35px" width="auto" alt="logo UCA">
<h1>Administration</h1>
<div class="form-center">
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
</div>
<br>
<div class="form-center">
<h3>Les questions :</h3>
<br>
<form method="post" action="addQuestion">
<div>
<label for="question">Écrivez la question : </label>
<br>
<input id="question" name="question" type="text" size="70">
</div>
<div>
<br>
<label for="type">Sélectionnez le type de question souhaitée :
<br>- Text permet d'écrire la réponse librement.
<br>- ListBox permet de choisir une réponse parmi plusieurs possibilités.
<br>- CheckBox permet de choisir une ou plusieurs réponses parmi plusieurs possibilités.
</label>
<br>
<select id="type" name="type">
<option value="BusinessClass\TextQuestion">Text</option>
<option value="BusinessClass\ListBoxQuestion">ListBox</option>
<option value="BusinessClass\CheckBoxQuestion">CheckBox</option>
</select>
</div>
<br>
<input type="submit" value="Ajouter">
<input type="hidden" name="action" value="addQuestion">
</form>
<br>
<hr>
<br>
<ul class="form-center">
<?php
/** @var array $questions */
foreach ($questions as $question) {
?>
<form method="post" action="deleteQuestion">
<li><?php echo $question->printStrategy();
echo '<input type="submit" value="Delete">';
echo '<input type="hidden" name="idQuestion" value="'.$question->getId().'">';
echo '<input type="hidden" name="type" value="<'.get_class($question).'">';
echo '<input type="hidden" name="page" value="deleteQuestion">';
echo ' </li>';
echo '</form>';
}
?>
</ul>
</div>
</body>
</html>

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="Views/CSS/base.css" />
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<title>Formulaire de témoignage</title>
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
</head>
<body>
<img id="logoUCA" src="<?php echo $logoUCA; ?>" height="35px" width="auto" alt="logo UCA">
<h1>Administration</h1>
<div class="form-center">
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
</div>
<br>
<div class="form-center">
<h3>Les réponses :</h3>
<br>
<div id="listResponses">
<form method="post" action="deleteResponsesCandidate">
<?php
/** @var array $responsesCandidate */
foreach ($responsesCandidate as $response) { ?>
<i><?php echo $response[0]["date"];?></i>
<p>Catégories associées :
<?php
echo " | ";
foreach ($response[2] as $category)
if(!empty($category)) {
echo $category[0] . " | ";
}
?>
</p>
<?php foreach ($response[1] as $questionResponses) { ?>
<p><i>Question : </i><?php echo $questionResponses["content"]; ?></p>
<p><i>Réponse : </i><?php echo $questionResponses["questionContent"]; ?></p>
<?php
} ?>
<input type="submit" value="Delete">
<input type="hidden" name="idResponseCandidate" value="<?php echo $response[0]["id"] ?>">
<input type="hidden" name="action" value="deleteResponsesCandidate">
<hr><br>
<?php
}
?>
</form>
</div>
</div>
</body>
</html>

@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="Views/CSS/styles.css" />
<link type="text/css" rel="stylesheet" href="Views/CSS/stylesForm.css" />
<link rel="preconnect" href="<?php echo $googleApis; ?>">
<link rel="preconnect" href="<?php echo $googleStatic; ?>" crossorigin>
<link href="<?php echo $poppins; ?>" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<title>Formulaire de témoignage</title>
<link rel="shortcut icon" href="<?php echo $icon; ?>" type="image/x-icon">
<link rel="icon" href="<?php echo $icon; ?>" type="image/x-icon">
</head>
<body>
<header class="py-1">
<div class="container px-4 px-lg-5 my-5">
<div class="text-center text-white">
<h1 class="display-4 fw-bolder">Les Témoignages</h1>
<p class="lead fw-normal text-white-50 mb-0">IUT Informatique de Clermont-Ferrand</p>
</div>
</div>
</header>
<div class='container mt-5'>
<div class='row d-flex justify-content-center align-items-center'>
<div class='col-md-8'>
<div class="text-center">
<h2>Merci d'avoir participé à ce questionnaire !</h2>
<p>Nous vous recontacterons si votre profil nous intéresse.</p>
</div>
</div>
</div>
</div>
<script src="<?php echo $jQueryMin; ?>"></script>
<script src="<?php echo $bundle4; ?>"></script>
<script src="<?php echo $bundle5; ?>"></script>
<script src="Views/JS/scripts.js"></script>
<script src="Views/JS/getData-Ids.js"></script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -0,0 +1,8 @@
const printCategoryButton = document.querySelector('#printCategory');
printCategoryButton.addEventListener('click', printCategories);
const printQuestionButton = document.querySelector('#printQuestion');
printQuestionButton.addEventListener('click', printQuestion);
const printFormQuestionButton = document.querySelector('#addNewQuestion');
printFormQuestionButton.addEventListener('click', addQuestion);

@ -0,0 +1,16 @@
/**
* Permet d'afficher la liste des catégories en fonction
* du choix de l'utilisateur (lorsqu'il clique sur le bouton)
*/
function printCategories() {
const printCategoryButton = document.querySelector('#printCategory');
const ul = document.querySelector("#listCategories");
if(printCategoryButton.innerText === "Les catégories ▲") {
printCategoryButton.innerText = "Les catégories ▼";
ul.style.visibility = "hidden";
} else {
printCategoryButton.innerText = "Les catégories ▲";
ul.style.visibility = "visible";
}
}

@ -0,0 +1,34 @@
/**
* Permet d'afficher ou non la liste des questions en fonction
* du choix de l'utilisateur. (lorsqu'il clique sur le bouton)
*/
function printQuestion() {
const printQuestionButton = document.querySelector('#printQuestion');
const ul = document.querySelector("#listQuestions");
if(printQuestionButton.innerText === "Les questions ▲") {
printQuestionButton.innerText = "Les questions ▼";
ul.style.visibility = "hidden";
} else {
printQuestionButton.innerText = "Les questions ▲";
ul.style.visibility = "visible";
}
}
/**
* Permet d'afficher le formulaire permettant d'ajouter une question
* si l'utilisateur clique sur le bouton.
*/
function addQuestion() {
const printAddQuestionFormButton = document.querySelector('#addNewQuestion');
const form = document.querySelector('#addQuestionForm');
if(printAddQuestionFormButton.innerText === "Ajouter une question ▲") {
printAddQuestionFormButton.innerText = "Ajouter une question ▼";
form.style.visibility = "hidden";
} else {
printAddQuestionFormButton.innerText = "Ajouter une question ▲";
form.style.visibility = "visible";
}
}

@ -0,0 +1,9 @@
let dataIds = [];
let elements = document.querySelectorAll('[data-id]');
elements.forEach(function(element) {
dataIds.push(element.getAttribute('data-id'));
});
let dataIdsInput = document.querySelector('input[name="data_ids"]');
dataIdsInput.value = JSON.stringify(dataIds);

@ -0,0 +1,11 @@
let responsesAndCategories = new Map();
function addResponse() {
const response = document.querySelector('#response');
const categories = document.querySelectorAll(".categories");
responsesAndCategories.set(response.value, categories.forEach(category => console.log(category.value)));
}
const addPossiblesResponsesButton = document.querySelector('#addNewResponse');
addPossiblesResponsesButton.addEventListener('click', addResponse);

@ -0,0 +1,68 @@
let currentTab = 0;
document.addEventListener("DOMContentLoaded", function(event) {
showTab(currentTab);
});
function showTab(n) {
const x = document.getElementsByClassName("tab");
x[n].style.display = "block";
if (n === 0) {
document.getElementById("prevBtn").style.display = "none";
} else {
document.getElementById("prevBtn").style.display = "inline";
}
if (n === (x.length - 1)) {
document.getElementById("nextBtn").innerHTML = '<i class="fa fa-angle-double-right"></i>';
} else {
document.getElementById("nextBtn").innerHTML = '<i class="fa fa-angle-double-right"></i>';
}
fixStepIndicator(n)
}
function nextPrev(n) {
const x = document.getElementsByClassName("tab");
if (n === 1 && !validateForm()) return false;
x[currentTab].style.display = "none";
currentTab = currentTab + n;
if (currentTab >= x.length) {
document.getElementById("nextprevious").style.display = "none";
document.getElementById("all-steps").style.display = "none";
document.getElementById("register").style.display = "none";
document.getElementById("text-message").style.display = "block";
}
showTab(currentTab);
}
function validateForm() {
let x, y, i, valid = true;
x = document.getElementsByClassName("tab");
y = x[currentTab].getElementsByTagName("input");
for (i = 0; i < y.length; i++) {
if (y[i].value === "") {
y[i].className += " invalid";
valid = false;
}
}
if (valid) {
document.getElementsByClassName("step")[currentTab].className += " finish";
}
return valid;
}
function fixStepIndicator(n) {
let i, x = document.getElementsByClassName("step");
for (i = 0; i < x.length; i++) {
x[i].className = x[i].className.replace(" active", "");
}
x[n].className += " active";
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1680374974">
<project timestamp="1680374974">
<metrics files="0" loc="0" ncloc="0" classes="0" methods="0" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="0" coveredstatements="0" elements="0" coveredelements="0"/>
</project>
</coverage>

@ -1,10 +1,9 @@
<?php
use Controller\FrontController;
use Config\Autoload;
require_once(__DIR__ . "/API/script/Config/config.php");
require_once(__DIR__.'/Config/Autoload.php');
require_once(__DIR__.'/Config/config.php');
require_once(__DIR__.'/Config/Autoload.php');
Autoload::charger();
@ -12,5 +11,4 @@ Autoload::charger();
session_start();
$frontController = new FrontController();
?>
$frontController->run();

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.6/phpunit.xsd"
colors="true"
bootstrap="./Config/vendor/autoload.php"
cacheResultFile=".phpunit.cache/test-results"
executionOrder="depends,defects"
forceCoversAnnotation="true"
beStrictAboutCoversAnnotation="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
convertDeprecationsToExceptions="true"
failOnRisky="true"
failOnWarning="true"
verbose="true">
<testsuites>
<testsuite name="default">
<directory>./Tests</directory>
</testsuite>
</testsuites>
<coverage cacheDirectory=".phpunit.cache/code-coverage"
processUncoveredFiles="true">
<include>
<directory suffix=".php">.</directory>
</include>
</coverage>
</phpunit>
Loading…
Cancel
Save