Compare commits

...

91 Commits

Author SHA1 Message Date
dorian.hodin a230ceb8bb Change Controller to access admin
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9b33a0207f Add .htaccess rule 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 01aca47283 Add .htaccess rule 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 094c67736b Add .htaccess rule
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin e76e6ee056 Try to change route 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f7dcfd2839 Try to change route
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 65b79cd8e7 Change every file 6
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin b49ee87474 Change every file 5
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 06b4aa2f8e Change every file 4
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 7a51b1979b Change every file 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 678d8d35ad Change every file 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 65e4ee21d2 Change every file 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 589803ec21 Change container name path
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 61395e5fd9 Try to add container name env var 5
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 86829153c8 Try to add container name env var 4
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 8c2745c8f6 Try to add container name env var 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 439ccf8be7 Try to add container name env var 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f7cbc30ea1 Try to add container name env var 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 1e8584899f Change default path, add / at the beginning of the url, change env var
continuous-integration/drone/push Build encountered an error Details
2 years ago
dorian.hodin bf44841669 Add working path to css and js files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 273f34a188 Try to display container name
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 86f91a5140 Add new secret, try to add container name in base url
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis e17eeeb98b Code smells and bugs resolve 15
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 21980efc86 Code smells and bugs resolve 14
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis aaba66ff5e Code smells and bugs resolve 13
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 329f6da171 Code smells and bugs resolve 12
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 85fac9b09e Code smells and bugs resolve 11
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 966e961c1b Code smells and bugs resolve 10
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 071b3f4fd4 Code smells and bugs resolve 9
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 321c3b9ee9 Code smells and bugs resolve 8
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 5a4066bb34 Code smells and bugs resolve 7
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7ab85d2050 Code smells and bugs resolve 6
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 7663ee93ac Code smells and bugs resolve 5
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 96cb672063 Code smells and bugs resolve 4
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis c08ea82208 Code smells and bugs resolve 3
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 00f3aa0e91 Code smells and bugs resolve 2
continuous-integration/drone/push Build is passing Details
2 years ago
Alexis 03d6a3c253 Code smells and bugs resolve 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 13522ef57f Add gitignore configuration
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 05235c2b34 Add Autoload Files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin a4d7ce9a1e Change many file for Tests, Tests working, can create a good coverage.xml file for now
2 years ago
Johan LACHENAL 56f8668424 Mise à jour de 'Source/Tests/TestModel/testModelAdmin.php'
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 377307362c Add unitary tests for the modelAdmin class
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL d20cc43d9a Add unitary tests for the modelAdmin class
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 80a95da97c Try to get the container name 7
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin b70338974e Try to get the container name 6
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin c678bd14b5 Try to get the container name 5
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 76ebc3a884 Try to get the container name 4
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 524f98b3ca Try to get the container name 3
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin ee9a1900b0 Try to get the container name 2
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 3ca03c3110 Add some autoloader files, so code can work, try 2, adding all composer file (just testing)
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin e3e7f502be Add some autoloader files, so code can work, try 4
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin d5874a315b Add some autoloader files, so code can work, try 2, adding all composer file (just testing)
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin a5718f524f Add some autoloader files, so code can wor, try 2
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 5781777849 Add some autoloader files, so code can wor, try 1
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 1855a2b288 Try to deploy 3, change Dockerfile
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 4a66c343ef Try to deploy 2, change Dockerfile
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin 9d77a37a1a Try to deploy, change Dockerfile place
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 16b932e47c Modification od Models, can now call APi without error in URL
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 332628d5b5 Back to old version, try to deploy 3
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9fe0dfe3f4 Back to old version, try to deploy 2
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 81f1010eec Back to old version, try to deploy
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 76c6702e14 Change name and remove tree
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 811d7c2f5b Try to display tree
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 18319f0ac5 Modification of the url to xml file for coverage, change image name
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin b6009ebba9 Dockefile work fine, image created 5
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin 32984fcf6d Dockefile work fine, image created 3
continuous-integration/drone/push Build is passing Details
2 years ago
dohodin c883dcaf3e Dockefile work fine, image created 3
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin f99b0594d9 Dockefile work fine, image created 2
continuous-integration/drone/push Build is failing Details
2 years ago
dohodin 08306cda9e Dockefile work fine, image created
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 6d1b72a67c Change Source path 3
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 953bf14737 Change Source path 2
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 91eab376f4 Change Source path
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 9f7d2dd03f Try to add Dockerfile to root
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin b1bb513c5d Come back to old version
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin e168d3667e Add Source directory
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 3006c49904 Add zip package download
continuous-integration/drone/push Build is failing Details
2 years ago
dorian.hodin 29afcbad3f Modification of some file to get good results from API, add Dockerfile to deploy, try to deploy in .drone.yml, try to add text/css type to css import because server cant load CSS, still not working
continuous-integration/drone/push Build was killed Details
2 years ago
dorian.hodin 3ee2764220 Merging Unit Test into Master
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 9617eb8074 Merge branch 'unit_test'
2 years ago
johan 4ab9c2dafb ajout du nettoyage et validation des données suer master
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 922e2f8256 ajout d'autres validations
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL efae1c1720 Ajout d'autres validations
continuous-integration/drone/push Build is passing Details
2 years ago
Johan LACHENAL 2872f25859 Nettoyage et validation des données version 1
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin f14c6b07df SonarQube verify only PHP files
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 929220c981 Merging delete function onto master, api call are now effective on delete
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 25fe072a12 Merge branch 'delete'
2 years ago
dorian.hodin f06fec639e Delete Gateway, call API on delete function
continuous-integration/drone/push Build is passing Details
2 years ago
Dorian HODIN ea46ead3b1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
dorian.hodin 840beee66a Add api_call branch on Master
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster dbffb4bfac ajout des bouttons de suppression de données et ajustement des Gateway
continuous-integration/drone/push Build is passing Details
2 years ago
Ness Gaster 1553784e6f ajout des bouttons de suppression de données et ajustement des Gateway
continuous-integration/drone/push Build is passing Details
2 years ago

@ -8,11 +8,11 @@ trigger:
steps:
- name: coverage-image
- name: formulaire
image: plugins/docker
settings:
dockerfile: ./Source/Tests/Dockerfile
context: Source/Tests
dockerfile: ./Source/Dockerfile
context: ./Source
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/dorian.hodin/sae4.01_formulaire
username:
@ -20,17 +20,16 @@ steps:
password:
from_secret: SECRET_PASSWD
#conteneur deployment
- name: deploy-coverage
- 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: coverage-image
CONTAINERNAME:
from_secret : CONTAINER_NAME
COMMAND: create
OVERWRITE: true
ADMINS: dorianhodin,alexislamande,baptistebaverel,johanlachenal
depends_on: [ coverage-image ]
depends_on: [ formulaire ]
- name: setup_PHP_for_SonarQube
image: sonarsource/sonar-scanner-cli
@ -38,7 +37,7 @@ steps:
SONAR_TOKEN:
from_secret: SONARQ_TOKEN
commands:
- curl https://codefirst.iut.uca.fr/containers/Temoignages-coverage-image/coverage.xml -o /drone/src/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
@ -46,6 +45,5 @@ steps:
-Dsonar.language=php
-Dsonar.host.url=https://codefirst.iut.uca.fr/sonar
-Dsonar.php.coverage.reportPaths=coverage.xml
depends_on: [ deploy-coverage ]
depends_on: [ deploy-form ]

15
.gitignore vendored

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

@ -8,5 +8,13 @@
</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>

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

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

@ -1,15 +1,4 @@
<?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;

@ -1,8 +1,11 @@
<?php
namespace Config;
use RuntimeException;
require_once(__DIR__.'/vendor/autoload.php');
class Autoload
{
private static mixed $instance = null;

@ -20,6 +20,28 @@ class Clean
return htmlspecialchars($string);
}
/**
* Cette fonction prend un tableau de chaînes de caractères en entrée et retourne un tableau de chaînes
* nettoyées.
* Elle supprime les espaces de début et de fin, ainsi que toutes les balises HTML, et encode les
* caractères spéciaux.
*
* @param array $array Le tableau de chaînes à nettoyer
* @return array Le tableau de chaînes nettoyées
*/
public static function simpleStringArray(array $array): array
{
$array = array_map('htmlspecialchars', $array);
$array = array_map('trim', $array);
$array = array_map('strip_tags', $array);
$array = array_map(function ($element) {
return trim(preg_replace('/\s+/', ' ', $element));
}, $array);
return array_map('trim', $array);
}
/**
* Cette fonction prend une chaîne de caractères en entrée et retourne une version nettoyée de cette chaîne.
* Elle supprime les espaces de début et de fin, ainsi que toutes les balises HTML et encode les
@ -49,10 +71,12 @@ class Clean
public static function int(mixed $int): int
{
if (!is_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);
}
}

@ -98,6 +98,14 @@ class Validate
{
return (strlen($response) <= $GLOBALS['responseMaxLength'] && !empty($response));
}
/**
* Vérifie si le nom est valide.
*
* @param string $username
* @return bool Vrai si le nom est valide, faux sinon.
*/
public static function username(string $username): bool
{
if (strlen($username) <= 3 || !ctype_alnum($username) || strlen($username) >= $GLOBALS['usernameMaxLength']) {
@ -106,4 +114,21 @@ class Validate
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;
}
}

@ -16,7 +16,7 @@
}
},
"require-dev": {
"phpunit/phpunit": "^10.0"
"phpunit/phpunit": "^9.0"
}
}

File diff suppressed because it is too large Load Diff

@ -11,7 +11,7 @@ $views['categories'] = 'Views/HTML/categories.php';
$views['questions'] = 'Views/HTML/questions.php';
$views['responses'] = 'Views/HTML/responses.php';
$views['thanks'] = 'Views/HTML/thanks.php';
$views['error']='Views/HTML/error.php';
$views['error'] = 'Views/HTML/error.php';
$_SERVER['BASE_URI'] = '';
@ -23,6 +23,12 @@ $googleStatic = "https://fonts.gstatic.com";
$poppins = "https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap";
$icon = "https://cdn.uca.fr/images/favicon/favicon.ico";
$logoUCA = "https://cdn.uca.fr/images/logos/logo_uca_mini_light.png";
$bootstrapIcon = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css";
$bootstrapMin = "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css";
$awesomeFont = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";
$jQueryMin = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js";
$bundle4 = "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js";
$bundle5 = "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js";
$GLOBALS['emailMaxLength']=150;
$GLOBALS['pseudoMaxLength']=50;
@ -32,4 +38,5 @@ $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
);
}

@ -5,6 +5,8 @@ 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
@ -22,7 +24,7 @@ class ControllerAdmin
*/
public function addQuestion(): void
{
$type = $_POST['type'];
$type = Clean::simpleString($_POST['type']);
if (empty($_POST['type'])) {
throw new InvalidArgumentException('$_POST[\'type\'] is empty');
}
@ -37,6 +39,17 @@ 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();
$this->goToQuestions();
}
/**
* Ajoute une possibilité de réponse à une question, on assigne également cette réponse
@ -52,13 +65,25 @@ class ControllerAdmin
}
(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']);
}
/**
* Permet de supprimer une possible réponse par son id récupéré par le tableau $_POST
*
* @return void
* @throws Exception
*/
public function deleteResponse(): void
{
(new ModelAdmin)->deleteResponse();
$this->goToQuestions();
}
/**
* Permet de proposer à l'utiliser de continuer ou non à ajouter des possibilités de réponses à l'aide
@ -69,15 +94,15 @@ class ControllerAdmin
*/
public function continueResponse(): void
{
$choose = Clean::simpleString($_POST['choose']);
if (empty($_POST['choose'] || empty($_POST['idQuestion']) || empty($_POST['type']) || empty($_POST['question']))) {
throw new InvalidArgumentException('$_POST parameters is missing');
}
$choose = $_POST['choose'];
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 {
@ -110,6 +135,17 @@ class ControllerAdmin
$this->goToCategories();
}
/**
* Permet de supprimer un mot clef qui sera récupéré par le tableau $_POST
*
* @return void
* @throws Exception
*/
public function deleteKeyword(): void
{
(new ModelAdmin)->deleteKeyword();
$this->goToCategories();
}
/**
* Permet de naviguer jusqu'à la page de gestion des catégories
@ -119,7 +155,7 @@ class ControllerAdmin
*/
public function goToCategories(): void
{
$categories = (new ModelAdmin())->getCategories();
$categories = (new ModelAdmin)->getCategories();
global $rep, $views;
require_once($rep.$views['categories']);
}
@ -138,7 +174,6 @@ class ControllerAdmin
require_once($rep.$views['questions']);
}
/**
* Permet de naviguer jusqu'à la page de gestion des réponses
*
@ -147,7 +182,7 @@ class ControllerAdmin
*/
public function goToResponses(): void
{
$responsesCandidate = (new ModelAdmin())->getResponsesCandidate();
$responsesCandidate = (new ModelAdmin)->getResponsesCandidate();
global $rep, $views;
require_once($rep.$views['responses']);
}
@ -157,4 +192,13 @@ class ControllerAdmin
global $rep, $views;
require_once($rep.$views['admin']);
}
/**
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
(new ModelAdmin)->deleteResponsesCandidate();
$this->goToResponses();
}
}

@ -48,16 +48,16 @@ class ControllerCandidate
global $rep, $views;
require_once($rep.$views['thanks']);
}
public function login() :void {
public function login(): void
{
global $rep,$views;
try{
try {
$model= new ModelCandidate();
$model->login();
if($_SESSION['role'] == "Admin") {
if ($_SESSION['role'] == "Admin") {
require_once($rep . $views['admin']);
}
else
{
} else {
require_once($rep . $views['adminLogin']);
}
} catch (Exception $e) {

@ -10,14 +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 {
class FrontController
{
private AltoRouter $router;
private array $rights;
/**
* @throws Exception
*/
public function __construct() {
public function __construct()
{
$this->router = new AltoRouter();
$this->router->setBasePath($_SERVER['BASE_URI']);
$this->mapRoutes();
@ -50,25 +52,27 @@ class FrontController {
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) {
if(strcmp($controllerName,$target[0])===0) {
foreach ($this->rights[$role] as $controllerName) {
if (strcmp($controllerName, $target[0])===0) {
$controllerClass = '\Controller\\' . $target[0];
$controller = new $controllerClass();
$controller->{$target[1]}($params);
$exists=true;
}
}
if(!$exists) {
$error = $error['403'];
if (!$exists) {
$error = '403';
require_once($rep . $views['error']);
}
} else {
// no route was matched
$error = $error['404'];
$error = '404';
require_once($rep . $views['error']);
}
}
@ -83,15 +87,19 @@ class FrontController {
$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', '/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

@ -3,6 +3,7 @@
namespace Exceptions;
use Exception;
class InvalidLoginOrPasswordException extends Exception
{
public function __construct()

@ -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);
}
}
}

@ -5,8 +5,11 @@ namespace Model;
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
@ -16,14 +19,15 @@ class ModelAdmin
{
private Client $client;
public function __construct(){
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();
@ -39,33 +43,66 @@ class ModelAdmin
*/
public function addQuestion(): int
{
$questionContent = $_POST['question'];
$type = $_POST['type'];
$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){
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']
$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){
if ($res->getStatusCode() != 200) {
throw new Exception('AddQuestion failed');
}
return json_decode($res->getBody());
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} 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;
}
/**
* Permet de supprimer une question du formulaire
*
* @return void
* @throws Exception
*/
public function deleteQuestion():void
{
$idQuestion = Clean::int($_POST["idQuestion"]);
$type = Clean::simpleString($_POST["type"]);
try {
if (!validate::type($type)) {
throw new Exception('Type de question invalide');
}
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteQuestion?'.
'classQuestion='.$type.'&'.
'id='.$idQuestion
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteQuestion failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet d'ajouter une possibilité de réponse à une question en l'assignant à des catégories.
@ -75,26 +112,50 @@ class ModelAdmin
*/
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 = [];
}
try {
$res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertResponseInQuestion?
response='.$response.'&
categories='.$categories.'&
$idQuestion='.$idQuestion
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){
if ($res->getStatusCode() != 200) {
throw new Exception('InsertResponseInQuestion failed');
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} 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
{
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.
@ -106,22 +167,23 @@ class ModelAdmin
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode()!=200){
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()
$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){
if ($res->getStatusCode() != 200) {
throw new Exception('InsertForm failed');
}
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
@ -134,19 +196,43 @@ class ModelAdmin
*/
public function addKeyword(): void
{
$keyword = $_POST['keyword'];
$keyword = Clean::simpleString($_POST['keyword']);
try {
$res = $this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertKeyword?
keyword='.$keyword
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){
if ($res->getStatusCode() != 200) {
throw new Exception('InsertKeyword failed');
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de supprimer une catégorie (mot-clef)
*
* @return void
* @throws Exception
*/
public function deleteKeyword(): void
{
try {
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteKeyword?'.
'keyword='.$_POST["idCateg"]
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteKeyword failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de récupérer toutes les catégories existantes.
@ -159,15 +245,16 @@ class ModelAdmin
$categories = [];
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllKeyword');
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllKeyword failed');
}
$res = json_decode($res->getBody());
foreach ($res as $category) {
$categories[] = $category["word"];
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException $g) {
echo "Error : ".$g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
return $categories;
@ -184,28 +271,29 @@ class ModelAdmin
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/existsForm');
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('Exists failed');
}
if (json_decode($res->getBody())){
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){
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
$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){
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllQuestions failed');
}
$questionsArray = json_decode($res->getBody());
return Factory::getBuiltObjects($questionsArray, "Question");
}else{
} else {
return array();
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
@ -219,24 +307,46 @@ class ModelAdmin
public function getResponsesCandidate(): array
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getAllListResponsesOfCandidate');
if ($res->getStatusCode()!=200){
$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/getDetailsListResponsesOfCandidate?
id='.$response["id"]
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getDetailsListResponseOfCandidate?'.
'id='.$response->id
);
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('GetDetailsListResponsesOfCandidate failed');
}
$results[] = json_decode($res->getBody());
$results[] =json_decode($res->getBody());
}
return $results;
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
/**
* Permet de supprimer les réponses d'une personne d'un formulaire
*
* @return void
* @throws Exception
*/
public function deleteResponsesCandidate(): void
{
try {
$res = $this->client->request('DELETE', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/deleteListResponseOfCandidate?'.
'id='.Clean::int($_POST["idResponseCandidate"])
);
if ($res->getStatusCode() != 200) {
throw new Exception('DeleteListResponseOfCandidate failed');
}
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
}

@ -8,6 +8,7 @@ use Exception;
use Exceptions\InvalidLoginOrPasswordException;
use Exceptions\InexistantLoginException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Exception\GuzzleException;
/**
@ -19,7 +20,8 @@ class ModelCandidate
private Client $client;
public function __construct(){
public function __construct()
{
$this->client = new Client(['headers' => ['Content-Type' => 'application/json'], 'verify' => false]);
}
@ -33,7 +35,7 @@ class ModelCandidate
{
$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);
}
@ -42,16 +44,15 @@ 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[] = [];
@ -59,22 +60,24 @@ class ModelCandidate
}
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$form = json_decode($res->getBody());
$title = $form[0]["title"];
$res =$this->client->request('POST', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/insertListResponsesOfCandidate?
id='.implode(",",$questionsId).'&
answer='.implode(",",$answer).'&
category='.implode(",",$category).'&
titleForm='.$title
$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){
if ($res->getStatusCode() != 200) {
throw new Exception('InsertListResponsesOfCandidate failed');
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
@ -91,7 +94,7 @@ class ModelCandidate
{
try {
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getForm');
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('GetForm failed');
}
$form = json_decode($res->getBody());
@ -99,28 +102,29 @@ class ModelCandidate
return "PAS DE FORMULAIRE\n";
}
$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']
$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){
if ($res->getStatusCode() != 200) {
throw new Exception('GetAllQuestion failed');
}
$questionsTab = json_decode($res->getBody());
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} 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'>
<div class='col-md-8'>
<form id='regForm' method='post'>
<form id='regForm' method='post' action='submitForm'>
<h1 id='register'>$title</h1>
<div class='all-steps' id='all-steps'>";
@ -128,11 +132,11 @@ class ModelCandidate
$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' alt='text-message' 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
@ -148,7 +152,7 @@ class ModelCandidate
</div>
</div>";
} else {
$html.= "\t\t</form>\n
$html .= "\t\t</form>\n
\t</div>\n";
}
@ -160,16 +164,17 @@ class ModelCandidate
* @throws InexistantLoginException
* @throws Exception
*/
public function login() :void {
global $rep,$views,$sel;
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
$res = $this->client->request('GET', 'https://codefirst.iut.uca.fr/containers/Temoignages-deploy_api_form/getPasswordWithLogin?'.
'login='.$identifiant
);
if ($res->getStatusCode()!=200){
if ($res->getStatusCode() != 200) {
throw new Exception('GetPasswordWithLogin failed');
}
$passwordbdd = json_decode($res->getBody());
@ -184,8 +189,9 @@ class ModelCandidate
} else {
throw new InvalidLoginOrPasswordException();
}
}catch (GuzzleException $g){
throw new Exception($g->getMessage(),$g->getCode(),$g);
} catch (GuzzleException | ClientException $g) {
echo "Error : " . $g->getMessage();
throw new Exception($g->getMessage(), $g->getCode(), $g);
}
}
}

@ -1,2 +0,0 @@
FROM php:8.1-apache
COPY ./coverage.xml /var/www/html

@ -8,6 +8,9 @@ use PHPUnit\Framework\TestCase;
class BoxQuestionTest extends TestCase
{
/**
* @covers BoxQuestion::__construct
*/
public function testConstructorWithFourArguments()
{
$args = [['response1', 'response2'], 'question', ['category1', 'category2'], 1];
@ -22,6 +25,9 @@ class BoxQuestionTest extends TestCase
$this->assertEquals($args[2], $boxQuestion->getCategories());
}
/**
* @covers BoxQuestion::setPossibleResponses
*/
public function testSetPossibleResponses()
{
$args = [1, 'question'];
@ -38,6 +44,9 @@ class BoxQuestionTest extends TestCase
$this->assertEquals($possibleResponses, $boxQuestion->getPossibleResponses());
}
/**
* @covers BoxQuestion::setCategories
*/
public function testSetCategories()
{
$args = [1, 'question'];

@ -7,12 +7,18 @@ 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', []);
@ -20,12 +26,18 @@ class FormTest extends TestCase
$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', []);
@ -33,6 +45,9 @@ class FormTest extends TestCase
$this->assertEquals('Nouvelle description', $form->getDescription());
}
/**
* @covers Form::getQuestions
*/
public function testGetQuestionsReturnsCorrectValue()
{
$questions = [
@ -45,6 +60,9 @@ class FormTest extends TestCase
$this->assertEquals($questions, $form->getQuestions());
}
/**
* @covers Form::setQuestions
*/
public function testSetQuestionsSetsCorrectValue()
{
$questions = [
@ -58,6 +76,9 @@ class FormTest extends TestCase
$this->assertEquals($questions, $form->getQuestions());
}
/**
* @covers Form::getId
*/
public function testGetIdReturnsCorrectValue()
{
$form = new Form(1, 'Titre du formulaire', 'Description du formulaire', []);

@ -7,6 +7,9 @@ use PHPUnit\Framework\TestCase;
class IPrintQuestionStrategyTest extends TestCase
{
/**
* @covers IPrintQuestionStrategy::printStrategy
*/
public function testPrintStrategy()
{
$strategy = new class implements IPrintQuestionStrategy {

@ -7,6 +7,9 @@ use PHPUnit\Framework\TestCase;
class KeywordTest extends TestCase
{
/**
* @covers Keyword::construct
*/
public function testConstructor()
{
$id = 1;
@ -17,6 +20,9 @@ class KeywordTest extends TestCase
$this->assertEquals($word, $keyword->getWord());
}
/**
* @covers Keyword::setWord
*/
public function testSetWord()
{
$id = 1;

@ -7,6 +7,9 @@ use PHPUnit\Framework\TestCase;
class QuestionTest extends TestCase
{
/**
* @covers Question::constructor
*/
public function testConstructor()
{
$id = 1;
@ -22,6 +25,9 @@ class QuestionTest extends TestCase
$this->assertEquals($content, $question->getContent());
}
/**
* @covers Question::setContent
*/
public function testSetContent()
{
$content = 'What is your age?';

@ -15,6 +15,13 @@ class ResponseTest extends TestCase
"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);
@ -25,6 +32,13 @@ class ResponseTest extends TestCase
$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);

@ -7,6 +7,10 @@ use PHPUnit\Framework\TestCase;
class TextQuestionTest extends TestCase
{
/**
* @covers TextQuestion::printStrategy
*
*/
public function testPrintStrategy()
{
$content = 'What is your name?';

@ -19,24 +19,35 @@ class AltoRouterTest extends TestCase
/**
* @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']);
@ -45,6 +56,8 @@ class AltoRouterTest extends TestCase
/**
* @throws Exception
* @covers AltoRouter::map
* @covers AltoRouter::getRoutes
*/
public function testMapAddsRouteToRoutesArray()
{
@ -54,6 +67,8 @@ class AltoRouterTest extends TestCase
/**
* @throws Exception
* @covers AltoRouter::map
* @covers AltoRouter::getNamedRoutes
*/
public function testMapAddsNamedRouteToNamedRoutesArray()
{
@ -63,6 +78,7 @@ class AltoRouterTest extends TestCase
/**
* @throws Exception
* @covers AltoRouter::map
*/
public function testMapThrowsExceptionForDuplicateNamedRoutes()
{

@ -7,6 +7,9 @@ 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
@ -20,6 +23,20 @@ class CleanTest extends TestCase
$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
@ -32,6 +49,9 @@ class CleanTest extends TestCase
$this->assertEquals($expected, Clean::email($email));
}
/**
* @covers Clean::int
*/
public function testInt()
{
// Test avec un entier valide

@ -8,6 +8,9 @@ use Config\Validate;
class ValidateTest extends TestCase
{
/**
* @covers Validate::email
*/
public function testEmail()
{
$this->assertTrue(Validate::email('john.doe@example.com'));
@ -15,6 +18,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::email('john.doe@example.commmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'));
}
/**
* @covers Validate::login
*/
public function testLogin()
{
$this->assertTrue(Validate::login('john123'));
@ -23,6 +29,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::login('john123456789012345555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555'));
}
/**
* @covers Validate::password
*/
public function testPassword()
{
$this->assertTrue(Validate::password('Pa$$w0rd'));
@ -32,6 +41,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::password('P@$$worddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::keyWord
*/
public function testKeyWord()
{
$this->assertTrue(Validate::keyWord('keyword'));
@ -39,6 +51,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::keyWord('keyworddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::title
*/
public function testTitle()
{
$this->assertTrue(Validate::title('Title'));
@ -46,6 +61,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::title('titleddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::type
*/
public function testType()
{
$this->assertTrue(Validate::type('Type'));
@ -53,6 +71,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::type('typeddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::response
*/
public function testResponse()
{
$this->assertTrue(Validate::response('Response'));
@ -60,6 +81,9 @@ class ValidateTest extends TestCase
$this->assertFalse(Validate::response('responseddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'));
}
/**
* @covers Validate::username
*/
public function testUsername()
{
$this->assertTrue(Validate::username('john123'));

@ -8,6 +8,9 @@ use PHPUnit\Framework\TestCase;
class InexistantLoginExceptionTest extends TestCase
{
/**
* @covers InexistantLoginException::constructor
*/
public function testConstructor()
{
$exception = new InexistantLoginException();

@ -8,6 +8,9 @@ use Exceptions\InvalidLoginOrPasswordException;
class InvalidLoginOrPasswordExceptionTest extends TestCase
{
/**
* @covers InvalidLoginOrPasswordException::constructor
*/
public function testConstructor()
{
$exception = new InvalidLoginOrPasswordException();

@ -10,6 +10,10 @@ use Exceptions\InvalidLoginOrPasswordException;
class InvalidUsernameOrPasswordExceptionTest extends TestCase
{
/**
* @covers InvalidUsernameOrPasswordException::constructor
* @covers InvalidUsernameOrPasswordException::constructor
*/
public function testConstructor()
{
$exception = new InvalidUsernameOrPasswordException();

@ -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());
}
}

File diff suppressed because it is too large Load Diff

@ -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>
@ -51,7 +52,7 @@
<div class="container mt-5">
<div class="row d-flex justify-content-center align-items-center">
<div class="col-md-8">
<form id="regForm" method="post">
<form id="regForm" method="post" action="addQuestion">
<h1 id="register">Ajout d'une question</h1>
<div class="all-steps" id="all-steps">
<span class="step"><i class="fa"></i></span>
@ -61,7 +62,9 @@
<div class="tab">
<h6>Écrivez la question : </h6>
<p>
<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>
<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">
@ -29,18 +29,27 @@
<div class="form-center">
<h3>Les catégories :</h3>
<form method="post">
<form method="post" action="addKeyword">
<label for="keyword"></label><input id="keyword" name="keyword" type="text" size="25" placeholder="...">
<input type="submit" value="Ajouter">
<input type="hidden" name="action" value="addKeyword">
</form>
<br>
<ul class="form-center">
<form method="post" action="deleteKeyword">
<?php
/** @var array $categories */
foreach ($categories as $category) {
?> <li><?php echo $category; ?></li> <?php
?> <li><?php
echo '<form method="post" action="deleteKeyword">';
echo $category;
echo ' <input type="submit" value="Delete">';
echo ' <input type="hidden" name="idCateg" value="'.$category.'">';
echo ' <input type="hidden" name="page" value="deleteQuestion">';
echo '</form>';
}
?>
</li>
</ul>
</div>

@ -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">
@ -51,10 +50,13 @@
<div class="text-center">
<h2>Continuer d'ajouter des possibilités de réponses ?</h2>
<form method="post">
<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; ?>">
<form method="post" action="continueResponse">
<input name="idQuestion" type="hidden" value="<?php /** @var int $idQuestion */
echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php /** @var string $questionContent */
echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php /** @var string $type */
echo $type; ?>">
<br>
<input type="submit" name="choose" value="Oui" style="width: 20%">
<br>
@ -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,14 +1,15 @@
<!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 if (empty($error)) {
echo "Erreur";
}else{
} else {
echo $error;
}
?>

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

@ -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">
@ -51,10 +52,13 @@
<div class="container mt-5">
<div class="row d-flex justify-content-center align-items-center">
<div class="col-md-8">
<form id="regForm" method="post">
<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; ?>">
<form id="regForm" method="post" action="addResponse">
<input name="idQuestion" type="hidden" value="<?php /** @var int $idQuestion */
echo $idQuestion; ?>">
<input name="question" type="hidden" value="<?php /** @var string $questionContent */
echo $questionContent; ?>">
<input name="type" type="hidden" value="<?php /** @var string $type */
echo $type; ?>">
<h1 id="register">Ajout de réponse possible pour votre question : <?php echo $questionContent;?> </h1>
<div class="all-steps" id="all-steps">
<span class="step"><i class="fa"></i></span>
@ -64,13 +68,16 @@
<div class="tab">
<h6>Entrez une réponse : </h6>
<p>
<label>
<input placeholder="Réponse..." oninput="this.className = ''" name="response">
</label>
</p>
</div>
<div class="tab">
<h6>Sé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">
@ -30,7 +30,7 @@
<div class="form-center">
<h3>Les questions :</h3>
<br>
<form method="post">
<form method="post" action="addQuestion">
<div>
<label for="question">Écrivez la question : </label>
<br>
@ -39,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.
@ -61,10 +61,17 @@
<br>
<ul class="form-center">
<?php
/** @var array $questions */
foreach ($questions as $question) {
?>
<?php echo $question->printStrategy() ?>
<?php
<form method="post" action="deleteQuestion">
<li><?php echo $question->printStrategy();
echo '<input type="submit" value="Delete">';
echo '<input type="hidden" name="idQuestion" value="'.$question->getId().'">';
echo '<input type="hidden" name="type" value="<'.get_class($question).'">';
echo '<input type="hidden" name="page" value="deleteQuestion">';
echo ' </li>';
echo '</form>';
}
?>
</ul>

@ -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">
@ -31,9 +31,11 @@
<h3>Les réponses :</h3>
<br>
<div id="listResponses">
<form method="post" action="deleteResponsesCandidate">
<?php
/** @var array $responsesCandidate */
foreach ($responsesCandidate as $response) { ?>
<i><?php echo $response[0]["date"]; ?></i>
<i><?php echo $response[0]["date"];?></i>
<p>Catégories associées :
<?php
echo " | ";
@ -48,11 +50,15 @@
<p><i>Réponse : </i><?php echo $questionResponses["questionContent"]; ?></p>
<?php
} ?>
<input type="submit" value="Delete">
<input type="hidden" name="idResponseCandidate" value="<?php echo $response[0]["id"] ?>">
<input type="hidden" name="action" value="deleteResponsesCandidate">
<hr><br>
<?php
}
?>
</form>
</div>
</div>

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

@ -1,23 +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/10.0/phpunit.xsd"
bootstrap=".\Config\vendor\autoload.php"
cacheDirectory=".phpunit.cache"
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"
requireCoverageMetadata="true"
beStrictAboutCoverageMetadata="true"
forceCoversAnnotation="true"
beStrictAboutCoversAnnotation="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
convertDeprecationsToExceptions="true"
failOnRisky="true"
failOnWarning="true">
failOnWarning="true"
verbose="true">
<testsuites>
<testsuite name="default">
<directory>.\Tests\</directory>
<directory>./Tests</directory>
</testsuite>
</testsuites>
<coverage>
<coverage cacheDirectory=".phpunit.cache/code-coverage"
processUncoveredFiles="true">
<include>
<directory suffix=".php">..\Source\</directory>
<directory suffix=".php">.</directory>
</include>
</coverage>
</phpunit>

Loading…
Cancel
Save