Request class and begin Frontend.

This commit is contained in:
2026-03-20 15:54:29 +01:00
parent 6c068443dc
commit 72108d4d03
18 changed files with 540 additions and 2 deletions

View File

@@ -0,0 +1,16 @@
<?php
namespace App\Domain\Recettes;
use App\Domain\Controller;
class RecettesAPIController extends Controller {
public static function defineRoutes(): array
{
return [
self::Route( routeUrl: '/api/recettes/list', routeName: 'api->recettes->list', routeAction: 'list', routeMethods: ['POST'] ),
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Domain\Recettes;
use App\Domain\Controller;
use App\Http\JSONResponse;
use App\Infrastructure\View;
class RecettesController extends Controller {
public static function defineRoutes(): array
{
return [
self::Route( routeUrl: '/recettes', routeName: 'recettes->index', routeAction: 'index', pageHeadTitle: 'Liste des recettes' ),
self::Route( routeUrl: '/recettes/{string}', routeName: 'recettes->show', routeAction: 'show', pageHeadTitle: 'Recette' ),
];
}
public function index(): View {
return new View( 'recettes/index', [] );
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Domain\Recettes;
use App\Domain\Controller;
class RecettesManagementController extends Controller {
public static function defineRoutes(): array
{
return [
self::Route( routeUrl: '/recettes/create', routeName: 'recettes->create', routeAction: 'create' ),
self::Route( routeUrl: '/recettes/edit/{int}', routeName: 'recettes->edit', routeAction: 'edit' ),
];
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Domain\Utilisateurs;
use App\Domain\Controller;
use App\Helpers\Authentification;
use App\Http\JSONResponse;
use App\Http\Request;
class AuthentificationController extends Controller {
public static function defineRoutes(): array {
return [
// Public routes.
self::Route( routeUrl: '/login', routeName: 'login', routeAction: 'loginForm', pageHeadTitle: 'Connexion' ),
// API Routes.
self::Route( routeUrl: '/api/auth', routeName: 'api->auth', routeAction: 'auth', routeMethods: ['POST'] ),
self::Route( routeUrl: '/api/auth/logout', routeName: 'api->auth->logout', routeAction: 'logout', routeMethods: ['POST'] ),
];
}
public function login(): View {
return new View( 'login' );
}
public function auth(): JSONResponse {
Request::setCORS();
$username = Request::get( 'username' );
$password = Request::get( 'password' );
// TODO : Récupération de l'utilisateur et verify_password.
$userId = 1;
Authentification::loginUser( $userId );
JSONResponse::sendSuccess( [ 'user_id' => $userId ] );
}
public function logout(): JSONResponse {
if( !Authentification::isLoggedIn() ) {
return JSONResponse::sendError( [ 'message' => 'Alrady disconnected' ] );
}
Authentification::destroySession();
return JSONResponse::sendSuccess( [ 'message' => 'Logged out' ] );
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Helpers;
class Authentification {
/**
* Permet de démarrer la variable Session.
*
* @return void
*/
public static function startSession(): void {
session_start();
}
/**
* Permet de supprimer la session.
*
* @return void
*/
public static function destroySession(): void {
session_destroy();
}
/**
* Permet de connecter un utilisateur.
*
* @param int $userId
* @return void
*/
public static function loginUser( int $userId ){
$_SESSION['user'] = $userId;
}
// TODO : Complete when user.
public static function getCurrentUser() {
return $_SESSION['user'] ?? false;
}
/**
* Permet de savoir si un utilisateur est connecté ou pas.
*
* @return bool
*/
public static function isLoggedIn(): bool {
return self::getCurrentUser() !== false;
}
}

View File

@@ -1 +0,0 @@
<?php

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Helpers;
/**
* Trait qui permet de désinfecter une variable.
*/
trait SanitizeTrait {
/**
* Permet de désinfecter une variable
*
* @param mixed $data
* @return mixed
*/
public static function sanitize( mixed $data ): mixed {
if( is_string( $data ) ) {
return htmlspecialchars( $data, ENT_QUOTES );
} else if( is_integer( $data ) ) {
return $data;
}
return $data;
}
}

51
src/Http/JSONResponse.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
namespace App\Http;
/**
* Permet de renvoyer une réponse de route au format JSON.
*/
class JSONResponse {
/**
* Les données ajoutés au fichier JSON.
* @var array|mixed
*/
public private(set) array $data;
/**
* Le code HTML de la réponse.
* @var int|mixed
*/
public private(set) int $htmlCode;
public function __construct( $data = [], $code = 200 ){
$this->data = $data;
$this->htmlCode = $code;
$this->returnResponse();
}
public function returnResponse(): never {
header( 'Content-type: application/json' );
http_response_code( $this->htmlCode );
$this->data['_status'] = $this->htmlCode;
$json = json_encode( $this->data );
echo $json;
die();
}
public static function sendSuccess( $data = [] ): self {
$data['success'] = true;
return new self( $data, 200 );
}
public static function sendError( $data = [] ): self {
$data['success'] = false;
return new self( $data, 400 );
}
}

53
src/Http/Request.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
namespace App\Http;
use App\Helpers\SanitizeTrait;
use App\Kernel;
/**
* Classe utilitaire ayant plusieurs méthodes pour gérer la requête actuelle.
*/
class Request {
use SanitizeTrait;
/**
* Bloquer les CORS venant d'autres sites.
* @return void
*/
public static function setCORS(): void {
$siteUrl = Kernel::$configs['general']['website_url'];
header("Access-Control-Allow-Origin: {$siteUrl}");
}
/**
* Permet d'obtenir une variable GET et nettoyé.
*
* @param string $name
* @return mixed
*/
public static function get( string $name ): mixed {
if( !isset( $_GET[$name] ) ) {
return null;
}
return self::sanitize( $_GET[$name] );
}
/**
* Permet d'obtenir une variable POST et nettoyé.
*
* @param string $name
* @return mixed
*/
public static function post( string $name ): mixed {
if( !isset( $_POST[$name] ) ) {
return null;
}
return self::sanitize( $_POST[$name] );
}
}

View File

@@ -192,4 +192,8 @@ final class Router {
return Kernel::$configs['general']['website_url'];
}
public static function getAssetURL( string $assetPath ): string {
return Kernel::$configs['general']['website_url'] . 'assets/' . $assetPath;
}
}

View File

@@ -207,4 +207,14 @@ final class View {
echo Router::getRouteURL( $routeName, ...$args );
}
/**
* Permet d'obtenir l'URL vers un asset (CSS,JS,Images).
* @param string $assetPath
*
* @return void
*/
public static function assetUrl( string $assetPath ): void {
echo Router::getAssetURL( $assetPath );
}
}

View File

@@ -3,6 +3,7 @@
namespace App;
use App\Exceptions\ConfigFailedLoadingException;
use App\Exceptions\InvalidRouteException;
use App\Helpers\Authentification;
use App\Helpers\AutoLoader;
use App\Helpers\ConfigFactory;
use App\Http\Router;
@@ -62,6 +63,8 @@ final class Kernel {
$this->buildAutoloader();
$this->loadConfig();
Authentification::startSession();
try {
Router::routeTo();
} catch ( InvalidRouteException $e ){