Compare commits

..

128 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
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
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 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 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

@ -2,22 +2,48 @@ kind: pipeline
type: docker
name: Témoignages_Formulaire
trigger:
event:
- push
steps:
- name: formulaire
image: plugins/docker
settings:
dockerfile: ./Source/Dockerfile
context: ./Source
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/dorian.hodin/sae4.01_formulaire
username:
from_secret: SECRET_USERNAME
password:
from_secret: SECRET_PASSWD
- 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:
from_secret : CONTAINER_NAME
COMMAND: create
OVERWRITE: true
ADMINS: dorianhodin,alexislamande,baptistebaverel,johanlachenal
depends_on: [ formulaire ]
- name: setup_PHP_for_SonarQube
image: sonarsource/sonar-scanner-cli
environment:
SONAR_TOKEN:
from_secret: SONARQ_TOKEN
commands:
- 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
- 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 ]

16
.gitignore vendored

@ -1 +1,15 @@
/Source/Config/vendor/
/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/

@ -2,9 +2,19 @@
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<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>

@ -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>

1
Source/.gitignore vendored

@ -1 +0,0 @@
/Config/vendor/

@ -26,4 +26,7 @@ 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]
RewriteRule ^goToProfiles$ %{ENV:APP_ROOT}index.php?page=goToProfiles [L]
AddType text/css .css
AddType text/javascript .js
AddType application/javascript .js

@ -1,40 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table Admin afin de gérer l'espace administrateur.
*/
class GatewayAdmin
{
/**
* @var Connection
*/
private Connection $connection;
public function __construct()
{
$this->connection = connect();
}
/**
* Permet de récupérer le mot de passe de l'administrateur en fonction de son login.
* @param String $login Le login de l'administrateur.
* @return String|null Le mot de passe de l'administrateur ou null si l'administrateur n'existe pas.
*/
public function getPasswordWithLogin(String $login)
{
$query = "SELECT password FROM ADMIN WHERE login = :login";
$this->connection->executeQuery($query, array(
':login' => array($login, PDO::PARAM_STR)
));
$result = $this->connection->getResults();
if(empty($result))
return null;
return $result[0]['password'];
}
}

@ -1,191 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
class GatewayForm
{
/**
* @var Connection
*/
private Connection $connection;
/**
*
*/
public function __construct()
{
$this->connection = connect();
}
/**
* Permet d'instancier un formulaire s'il n'y a pas déjà un de présent dans la base de donnée
* afin de rendre le formulaire modulable.
*
* @param string $title Titre du formulaire que l'on veut sauvegarder
* @param string $desc Description du formulaire que l'on veut sauvegarder
*
* @return void
*/
public function insertForm(string $title, string $desc): void
{
if (empty($this->getForm())) {
$query = "INSERT INTO Form(title, description) VALUES(:title, :desc)";
$this->connection->executeQuery($query, array(
':title' => array($title, PDO::PARAM_STR),
':desc' => array($desc, PDO::PARAM_STR)
));
}
}
/**
* Permet de récupérer le formulaire sauvegarder dans la base de donnée.
*
* @return array Retourne un array contenant l'ensemble des données du formulaire
*/
public function getForm(): array
{
$query = "SELECT * FROM Form";
$this->connection->executeQuery($query);
return $this->connection->getResults();
}
/**
* Permet de supprimer le formulaire dont l'id est le même que le formulaire passé en paramètre.
*
* @param int $form Id du formulaire que l'on veut supprimer de la base de donnée
*
* @return void
*/
public function deleteForm(int $form): void
{
$query = "DELETE FROM Form WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($form, PDO::PARAM_INT)
));
}
/**
* Permet de faire le lien entre une catégorie et la réponse possible passées en paramètre
* à la question dont l'id est aussi passé en paramètre.
*
* @param string $keyword Keyword que l'on veut associer
* @param string $response Réponse que l'on veut associer
* @param int $idQuestion Id de la question qui contient la réponse
*
* @return void
*/
public function assignKeywordToQuestion(string $keyword, string $response, int $idQuestion): void
{
$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_INT),
':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)
));
}
/**
* Permet de supprimer le lien entre une catégorie et la réponse possible passées en paramètre
* à la question dont l'id est aussi passé en paramètre.
*
* @param string $keyword Keyword que l'on veut associer
* @param string $response Réponse que l'on veut associer
* @param int $question Id de la question qui contient la réponse
*
* @return void
*/
public function deleteKeywordFromQuestion(string $keyword, string $response, int $question): void
{
$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, PDO::PARAM_INT),
':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, PDO::PARAM_INT)
));
}
/**
* Permet de modifier le titre du formulaire sauvé dans la base de donnée.
*
* @param string $title Nouveau titre
* @param int $form Id du formulaire que l'on veut modifier
*
* @return void
*/
public function updateTitleToForm(string $title, int $form): void
{
$query = "UPDATE Form SET title = :title WHERE id = :id";
$this->connection->executeQuery($query, array(
':title' => array($title, PDO::PARAM_STR),
':id' => array($form, PDO::PARAM_INT)
));
}
/**
* Permet de modifier la description du formulaire sauvé dans la base de donnée.
*
* @param string $description Nouvelle description
* @param int $form Id du formulaire que l'on veut modifier
*
* @return void
*/
public function updateDescriptionToForm(string $description, int $form): void
{
$query = "UPDATE Form SET title = :title WHERE description = :description";
$this->connection->executeQuery($query, array(
':description' => array($description, PDO::PARAM_STR),
':id' => array($form, PDO::PARAM_INT)
));
}
/**
* Permet de supprimer la description du formulaire dans la base de donnée en le remplaçant par une chaine vide.
*
* @param int $form Id du formulaire que l'on veut modifier
*
* @return void
*/
public function deleteDescriptionToForm(int $form): void
{
$query = "UPDATE Form SET title = :title WHERE description = :description";
$this->connection->executeQuery($query, array(
':description' => array('', PDO::PARAM_STR),
':id' => array($form, PDO::PARAM_INT)
));
}
/**
* Permet de vérifier si un formulaire est présent dans la base de donnée
*
* @return bool
*/
public function existsForm(): bool
{
$query = "SELECT * FROM Form";
$this->connection->executeQuery($query);
return !empty($this->connection->getResults());
}
}

@ -1,124 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table Keyword
* afin de gérer les catégories disponibles et associer aux différentes réponses des questions.
*/
class GatewayKeyword
{
/**
* @var Connection
*/
private Connection $connection;
/**
*
*/
public function __construct()
{
$this->connection = connect();
}
/**
* Permet d'ajouter un Keyword dans la base de donnée.
*
* @param string $keyword Keyword à ajouter
*
* @return void
*/
public function insertKeyword(string $keyword)
{
$query = "INSERT INTO Keyword(word) VALUES(:word)";
$this->connection->executeQuery($query, array(
':word' => array($keyword, PDO::PARAM_STR)
));
}
/**
* Permet de supprimer un keyword de la base de donnée.
*
* @param string $keyword Keyword à supprimer
*
* @return void
*/
public function deleteKeyword(string $keyword)
{
$query = "DELETE FROM Keyword WHERE word = :word";
$this->connection->executeQuery($query, array(
':word' => array($keyword, PDO::PARAM_STR)
));
}
/**
* Permet de récupérer l'ensemble des Keyword disponible.
*
* @return array Retourne la liste de l'ensemble des keyword sauvé dans la base de donnée
*/
public function getAllKeyword(): array
{
$query = "SELECT * FROM Keyword";
$this->connection->executeQuery($query);
return $this->connection->getResults();
}
/**
* Permet de récupérer tous les Keyword qui font référence à l'id de la réponse possible à une question passée en paramètre.
*
* @param int $id Id de la possible réponse que l'on veut connaitre ses catégories
*
* @return array Retourne l'ensemble de tous les Keyword associer à la réponse
*/
public function getKeywordsContentByReference(int $id): array
{
$query = "SELECT k.* FROM Keyword k, Reference r
WHERE k.word = r.keyword AND r.possibleResponse = :id";
$this->connection->executeQuery($query, array(
':id' => array($id, PDO::PARAM_STR)
));
return $this->getKeywordByAssotiation($id , $query);
}
/**
* Permet de récupérer tous les Keyword qui font référence à l'id de la réponse d'un candidat passée en paramètre.
*
* @param int $id Id de la réponse que l'on veut connaitre ses catégories
*
* @return array Retourne l'ensemble de tous les Keyword associer à la réponse
*/
public function getKeywordsContentByCategorieze(int $id): array
{
$query = "SELECT k.* FROM Keyword k, Categorize c
WHERE k.word = c.keyword AND c.response = :id";
return $this->getKeywordByAssotiation($id , $query);
}
/**
* Permet de récupérer une liste de Keyword selon une requête donnée et un id associé.
*
* @param int $id Id de l'objet dont on veut ses Keyword associé
* @param string $query Requête que l'on veut exécuter
*
* @return array Retourne la liste des différents Keyword associé à l'objet voulu
*/
private function getKeywordByAssotiation(int $id, string $query): array
{
$this->connection->executeQuery($query, array(
':id' => array($id, PDO::PARAM_STR)
));
$tab = [];
foreach ($this->connection->getResults() as $result) {
$tab[] = $result["word"];
}
return $tab;
}
}

@ -1,127 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table PossibleResponse
* afin de gérer la liste des réponses et les catégories associer d'un candidat.
*/
class GatewayListResponseOfCandidate
{
/**
* @var Connection
*/
private Connection $connection;
/**
*
*/
public function __construct()
{
$this->connection = connect();
}
/**
* Permet de récupérer la liste détaillée des réponses avec leurs catégories associer
* aux différentes questions qu'un candidat cible a répondu
*
* @param int $idListResponse Id du candidat pour lequel on veut récupérer ses réponses
*
* @return array Retourne une liste qui pour
* l'indice 0 a la liste des infos du candidat
* l'indice 1 la liste des réponses
* l'indice 2 une liste de liste de catégories, qui pour chaque même indice correspont à la liste des catégories de la réponse
*/
public function getDetailsListResponsesOfCandidate(int $idListResponse)
{
$gatewayResponse = new GatewayResponse();
$gatewayKeyword = new GatewayKeyword();
$tabKeywords = [];
$query = "SELECT * FROM ListResponsesOfCandidate WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($idListResponse, PDO::PARAM_INT)
));
$questionList = $this->connection->getResults()[0];
$responses = $gatewayResponse->getResponsesByIdListCandidate($questionList['id']);
foreach ($responses as $row) {
$tabKeywords[] = $gatewayKeyword->getKeywordsContentByCategorieze($row['id']);
}
return array($questionList, $responses, $tabKeywords);
}
/**
* Permet de récupérer la liste des personnes ayant répondu aux formulaire
*
* @return array Retourne la liste brute des informations de tous les candidats ayant répondu au formulaire
*/
public function getAllListResponsesOfCandidate(): array
{
$query = "SELECT * FROM ListResponsesOfCandidate";
$this->connection->executeQuery($query);
return $this->connection->getResults();
}
/**
* Permet de supprimer la liste des réponses d'un candidat de la base de donnée
*
* @param int $id Id du candidat à supprimer
*
* @return void
*/
public function deleteListResponseOfCandidate(int $id): void
{
$gatewayResponse = new GatewayResponse();
foreach ($gatewayResponse->getResponsesIdByIdListCandidate($id) as $response) {
$gatewayResponse->deleteResponseById($response['id']);
}
$query = "DELETE FROM ListResponsesOfCandidate WHERE id = :id";
$this->connection->executeQuery($query, array(
'id' => array($id, PDO::PARAM_INT)
));
}
/**
* Permet d'insérer dans la base de données les réponses aux questions d'un candidat
* ainsi que les catégories associées à chaque réponse
*
* @param array $id Liste des id des questions répondue
* @param array $answer Liste des réponses à chaque question
* @param array $category Liste des catégories attribuées à chaque réponse
* @param string $titleForm Titre du formulaire
*
* @return void
*/
public function insertListResponsesOfCandidate(array $id, array $answer, array $category, string $titleForm): void
{
$gatewayResponse = new GatewayResponse();
$gatewayQuestion = new GatewayQuestion();
$query = "INSERT INTO ListResponsesOfCandidate(date, titleForm) VALUES(:date, :titleForm)";
$this->connection->executeQuery($query, array(
':date' => array(date('Y-m-d H:i:s'), PDO::PARAM_STR),
':titleForm' => array($titleForm, PDO::PARAM_STR)
));
$idListQuestion = $this->connection->lastInsertId();
for ($i = 0; $i < count($answer); $i++) {
$question = $gatewayQuestion->getQuestionContentById($id[$i]);
$idResponse = $gatewayResponse->insertResponse($question, $answer[$i], $category[$i]);
$query = "INSERT INTO Submit (responsesCandidate, response) VALUES(:responsesCandidate, :response)";
$this->connection->executeQuery($query, array(
':responsesCandidate' => array($idListQuestion, PDO::PARAM_STR),
':response' => array($idResponse, PDO::PARAM_STR)
));
}
}
}

@ -1,79 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table PossibleResponse.
*/
class GatewayPossibleResponse
{
/**
* @var Connection
*/
private Connection $connection;
/**
*
*/
public function __construct()
{
$this->connection = connect();
}
/**
* Permet de récupérer les différentes réponses possibles à une question donnée.
*
* @param string $idQuestion Id de la question pour laquelle on veut récupérer les réponses possibles
*
* @return array Retourne la liste de possibles réponses
*/
public function getPossibleResponseByQuestion(string $idQuestion): array
{
$query = "SELECT pr.* FROM Propose p, PossibleResponse pr
WHERE p.question = :questionId AND p.possibleResponse = pr.id";
$this->connection->executeQuery($query, array(
':questionId' => array($idQuestion, PDO::PARAM_INT)
));
return $this->connection->getResults();
}
/**
* Permet d'insérer une possible réponse dans la base de donnée.
*
* @param string $contentPossibleResponse Contenu de la possible réponse
* @return int
*/
public function insertPossibleResponse(string $contentPossibleResponse): int
{
$query = "INSERT INTO PossibleResponse(content) VALUES(:content)";
$this->connection->executeQuery($query, array(
':content' => array($contentPossibleResponse, PDO::PARAM_STR)
));
return $this->connection->lastInsertId();
}
/**
* Permet de supprimer une possible réponse de la base de donnée par son id.
*
* @param int $id Id de la possible réponse à supprimer
*
* @return void
*/
public function deletePossibleResponse(int $id): void
{
$query = "DELETE FROM Reference WHERE response = :id";
$this->connection->executeQuery($query, array(
':id' => array($id, PDO::PARAM_INT)
));
$query = "DELETE FROM PossibleResponse WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($id, PDO::PARAM_INT)
));
}
}

@ -1,189 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table Question
* afin de rendre le formulaire modulable.
*/
class GatewayQuestion
{
/**
* @var Connection
*/
private Connection $connection;
/**
*
*/
public function __construct()
{
$this->connection = connect();
}
/**
* Permet d'ajouter une question dans la base de donnée.
*
* @param array $question Information sur la question ajouter [type, content]
* @param int $idForm Id du formulaire associer
*
* @return int Id de la question ajouté en base
*/
public function addQuestion(array $question, int $idForm): int
{
$query = "INSERT INTO Question(content, type, form) VALUES(:content, :type, :form)";
$this->connection->executeQuery($query, array(
':content' => array($question[1], PDO::PARAM_STR),
':type' => array($question[0], PDO::PARAM_STR),
':form' => array($idForm, PDO::PARAM_INT)
));
return $this->connection->lastInsertId();
}
/**
* Ajoute une possible réponse à une question cible et associe à la possible réponse des catégories.
*
* @param string $response Contenu de la réponse possible
* @param array $categories Liste des catégories attribuées à la possible réponse
* @param int $idQuestion Id de la question associée à cette possible réponse
*
* @return int Retourne l'id de la possible réponse insérée en base
*/
public function insertResponseInQuestion(string $response, array $categories, int $idQuestion): int
{
$gatewayPossibleResponse = new GatewayPossibleResponse();
$idPossibleResponse = $gatewayPossibleResponse->insertPossibleResponse($response);
$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 ($categories as $keyword) {
$gatewayForm = new GatewayForm();
$gatewayForm->assignKeywordToQuestion($keyword, $response, $idQuestion);
}
return $idQuestion;
}
/**
* Permet de supprimer une question dans la base ainsi que ses dépendances
*
* @param int $idQuestion Id de la question à supprimer
* @param string $type Type de la question à supprimer
*
* @return void
*/
public function deleteQuestion(int $idQuestion, string $type): void
{
if ($type != "BusinessClass\TextQuestion") {
$query = "DELETE FROM Propose WHERE question = :id";
$this->connection->executeQuery($query, array(
':id' => array($idQuestion, PDO::PARAM_INT)
));
$gatewayPossibleResponse = new GatewayPossibleResponse();
$listPossibleResponse = $gatewayPossibleResponse->getPossibleResponseByQuestion($idQuestion);
foreach ($listPossibleResponse as $row) {
$gatewayPossibleResponse->deletePossibleResponse($row["id"]);
}
}
$query = "DELETE FROM Question WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($idQuestion, PDO::PARAM_INT)
));
}
/**
* Permet de modifier dans la base de données les informations de la question.
*
* @param array $question Question modifier à changer en base [id, type, contente]
*
* @return void
*/
public function updateQuestion(array $question): void
{
$query = "UPDATE Question SET content = :content, type = :type WHERE id = :id";
$this->connection->executeQuery($query, array(
':content' => array($question[2], PDO::PARAM_STR),
':type' => array($question[1], PDO::PARAM_STR),
':id' => array($question[0], PDO::PARAM_STR)
));
}
/**
* Permet de récupérer toutes les questions, possibles réponses et catégories associées d'un formualire cible.
*
* @param string $idForm Id du formulaire
*
* @return array Retourne une liste qui pour
* l'indice 0 la liste des questions
* l'indice 1 une liste de liste de réponses, qui pour chaque même indice correspond à la liste des réponses possibles de la question
* l'indice 2 une liste de liste de liste de catégories qui pour chaque indice de questions,
* on a une liste de liste de catégories qui pour chaque indice de réponses est associer une liste de catégories
* Ou vide s'il n'y a pas de question dans la base
*/
public function getAllQuestions(string $idForm): array
{
$query = "SELECT * FROM Question WHERE form = :fom";
$this->connection->executeQuery($query, array(
':fom' => array($idForm, PDO::PARAM_INT)
));
$listQuestions = $this->connection->getResults();
$possibleResponsesContent = [];
$keywordsResponses = [];
$gatewayKeyword = new GatewayKeyword();
$gatewayPossibleResponse = new GatewayPossibleResponse();
if (!empty($listQuestions)) {
for ($i = 0; $i < count($listQuestions); $i++) {
if ($listQuestions[$i]["type"] != "BusinessClass/TextQuestion") {
$idQuestion = $listQuestions[$i]["id"];
$possibleResponses = $gatewayPossibleResponse->getPossibleResponseByQuestion($idQuestion);
$tmpTabKeyword = [];
$tmpTabPossibleResponse = [];
foreach ($possibleResponses as $row) {
$tmpTabKeyword[] = $gatewayKeyword->getKeywordsContentByReference($row["id"]);
$tmpTabPossibleResponse[] = $row["content"];
}
$possibleResponsesContent[] = $tmpTabPossibleResponse;
$keywordsResponses[] = $tmpTabKeyword;
} else {
$possibleResponsesContent[] = null;
$keywordsResponses[] = null;
}
}
return array($listQuestions, $possibleResponsesContent, $keywordsResponses);
}
return array();
}
/**
* Permet de récupérer le contenu d'une réponse à une question par son id.
*
* @param string $id Id de la question cible
*
* @return string Retourne le contenu de la question ciblé
*/
public function getQuestionContentById(string $id): string
{
$query = "SELECT content FROM Question WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($id, PDO::PARAM_INT)
));
return $this->connection->getResults()[0][0];
}
}

@ -1,131 +0,0 @@
<?php
namespace API\script\Gateway;
use Config\Connection;
use PDO;
/**
* Permet d'accéder, d'écrire ou de modifier les données contenues dans la table Response
* afin de récupérer les réponses d'un utilisateur.
*/
class GatewayResponse
{
/**
* @var Connection
*/
private Connection $connection;
public function __construct()
{
$this->connection = connect();
}
/**
* Permet de récupérer la liste des réponses d'un candidat ainsi que les Keyword couvert pour chaque réponse.
*
* @param int $listResponsesOfCandidateId Id du candidat
*
* @return array Retourne une liste contenant à l'indice 0 la liste de réponse
* et à l'indice 1 une liste de liste de Keword,
* où chaque indice d'une liste de question est associé au même indice une réponse
*/
public function getCatgoriezeOfResponsesIdByIdListCandidate(int $listResponsesOfCandidateId): array
{
$result = $this->getResponsesByIdListCandidate($listResponsesOfCandidateId);
$tab = [];
foreach ($result as $row) {
$tab[] = (new GatewayKeyword())->getKeywordsContentByCategorieze($row['id']);
}
return array($result, $tab);
}
/**
* Permet de récupérer la liste des réponses d'un candidat par son id.
*
* @param int $listResponsesOfCandidateId Id du candidat
*
* @return array Retourne la list des réponses du candidat
*/
public function getResponsesByIdListCandidate(int $listResponsesOfCandidateId): array
{
$query = "SELECT r.* FROM Response r, Submit s WHERE s.responsesCandidate = :id AND r.id = s.response";
$this->connection->executeQuery($query, array(
':id' => array($listResponsesOfCandidateId, PDO::PARAM_INT)
));
return $this->connection->getResults();
}
/**
* Permet de récupérer la liste des id des réponses d'un candidat par son id.
*
* @param int $listResponsesOfCandidateId Id du candidat
*
* @return array Retourne la list des id des réponses du candidat
*/
public function getResponsesIdByIdListCandidate(int $listResponsesOfCandidateId): array
{
$query = "SELECT r.id FROM Response r, Submit s WHERE s.responsesCandidate = :id AND r.id = s.response";
$this->connection->executeQuery($query, array(
':id' => array($listResponsesOfCandidateId, PDO::PARAM_INT)
));
return $this->connection->getResults();
}
/**
* Permet de supprimer la réponse et ses liens avec les différents Keyword
* selon l'id de la réponse passée en paramêtre
*
* @param int $responseId Id de la réponse à supprimer
*
* @return void
*/
public function deleteResponseById(int $responseId): void
{
$query = "DELETE FROM Categorize WHERE response = :id";
$this->connection->executeQuery($query, array(
':id' => array($responseId, PDO::PARAM_INT)
));
$query = "DELETE FROM Submit WHERE response = :id";
$this->connection->executeQuery($query, array(
':id' => array($responseId, PDO::PARAM_INT)
));
$query = "DELETE FROM Response WHERE id = :id";
$this->connection->executeQuery($query, array(
':id' => array($responseId, PDO::PARAM_INT)
));
}
/**
* Permet d'insérer une réponse ainsi que de la lier avec les Keywords passés en paramètre.
*
* @param string $content Contenu de la réponse
* @param string $questionContent Contenu de la question, dans le cas où la question viendra à changer dans le futur
* @param array $category Liste des Keyword associé à la réponse
*
* @return int Retourne l'Id de la réponse insérée
*/
public function insertResponse(string $content, string $questionContent, array $category): int
{
$query = "INSERT INTO Response(content, questionContent) VALUES (:content, :questionContent)";
$this->connection->executeQuery($query, array(
':content' => array($content, PDO::PARAM_STR),
':questionContent' => array($questionContent, PDO::PARAM_STR)
));
$idResponse = $this->connection->lastInsertId();
foreach ($category as $keyword) {
$query = "INSERT INTO Categorize (response, keyword) VALUES(:response, :keyword)";
$this->connection->executeQuery($query, array(
':response' => array($idResponse, PDO::PARAM_STR),
':keyword' => array($keyword, PDO::PARAM_STR)
));
}
return $idResponse;
}
}

@ -3,7 +3,7 @@
namespace BusinessClass;
/**
* Définit une question avec plusieurs réponse mais une seule possible.
* Définit une question avec plusieurs réponses, mais une seule possible.
*/
class ListBoxQuestion extends BoxQuestion
{

@ -1,19 +1,10 @@
<?php
/*
MIT License
Copyright (c) 2012 Danny van Kooten <hi@dannyvankooten.com>
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.
*/
namespace Config;
use Exception;
use RuntimeException;
use Traversable;
class AltoRouter
{
@ -21,22 +12,22 @@ class AltoRouter
/**
* @var array Array of all routes (incl. named routes).
*/
protected $routes = [];
protected array $routes = [];
/**
* @var array Array of all named routes.
*/
protected $namedRoutes = [];
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 $basePath = '';
protected string $basePath = '';
/**
* @var array Array of default match types (regex helpers)
*/
protected $matchTypes = [
protected array $matchTypes = [
'i' => '[0-9]++',
'a' => '[0-9A-Za-z]++',
'h' => '[0-9A-Fa-f]++',
@ -53,19 +44,42 @@ class AltoRouter
* @param array $matchTypes
* @throws Exception
*/
public function __construct(array $routes = [], $basePath = '', array $matchTypes = [])
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()
public function getRoutes(): array
{
return $this->routes;
}
@ -79,10 +93,10 @@ class AltoRouter
*
* @param array $routes
* @return void
* @author Koen Punt
* @throws Exception
*@author Koen Punt
*/
public function addRoutes($routes)
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');
@ -97,7 +111,7 @@ class AltoRouter
* Useful if you are running your application from a subdirectory.
* @param string $basePath
*/
public function setBasePath($basePath)
public function setBasePath(string $basePath): void
{
$this->basePath = $basePath;
}
@ -107,7 +121,7 @@ class AltoRouter
*
* @param array $matchTypes The key is the name and the value is the regex.
*/
public function addMatchTypes(array $matchTypes)
public function addMatchTypes(array $matchTypes): void
{
$this->matchTypes = array_merge($this->matchTypes, $matchTypes);
}
@ -118,22 +132,21 @@ class AltoRouter
* @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 $name Optional name of this route. Supply if you want to reverse route this url in your application.
* @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($method, $route, $target, $name = null)
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}'");
throw new RuntimeException("Can not redeclare route ".$name);
}
$this->namedRoutes[$name] = $route;
}
return;
}
/**
@ -142,16 +155,16 @@ class AltoRouter
* Generate the URL for a named route. Replace regexes with supplied parameters
*
* @param string $routeName The name of the route.
* @param array @params Associative array of parameters to replace placeholders with.
* @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($routeName, array $params = [])
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.");
throw new RuntimeException("Route ".$routeName." does not exist.");
}
// Replace named parameters
@ -186,18 +199,18 @@ class AltoRouter
/**
* Match a given Request Url against stored routes
* @param string $requestUrl
* @param string $requestMethod
* @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($requestUrl = null, $requestMethod = null)
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 = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
$requestUrl = $_SERVER['REQUEST_URI'] ?? '/';
}
// strip base path from request url
@ -212,7 +225,7 @@ class AltoRouter
// set Request Method if it isn't passed as a parameter
if ($requestMethod === null) {
$requestMethod = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
$requestMethod = $_SERVER['REQUEST_METHOD'] ?? 'GET';
}
foreach ($this->routes as $handler) {
@ -234,7 +247,7 @@ class AltoRouter
$match = preg_match($pattern, $requestUrl, $params) === 1;
} elseif (($position = strpos($route, '[')) === false) {
// No params in url, do string comparison
$match = strcmp($requestUrl, "/SAE4.01_FORMULAIRE/Source" . $route) === 0;
$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)
@ -271,7 +284,7 @@ class AltoRouter
* @param $route
* @return string
*/
protected function compileRoute($route)
protected function compileRoute($route): string
{
if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) {
$matchTypes = $this->matchTypes;

@ -1,37 +1,50 @@
<?php
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) {
throw RuntimeException(sprintf('%s is already started', __CLASS__));
throw new RuntimeException(sprintf('%s is already started', __CLASS__));
}
self::$instance = new self();
if (!spl_autoload_register(array(self::$instance, 'autoloader'))) {
throw RuntimeException(sprintf('%s : Could not start the autoload', __CLASS__));
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 (!spl_autoload_unregister(array(self::$instance, 'autoloader'))) {
throw RuntimeException('Could not stop the autoload');
throw new RuntimeException('Could not stop the autoload');
}
self::$instance = null;
}
}
private static function autoloader($className)
private static function autoloader($className): void
{
$folder = "./";
$className = ltrim($className, '\\');

@ -6,7 +6,7 @@ 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
* 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
@ -15,23 +15,50 @@ class Clean
public static function simpleString(string $string): string
{
$string = trim($string);
$string = strip_tags($string);
$string = trim($string);
return htmlspecialchars($string);
}
/**
* Cette fonction prend une chaîne de caractères en entrée et retourne une version nettoyée de cette chaîne.
* 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
{
$email = self::simpleString($email);
// 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);
}
/**
@ -41,8 +68,15 @@ class Clean
* @return int Le nombre entier formaté
*/
public static function int(int $int): int
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,54 +0,0 @@
<?php
namespace Config;
use PDO;
use PDOStatement;
/**
* Définit une connection à la base de données.
*/
class Connection extends PDO
{
/**
* @var PDOStatement
*/
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);
}
/**
* Éxécute une réquête SQL.
*
* @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();
}
/**
* Permet de récupère le résultat de la dernière réquête éxecuté avec
* la fonction executeQuery().
*
* @return array
*/
public function getResults(): array
{
return $this->stmt->fetchAll();
}
}

@ -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
@ -67,7 +69,7 @@ class SplClassLoader
}
/**
* 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 string
*/

@ -2,6 +2,8 @@
namespace Config;
require_once "config.php";
class Validate
{
/**
@ -14,22 +16,25 @@ class Validate
public static function email(String $email): bool
{
global $emailMaxLength;
return (filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($email) <= $emailMaxLength);
// 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 $pseudo Le pseudo à valider.
* @param string $login
* @return bool Vrai si le pseudo est valide, faux sinon.
*/
public static function login(string $login) : bool
{
global $loginMaxLength;
return (strlen($login) >= 3 && preg_match("#[a-zA-Z0-9]+#", $login) && strlen($login) <= $loginMaxLength);
// Vérifier si la longueur est supérieure à 3.
if (strlen($login) <= 3 || !ctype_alnum($login) || strlen($login) >= $GLOBALS['pseudoMaxLength']) {
return false;
}
return true;
}
/**
@ -42,66 +47,88 @@ class Validate
public static function password(string $password) : bool
{
global $passwordMaxLength;
return (strlen($password) >= 8 && strlen($password) <=$passwordMaxLength &&
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é a vérifié.
* @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
{
global $keyWordMaxLength;
return (strlen($keyword) <= $keyWordMaxLength && strlen($keyword) >= 3);
return (strlen($keyword) <= $GLOBALS['keyWordMaxLength'] && strlen($keyword) >= 3);
}
/**
* Vérifie si le titre est valide.
*
* @param string $title Le titre a vérifié.
* @param string $title Le titre à vérifier
* @return bool Vrai si le titre est valide, faux sinon.
*/
public static function title(string $title) : bool
{
global $titleMaxLength;
return (strlen($title) <= $titleMaxLength && strlen($title) >= 3);
return (strlen($title) <= $GLOBALS['titleMaxLength'] && strlen($title) >= 3);
}
/**
* Vérifie si le type est valide.
*
* @param string $type Le type a vérifié.
* @param string $type Le type à vérifier
* @return bool Vrai si le type est valide, faux sinon.
*/
public static function type(string $type) : bool
{
global $typeMaxLength;
return (strlen($type) <= $typeMaxLength && strlen($type) >=3);
return (strlen($type) <= $GLOBALS['typeMaxLength'] && strlen($type) >=3);
}
/**
* Vérifie si la réponse est valide.
*
* @param string $response La réponse a vérifié.
* @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
{
global $responseMaxLength;
return (strlen($response) <= $responseMaxLength);
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
{
global $usernameMaxLength;
return (strlen($username) >= 3 && preg_match("#[a-zA-Z0-9]+#", $username) && strlen($username) <= $usernameMaxLength);
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,5 @@
<?php
use Config\Connection;
$rep = __DIR__ . '/../';
$views['form'] = 'Views/HTML/form.php';
@ -15,7 +12,6 @@ $views['questions'] = 'Views/HTML/questions.php';
$views['responses'] = 'Views/HTML/responses.php';
$views['thanks'] = 'Views/HTML/thanks.php';
$views['error'] = 'Views/HTML/error.php';
$views['interestingProfiles'] = 'Views/HTML/interestingProfiles.php';
$_SERVER['BASE_URI'] = '';
@ -27,27 +23,20 @@ $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";
function connect() //temoignage formulaire
{
$dsn = "mysql:host=localhost;dbname=formulaire;charset=utf8";
$login = "root";
try {
$connection = new Connection($dsn, $login, "root");
} catch (PDOException $e) {
http_response_code(404);
return http_response_code();
}
return $connection;
}
$emailMaxLength=150;
$pseudoMaxLength=50;
$passwordMaxLength=500;
$keyWordMaxLength=50;
$titleMaxLength=50;
$typeMaxLength=50;
$responseMaxLength=200;
$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,7 +2,11 @@
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
@ -16,10 +20,14 @@ class ControllerAdmin
* d'ajouter des réponses prédéfinies à la question.
*
* @return void
* @throws Exception
*/
public function addQuestion(): void
{
$type = $_POST['type'];
$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();
@ -35,26 +43,31 @@ class ControllerAdmin
* 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();
(new ModelAdmin)->deleteQuestion();
$this->goToQuestions();
}
/**
* Ajoute une possibilité de réponse à une question, on assige également cette réponse
* à des catégories. On propose ensuite à l'utilisateur de continuer l'ajout d'autre réponses.
* 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 = $_POST['idQuestion'];
$questionContent = $_POST['question'];
$type = $_POST['type'];
$idQuestion = Clean::int($_POST['idQuestion']);
$questionContent = Clean::simpleString($_POST['question']);
$type = Clean::simpleString($_POST['type']);
global $rep, $views;
require_once($rep.$views['continue']);
}
@ -63,28 +76,33 @@ class ControllerAdmin
* 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();
(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(). Si non, il retourne à la page d'admnistration.
* de la fonction addResponse(). Sinon, il retourne à la page administration.
*
* @return void
* @throws Exception
*/
public function continueResponse(): void
{
$choose = $_POST['choose'];
$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 = $_POST['idQuestion'];
$idQuestion = Clean::int($_POST['idQuestion']);
$categories = (new ModelAdmin())->getCategories();
$questionContent = $_POST['question'];
$type = $_POST['type'];
$questionContent = Clean::simpleString($_POST['question']);
$type = Clean::simpleString($_POST['type']);
global $rep, $views;
require_once($rep.$views['possibleResponsesForm']);
} else {
@ -97,6 +115,7 @@ class ControllerAdmin
* Permet de créer un nouveau formulaire avec un titre et une description.
*
* @return void
* @throws Exception
*/
public function createForm(): void
{
@ -105,9 +124,10 @@ class ControllerAdmin
/**
* Permet d'ajouter une catégories (mot-clef) à notre application
* Permet d'ajouter une catégorie (mot-clef) à notre application
*
* @return void
* @throws Exception
*/
public function addKeyword(): void
{
@ -119,10 +139,11 @@ class ControllerAdmin
* 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();
(new ModelAdmin)->deleteKeyword();
$this->goToCategories();
}
@ -130,10 +151,11 @@ class ControllerAdmin
* Permet de naviguer jusqu'à la page de gestion des catégories
*
* @return void
* @throws Exception
*/
public function goToCategories(): void
{
$categories = (new ModelAdmin())->getCategories();
$categories = (new ModelAdmin)->getCategories();
global $rep, $views;
require_once($rep.$views['categories']);
}
@ -143,6 +165,7 @@ class ControllerAdmin
* Permet de naviguer jusqu'à la page de gestion des questions
*
* @return void
* @throws Exception
*/
public function goToQuestions(): void
{
@ -155,10 +178,11 @@ class ControllerAdmin
* Permet de naviguer jusqu'à la page de gestion des réponses
*
* @return void
* @throws Exception
*/
public function goToResponses(): void
{
$responsesCandidate = (new ModelAdmin())->getResponsesCandidate();
$responsesCandidate = (new ModelAdmin)->getResponsesCandidate();
global $rep, $views;
require_once($rep.$views['responses']);
}
@ -169,15 +193,12 @@ class ControllerAdmin
require_once($rep.$views['admin']);
}
/**
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
(new ModelAdmin())->deleteResponsesCandidate();
(new ModelAdmin)->deleteResponsesCandidate();
$this->goToResponses();
}
public function goToProfiles(): void {
global $rep, $views;
$profiles = (new ModelAdmin())->getInterestingProfiles();
require_once($rep.$views['interestingProfiles']);
}
}

@ -15,6 +15,7 @@ class ControllerCandidate
* Permet de naviguer jusqu'au formulaire.
*
* @return void
* @throws Exception
*/
public function goToForm(): void
{
@ -34,6 +35,7 @@ class ControllerCandidate
* Permet de finaliser la saisie du formulaire et de le soumettre.
*
* @return void
* @throws Exception
*/
public function submitForm(): void
{
@ -46,18 +48,18 @@ class ControllerCandidate
global $rep, $views;
require_once($rep.$views['thanks']);
}
public function login() :void {
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']);
}
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,8 +3,6 @@
namespace Controller;
use Exception;
use PDOException;
use Config\Validate;
use Config\Clean;
use Config\AltoRouter;
@ -12,11 +10,16 @@ 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 {
private $router;
private $rights;
public function __construct() {
class FrontController
{
private AltoRouter $router;
private array $rights;
/**
* @throws Exception
*/
public function __construct()
{
$this->router = new AltoRouter();
$this->router->setBasePath($_SERVER['BASE_URI']);
$this->mapRoutes();
@ -26,28 +29,44 @@ class FrontController {
);
}
public function run() {
/**
* @return array
*/
public function getRights(): array
{
return $this->rights;
}
/**
* @return AltoRouter
*/
public function getRouter(): AltoRouter
{
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'])) {
if (!isset($_SESSION['role']) || ($_SESSION['role']!="Admin" && $_SESSION['role']!="Candidate")) {
$_SESSION['role'] = 'Candidate';
}
$role = Clean::simpleString($_SESSION['role']);
foreach($this->rights[$role] as $controllerName) {
foreach ($this->rights[$role] as $controllerName) {
if(strcmp($controllerName,$target[0])===0) {
if (strcmp($controllerName, $target[0])===0) {
$controllerClass = '\Controller\\' . $target[0];
$controller = new $controllerClass();
$controller->{$target[1]}($params);
$exists=true;
}
}
if(!$exists) {
if (!$exists) {
$error = '403';
require_once($rep . $views['error']);
}
@ -58,26 +77,29 @@ class FrontController {
}
}
private function mapRoutes(): void {
/**
* @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');
$this->router->map('GET','/goToProfiles',array($controller['Admin'],'goToProfiles'),'goToProfiles');
$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

@ -10,4 +10,4 @@ class InexistantLoginException extends Exception
{
parent::__construct("Identifiant inexistant");
}
}
}

@ -3,10 +3,11 @@
namespace Exceptions;
use Exception;
class InvalidLoginOrPasswordException extends Exception
{
public function __construct()
{
parent::__construct("Identifiant ou mot de passe invalide");
}
}
}

@ -6,8 +6,8 @@ use Exception;
class InvalidUsernameOrPasswordException extends Exception
{
public function __construct($message = "nom d'utilisateur ou mot de passe invalide", $code = 0, Exception $previous = null)
public function __construct($message = "Nom d'utilisateur ou mot de passe invalide", $code = 0, Exception $previous = null)
{
parent::__construct($message, $code, $previous);
}
}
}

@ -5,7 +5,7 @@ namespace Model;
use BusinessClass\Question;
/**
* Décrit les fonctionnalités principale d'une frabique
* Décrit les fonctionnalités principales d'une fabrique
*/
abstract class Factory
{
@ -20,7 +20,7 @@ abstract class Factory
/**
* Permet de récupérer les objets créer par la fonction create().
* Permet de récupérer les objets créés par la fonction create().
*
* @param array $results
* @param string $type

@ -12,7 +12,7 @@ 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 type de question.
* passer en paramètre. On prend en compte les différents types de question.
*
* @param array $results
*
@ -23,14 +23,14 @@ class FactoryQuestion extends Factory
$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']);
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'];
$content = $results[0][$i]->content;
$categories = $results[2][$i];
$id = $results[0][$i]['id'];
$questions[] = new $results[0][$i]['type']($possiblesResponses, $content, $categories, $id);
$id = $results[0][$i]->id;
$questions[] = new $results[0][$i]->type($possiblesResponses, $content, $categories, $id);
}
}
}

@ -2,14 +2,14 @@
namespace Model;
use API\script\Gateway\GatewayForm;
use API\script\Gateway\GatewayKeyword;
use API\script\Gateway\GatewayListResponseOfCandidate;
use API\script\Gateway\GatewayPossibleResponse;
use API\script\Gateway\GatewayQuestion;
use API\script\Gateway\GatewayResponse;
use BusinessClass\Form;
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
@ -17,10 +17,17 @@ use PDOException;
*/
class ModelAdmin
{
private Client $client;
public function __construct()
{
$this->client = new Client(['headers' => ['Content-Type' => 'application/json'], 'verify' => false]);
}
public function goToAdmin(): void
{
global $rep, $views;
try{
try {
require_once($rep . $views['admin']);
} catch (PDOException $e) {
$error = $e->getMessage();
@ -32,19 +39,41 @@ class ModelAdmin
* reconnaitre facilement dans la suite du code.
*
* @return int
* @throws Exception
*/
public function addQuestion(): int
{
$questionContent = $_POST['question'];
$type = $_POST['type'];
$question = new $type(0, $questionContent);
$form = (new GatewayForm())->getForm();
if (!empty($form)) {
return (new GatewayQuestion())->addQuestion(array(get_class($question) ,$question->getContent()), $form[0]['id']);
$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;
}
@ -52,50 +81,109 @@ class ModelAdmin
* Permet de supprimer une question du formulaire
*
* @return void
* @throws Exception
*/
public function deleteQuestion():void
{
$idQuestion = $_POST["idQuestion"];
$type = $_POST["type"];
(new GatewayQuestion())->deleteQuestion($idQuestion, $type);
$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);
}
}
/**
* Permet d'ajouter une possibilité de réponse à une question en l'assignant à des catégories.
*
* @return void
* @throws Exception
*/
public function addResponse(): void
public function addResponse(): void
{
$idQuestion = $_POST['idQuestion'];
$response = $_POST['response'];
$categories = $_POST['categories'];
$idQuestion = Clean::int($_POST['idQuestion']);
$response = Clean::simpleString($_POST['response']);
$categories = Clean::simpleStringArray($_POST['categories']);
if ($categories == null) {
$categories = [];
}
(new GatewayQuestion())->insertResponseInQuestion($response, $categories, $idQuestion);
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);
}
}
/**
* Permet de supprimer une possible réponse à une question
*
* @return void
* @throws Exception
*/
public function deleteResponse(): void
{
(new GatewayPossibleResponse())->deletePossibleResponse($_POST["possibleResponse"]);
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);
}
}
@ -104,33 +192,69 @@ class ModelAdmin
* Permet d'ajouter une nouvelle catégorie (mot-clef)
*
* @return void
* @throws Exception
*/
public function addKeyword(): void
{
$keyword = $_POST['keyword'];
(new GatewayKeyword())->insertKeyword($keyword);
$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
{
(new GatewayKeyword())->deleteKeyword($_POST["idCateg"]);
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 = [];
foreach ((new GatewayKeyword())->getAllKeyword() as $category) {
$categories[] = $category["word"];
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;
@ -141,16 +265,35 @@ class ModelAdmin
* Permet de récupérer toutes les questions existantes.
*
* @return array
* @throws Exception
*/
public function getQuestions(): array
{
if((new GatewayForm())->existsForm()) {
$idForm = (new GatewayForm())->getForm()[0]["id"];
$questionsArray = (new GatewayQuestion())->getAllQuestions($idForm);
return Factory::getBuiltObjects($questionsArray, "Question");
}
else {
return 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);
}
}
@ -159,77 +302,51 @@ class ModelAdmin
* Permet de récupérer toutes les réponses existantes.
*
* @return array
* @throws Exception
*/
public function getResponsesCandidate(): array
{
$responsesCandidate = (new GatewayListResponseOfCandidate())->getAllListResponsesOfCandidate();
$results = [];
foreach ($responsesCandidate as $response) {
$results[] = (new GatewayListResponseOfCandidate())->getDetailsListResponsesOfCandidate($response["id"]);
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);
}
return $results;
}
/**
* Permet de supprimer les réponses d'une personne d'un formulaire
*
* @return void
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
(new GatewayListResponseOfCandidate())->deleteListResponseOfCandidate($_POST["idResponseCandidate"]);
}
/**
* Permet de récupérer tous les profiles intéressants à interviewer
*
* @return array
*/
public function getInterestingProfiles(): array
{
$occurences = ["2ème année" => 3, "Stage" => 3, "Alternance" => 1];
$responsesCandidates = (new GatewayListResponseOfCandidate())->getAllListResponsesOfCandidate();
$responses = [];
$profil = [];
foreach ($responsesCandidates as $candidate) {
$responses = (new GatewayListResponseOfCandidate())->getDetailsListResponsesOfCandidate($candidate["id"]);
$tab = [];
foreach ($responses[2] as $categories) {
if (isset($categories[0])) {
$tab[] = $categories[0];
}
}
$profil[$candidate["id"]] = $tab;
}
foreach ($profil as $key => $elements) {
foreach ($elements as $profilElement) {
if (!array_key_exists($profilElement, $occurences)) {
var_dump($key);
var_dump($elements);
echo "----------------";
$index = array_search($profilElement, $elements);
if ($index !== false) {
unset($elements[$index]);
}
}
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);
}
echo "\ndfoeznfiozerbgiofzerjgopizerjgioerhj\n";
foreach ($profil as $key => $elements) {
foreach ($elements as $profilElement) {
if ($occurences[$profilElement] <= min($occurences)) {
var_dump($key);
var_dump($profilElement);
}
}
}
return [];
}
}

@ -2,15 +2,14 @@
namespace Model;
use API\script\Gateway\GatewayForm;
use API\script\Gateway\GatewayListResponseOfCandidate;
use API\script\Gateway\GatewayQuestion;
use API\script\Gateway\GatewayAdmin;
use Config\Clean;
use Config\Validate;
use Exceptions\InvalidUsernameOrPasswordException;
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
@ -18,17 +17,25 @@ use Exceptions\InexistantLoginException;
*/
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 ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'submitForm') {
if (isset($_POST['action']) && Clean::simpleString($_POST['action']) === 'submitForm') {
$dataIdsJson = $_POST['data_ids'];
$dataIds = json_decode($dataIdsJson);
}
@ -37,49 +44,82 @@ class ModelCandidate
$category = [];
$questionsId = [];
foreach ($answersAndCategories as $answerAndCategory) {
$exploded = explode("||",$answerAndCategory);
if( count($exploded) == 3 ){
$questionsId[] = $exploded[0];
$answer[] = $exploded[1];
$categs = $exploded[2];
$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 {
} else {
$questionsId[] = array_shift($dataIds);
$answer[] = $answerAndCategory;
$category[] = [];
}
}
$title = (new GatewayForm())->getForm()[0]["title"];
(new GatewayListResponseOfCandidate())->insertListResponsesOfCandidate($questionsId, $answer, $category, $title);
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 traduits en code HTML puis on le retourne. On utilise une Factory
* pour récupèrer les questions.
* 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
{
$form = (new GatewayForm())->getForm();
if (empty($form)) {
return "PAS DE FORMULAIRE\n";
}
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";
}
$title = $form[0]['title'];
$description = $form[0]['description'];
$questionsTab = (new GatewayQuestion())->getAllQuestions($form[0]['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);
}
$questions = Factory::getBuiltObjects($questionsTab, "Question");
$nbQuestions = count($questions);
$time = round(($nbQuestions * 20)/60);
$time = round(($nbQuestions * 20) / 60);
$html = "<div class='container mt-5'>
<div class='row d-flex justify-content-center align-items-center'>
@ -88,17 +128,15 @@ class ModelCandidate
<h1 id='register'>$title</h1>
<div class='all-steps' id='all-steps'>";
for ($i = 0; $i < sizeof($questions); $i++) {
$html.= "<span class='step'><i class='fa'></i></span>";
}
$html .= str_repeat("<span class='step'><i class='fa'></i></span>", sizeof($questions));
$html.= "</div>";
foreach ($questions as $question) {
$html.= $question->printStrategy()."\n";
$html .= $question->printStrategy() . "\n";
}
if (count($questions) > 0) {
$html.= "<div class='thanks-message text-center' id='text-message'> <img src='https://i.imgur.com/O18mJ1K.png' width='100' class='mb-4'>
$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
@ -114,21 +152,46 @@ class ModelCandidate
</div>
</div>";
} else {
$html.= "\t\t</form>\n
$html .= "\t\t</form>\n
\t</div>\n";
}
return $html;
}
public function login() :void {
$password = $_REQUEST['password'];
$identifiant = $_REQUEST['login'];
$passwordbdd = (new GatewayAdmin())->getPasswordWithLogin($identifiant);
if (strcmp($password, $passwordbdd) == 0) {
$_SESSION['role'] = 'Admin';
} else {
$_SESSION['role'] = 'Visitor';
/**
* @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());
}
}

@ -1,8 +1,3 @@
* {
margin: 0;
padding: 0;
}
body {
background-image: url('../IMAGES/background_uca.png');
background-attachment: fixed;
@ -10,42 +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%;
}
#container {
display: flex;
flex-direction: row;
justify-content: space-around;
}
.form-center {
text-align: center;
}
.hidden-content {
visibility: hidden;
}
.button-continue {
border-radius: 10px;
width: 1rem;
color: red;
}

@ -1,11 +1,13 @@
body {
background: #eee
}
@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: 0px auto;
font-family: Poppins;
margin: 0 auto;
font-family: Poppins, serif;
padding: 40px;
border-radius: 30px;
background-color: rgba(23,143,150,0.7);
@ -17,7 +19,7 @@ body {
h1 {
text-align: center;
font-family: Poppins;
font-family: Poppins, serif;
}
h6 {
@ -28,7 +30,7 @@ input {
padding: 10px;
width: 100%;
font-size: 17px;
font-family: Raleway;
font-family: Raleway, serif;
border: 1px solid #aaaaaa;
border-radius: 10px;
-webkit-appearance: none;
@ -58,7 +60,7 @@ button {
border-radius: 50%;
padding: 10px 20px;
font-size: 17px;
font-family: Raleway;
font-family: Raleway, serif;
cursor: pointer
}

@ -1,4 +1,6 @@
@charset "UTF-8";
@import url("styles.css") screen;
/*!
* Start Bootstrap - Shop Homepage v5.0.5 (https://startbootstrap.com/template/shop-homepage)
* Copyright 2013-2022 Start Bootstrap
@ -112,7 +114,7 @@ body {
text-align: var(--bs-body-text-align);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
background-image: url('../../../../SAE4.01_Temoignages/Source/Views/IMAGES/background_uca.png');
background-image: url('../IMAGES/background_uca.png');
background-attachment: fixed;
background-size: cover;
background-repeat: no-repeat;

@ -3,16 +3,17 @@
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $awesomeFont, $bootstrapMin, $bootstrapIcon, $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 href="Views/css/styles.css" rel="stylesheet" />
<link href="Views/css/stylesForm.css" rel="stylesheet" />
<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">
@ -41,7 +42,7 @@
<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>
<a class="nav-link" href="/index.php?action=GoToAddTestimony">Témoignages</a>
</li>
</ul>
</div>
@ -61,7 +62,9 @@
<div class="tab">
<h6>Écrivez la question : </h6>
<p>
<input placeholder="Question..." oninput="this.className = ''" name="question">
<label>
<input placeholder="Question..." oninput="this.className = ''" name="question">
</label>
</p>
</div>
@ -70,14 +73,16 @@
<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>
<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>
<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" class="mb-4">
<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'>
@ -94,13 +99,11 @@
</div>
<br><br>
<footer class="py-5 bg-white">
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="Views/js/scripts.js"></script>
<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>

@ -7,13 +7,14 @@
<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="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">
<img src="Views/IMAGES/logoUca.png" class="logo" alt="logo" height="auto" width="auto">
<article class="card">
<main id="main-content">
<section id="content">

@ -5,7 +5,7 @@
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/base.css" />
<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">
@ -23,7 +23,6 @@
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
<a href="goToProfiles">Les profils intéressants</a>
</div>
<br>
@ -39,6 +38,7 @@
<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">';

@ -1,10 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<!DOCTYPE html>
<html lang="en">
<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" />
@ -13,8 +12,8 @@
<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 href="Views/css/styles.css" rel="stylesheet" />
<link href="Views/css/stylesForm.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">
@ -52,9 +51,12 @@
<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 echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php echo $type; ?>">
<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>
@ -63,10 +65,10 @@
</form>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="Views/js/scripts.js"></script>
<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>

@ -1,9 +1,18 @@
<html>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/common.css">
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
<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 echo $error ?></h1>
<h1>
<?php if (empty($error)) {
echo "Erreur";
} else {
echo $error;
}
?>
</h1>
</body>
</html>
</html>

@ -3,16 +3,17 @@
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/styles.css" />
<link rel="stylesheet" href="Views/CSS/stylesForm.css" />
<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" />
<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">
@ -28,17 +29,17 @@
</div>
</header>
<?php echo $html; ?>
<?php /** @var string $html */
echo $html;
?>
<br><br>
<footer class="py-5 bg-white">
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="Views/JS/scripts.js"></script>
<script src="Views/JS/getData-Ids.js"></script>
<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>

@ -1,37 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link 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>
<a href="goToProfiles">Les profils intéressants</a>
</div>
<br>
<div class="form-center">
<!-- Add profiles -->
</div>
</body>
</html>

@ -3,6 +3,7 @@
<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" />
@ -11,8 +12,8 @@
<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 href="Views/css/styles.css" rel="stylesheet" />
<link href="Views/css/stylesForm.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">
@ -52,9 +53,12 @@
<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 echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php echo $type; ?>">
<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>
@ -64,13 +68,16 @@
<div class="tab">
<h6>Entrez une réponse : </h6>
<p>
<input placeholder="Réponse..." oninput="this.className = ''" name="response">
<label>
<input placeholder="Réponse..." oninput="this.className = ''" name="response">
</label>
</p>
</div>
<div class="tab">
<h6>Séléctionnez les catégories associées à cette réponse : </h6>
<?php foreach ($categories as $category) { ?>
<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 ?>">
@ -78,7 +85,7 @@
<?php } ?>
</div>
<div class="thanks-message text-center" id="text-message"> <img src="https://i.imgur.com/O18mJ1K.png" width="100" class="mb-4">
<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'>
@ -95,13 +102,10 @@
</div>
<br><br>
<footer class="py-5 bg-white">
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="Views/js/scripts.js"></script>
<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>

@ -5,7 +5,7 @@
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/base.css" />
<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">
@ -23,7 +23,6 @@
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
<a href="goToProfiles">Les profils intéressants</a>
</div>
<br>
@ -40,7 +39,7 @@
<div>
<br>
<label for="type">Séléctionnez le type de question souhaitée :
<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.
@ -62,6 +61,7 @@
<br>
<ul class="form-center">
<?php
/** @var array $questions */
foreach ($questions as $question) {
?>
<form method="post" action="deleteQuestion">

@ -5,7 +5,7 @@
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/base.css" />
<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">
@ -23,7 +23,6 @@
<a href="goToCategories">Les catégories</a>
<a href="goToQuestions">Les questions</a>
<a href="goToResponses">Les réponses</a>
<a href="goToProfiles">Les profils intéressants</a>
</div>
<br>
@ -34,8 +33,9 @@
<div id="listResponses">
<form method="post" action="deleteResponsesCandidate">
<?php
/** @var array $responsesCandidate */
foreach ($responsesCandidate as $response) { ?>
<i><?php echo $response[0]["date"];;?></i>
<i><?php echo $response[0]["date"];?></i>
<p>Catégories associées :
<?php
echo " | ";

@ -3,10 +3,11 @@
<head>
<?php
global $googleApis, $googleStatic, $poppins, $icon, $logoUCA;
global $jQueryMin, $bundle4, $bundle5;
?>
<meta charset="UTF-8">
<link rel="stylesheet" href="Views/CSS/styles.css" />
<link rel="stylesheet" href="Views/CSS/stylesForm.css" />
<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">
@ -40,9 +41,9 @@
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<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>

@ -1,4 +1,4 @@
var currentTab = 0;
let currentTab = 0;
document.addEventListener("DOMContentLoaded", function(event) {
@ -7,14 +7,14 @@ document.addEventListener("DOMContentLoaded", function(event) {
});
function showTab(n) {
var x = document.getElementsByClassName("tab");
const x = document.getElementsByClassName("tab");
x[n].style.display = "block";
if (n == 0) {
if (n === 0) {
document.getElementById("prevBtn").style.display = "none";
} else {
document.getElementById("prevBtn").style.display = "inline";
}
if (n == (x.length - 1)) {
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>';
@ -23,8 +23,8 @@ function showTab(n) {
}
function nextPrev(n) {
var x = document.getElementsByClassName("tab");
if (n == 1 && !validateForm()) return false;
const x = document.getElementsByClassName("tab");
if (n === 1 && !validateForm()) return false;
x[currentTab].style.display = "none";
currentTab = currentTab + n;
if (currentTab >= x.length) {
@ -42,11 +42,11 @@ function nextPrev(n) {
}
function validateForm() {
var x, y, i, valid = true;
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 == "") {
if (y[i].value === "") {
y[i].className += " invalid";
valid = false;
}
@ -60,7 +60,7 @@ function validateForm() {
}
function fixStepIndicator(n) {
var i, x = document.getElementsByClassName("step");
let i, x = document.getElementsByClassName("step");
for (i = 0; i < x.length; i++) {
x[i].className = x[i].className.replace(" 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>

@ -5,7 +5,7 @@ use Config\Autoload;
require_once(__DIR__.'/Config/Autoload.php');
require_once(__DIR__.'/Config/config.php');
require_once(__DIR__.'/Config/Connection.php');
require_once(__DIR__.'/Config/Autoload.php');
Autoload::charger();
session_start();

@ -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