Compare commits

5 Commits

13 changed files with 171 additions and 27 deletions

View File

@@ -67,6 +67,15 @@ nav {
border-radius: 40px; border-radius: 40px;
} }
.nav-list li {
/*border: 1px solid black;*/
border-radius: 2000px;
}
.nav-list li:hover {
background-color: #00d8a2;
}
.nav-element { .nav-element {
line-height: 2.5; line-height: 2.5;
@@ -85,12 +94,13 @@ nav {
#login { #login {
border: 1px solid black; border: 1px solid black;
border-radius: 6px; border-radius: 2000px;
background-color: #ffc478; background-color: #ffc478;
} }
#login:hover { #login:hover {
background-color: #0bbd90; background-color: #0bbd90;
box-shadow: 1px 1px 7px black;
} }
/*Body et son contenu */ /*Body et son contenu */
@@ -143,6 +153,8 @@ body {
} }
.search-form { .search-form {
margin-top: .5%;
padding: .5% 0 .5% .5%;
border: 1px solid black; border: 1px solid black;
border-radius: 20px; border-radius: 20px;
box-shadow: 0px 0px 10px rgb(131, 131, 131); box-shadow: 0px 0px 10px rgb(131, 131, 131);
@@ -191,6 +203,7 @@ nav {
background-clip: border-box; background-clip: border-box;
padding-right: 2%; padding-right: 2%;
padding-left: 2%; padding-left: 2%;
padding-bottom: 5px;
overflow: hidden; overflow: hidden;
} }
@@ -447,11 +460,23 @@ ul {
box-shadow: 2px 2px 0px #000000; box-shadow: 2px 2px 0px #000000;
} }
.btn {
padding: .5% 2%;
border: 2px solid black;
border-radius: 10px;
margin-top: .5%;
margin-left: .5%;
background-color: #ffd9a0;
}
.btn:hover { .btn:hover {
background-color: #0bbd90; background-color: #0bbd90;
box-shadow: none;
cursor: pointer;
} }
.form-control { .form-control {
padding: 1%;
border-radius: 10px; border-radius: 10px;
box-shadow: 3px 4px 5px #8c8c8c; box-shadow: 3px 4px 5px #8c8c8c;
} }
@@ -466,8 +491,9 @@ ul {
margin: 10px; margin: 10px;
padding: 10px; padding: 10px;
border: 1px solid black; border: 1px solid black;
background: white; background: #fff9f1;
border-radius: 20px; border-radius: 20px;
box-shadow: 2px 2px 3px #a06100;
} }
.recette-form-group { .recette-form-group {
@@ -477,7 +503,7 @@ ul {
} }
#recette-form-div-desc { #recette-form-div-desc {
height: 300px; height: 220px;
} }
#recette-form-description { #recette-form-description {
@@ -523,6 +549,8 @@ ul {
border: 1px solid black; border: 1px solid black;
border-radius: 10px; border-radius: 10px;
box-shadow: 1px 1px 1px black; box-shadow: 1px 1px 1px black;
margin-top: .25%;
margin-bottom: .25%;
} }
.liste-ingr-elem:hover { .liste-ingr-elem:hover {
@@ -553,6 +581,8 @@ ul {
border: 1px solid black; border: 1px solid black;
border-radius: 10px; border-radius: 10px;
box-shadow: 1px 1px 1px black; box-shadow: 1px 1px 1px black;
margin-top: .25%;
margin-bottom: .25%;
} }
.liste-tag-elem:hover { .liste-tag-elem:hover {
@@ -592,3 +622,6 @@ footer{
color: white; color: white;
border-top: 1px solid black; border-top: 1px solid black;
} }

View File

@@ -49,14 +49,15 @@ document.addEventListener( 'DOMContentLoaded', function(){
fetch( FORM.action, options ).then( ( response ) => { fetch( FORM.action, options ).then( ( response ) => {
if( response.ok ){ if( response.ok ){
response.json().then( ( responseJSON ) => { response.json().then( ( responseJSON ) => {
if( responseJSON.success === true ){ if( responseJSON.success === true ){
window.location.href = window.location.origin; // Redirection sur la page d'accueil si succès. window.location.href = window.location.origin; // Redirection sur la page d'accueil si succès.
} else { } else {
FORM.showError( responseJSON.message || "Mauvais nom d'utilisateur ou mauvais mot de passe." ); FORM.showError( "Mauvais nom d'utilisateur ou mauvais mot de passe." );
} }
}) })
} else {
FORM.showError( "Mauvais nom d'utilisateur ou mauvais mot de passe." );
} }
}) })

View File

@@ -25,7 +25,7 @@ class IngredientsAPIController extends Controller {
if( !$name || $name == "" ) if( !$name || $name == "" )
JSONResponse::sendError( [ 'error' => 'Name not defined' ] ); JSONResponse::sendError( [ 'error' => 'Name not defined' ] );
$urlOrError = UploadFiles::uploadFile( $fileNameField ); $urlOrError = UploadFiles::uploadFile( $fileNameField, UploadFiles::IMAGE_MIME_TYPES );
if( is_int( $urlOrError ) ){ if( is_int( $urlOrError ) ){
JSONResponse::sendError( [ 'error' => $urlOrError ] ); JSONResponse::sendError( [ 'error' => $urlOrError ] );
} }

View File

@@ -80,7 +80,7 @@ class RecettesAPIController extends Controller {
JSONResponse::sendError( [ 'error' => "One required fields is missing" ] ); JSONResponse::sendError( [ 'error' => "One required fields is missing" ] );
// Upload & Vérification de l'image. // Upload & Vérification de l'image.
$urlOrError = UploadFiles::uploadFile( $fileField ); $urlOrError = UploadFiles::uploadFile( $fileField, UploadFiles::IMAGE_MIME_TYPES );
if( is_int( $urlOrError ) ){ if( is_int( $urlOrError ) ){
JSONResponse::sendError( [ 'error' => $urlOrError ] ); JSONResponse::sendError( [ 'error' => $urlOrError ] );
} }
@@ -171,7 +171,7 @@ class RecettesAPIController extends Controller {
} }
// Upload & Vérification de l'image. // Upload & Vérification de l'image.
$urlOrError = UploadFiles::uploadFile( $fileField ); $urlOrError = UploadFiles::uploadFile( $fileField, UploadFiles::IMAGE_MIME_TYPES );
if( is_int( $urlOrError ) ){ if( is_int( $urlOrError ) ){
// Ingore image. // Ingore image.
} else { } else {

View File

@@ -43,12 +43,14 @@ class AuthentificationController extends Controller {
Request::setCORS(); Request::setCORS();
$username = Request::get( 'username' ); $username = Request::post( 'username' );
$password = Request::get( 'password' ); $password = Request::post( 'password' );
// TODO : Récupération de l'utilisateur et verify_password. $userId = new UtilisateurRepository()->login( $username, $password );
if( !$userId ) {
return JSONResponse::sendError();
}
$userId = 1;
Authentification::loginUser( $userId ); Authentification::loginUser( $userId );
return JSONResponse::sendSuccess( [ 'user_id' => $userId ] ); return JSONResponse::sendSuccess( [ 'user_id' => $userId ] );

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Domain\Utilisateurs;
use App\Domain\Model;
//use App\Helpers\Markdown;
class Utilisateur extends Model {
public int $num_user;
public string $username;
public string $userpassword;
public function getID(): int
{
return $this->num_user;
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace App\Domain\Utilisateurs;
use App\Domain\Model;
use App\Domain\Repository;
/**
* Classe qui permet de faire le lien entre la BDD et le site pour les utilisateurs.
*/
class UtilisateurRepository extends Repository {
public static function getEntity(): string
{
return Utilisateur::class;
}
public static function getStructure(): array
{
return [
'table' => 'User',
'columns' => [
'num_user', 'username', 'userpassword'
]
];
}
/**
* Permet d'obtenir une liste de toutes les recettes objet Utilisateur.
*
* @return Utilisateur[]|null
*/
public function getAll(): ?array {
$sqlQuery = "SELECT * FROM {$this->tableName};";
$results = $this->selectGetAll($sqlQuery);
if( $results === null )
return null;
return $results;
}
/**
* Permet d'avoir un utilisateur par un ID.
*
* @param int $id
* @return Utilisateur|null
*/
public function getByID( int $id ): ?Utilisateur {
$sqlQuery = "SELECT * FROM {$this->tableName} WHERE num_user = {$id}";
$results = $this->selectGetAll($sqlQuery);
if( $results === null || count( $results ) > 1 )
return null;
return $results[0];
}
public function login(string $name, string $pass): int|bool{
$users = new UtilisateurRepository()->getAll();
foreach($users as $user){
if((strcmp($name,$user->username)==0) and (strcmp($pass,$user->userpassword)==0))return $user->num_user;
}
return false;
}
public function add( Model $utilisateurs ): bool {
return $this->addEntity( $utilisateurs );
}
public function update( Model $utilisateurs ): bool {
return $this->updateEntity( $utilisateurs, 'num_user' );
}
public function delete( Model $utilisateurs ): bool {
return $this->deleteEntity( $utilisateurs, 'num_user' );
}
}

View File

@@ -7,6 +7,8 @@ use App\Kernel;
class UploadFiles { class UploadFiles {
const array IMAGE_MIME_TYPES = [ 'image/png', 'image/jpeg' ];
public static function uploadFolderPath(){ public static function uploadFolderPath(){
return APP_ROOT . 'public/uploads/'; return APP_ROOT . 'public/uploads/';
} }
@@ -16,6 +18,7 @@ class UploadFiles {
/** /**
* @param string $fileName * @param string $fileName
* @param array $allowedMimeTypes Les mimes types autorisés pour ce fichier. Une liste vide n'a pas de restriction de mime type.
* *
* @return string|int * @return string|int
* *
@@ -23,8 +26,9 @@ class UploadFiles {
* 2: Erreur dans le fichier * 2: Erreur dans le fichier
* 3: Déjà existant. * 3: Déjà existant.
* 4: Erreur dans le déplacement. * 4: Erreur dans le déplacement.
* 5: Erreur dans le mimetype.
*/ */
public static function uploadFile( string $fileArg ): string|int { public static function uploadFile( string $fileArg, array $allowedMimeTypes = [] ): string|int {
if( !isset( $_FILES[ $fileArg ] ) ) if( !isset( $_FILES[ $fileArg ] ) )
return 1; return 1;
@@ -36,6 +40,11 @@ class UploadFiles {
$tempFileName = $file['tmp_name']; $tempFileName = $file['tmp_name'];
$fileName = $file['name']; $fileName = $file['name'];
if( $allowedMimeTypes !== [] ){
if( !in_array( $file['type'], $allowedMimeTypes ) )
return 5;
}
$full_name = self::uploadFolderPath() . $fileName; $full_name = self::uploadFolderPath() . $fileName;
$full_uri = self::uploadFolderUri() . $fileName; $full_uri = self::uploadFolderUri() . $fileName;

View File

@@ -1,2 +1 @@
<h1>Coucou</h1> <h1>Coucou</h1>
<?php $str = "Markdown **text**\n# SOLONG\n*text*."; $md = \App\Helpers\Markdown::convertToHTML( $str ); echo "<p>$md</p>"; ?>

View File

@@ -10,7 +10,7 @@
<body> <body>
<header id="header"> <header id="header">
<div id="logo"> <div id="logo">
<a href="index.php"> <a href="<?php V::routeUrl( 'home'); ?>">
<img src="<?php V::assetUrl( 'images/Logo.jpg'); ?>" class="logo"> <img src="<?php V::assetUrl( 'images/Logo.jpg'); ?>" class="logo">
</a> </a>
</div> </div>

View File

@@ -7,9 +7,6 @@
<ul> <ul>
</ul> </ul>
</div> </div>
<form class="sidebar-search" action="none">
<input type="text" class="search-form search-form-tag" name="search-tag" placeholder="Rechercher..." >
</form>
<div class="tag-unselected-div"> <div class="tag-unselected-div">
<ul id="tagsList"> <ul id="tagsList">
<?php foreach( V::arg( 'tagsList') as $tag ): ?> <?php foreach( V::arg( 'tagsList') as $tag ): ?>
@@ -25,9 +22,6 @@
<ul> <ul>
</ul> </ul>
</div> </div>
<form class="sidebar-search" action="none">
<input type="text" class="search-form search-form-tag" name="search-ingr" placeholder="Rechercher..." >
</form>
<div class="ing-unselected-div"> <div class="ing-unselected-div">
<ul id="ingredientsList"> <ul id="ingredientsList">
<?php foreach( V::arg( 'ingredientsList') as $tag ): ?> <?php foreach( V::arg( 'ingredientsList') as $tag ): ?>

View File

@@ -5,6 +5,7 @@ use App\Infrastructure\View as V; ?>
<div class="content"> <div class="content">
<div class="recette-add-form-all"> <div class="recette-add-form-all">
<form id="recette-form-complete" class="recette-form recette-form-add" action="/api/recettes/create" method="POST"> <form id="recette-form-complete" class="recette-form recette-form-add" action="/api/recettes/create" method="POST">
<legend><h1>Nouvelle Recette : </h1></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="nom">Titre : </label> <label for="nom">Titre : </label>
<input type="text" class="form-control" id="recette-form-nom" name="nom" placeholder="Titre de votre recette"> <input type="text" class="form-control" id="recette-form-nom" name="nom" placeholder="Titre de votre recette">
@@ -15,7 +16,7 @@ use App\Infrastructure\View as V; ?>
</div> </div>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="image">Photo du plat : </label> <label for="image">Photo du plat : </label>
<input type="file" class="form-control" id="recette-form-photo" name="image" placeholder="ajouter votre image"> <input type="file" class="form-control" id="recette-form-photo" name="image" placeholder="ajouter votre image" accept="image/jpeg, image/png">
</div> </div>
<div class="recette-form-group form-group" id="recette-form-div-ingr"> <div class="recette-form-group form-group" id="recette-form-div-ingr">
<label for="ingr">Ingredients</label> <label for="ingr">Ingredients</label>
@@ -35,13 +36,14 @@ use App\Infrastructure\View as V; ?>
</div> </div>
<div class="recette-form-group form-group" id="recette-form-div-desc"> <div class="recette-form-group form-group" id="recette-form-div-desc">
<label for="description">Description</label> <label for="description">Description</label>
<textarea type="texte" class="form-control" id="recette-form-description" name="description" placeholder="Description..."></textarea> <textarea type="texte" class="form-control" id="recette-form-description" name="description" placeholder="Markdown supporté pour les titres de niveau 1,2, le gras ainsi que l'italique"></textarea>
</div> </div>
<button type='submit' class='btn btn-primary'>Confirmer</button> <button type='submit' class='btn btn-primary'>Envoyer la recette</button>
</form> </form>
<div class="recette-form-add-additional"> <div class="recette-form-add-additional">
<form id="recette-form-ingr-add" class="recette-form recette-form-add-ingr" action="" method="POST"> <form id="recette-form-ingr-add" class="recette-form recette-form-add-ingr" action="" method="POST">
<legend><h2>Nouvel Ingrédient :</h2></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="name">Nom de l'Ingrédient</label> <label for="name">Nom de l'Ingrédient</label>
<input type="texte" class="form-control" id="recette-form-ingr-nom" name="name" placeholder="Nom de l'ingrédient" value=""> <input type="texte" class="form-control" id="recette-form-ingr-nom" name="name" placeholder="Nom de l'ingrédient" value="">
@@ -57,6 +59,7 @@ use App\Infrastructure\View as V; ?>
</div> </div>
</form> </form>
<form id="recette-form-tag-add" class="recette-form recette-form-add-tag" action="" method="POST"> <form id="recette-form-tag-add" class="recette-form recette-form-add-tag" action="" method="POST">
<legend><h2>Nouveau Tag : </h2></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="tag">Tags</label> <label for="tag">Tags</label>
<input type="text" class="form-control" id="recette-form-tag-nom" name="name" placeholder="Nom de l'ingrédient"> <input type="text" class="form-control" id="recette-form-tag-nom" name="name" placeholder="Nom de l'ingrédient">

View File

@@ -5,6 +5,7 @@ use App\Infrastructure\View as V; ?>
<div class="content"> <div class="content">
<div class="recette-add-form-all"> <div class="recette-add-form-all">
<form id="recette-form-complete" class="recette-form recette-form-add" action="/api/recettes/edit" method="POST"> <form id="recette-form-complete" class="recette-form recette-form-add" action="/api/recettes/edit" method="POST">
<legend><h1>Editer une Recette : </h1></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="nom">Titre : </label> <label for="nom">Titre : </label>
<input type="text" class="form-control" id="recette-form-nom" name="nom" placeholder="Titre de votre recette" value="<?php echo $R->titre_recette; ?>"> <input type="text" class="form-control" id="recette-form-nom" name="nom" placeholder="Titre de votre recette" value="<?php echo $R->titre_recette; ?>">
@@ -15,7 +16,7 @@ use App\Infrastructure\View as V; ?>
</div> </div>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="image">Photo du plat : </label> <label for="image">Photo du plat : </label>
<input type="file" class="form-control" id="recette-form-photo" name="image" placeholder="ajouter votre image"> <input type="file" class="form-control" id="recette-form-photo" name="image" placeholder="ajouter votre image" accept="image/jpeg, image/png">
</div> </div>
<div class="recette-form-group form-group" id="recette-form-div-ingr"> <div class="recette-form-group form-group" id="recette-form-div-ingr">
<label for="ingr">Ingredients</label> <label for="ingr">Ingredients</label>
@@ -42,6 +43,7 @@ use App\Infrastructure\View as V; ?>
</form> </form>
<div class="recette-form-add-additional"> <div class="recette-form-add-additional">
<form id="recette-form-ingr-add" class="recette-form recette-form-add-ingr" action="" method="POST"> <form id="recette-form-ingr-add" class="recette-form recette-form-add-ingr" action="" method="POST">
<legend><h2>Nouvel Ingrédient :</h2></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="name">Nom de l'Ingrédient</label> <label for="name">Nom de l'Ingrédient</label>
<input type="texte" class="form-control" id="recette-form-ingr-nom" name="name" placeholder="Nom de l'ingrédient" value=""> <input type="texte" class="form-control" id="recette-form-ingr-nom" name="name" placeholder="Nom de l'ingrédient" value="">
@@ -57,6 +59,7 @@ use App\Infrastructure\View as V; ?>
</div> </div>
</form> </form>
<form id="recette-form-tag-add" class="recette-form recette-form-add-tag" action="" method="POST"> <form id="recette-form-tag-add" class="recette-form recette-form-add-tag" action="" method="POST">
<legend><h2>Nouveau Tag : </h2></legend>
<div class="recette-form-group form-group"> <div class="recette-form-group form-group">
<label for="tag">Tags</label> <label for="tag">Tags</label>
<input type="text" class="form-control" id="recette-form-tag-nom" name="name" placeholder="Nom de l'ingrédient"> <input type="text" class="form-control" id="recette-form-tag-nom" name="name" placeholder="Nom de l'ingrédient">