From 4e585ba2780ae2b7f032e937bfbbc25828eb1ef0 Mon Sep 17 00:00:00 2001 From: Cerbu Andrei Mihnea <100320074+andrei-mihnea-cerbu@users.noreply.github.com> Date: Thu, 15 Jun 2023 22:21:53 +0300 Subject: [PATCH] microserviciile de register, login finalizate --- api.knowyourfood/.htaccess | 12 + api.knowyourfood/.idea/.gitignore | 8 + api.knowyourfood/.idea/api.knowyourfood.iml | 12 + api.knowyourfood/.idea/modules.xml | 8 + api.knowyourfood/.idea/php.xml | 25 + api.knowyourfood/composer.json | 12 + api.knowyourfood/composer.lock | 20 + api.knowyourfood/core/DVC.php | 96 +++ api.knowyourfood/core/Request.php | 43 ++ api.knowyourfood/core/Router.php | 105 ++++ .../database config.php | 19 +- .../exceptions/GenericErrorException.php | 13 + .../InvalidCurlStructureException.php | 14 + .../exceptions/InvalidTokenException.php | 13 + .../exceptions/ServiceNotFoundException.php | 13 + .../external_requests/CurlRequest.php | 60 ++ .../external_requests/CurlRequestBuilder.php | 37 ++ api.knowyourfood/headers_config.php | 23 + api.knowyourfood/index.php | 16 + api.knowyourfood/test.php | 1 + api.knowyourfood/vendor/autoload.php | 25 + .../vendor/composer/ClassLoader.php | 585 ++++++++++++++++++ .../vendor/composer/InstalledVersions.php | 359 +++++++++++ api.knowyourfood/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 10 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 10 + .../vendor/composer/autoload_real.php | 36 ++ .../vendor/composer/autoload_static.php | 36 ++ .../vendor/composer/installed.json | 5 + .../vendor/composer/installed.php | 23 + knowyourfood/.env.example | 3 - knowyourfood/.gitignore | 6 +- knowyourfood/.htaccess | 14 +- knowyourfood/composer.json | 14 +- knowyourfood/composer.lock | 478 +------------- knowyourfood/controllers/AuthController.php | 156 ++--- knowyourfood/controllers/SiteController.php | 47 ++ knowyourfood/controllers/siteController.php | 55 -- knowyourfood/core/Application.php | 133 ++-- knowyourfood/core/Controller.php | 50 +- knowyourfood/core/DVC.php | 96 +++ knowyourfood/core/Database.php | 154 ++--- knowyourfood/core/DbModel.php | 51 -- knowyourfood/core/Model.php | 221 ++++--- knowyourfood/core/Request.php | 106 ++-- knowyourfood/core/Response.php | 24 +- knowyourfood/core/Router.php | 96 ++- knowyourfood/core/Session.php | 53 +- knowyourfood/core/View.php | 88 +-- .../core/exceptions/ForbiddenException.php | 8 - .../core/exceptions/NotFoundException.php | 8 - knowyourfood/core/form/BaseField.php | 35 -- knowyourfood/core/form/Button.php | 22 +- knowyourfood/core/form/Field.php | 43 -- knowyourfood/core/form/Form.php | 52 +- knowyourfood/core/form/InputField.php | 76 +-- knowyourfood/core/form/Region.php | 40 ++ knowyourfood/core/form/TextareaField.php | 24 +- .../core/middlewares/AuthMiddleware.php | 21 - .../core/middlewares/BaseMiddleware.php | 7 - .../exceptions/ForbiddenAccessException.php | 13 + .../exceptions/GenericErrorException.php | 13 + .../InvalidCurlStructureException.php | 14 + .../exceptions/PageNotFoundException.php | 13 + .../external_requests/CurlRequest.php | 53 ++ .../external_requests/CurlRequestBuilder.php | 37 ++ knowyourfood/index.php | 66 +- knowyourfood/migrations.php | 10 - knowyourfood/migrations/m01_initial.php | 25 - .../migrations/m02_add_password_column.php | 17 - knowyourfood/models/ContactForm.php | 54 +- knowyourfood/models/LoginForm.php | 40 -- knowyourfood/models/LoginModel.php | 58 ++ knowyourfood/models/RegisterModel.php | 59 ++ knowyourfood/models/User.php | 53 -- knowyourfood/runtime/.gitignore | 0 knowyourfood/views/Login.php | 28 + knowyourfood/views/Register.php | 28 + knowyourfood/views/_error.php | 1 - knowyourfood/views/contact.php | 12 - knowyourfood/views/home.php | 6 - knowyourfood/views/layouts/CSS/styleAuth.css | 148 +++++ knowyourfood/views/layouts/CSS/styleMain.css | 100 +++ knowyourfood/views/layouts/HTML/Auth.php | 28 + knowyourfood/views/layouts/HTML/Main.php | 28 + .../Images/admin_files/admin_background.jpg | Bin 0 -> 72622 bytes .../Images/admin_files/admin_background.psd | Bin 0 -> 690920 bytes .../Images/admin_files/dashboard icon.png | Bin 0 -> 89067 bytes .../Images/admin_files/dashboard icon.psd | Bin 0 -> 573195 bytes .../Images/admin_files/database icon.png | Bin 0 -> 49859 bytes .../Images/admin_files/database icon.psd | Bin 0 -> 245013 bytes .../layouts/Images/admin_files/exit icon.png | Bin 0 -> 4020 bytes .../layouts/Images/admin_files/exit icon.psd | Bin 0 -> 91884 bytes .../Images/admin_files/recipes-database.jpg | Bin 0 -> 426935 bytes .../Images/admin_files/recipes-database.psd | Bin 0 -> 2381177 bytes .../admin_files/restaurants-database.jpg | Bin 0 -> 319158 bytes .../admin_files/restaurants-database.psd | Bin 0 -> 8686383 bytes .../layouts/Images/admin_files/user icon.png | Bin 0 -> 24312 bytes .../layouts/Images/admin_files/user icon.psd | Bin 0 -> 253701 bytes .../layouts/Images/background/backgroudn.psd | Bin 0 -> 17044052 bytes .../layouts/Images/background/background.jpg | Bin 0 -> 2153586 bytes .../Images/menu_icon/dropdown_menu_icon.png | Bin 0 -> 5682 bytes .../Images/menu_icon/dropdown_menu_icon.psd | Bin 0 -> 71461 bytes .../views/layouts/Images/recipes/recipe.txt | 5 + .../views/layouts/Images/recipes/recipe1.jpg | Bin 0 -> 453048 bytes .../views/layouts/Images/recipes/recipe2.jpg | Bin 0 -> 192592 bytes .../views/layouts/Images/recipes/recipe3.webp | Bin 0 -> 274134 bytes .../views/layouts/Images/recipes/recipe4.jpg | Bin 0 -> 232324 bytes .../views/layouts/Images/recipes/recipe5.jpg | Bin 0 -> 436533 bytes .../Images/restaurants/restaurant1.jpg | Bin 0 -> 201291 bytes .../Images/restaurants/restaurant2.jpg | Bin 0 -> 133576 bytes .../Images/restaurants/restaurant3.jpg | Bin 0 -> 211734 bytes .../Images/restaurants/restaurant4.webp | Bin 0 -> 462440 bytes .../Images/restaurants/restaurant5.jpg | Bin 0 -> 168328 bytes .../Images/restaurants/restaurant6.jpg | Bin 0 -> 1035087 bytes .../Images/restaurants/restaurant7.jpg | Bin 0 -> 142532 bytes .../views/layouts/Videos/Another-Clock.gif | Bin 0 -> 166513 bytes .../views/layouts/Videos/analog-clock.mp4 | Bin 0 -> 75530 bytes knowyourfood/views/layouts/auth.php | 27 - knowyourfood/views/layouts/main.php | 60 -- knowyourfood/views/login.php | 15 - knowyourfood/views/profile.php | 7 - knowyourfood/views/register.php | 17 - service_authentication/.htaccess | 4 + service_authentication/.idea/.gitignore | 8 + service_authentication/.idea/dataSources.xml | 12 + service_authentication/.idea/modules.xml | 8 + service_authentication/.idea/php.xml | 25 + .../.idea/service_regions.iml | 8 + service_authentication/.idea/sqldialects.xml | 6 + service_authentication/composer.json | 12 + service_authentication/composer.lock | 21 + service_authentication/core/AuthInterface.php | 8 + service_authentication/core/Controller.php | 80 +++ service_authentication/core/DVC.php | 80 +++ service_authentication/core/Request.php | 37 ++ service_authentication/database config.php | 9 + .../exceptions/GenericErrorException.php | 13 + .../InvalidAuthRequestException.php | 13 + .../exceptions/InvalidAuthTokenException.php | 13 + .../exceptions/InvalidBodyException.php | 13 + .../exceptions/InvalidRequestException.php | 13 + .../exceptions/UserAlreadyExistsException.php | 13 + .../exceptions/UserNotExistingException.php | 13 + service_authentication/index.php | 10 + service_authentication/models/LoginModel.php | 48 ++ .../models/RegisterModel.php | 51 ++ service_authentication/vendor/autoload.php | 25 + .../vendor/composer/ClassLoader.php | 585 ++++++++++++++++++ .../vendor/composer/InstalledVersions.php | 359 +++++++++++ .../vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 10 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 10 + .../vendor/composer/autoload_real.php | 36 ++ .../vendor/composer/autoload_static.php | 36 ++ .../vendor/composer/installed.json | 5 + .../vendor/composer/installed.php | 23 + 159 files changed, 4775 insertions(+), 1747 deletions(-) create mode 100755 api.knowyourfood/.htaccess create mode 100755 api.knowyourfood/.idea/.gitignore create mode 100644 api.knowyourfood/.idea/api.knowyourfood.iml create mode 100755 api.knowyourfood/.idea/modules.xml create mode 100755 api.knowyourfood/.idea/php.xml create mode 100755 api.knowyourfood/composer.json create mode 100755 api.knowyourfood/composer.lock create mode 100755 api.knowyourfood/core/DVC.php create mode 100755 api.knowyourfood/core/Request.php create mode 100755 api.knowyourfood/core/Router.php rename knowyourfood/dbconfig.php => api.knowyourfood/database config.php (77%) mode change 100644 => 100755 create mode 100755 api.knowyourfood/exceptions/GenericErrorException.php create mode 100755 api.knowyourfood/exceptions/InvalidCurlStructureException.php create mode 100755 api.knowyourfood/exceptions/InvalidTokenException.php create mode 100644 api.knowyourfood/exceptions/ServiceNotFoundException.php create mode 100755 api.knowyourfood/external_requests/CurlRequest.php create mode 100755 api.knowyourfood/external_requests/CurlRequestBuilder.php create mode 100644 api.knowyourfood/headers_config.php create mode 100755 api.knowyourfood/index.php create mode 100644 api.knowyourfood/test.php create mode 100755 api.knowyourfood/vendor/autoload.php create mode 100755 api.knowyourfood/vendor/composer/ClassLoader.php create mode 100755 api.knowyourfood/vendor/composer/InstalledVersions.php create mode 100755 api.knowyourfood/vendor/composer/LICENSE create mode 100755 api.knowyourfood/vendor/composer/autoload_classmap.php create mode 100755 api.knowyourfood/vendor/composer/autoload_namespaces.php create mode 100755 api.knowyourfood/vendor/composer/autoload_psr4.php create mode 100755 api.knowyourfood/vendor/composer/autoload_real.php create mode 100755 api.knowyourfood/vendor/composer/autoload_static.php create mode 100755 api.knowyourfood/vendor/composer/installed.json create mode 100755 api.knowyourfood/vendor/composer/installed.php delete mode 100644 knowyourfood/.env.example mode change 100644 => 100755 knowyourfood/.gitignore mode change 100644 => 100755 knowyourfood/composer.json mode change 100644 => 100755 knowyourfood/composer.lock mode change 100644 => 100755 knowyourfood/controllers/AuthController.php create mode 100755 knowyourfood/controllers/SiteController.php delete mode 100644 knowyourfood/controllers/siteController.php mode change 100644 => 100755 knowyourfood/core/Application.php mode change 100644 => 100755 knowyourfood/core/Controller.php create mode 100755 knowyourfood/core/DVC.php mode change 100644 => 100755 knowyourfood/core/Database.php delete mode 100644 knowyourfood/core/DbModel.php mode change 100644 => 100755 knowyourfood/core/Model.php mode change 100644 => 100755 knowyourfood/core/Request.php mode change 100644 => 100755 knowyourfood/core/Response.php mode change 100644 => 100755 knowyourfood/core/Router.php mode change 100644 => 100755 knowyourfood/core/Session.php mode change 100644 => 100755 knowyourfood/core/View.php delete mode 100644 knowyourfood/core/exceptions/ForbiddenException.php delete mode 100644 knowyourfood/core/exceptions/NotFoundException.php delete mode 100644 knowyourfood/core/form/BaseField.php mode change 100644 => 100755 knowyourfood/core/form/Button.php delete mode 100644 knowyourfood/core/form/Field.php mode change 100644 => 100755 knowyourfood/core/form/Form.php mode change 100644 => 100755 knowyourfood/core/form/InputField.php create mode 100755 knowyourfood/core/form/Region.php mode change 100644 => 100755 knowyourfood/core/form/TextareaField.php delete mode 100644 knowyourfood/core/middlewares/AuthMiddleware.php delete mode 100644 knowyourfood/core/middlewares/BaseMiddleware.php create mode 100755 knowyourfood/exceptions/ForbiddenAccessException.php create mode 100755 knowyourfood/exceptions/GenericErrorException.php create mode 100755 knowyourfood/exceptions/InvalidCurlStructureException.php create mode 100755 knowyourfood/exceptions/PageNotFoundException.php create mode 100755 knowyourfood/external_requests/CurlRequest.php create mode 100755 knowyourfood/external_requests/CurlRequestBuilder.php mode change 100644 => 100755 knowyourfood/index.php delete mode 100644 knowyourfood/migrations.php delete mode 100644 knowyourfood/migrations/m01_initial.php delete mode 100644 knowyourfood/migrations/m02_add_password_column.php mode change 100644 => 100755 knowyourfood/models/ContactForm.php delete mode 100644 knowyourfood/models/LoginForm.php create mode 100755 knowyourfood/models/LoginModel.php create mode 100644 knowyourfood/models/RegisterModel.php delete mode 100644 knowyourfood/models/User.php mode change 100644 => 100755 knowyourfood/runtime/.gitignore create mode 100644 knowyourfood/views/Login.php create mode 100644 knowyourfood/views/Register.php delete mode 100644 knowyourfood/views/_error.php delete mode 100644 knowyourfood/views/contact.php delete mode 100644 knowyourfood/views/home.php create mode 100755 knowyourfood/views/layouts/CSS/styleAuth.css create mode 100755 knowyourfood/views/layouts/CSS/styleMain.css create mode 100644 knowyourfood/views/layouts/HTML/Auth.php create mode 100644 knowyourfood/views/layouts/HTML/Main.php create mode 100755 knowyourfood/views/layouts/Images/admin_files/admin_background.jpg create mode 100755 knowyourfood/views/layouts/Images/admin_files/admin_background.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/dashboard icon.png create mode 100755 knowyourfood/views/layouts/Images/admin_files/dashboard icon.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/database icon.png create mode 100755 knowyourfood/views/layouts/Images/admin_files/database icon.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/exit icon.png create mode 100755 knowyourfood/views/layouts/Images/admin_files/exit icon.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/recipes-database.jpg create mode 100755 knowyourfood/views/layouts/Images/admin_files/recipes-database.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/restaurants-database.jpg create mode 100755 knowyourfood/views/layouts/Images/admin_files/restaurants-database.psd create mode 100755 knowyourfood/views/layouts/Images/admin_files/user icon.png create mode 100755 knowyourfood/views/layouts/Images/admin_files/user icon.psd create mode 100755 knowyourfood/views/layouts/Images/background/backgroudn.psd create mode 100755 knowyourfood/views/layouts/Images/background/background.jpg create mode 100755 knowyourfood/views/layouts/Images/menu_icon/dropdown_menu_icon.png create mode 100755 knowyourfood/views/layouts/Images/menu_icon/dropdown_menu_icon.psd create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe.txt create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe1.jpg create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe2.jpg create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe3.webp create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe4.jpg create mode 100755 knowyourfood/views/layouts/Images/recipes/recipe5.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant1.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant2.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant3.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant4.webp create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant5.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant6.jpg create mode 100755 knowyourfood/views/layouts/Images/restaurants/restaurant7.jpg create mode 100755 knowyourfood/views/layouts/Videos/Another-Clock.gif create mode 100755 knowyourfood/views/layouts/Videos/analog-clock.mp4 delete mode 100644 knowyourfood/views/layouts/auth.php delete mode 100644 knowyourfood/views/layouts/main.php delete mode 100644 knowyourfood/views/login.php delete mode 100644 knowyourfood/views/profile.php delete mode 100644 knowyourfood/views/register.php create mode 100755 service_authentication/.htaccess create mode 100755 service_authentication/.idea/.gitignore create mode 100755 service_authentication/.idea/dataSources.xml create mode 100755 service_authentication/.idea/modules.xml create mode 100755 service_authentication/.idea/php.xml create mode 100755 service_authentication/.idea/service_regions.iml create mode 100644 service_authentication/.idea/sqldialects.xml create mode 100755 service_authentication/composer.json create mode 100755 service_authentication/composer.lock create mode 100755 service_authentication/core/AuthInterface.php create mode 100755 service_authentication/core/Controller.php create mode 100755 service_authentication/core/DVC.php create mode 100755 service_authentication/core/Request.php create mode 100755 service_authentication/database config.php create mode 100755 service_authentication/exceptions/GenericErrorException.php create mode 100755 service_authentication/exceptions/InvalidAuthRequestException.php create mode 100755 service_authentication/exceptions/InvalidAuthTokenException.php create mode 100755 service_authentication/exceptions/InvalidBodyException.php create mode 100755 service_authentication/exceptions/InvalidRequestException.php create mode 100755 service_authentication/exceptions/UserAlreadyExistsException.php create mode 100755 service_authentication/exceptions/UserNotExistingException.php create mode 100755 service_authentication/index.php create mode 100755 service_authentication/models/LoginModel.php create mode 100755 service_authentication/models/RegisterModel.php create mode 100755 service_authentication/vendor/autoload.php create mode 100755 service_authentication/vendor/composer/ClassLoader.php create mode 100755 service_authentication/vendor/composer/InstalledVersions.php create mode 100755 service_authentication/vendor/composer/LICENSE create mode 100755 service_authentication/vendor/composer/autoload_classmap.php create mode 100755 service_authentication/vendor/composer/autoload_namespaces.php create mode 100755 service_authentication/vendor/composer/autoload_psr4.php create mode 100755 service_authentication/vendor/composer/autoload_real.php create mode 100755 service_authentication/vendor/composer/autoload_static.php create mode 100755 service_authentication/vendor/composer/installed.json create mode 100755 service_authentication/vendor/composer/installed.php diff --git a/api.knowyourfood/.htaccess b/api.knowyourfood/.htaccess new file mode 100755 index 0000000..99ea233 --- /dev/null +++ b/api.knowyourfood/.htaccess @@ -0,0 +1,12 @@ +RewriteEngine On + + + Header set Access-Control-Allow-Origin "*" + Header set Access-Control-Allow-Headers "*" + Header set Access-Control-Allow-Methods "*" + + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)$ index.php [L] + diff --git a/api.knowyourfood/.idea/.gitignore b/api.knowyourfood/.idea/.gitignore new file mode 100755 index 0000000..1c2fda5 --- /dev/null +++ b/api.knowyourfood/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/api.knowyourfood/.idea/api.knowyourfood.iml b/api.knowyourfood/.idea/api.knowyourfood.iml new file mode 100644 index 0000000..928ea4e --- /dev/null +++ b/api.knowyourfood/.idea/api.knowyourfood.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/api.knowyourfood/.idea/modules.xml b/api.knowyourfood/.idea/modules.xml new file mode 100755 index 0000000..2e766bb --- /dev/null +++ b/api.knowyourfood/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/api.knowyourfood/.idea/php.xml b/api.knowyourfood/.idea/php.xml new file mode 100755 index 0000000..bccf9a4 --- /dev/null +++ b/api.knowyourfood/.idea/php.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api.knowyourfood/composer.json b/api.knowyourfood/composer.json new file mode 100755 index 0000000..4d28886 --- /dev/null +++ b/api.knowyourfood/composer.json @@ -0,0 +1,12 @@ +{ + "name": "andrei_robert/api.knowyourfood", + "autoload": { + "psr-4": { + "app\\": "./" + } + }, + "require": { + "ext-curl": "*", + "ext-ssh2": "*" + } +} diff --git a/api.knowyourfood/composer.lock b/api.knowyourfood/composer.lock new file mode 100755 index 0000000..07783ca --- /dev/null +++ b/api.knowyourfood/composer.lock @@ -0,0 +1,20 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "d0c0dc1923200d7104286e6b4706aaad", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "ext-curl": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/api.knowyourfood/core/DVC.php b/api.knowyourfood/core/DVC.php new file mode 100755 index 0000000..54c1246 --- /dev/null +++ b/api.knowyourfood/core/DVC.php @@ -0,0 +1,96 @@ + [ + DVC::$returnCode => 460, + DVC::$returnMessage => "Operation done successfully" + ], + DVC::$genericExceptionName => [ + DVC::$returnCode => 461, + DVC::$returnMessage => "Internal Server Error" + ], + DVC::$invalidTokenName => [ + DVC::$returnCode => 462, + DVC::$returnMessage => "Unauthorized access" + ], + DVC::$invalidRequestName => [ + DVC::$returnCode => 463, + DVC::$returnMessage => "Service doesn't provide this type of request" + ], + DVC::$invalidBodyName => [ + DVC::$returnCode => 464, + DVC::$returnMessage => "Not valid parameters sent" + ], + DVC::$alreadyExistsName => [ + + DVC::$returnCode => 465, + DVC::$returnMessage => "Field already existing" + ], + DVC::$fieldNotExistingName => [ + DVC::$returnCode => 466, + DVC::$returnMessage => "Field not existing anymore" + ], + DVC::$invalidCurlStructureName => [ + DVC::$returnCode => 467, + DVC::$returnMessage => "cURL class needs URL, request method and headers to run" + ], + DVC::$userNotExistingName => [ + DVC::$returnCode => 468, + DVC::$returnMessage => "User account doesn't exists" + ], + DVC::$pageNotFoundName => [ + DVC::$returnCode => 469, + DVC::$returnMessage => "Page not found" + ], + DVC::$forbiddenAccessName => [ + DVC::$returnCode => 470, + DVC::$returnMessage => "You are not authorised to access this page" + ], + DVC::$serviceNotFoundName => [ + DVC::$returnCode => 471, + DVC::$returnMessage => "Service not existing" + ] + }; + } + + public static function getHttpCodeWithCode(int $code): int + { + return match ($code){ + 460 => 200, + 461 => 500, + 462 => 401, + 463 => 405, + 464 => 400, + 465, 466 => 204, + 467 => 409, + 468, 469, 471 => 404, + 470 => 403, + default => 100 + }; + } +} \ No newline at end of file diff --git a/api.knowyourfood/core/Request.php b/api.knowyourfood/core/Request.php new file mode 100755 index 0000000..572d064 --- /dev/null +++ b/api.knowyourfood/core/Request.php @@ -0,0 +1,43 @@ +request = $request; + $this->token = $token; + } + + public function set($path, $callback): void + { + $this->routes[$path] = $callback; + } + + public function getHeaders(string $path): array + { + $array = $_SESSION['headers_configuration'][$path]; + + if($path === '/authentication'){ + $array = $array[$this->request->getAuthRequest()]; + } + + $array["Content-Length"] = empty($this->request->getBody()) ? 0 : strlen(json_encode($this->request->getBody())); + + $toReturn = array(); + foreach ($array as $key => $value){ + $value = $key . ": " . $value; + $toReturn[] = $value; + } + + return $toReturn; + } + + + public function resolve(): void + { + try { + if (!$this->isTokenValid()) throw new InvalidTokenException(); + + $path = $this->request->getPath(); + $method = $this->request->method(); + $body = $this->request->getBody(); + $callback = $this->routes[$path] ?? false; + + if (!$callback) throw new ServiceNotFoundException(); + + $headers = $this->getHeaders($path); + + $requestBuilder = new CurlRequestBuilder(); + + $requestBuilder->setRequest($method); + $requestBuilder->setUrl($callback); + $requestBuilder->setHeaders($headers); + $requestBuilder->setBody($body); + $requestBuilder->setIsReturnable(true); + $request = $requestBuilder->getCurlRequestObject(); + + $response = $request->makeRequest(); + $this->writeResponse( + DVC::getHttpCodeWithCode(DVC::$successReturnCode), + DVC::$successReturnCode, $response + ); + } catch (Exception $e){ + $this->writeResponse(DVC::getHttpCodeWithCode($e->getCode()), + $e->getCode(), $e->getMessage() + ); + } + } + + private function isTokenValid(): bool + { + $validToken = hash('md5', 'api.knowyourfood'); + return $validToken == $this->token; + } + + private function writeResponse(int $httpCode, int $returnCode, string $returnMessage): void + { + header("Content-Disposition: ".DVC::$nameOfResponsePackage); + header("Content-Type: application/json"); + http_response_code($httpCode); + if($httpCode != 200) { + echo json_encode([ + "code" => $returnCode, + "message" => $returnMessage + ]); + }else{ + echo $returnMessage; + } + } +} \ No newline at end of file diff --git a/knowyourfood/dbconfig.php b/api.knowyourfood/database config.php old mode 100644 new mode 100755 similarity index 77% rename from knowyourfood/dbconfig.php rename to api.knowyourfood/database config.php index ab75e91..fda94ed --- a/knowyourfood/dbconfig.php +++ b/api.knowyourfood/database config.php @@ -1,10 +1,11 @@ - \app\models\User::class, - 'db' => [ - 'dsn' => 'mysql:host=localhost;port=3306;dbname=Web', - 'user' => 'root', - 'password' => '', - ] + [ + 'dsn' => 'mysql:host=localhost;port=3306;dbname=Web', + 'user' => 'root', + 'password' => '', + ] ]; \ No newline at end of file diff --git a/api.knowyourfood/exceptions/GenericErrorException.php b/api.knowyourfood/exceptions/GenericErrorException.php new file mode 100755 index 0000000..b1f51bb --- /dev/null +++ b/api.knowyourfood/exceptions/GenericErrorException.php @@ -0,0 +1,13 @@ +url = $url; + $this->request = $request; + $this->headers = $headers; + $this->body = $body; + $this->isReturnable = $isReturnable; + } + + /** + * @throws GenericErrorException + */ + public function makeRequest(): string + { + $curl = curl_init(); + $this->setCurlBody($curl); + + $response = curl_exec($curl); + + if(!$response){ + throw new GenericErrorException(); + } + if(curl_errno($curl)){ + echo curl_error($curl); + die; + } + + curl_close($curl); + + return $response; + } + + public function setCurlBody(CurlHandle &$curl): void + { + curl_setopt($curl, CURLOPT_URL, $this->url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->request); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, $this->isReturnable); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + + curl_setopt($curl,CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->body)); + } +} \ No newline at end of file diff --git a/api.knowyourfood/external_requests/CurlRequestBuilder.php b/api.knowyourfood/external_requests/CurlRequestBuilder.php new file mode 100755 index 0000000..5eab95e --- /dev/null +++ b/api.knowyourfood/external_requests/CurlRequestBuilder.php @@ -0,0 +1,37 @@ +url = $url;} + public function setHeaders(?array $headers): void{$this->headers = $headers;} + public function setRequest(?string $request): void{$this->request = $request;} + public function setBody(?array $body): void{$this->body = $body;} + public function setIsReturnable(?bool $isReturnable): void{$this->isReturnable = $isReturnable;} + + private function areMainParametersNotSet(): bool{ + return $this->url == NULL || $this->request == NULL || $this->headers == NULL; + } + + /** + * @throws InvalidCurlStructureException + */ + public function getCurlRequestObject(): CurlRequest{ + if($this->areMainParametersNotSet()){ + throw new InvalidCurlStructureException(); + } + + return new CurlRequest($this->url, $this->request, $this->headers, $this->body, $this->isReturnable); + } +} \ No newline at end of file diff --git a/api.knowyourfood/headers_config.php b/api.knowyourfood/headers_config.php new file mode 100644 index 0000000..644a9ee --- /dev/null +++ b/api.knowyourfood/headers_config.php @@ -0,0 +1,23 @@ + [ + "register" => [ + "Content-Type" => "application/json", + "Authorization" => hash('md5', 'service_authentication'), + "Auth-Request" => "register" + ], + "login" => [ + "Content-Type" => "application/json", + "Authorization" => hash('md5', 'service_authentication'), + "Auth-Request" => "login" + ], + + "default" => [ + "Content-Type" => "application/json", + "Authorization" => hash('md5', 'service_authentication') + ], + ] +]; + +$_SESSION['headers_configuration'] = $headers_array; \ No newline at end of file diff --git a/api.knowyourfood/index.php b/api.knowyourfood/index.php new file mode 100755 index 0000000..4fe39df --- /dev/null +++ b/api.knowyourfood/index.php @@ -0,0 +1,16 @@ +getToken()); + +$router->set("/authentication", '89.137.67.2:702'); + +$request->getAuthRequest(); + +$router->resolve(); diff --git a/api.knowyourfood/test.php b/api.knowyourfood/test.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/api.knowyourfood/test.php @@ -0,0 +1 @@ + + * Jordi Boggiano + * + * 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 + * @author Jordi Boggiano + * @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> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ + 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> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-return array + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array $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); + } +} diff --git a/api.knowyourfood/vendor/composer/InstalledVersions.php b/api.knowyourfood/vendor/composer/InstalledVersions.php new file mode 100755 index 0000000..51e734a --- /dev/null +++ b/api.knowyourfood/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * 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}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + 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 + */ + 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 + */ + 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 || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + 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((string) $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} + */ + 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}> + */ + 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} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + 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')) { + /** @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} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + 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') { + /** @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} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/api.knowyourfood/vendor/composer/LICENSE b/api.knowyourfood/vendor/composer/LICENSE new file mode 100755 index 0000000..f27399a --- /dev/null +++ b/api.knowyourfood/vendor/composer/LICENSE @@ -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. + diff --git a/api.knowyourfood/vendor/composer/autoload_classmap.php b/api.knowyourfood/vendor/composer/autoload_classmap.php new file mode 100755 index 0000000..0fb0a2c --- /dev/null +++ b/api.knowyourfood/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/api.knowyourfood/vendor/composer/autoload_namespaces.php b/api.knowyourfood/vendor/composer/autoload_namespaces.php new file mode 100755 index 0000000..15a2ff3 --- /dev/null +++ b/api.knowyourfood/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/'), +); diff --git a/api.knowyourfood/vendor/composer/autoload_real.php b/api.knowyourfood/vendor/composer/autoload_real.php new file mode 100755 index 0000000..7b58fad --- /dev/null +++ b/api.knowyourfood/vendor/composer/autoload_real.php @@ -0,0 +1,36 @@ +register(true); + + return $loader; + } +} diff --git a/api.knowyourfood/vendor/composer/autoload_static.php b/api.knowyourfood/vendor/composer/autoload_static.php new file mode 100755 index 0000000..47c793b --- /dev/null +++ b/api.knowyourfood/vendor/composer/autoload_static.php @@ -0,0 +1,36 @@ + + array ( + 'app\\' => 4, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'app\\' => + array ( + 0 => __DIR__ . '/../..' . '/', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit345c1a817a7f402322a2ecae01a96071::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit345c1a817a7f402322a2ecae01a96071::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit345c1a817a7f402322a2ecae01a96071::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/api.knowyourfood/vendor/composer/installed.json b/api.knowyourfood/vendor/composer/installed.json new file mode 100755 index 0000000..87fda74 --- /dev/null +++ b/api.knowyourfood/vendor/composer/installed.json @@ -0,0 +1,5 @@ +{ + "packages": [], + "dev": true, + "dev-package-names": [] +} diff --git a/api.knowyourfood/vendor/composer/installed.php b/api.knowyourfood/vendor/composer/installed.php new file mode 100755 index 0000000..a116754 --- /dev/null +++ b/api.knowyourfood/vendor/composer/installed.php @@ -0,0 +1,23 @@ + array( + 'name' => 'andrei_robert/api.knowyourfood', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'andrei_robert/api.knowyourfood' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/knowyourfood/.env.example b/knowyourfood/.env.example deleted file mode 100644 index e499597..0000000 --- a/knowyourfood/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -DB_DSN = mysql:host=localhost;port=3306;dbname=Web -DB_USER = root -DB_PASSWORD = root \ No newline at end of file diff --git a/knowyourfood/.gitignore b/knowyourfood/.gitignore old mode 100644 new mode 100755 index 105e5d8..1907110 --- a/knowyourfood/.gitignore +++ b/knowyourfood/.gitignore @@ -1,4 +1,4 @@ -vendor -.idea -dbconfig +vendor +.idea +dbconfig !.gitignore \ No newline at end of file diff --git a/knowyourfood/.htaccess b/knowyourfood/.htaccess index 8d79af1..dbd5b49 100644 --- a/knowyourfood/.htaccess +++ b/knowyourfood/.htaccess @@ -1,14 +1,4 @@ -ErrorDocument 403 /404.php -ErrorDocument 404 /404.php -DirectoryINdex index.php - - -RewriteEngine on +RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule ^(.*)$ index.php?page=$1 [L,QSA] - -RewriteCond %{REQUEST_URI} !^/$ -RewriteCond %{REQUEST_URI} !^/admin -RewriteRule .*/ [L,R=301] - \ No newline at end of file +RewriteRule ^(.*)$ index.php [L] \ No newline at end of file diff --git a/knowyourfood/composer.json b/knowyourfood/composer.json old mode 100644 new mode 100755 index ce8993e..d598cb7 --- a/knowyourfood/composer.json +++ b/knowyourfood/composer.json @@ -1,17 +1,11 @@ { - "name": "andrei/knowyourfood", - "authors": [ - { - "name": "Cerbu Andrei Mihnea", - "email": "andreimihneacerbu@gmail.com" - } - ], - "autoload" : { - "psr-4" : { + "name": "andrei_cerbu/knowyourfood", + "autoload": { + "psr-4": { "app\\": "./" } }, "require": { - "vlucas/phpdotenv": "^5.5" + "ext-curl": "*" } } diff --git a/knowyourfood/composer.lock b/knowyourfood/composer.lock old mode 100644 new mode 100755 index 5a0612e..481155d --- a/knowyourfood/composer.lock +++ b/knowyourfood/composer.lock @@ -4,485 +4,17 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c85ce2bf1fa0099ca65ec02d2a26abb1", - "packages": [ - { - "name": "graham-campbell/result-type", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" - }, - "type": "library", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "time": "2023-02-25T20:23:15+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2023-02-25T19:38:58+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v5.5.0", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "5.5-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2022-10-16T01:01:54+00:00" - } - ], + "content-hash": "d99f7bada71212307c9485da334476d5", + "packages": [], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "ext-curl": "*" + }, "platform-dev": [], "plugin-api-version": "2.3.0" } diff --git a/knowyourfood/controllers/AuthController.php b/knowyourfood/controllers/AuthController.php old mode 100644 new mode 100755 index 052974c..15b2999 --- a/knowyourfood/controllers/AuthController.php +++ b/knowyourfood/controllers/AuthController.php @@ -1,70 +1,88 @@ -registerMiddleware(new AuthMiddleware(['profile'])); - } - - public function login(Request $request, Response $response){ - $loginForm = new LoginForm(); - - if($request->isPost()){ - $loginForm->loadData($request->getBody()); - if($loginForm->validate() && $loginForm->login()){ - $response->redirect('home'); - exit; - } - - $this->setLayout('auth'); - return $this->render('login', [ - 'model' => $loginForm - ]); - } - - $this->setLayout('auth'); - return $this->render('login', [ - 'model' => $loginForm - ]); - } - - public function register(Request $request, $response){ - $user = new User(); - - if($request->isPost()){ - $user->loadData($request->getBody()); - - if($user->validate() && $user->save()){ - $response->redirect('home'); - exit; - } - - $this->setLayout('auth'); - return $this->render('register', [ - 'model'=>$user - ]); - } - - $this->setLayout('auth'); - return $this->render('register', [ - 'model'=>$user - ]); - } - - public function logout($request, $response){ - Application::$app->logout(); - $response->redirect('/'); - } - - public function profile(){ - return $this->render('profile'); - } +isPost()){ + $model->loadData($request->getPOSTBody()); + $model->checkForErrors(); + + if($model->hasErrors()){ + self::setControllerParams("Login", "Login", "Auth", $model); + return Application::$app->controller->render(); + } + $model->removeErrors(); + + $body = $model->createBody(); + $headers = $model->createHeaders(json_encode($body)); + + $model->setParametersForRequest("GET", $headers, $body); + + $model->execute(); + if($model->isRequestFulfilled()){ + //Application::$app->response->redirect("homepage"); + } + + $model->setRequestError(); + self::setControllerParams("Login", "Login", "Auth", $model); + return Application::$app->controller->render(); + } + + self::setControllerParams("Login", "Login", "Auth", $model); + return Application::$app->controller->render(); + } + + public static function registerPage(Request $request): string + { + $model = new RegisterModel(); + + if($request->isPost()){ + $model->loadData($request->getPOSTBody()); + $model->checkForErrors(); + + if($model->hasErrors()){ + self::setControllerParams("Register", "Register", "Auth", $model); + return Application::$app->controller->render(); + } + $model->removeErrors(); + + $body = $model->createBody(); + $headers = $model->createHeaders(json_encode($body)); + + $model->setParametersForRequest("PUT", $headers, $body); + + $model->execute(); + if($model->isRequestFulfilled()){ + Application::$app->response->redirect("login"); + } + + $model->setRequestError(); + self::setControllerParams("Register", "Register", "Auth", $model); + return Application::$app->controller->render(); + } + + self::setControllerParams("Register", "Register", "Auth", $model); + return Application::$app->controller->render(); + } + + public static function setControllerParams(string $title, string $view, string $layout, ?Model $model): void + { + Application::$app->controller->setLayout($layout); + Application::$app->controller->setModel($model); + Application::$app->controller->setTitle($title); + Application::$app->controller->setView($view); + } } \ No newline at end of file diff --git a/knowyourfood/controllers/SiteController.php b/knowyourfood/controllers/SiteController.php new file mode 100755 index 0000000..366fae9 --- /dev/null +++ b/knowyourfood/controllers/SiteController.php @@ -0,0 +1,47 @@ +render(); + } + + public function profile(): string + { + return $this->render('profile'); + } + + public static function renderMainPage(): string + { + Application::$app->view->setLayout('Main'); + return Application::$app->view->renderLayout(); + } + + public function _404(): string + { + return $this->render(); + } + + public function _403(): string + { + return $this->render(); + } + + protected static function setControllerParams(string $title, string $view, string $layout, ?Model $model) + { + // TODO: Implement setControllerParams() method. + } +} \ No newline at end of file diff --git a/knowyourfood/controllers/siteController.php b/knowyourfood/controllers/siteController.php deleted file mode 100644 index bc8dc36..0000000 --- a/knowyourfood/controllers/siteController.php +++ /dev/null @@ -1,55 +0,0 @@ -isPost()) { - $contact->loadData($request->getBody()); - - if ($contact->validate() && $contact->send()) { - Application::$app->session->setFlash('success', 'The form has been succesfully sent!'); - var_dump($_SESSION['flash_messages']); - $response->redirect('contact'); - exit; - } - - return $this->render('contact', [ - 'model' => $contact - ]); - } - - return $this->render('contact', [ - 'model' => $contact - ]); - } - - public function home() - { - $params = [ - 'name' => "TheCodeholic" - ]; - - return $this->render('home', $params); - } - - public function profile() - { - return $this->render('profile'); - } - - public function _404() - { - return $this->render('_404'); - } -} \ No newline at end of file diff --git a/knowyourfood/core/Application.php b/knowyourfood/core/Application.php old mode 100644 new mode 100755 index 9f414fd..358a2b2 --- a/knowyourfood/core/Application.php +++ b/knowyourfood/core/Application.php @@ -1,93 +1,42 @@ -userClass = $config['userClass']; - self::$app = $this; - - $this->request = new Request(); - $this->response = new Response(); - $this->router = new Router($this->request, $this->response); - $this->view = new View(); - - $this->db = new Database($config['db']); - $this->session = new Session(); - - $primaryValue = $this->session->get('user'); - if ($primaryValue) { - $userObj = new $this->userClass(); - $primaryKey = $userObj->primaryKey(); - $this->user = $userObj->findOne([$primaryKey => $primaryValue]); - } else { - $this->user = null; - } - } - - public function setController($controller) - { - $this->controller = $controller; - } - - public function getController() - { - return $this->controller; - } - - public function login(DbModel $user) - { - $this->user = $user; - $primaryKey = $user->primaryKey(); - $primaryValue = $user->{$primaryKey}; - $this->session->set('user', $primaryValue); - return true; - } - - public function logout() - { - $this->user = null; - $this->session->remove('user'); - } - - public static function isLoggedIn() - { - return !self::$app->user; - } - - public function run() - { - try{ - echo $this->router->resolve(); - }catch(ForbiddenException $e){ - $this->response->setStatusCode(403); - echo $this->view->renderView('_error', [ - 'exception' => $e - ]); - }catch(NotFoundException $e){ - $this->response->setStatusCode(404); - echo $this->view->renderView('_error', [ - 'exception' => $e - ]); - } - } +request = new Request(); + $this->response = new Response(); + $this->router = new Router($this->request); + $this->view = new View(); + $this->session = new Session(); + } + + public function run(): void + { + try{ + echo $this->router->resolve(); + }catch(ForbiddenAccessException $e){ + + }catch(PageNotFoundException $e){ + + } + } } \ No newline at end of file diff --git a/knowyourfood/core/Controller.php b/knowyourfood/core/Controller.php old mode 100644 new mode 100755 index 39577ca..39f940e --- a/knowyourfood/core/Controller.php +++ b/knowyourfood/core/Controller.php @@ -1,26 +1,26 @@ -view->renderView($view, $params); - } - - public function setLayout($layout){ - $this->layout = $layout; - } - - public function registerMiddleware(BaseMiddleware $middleware){ - $this->middlewares[] = $middleware; - } - - public function getMiddlewares(){ - return $this->middlewares; - } +view->setLayout($this->layout); + Application::$app->view->setTitle($this->title); + Application::$app->view->setView($this->view); + Application::$app->view->setModel($this->model); + + return Application::$app->view->render(); + } + + protected static abstract function setControllerParams(string $title, string $view, string $layout, ?Model $model); + + public function setView(string $view): void {$this->view = $view;} + public function setTitle(string $title): void {$this->title = $title;} + public function setLayout(string $layout): void {$this->layout = $layout;} + public function setModel(?Model $model): void {$this->model = $model;} } \ No newline at end of file diff --git a/knowyourfood/core/DVC.php b/knowyourfood/core/DVC.php new file mode 100755 index 0000000..76ed874 --- /dev/null +++ b/knowyourfood/core/DVC.php @@ -0,0 +1,96 @@ + [ + DVC::$returnCode => 460, + DVC::$returnMessage => "Operation done successfully" + ], + DVC::$genericExceptionName => [ + DVC::$returnCode => 461, + DVC::$returnMessage => "Internal Server Error" + ], + DVC::$invalidTokenName => [ + DVC::$returnCode => 462, + DVC::$returnMessage => "Unauthorized access" + ], + DVC::$invalidRequestName => [ + DVC::$returnCode => 463, + DVC::$returnMessage => "Service doesn't provide this type of request" + ], + DVC::$invalidBodyName => [ + DVC::$returnCode => 464, + DVC::$returnMessage => "Not valid parameters sent" + ], + DVC::$alreadyExistsName => [ + + DVC::$returnCode => 465, + DVC::$returnMessage => "Field already existing" + ], + DVC::$fieldNotExistingName => [ + DVC::$returnCode => 466, + DVC::$returnMessage => "Field not existing anymore" + ], + DVC::$invalidCurlStructureName => [ + DVC::$returnCode => 467, + DVC::$returnMessage => "cURL class needs URL, request method and headers to run" + ], + DVC::$userNotExistingName => [ + DVC::$returnCode => 468, + DVC::$returnMessage => "User account doesn't exists" + ], + DVC::$pageNotFoundName => [ + DVC::$returnCode => 469, + DVC::$returnMessage => "Page not found" + ], + DVC::$forbiddenAccessName => [ + DVC::$returnCode => 470, + DVC::$returnMessage => "You are not authorised to access this page" + ], + DVC::$serviceNotFoundName => [ + DVC::$returnCode => 471, + DVC::$returnCode => "Service not existing" + ] + }; + } + + public static function getHttpCodeWithCode(int $code): int + { + return match ($code){ + 460 => 200, + 461 => 500, + 462 => 401, + 463 => 405, + 464 => 400, + 465, 466 => 204, + 467 => 409, + 468, 469, 471 => 404, + 470 => 403, + default => 100 + }; + } +} \ No newline at end of file diff --git a/knowyourfood/core/Database.php b/knowyourfood/core/Database.php old mode 100644 new mode 100755 index ba3a5bd..e1de97d --- a/knowyourfood/core/Database.php +++ b/knowyourfood/core/Database.php @@ -1,78 +1,78 @@ -pdo = new \PDO($dsn, $user, $password); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - } - - public function applyMigrations(){ - $this->createMigrationsTable(); - $appliedMigrations = $this->getAppliedMigrations(); - - $newMigrations = []; - $files = scandir(Application::$ROOT_DIR.'/migrations'); - $toApplyMigrations = array_diff($files, $appliedMigrations); - - foreach($toApplyMigrations as $migration){ - if($migration === '.' || $migration === '..'){ - continue; - } - - require_once Application::$ROOT_DIR.'/migrations/'.$migration; - $className = pathinfo($migration, PATHINFO_FILENAME); - - $instance = new $className(); - $this->log("Applying migration $migration" . PHP_EOL); - $instance->up(); - $this->log("Applied migration $migration" . PHP_EOL); - - $newMigrations[] = $migration; - } - - if(!empty($newMigrations)){ - $this->saveMigrations($newMigrations); - }else{ - $this->log('All migrations are applied'); - } - } - - public function createMigrationsTable(){ - $this->pdo->exec(" - CREATE TABLE IF NOT EXISTS migrations ( - id INT AUTO_INCREMENT, - migration varchar(255), - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (id) - ) - ENGINE=INNODB;"); - } - - public function getAppliedMigrations(){ - $statement = $this->pdo->prepare("SELECT migration FROM migrations"); - $statement->execute(); - - return $statement->fetchAll(\PDO::FETCH_COLUMN); - } - - public function saveMigrations(array $migrations){ - $str = implode(",", array_map(fn($m) => "('$m')", $migrations)); - $statement = $this->pdo->prepare("INSERT INTO migrations (migration) VALUES $str"); - $statement->execute(); - } - - public function prepare($sql){ - return $this->pdo->prepare($sql); - } - - protected function log($message){ - echo '['.date('Y-m-d H:i:s').'] - '.$message.PHP_EOL; - } +pdo = new \PDO($dsn, $user, $password); + $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + } + + public function applyMigrations(){ + $this->createMigrationsTable(); + $appliedMigrations = $this->getAppliedMigrations(); + + $newMigrations = []; + $files = scandir(Application::$ROOT_DIR.'/migrations'); + $toApplyMigrations = array_diff($files, $appliedMigrations); + + foreach($toApplyMigrations as $migration){ + if($migration === '.' || $migration === '..'){ + continue; + } + + require_once Application::$ROOT_DIR.'/migrations/'.$migration; + $className = pathinfo($migration, PATHINFO_FILENAME); + + $instance = new $className(); + $this->log("Applying migration $migration" . PHP_EOL); + $instance->up(); + $this->log("Applied migration $migration" . PHP_EOL); + + $newMigrations[] = $migration; + } + + if(!empty($newMigrations)){ + $this->saveMigrations($newMigrations); + }else{ + $this->log('All migrations are applied'); + } + } + + public function createMigrationsTable(){ + $this->pdo->exec(" + CREATE TABLE IF NOT EXISTS migrations ( + id INT AUTO_INCREMENT, + migration varchar(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id) + ) + ENGINE=INNODB;"); + } + + public function getAppliedMigrations(){ + $statement = $this->pdo->prepare("SELECT migration FROM migrations"); + $statement->execute(); + + return $statement->fetchAll(\PDO::FETCH_COLUMN); + } + + public function saveMigrations(array $migrations){ + $str = implode(",", array_map(fn($m) => "('$m')", $migrations)); + $statement = $this->pdo->prepare("INSERT INTO migrations (migration) VALUES $str"); + $statement->execute(); + } + + public function prepare($sql){ + return $this->pdo->prepare($sql); + } + + protected function log($message){ + echo '['.date('Y-m-d H:i:s').'] - '.$message.PHP_EOL; + } } \ No newline at end of file diff --git a/knowyourfood/core/DbModel.php b/knowyourfood/core/DbModel.php deleted file mode 100644 index b6928c0..0000000 --- a/knowyourfood/core/DbModel.php +++ /dev/null @@ -1,51 +0,0 @@ -tableName(); - $attributes = $this->attributes(); - $params = array_map(fn($attr) => ":$attr", $attributes); - - $statement = self::prepare("INSERT INTO $tableName (" - .implode(',', $attributes) - .") VALUES (" - .implode(',', $params) - .")" - ); - - foreach($attributes as $attribute){ - $statement->bindValue(":$attribute", $this->{$attribute}); - } - - $statement->execute(); - return true; - } - - public static function prepare($sql){ - return Application::$app->db->pdo->prepare($sql); - } - - public function findOne($where){ - $tableName = static::tableName(); - $attributes = array_keys($where); - - $sql = implode("AND ", array_map(fn($attr) => "$attr = :$attr", $attributes)); - $statement = self::prepare("SELECT * from $tableName WHERE $sql"); - - foreach($where as $key => $item){ - $statement->bindValue(":$key", $item); - } - - $statement->execute(); - - return $statement->fetchObject(static::class); - } -} \ No newline at end of file diff --git a/knowyourfood/core/Model.php b/knowyourfood/core/Model.php old mode 100644 new mode 100755 index 250c137..143a678 --- a/knowyourfood/core/Model.php +++ b/knowyourfood/core/Model.php @@ -1,104 +1,119 @@ - $value){ - if(property_exists($this, $key)){ - $this->{$key} = $value; - } - } - } - - abstract public function rules():array; - - public function labels(): array{ - return []; - } - - public array $errors = []; - - private function addErrorForRule(string $attribute, string $rule, $params =[]){ - $message = $this->errorMessages()[$rule] ?? ''; - foreach($params as $key => $value){ - $message = str_replace("{{$key}}", $value, $message); - } - - $this->errors[$attribute][] = $message; - } - - public function addError(string $attribute, string $message){ - $this->errors[$attribute][] = $message; - } - - public function errorMessages(){ - return [ - self::RULE_REQUIRED => 'This field is required', - self::RULE_EMAIL => 'This field must be valid email address', - self::RULE_MIN => 'Min length of this field must be {min}', - self::RULE_MAX => 'Max length of this field must be {max}', - self::RULE_UNIQUE => 'Email already exists' - ]; - } - - public function validate(){ - foreach($this->rules() as $attribute => $rules){ - $value = $this->{$attribute}; - foreach($rules as $rule){ - $ruleName = $rule; - - if(!is_string($ruleName)){ - $ruleName = $rule[0]; - } - - if($ruleName === self::RULE_REQUIRED && !$value){ - $this->addErrorForRule($attribute, self::RULE_REQUIRED); - } - - if($ruleName === self::RULE_EMAIL && !filter_var($value, FILTER_VALIDATE_EMAIL)){ - $this->addErrorForRule($attribute, self::RULE_EMAIL); - } - - if($ruleName === self::RULE_MIN && strlen($value) < $rule['min']){ - $this->addErrorForRule($attribute, self::RULE_MIN, $rule); - } - - if($ruleName === self::RULE_MAX && strlen($value) > $rule['max']){ - $this->addErrorForRule($attribute, self::RULE_MAX, $rule); - } - - if($ruleName === self::RULE_UNIQUE){ - $className = $rule['class']; - $uniqueAttr = $rule['attirubute'] ?? $attribute; - $tableName = $className::tableName(); - - $statement = Application::$app->db->prepare(("SELECT * FROM $tableName WHERE $uniqueAttr = :attr")); - $statement->bindValue(":attr", $value); - $statement->execute(); - $record = $statement->fetchObject(); - - if($record){ - $this->addErrorForRule($attribute, SELF::RULE_UNIQUE); - } - } - } - } - - return empty($this->errors); - } - - public function hasError($attribute){ - return $this->errors[$attribute] ?? false; - } - - public function getFirstError($attribute){ - return $this->errors[$attribute][0] ?? ''; - } + $value){ + if(property_exists($this, $key)){ + $this->{$key} = $value; + } + } + } + abstract public function rules(): array; + public abstract function labels(): array; + public function errorMessages(): array{ + return [ + self::RULE_REQUIRED => 'This field is required', + self::RULE_EMAIL => 'This field must be a valid email address', + ]; + } + + public function checkForErrors(): void{ + foreach($this->rules() as $field => $rules){ + $value = $this->{$field}; + foreach ($rules as $rule){ + if($rule == self::RULE_REQUIRED && !strlen($value)) { + $this->addError($field, $this->errorMessages()[$rule]); + break; + } + + if($rule == self::RULE_EMAIL && !filter_var($value, FILTER_VALIDATE_EMAIL)) { + $this->addError($field, $this->errorMessages()[$rule]); + break; + } + } + } + } + + protected abstract function createBody(): array; + protected abstract function createHeaders(string $body): array; + protected abstract function formatHeaderArray(array $headers): array; + public function setParametersForRequest(string $request, array $headers, array $body): void + { + $this->request = $request; + $this->headers = $headers; + $this->body = $body; + } + + public function execute(): void + { + $requestBuilder = new CurlRequestBuilder(); + + $requestBuilder->setRequest($this->request); + $requestBuilder->setUrl($this->url); + $requestBuilder->setHeaders($this->headers); + $requestBuilder->setBody($this->body); + $requestBuilder->setIsReturnable(true); + + $curl = $requestBuilder->getCurlRequestObject(); + $response = json_decode($curl->makeRequest(), true); + + $this->code = $response["code"]; + $this->message = $response["message"]; + } + + public function isRequestFulfilled(): bool + { + return $this->code == DVC::$successReturnCode; + } + + public function setRequestError(): void + { + Application::$app->view->setActionError($this->message); + } + + + public function addError($attribute, $message): void + { + $this->errors[$attribute] = $message; + } + + public function removeErrors(): void + { + unset($this->errors); + $this->errors = array(); + } + + public function hasErrors(): bool + { + return count($this->errors); + } + + public function getError($field): ?string + { + return array_key_exists($field, $this->errors) ? $this->errors[$field] : NULL; + } + + public function getValueForField($field):string + { + return $this->{$field}; + } } \ No newline at end of file diff --git a/knowyourfood/core/Request.php b/knowyourfood/core/Request.php old mode 100644 new mode 100755 index b59f214..d7841b2 --- a/knowyourfood/core/Request.php +++ b/knowyourfood/core/Request.php @@ -1,54 +1,54 @@ -lengthOfRoot = strlen('knowyourfood') + 1; - } - - public function getPath(){//identificam din URL pe pagina trebuie accesata - $path = $_SERVER['REQUEST_URI']; - $path = substr($path, $this->lengthOfRoot); - - $position = strpos($path, '?'); - - if(!$position){ - return $path; - } - - return substr($path, 0, $position); - } - - public function method(){ - return strtolower($_SERVER['REQUEST_METHOD']); - } - - public function isGet(){ - return $this->method() === 'get'; - } - - public function isPost(){ - return $this->method() === 'post'; - } - - //bazat pe tipul de request, accesam tuplele key/value pentru a identifica body ul requestului - public function getBody(){ - $body = []; - if($this->method() === 'get'){ - foreach($_GET as $key => $value){ - $body[$key] = filter_input(INPUT_GET, $key, FILTER_SANITIZE_SPECIAL_CHARS); - } - } - - if($this->method() === 'post'){ - foreach($_POST as $key => $value){ - $body[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_SPECIAL_CHARS); - } - } - - return $body; - } +method() === 'GET'){ + foreach($_GET as $key => $value){ + $body[$key] = filter_input(INPUT_GET, $key, FILTER_SANITIZE_SPECIAL_CHARS); + } + } + + return $body; + } + + public function getPOSTBody(): ?array + { + $body = []; + + if($this->method() === 'POST'){ + foreach($_POST as $key => $value){ + $body[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_SPECIAL_CHARS); + } + } + + return $body; + } } \ No newline at end of file diff --git a/knowyourfood/core/Response.php b/knowyourfood/core/Response.php old mode 100644 new mode 100755 index 27487ed..99adb04 --- a/knowyourfood/core/Response.php +++ b/knowyourfood/core/Response.php @@ -1,13 +1,13 @@ -request = $request; - $this->response = $response; - } - - public function get($path, $callback) - { - $this->routes['get'][$path] = $callback; - } - - public function post($path, $callback) - { - $this->routes['post'][$path] = $callback; - } - - public function resolve() - { - $path = $this->request->getPath(); - $method = $this->request->method(); - $callback = $this->routes[$method][$path] ?? false; - - if (!$callback) { - throw new NotFoundException(); - } - - $controller = new $callback[0](); - Application::$app->controller = $controller; - $controller->action = $callback[1]; - $callback[0] = $controller; - - foreach ($controller->getMiddlewares() as $middleware) { - $middleware->execute(); - } - - return call_user_func($callback, $this->request, $this->response); - } +request = $request; + } + + public function get($path, $callback): void + { + $this->routes['GET'][$path] = $callback; + } + + public function post($path, $callback): void + { + $this->routes['POST'][$path] = $callback; + } + + /** + * @throws PageNotFoundException + */ + public function resolve() + { + $path = $this->request->getPath(); + $method = $this->request->method(); + $callback = $this->routes[$method][$path] ?? false; + + if (!$callback) { + throw new PageNotFoundException(); + } + + Application::$app->controller = new $callback[0](); + + /* + * TODO: + * de adaugat aici middleware urile asociate unui controller + */ + + return call_user_func($callback, $this->request); + } } \ No newline at end of file diff --git a/knowyourfood/core/Session.php b/knowyourfood/core/Session.php old mode 100644 new mode 100755 index 84c7679..da0de53 --- a/knowyourfood/core/Session.php +++ b/knowyourfood/core/Session.php @@ -1,48 +1,7 @@ - &$flashMessage){ - $flashMessage['remove'] = 'true'; - } - } - - public function setFlash($key, $message){ - $_SESSION[self::FLASH_KEY][$key] = [ - 'value' => $message, - 'remove' => 'false' - ]; - } - - public function getFlash($key){ - return $_SESSION[self::FLASH_KEY][$key]['value'] ?? false; - } - - public function set($key, $value){ - $_SESSION[$key] = $value; - } - - public function get($key){ - return $_SESSION[$key]; - } - - public function remove($key){ - unset($_SESSION[$key]); - } - - public function __destruct(){ - $flashMessages = $_SESSION[self::FLASH_KEY] ?? []; - foreach($flashMessages as $key => &$flashMessage){ - if($flashMessage['remove'] == 'true'){ - unset($flashMessages[$key]); - } - } - - $_SESSION[self::FLASH_KEY] = $flashMessages; - } +layout; - if (Application::$app->controller) { - $layout = Application::$app->controller->layout; - } - - ob_start(); - include_once Application::$ROOT_DIR . "/views/layouts/$layout.php"; - return ob_get_clean(); - } - - - public function renderView($view, $params = []) - { - $viewContent = $this->renderOnlyView($view, $params); - $layoutContent = $this->layoutContent(); - - return str_replace('{{content}}', $viewContent, $layoutContent); - } - - public function renderContent($viewContent) - { - $layoutContent = $this->layoutContent(); - return str_replace('{{content}}', $viewContent, $layoutContent); - } - - protected function renderOnlyView($view, $params) - { - foreach ($params as $key => $value) { - $$key = $value; - } - - ob_start(); - include_once Application::$ROOT_DIR."/views/$view.php"; - return ob_get_clean(); - } +renderView(); + $layoutContent = $this->renderLayout(); + + return str_replace('{{content}}', $viewContent, $layoutContent); + } + + public function renderView(): string + { + ob_start(); + include_once Application::$ROOT_DIR . "/views/$this->view.php"; + return ob_get_clean(); + } + + public function renderLayout(): string + { + ob_start(); + include_once Application::$ROOT_DIR . "/views/layouts/HTML/$this->layout.php"; + return ob_get_clean(); + } + + public function setLayout($layout): void {$this->layout = $layout;} + public function setTitle($title): void {$this->title = $title;} + public function setView($view): void {$this->view = $view;} + public function setModel(?Model $model): void {$this->model = $model;} + public function setActionError(string $actionError): void {$this->actionError = $actionError;} + + public function getTitle(): string {return $this->title;} + public function getView(): string {return $this->view;} + public function getLayout(): string {return $this->layout;} + public function getModel(): ?Model {return $this->model;} + public function getActionError(): string {return $this->actionError;} } \ No newline at end of file diff --git a/knowyourfood/core/exceptions/ForbiddenException.php b/knowyourfood/core/exceptions/ForbiddenException.php deleted file mode 100644 index b6ed42a..0000000 --- a/knowyourfood/core/exceptions/ForbiddenException.php +++ /dev/null @@ -1,8 +0,0 @@ -model = $model; - $this->attribute = $attribute; - } - - abstract public function renderInput(): string; - - public function __toString() - { - return sprintf(' -
- - %s -
- %s -
-
- ', - $this->model->labels()[$this->attribute] ?? $this->attribute, - $this->renderInput(), - $this->model->getFirstError($this->attribute) - ); - } -} \ No newline at end of file diff --git a/knowyourfood/core/form/Button.php b/knowyourfood/core/form/Button.php old mode 100644 new mode 100755 index e7fe40a..60be67e --- a/knowyourfood/core/form/Button.php +++ b/knowyourfood/core/form/Button.php @@ -1,12 +1,12 @@ -Submit - ', - ); - } +Submit + ', + ); + } } \ No newline at end of file diff --git a/knowyourfood/core/form/Field.php b/knowyourfood/core/form/Field.php deleted file mode 100644 index 2d7379b..0000000 --- a/knowyourfood/core/form/Field.php +++ /dev/null @@ -1,43 +0,0 @@ -type = self::TYPE_TEXT; - $this->model = $model; - $this->attribute = $attribute; - } - - public function __toString(){ - return sprintf(' -
- - -
- %s -
-
- ', - $this->model->labels()[$this->attribute] ?? $this->attribute, - $this->type, - $this->attribute, - $this->model->{$this->attribute}, - $this->model->hasError($this->attribute) ? ' is invalid' : '', - $this->model->getFirstError($this->attribute) - ); - } - - public function passwordField(){ - $this->type = self::TYPE_PASSWORD; - return $this; - } -} \ No newline at end of file diff --git a/knowyourfood/core/form/Form.php b/knowyourfood/core/form/Form.php old mode 100644 new mode 100755 index bbadec2..cfc9713 --- a/knowyourfood/core/form/Form.php +++ b/knowyourfood/core/form/Form.php @@ -1,23 +1,31 @@ -', $action, $method); - return new Form(); - } - - public static function end(){ - echo ''; - } - - public function inputField(Model $model, $attribute){ - return new InputField($model, $attribute); - } - - public function button(){ - return new Button(); - } +formDestinationPage = $formDestinationPage; + } + public function beginForm(): void + { + echo "
"; + } + + public function endForm(): void + { + echo "
"; + } + + public function renderInputField(string $type, string $name, string $placeholder, string $value, ?string $error): void + { + echo new InputField($type, $name, $placeholder, $value, $error); + } + + public function renderButton(): void + { + echo new Button(); + } } \ No newline at end of file diff --git a/knowyourfood/core/form/InputField.php b/knowyourfood/core/form/InputField.php old mode 100644 new mode 100755 index d370de7..1db8935 --- a/knowyourfood/core/form/InputField.php +++ b/knowyourfood/core/form/InputField.php @@ -1,36 +1,42 @@ -type = self::TYPE_TEXT; - parent::__construct($model, $attribute); - } - - public function passwordField() - { - $this->type = self::TYPE_PASSWORD; - return $this; - } - - public function renderInput(): string - { - return sprintf( - '', - $this->type, - $this->attribute, - $this->model->{$this->attribute}, - $this->model->hasError($this->attribute) ? ' is invalid' : '' - ); - } +type = $this->getInputType($type); + $this->name = $name; + $this->placeholder = $placeholder; + $this->value = $value; + $this->error = $error; + } + public function __toString():string + { + $field = sprintf( + '', + $this->type, $this->name, $this->placeholder, $this->value + ); + + $errorField = NULL; + if(!$this->error == NULL){ + $errorField = sprintf('

%s

', $this->error); + } + + return $field.$errorField; + } + + private function getInputType(string $type): string{ + return match($type){ + "username", "email" => "text", + "password" => "password" + }; + } } \ No newline at end of file diff --git a/knowyourfood/core/form/Region.php b/knowyourfood/core/form/Region.php new file mode 100755 index 0000000..a2f35f2 --- /dev/null +++ b/knowyourfood/core/form/Region.php @@ -0,0 +1,40 @@ +type = self::TYPE_TEXT; + parent::__construct($model, $attribute); + } + + public function startSelect(): string + { + return sprintf(''; + } + + public function renderInput(): string + { + return $this->startSelect().$this->content().$this->endSelect(); + } +} \ No newline at end of file diff --git a/knowyourfood/core/form/TextareaField.php b/knowyourfood/core/form/TextareaField.php old mode 100644 new mode 100755 index 43baa3d..888e678 --- a/knowyourfood/core/form/TextareaField.php +++ b/knowyourfood/core/form/TextareaField.php @@ -1,13 +1,13 @@ -%s', - $this->attribute, - $this->model->hasError($this->attribute) ? ' is invalid' : '', - $this->model->{$this->attribute} - ); - } +%s', + $this->attribute, + $this->model->hasError($this->attribute) ? ' is invalid' : '', + $this->model->{$this->attribute} + ); + } } \ No newline at end of file diff --git a/knowyourfood/core/middlewares/AuthMiddleware.php b/knowyourfood/core/middlewares/AuthMiddleware.php deleted file mode 100644 index aa6a702..0000000 --- a/knowyourfood/core/middlewares/AuthMiddleware.php +++ /dev/null @@ -1,21 +0,0 @@ -actions = $actions; - } - - public function execute(){ - if(Application::isLoggedIn()){ - if(empty($this->actions) || in_array(Application::$app->controller->action, $this->actions)){ - throw new ForbiddenException; - } - } - } -} \ No newline at end of file diff --git a/knowyourfood/core/middlewares/BaseMiddleware.php b/knowyourfood/core/middlewares/BaseMiddleware.php deleted file mode 100644 index 4bb4ec1..0000000 --- a/knowyourfood/core/middlewares/BaseMiddleware.php +++ /dev/null @@ -1,7 +0,0 @@ -url = $url; + $this->request = $request; + $this->headers = $headers; + $this->body = $body; + $this->isReturnable = $isReturnable; + } + + /** + * @throws GenericErrorException + */ + public function makeRequest(): string + { + $curl = curl_init(); + $this->setCurlBody($curl); + + $response = curl_exec($curl); + if(!$response){ + throw new GenericErrorException(); + } + curl_close($curl); + + return $response; + } + + public function setCurlBody(\CurlHandle &$curl): void + { + curl_setopt($curl, CURLOPT_URL, $this->url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers); + + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->request); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, $this->isReturnable); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + + curl_setopt($curl,CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->body)); + } +} \ No newline at end of file diff --git a/knowyourfood/external_requests/CurlRequestBuilder.php b/knowyourfood/external_requests/CurlRequestBuilder.php new file mode 100755 index 0000000..333d462 --- /dev/null +++ b/knowyourfood/external_requests/CurlRequestBuilder.php @@ -0,0 +1,37 @@ +url = $url;} + public function setHeaders(?array $headers): void{$this->headers = $headers;} + public function setRequest(?string $request): void{$this->request = $request;} + public function setBody(?array $body): void{$this->body = $body;} + public function setIsReturnable(?bool $isReturnable): void{$this->isReturnable = $isReturnable;} + + private function areMainParametersNotSet(): bool{ + return $this->url == NULL || $this->request == NULL || $this->headers == NULL; + } + + /** + * @throws InvalidCurlStructureException + */ + public function getCurlRequestObject(): CurlRequest{ + if($this->areMainParametersNotSet()){ + throw new InvalidCurlStructureException("Invalid structure for making a request"); + } + + return new CurlRequest($this->url, $this->request, $this->headers, $this->body, $this->isReturnable); + } +} \ No newline at end of file diff --git a/knowyourfood/index.php b/knowyourfood/index.php old mode 100644 new mode 100755 index 2533f16..8858009 --- a/knowyourfood/index.php +++ b/knowyourfood/index.php @@ -1,41 +1,25 @@ -router->get('/', [SiteController::class, '/']); - -$app->router->get('/home', [SiteController::class, 'home']); - -$app->router->get('/_404', [SiteController::class, '_404']); - -$app->router->get('/contact', [SiteController::class, 'contact']); -$app->router->post('/contact', [SiteController::class, 'contact']); - -$app->router->get('/login', [AuthController::class, 'login']); -$app->router->post('/login', [AuthController::class, 'login']); - -$app->router->get('/register', [AuthController::class, 'register']); -$app->router->post('/register', [AuthController::class, 'register']); - -$app->router->get('/profile', [AuthController::class, 'profile']); -$app->router->post('/profile', [AuthController::class, 'profile']); - -$app->router->get('/logout', [AuthController::class, 'logout']); - -$app->router->get('/login/{id}', [SiteController::class, 'login']); - -$app->run(); +router->get('/', [SiteController::class, 'renderMainPage']); +$app->router->get('/homepage', [SiteController::class, 'homepage']); + +$app->router->get('/login', [AuthController::class, 'loginPage']); +$app->router->post('/login', [AuthController::class, 'loginPage']); + +$app->router->get('/register', [AuthController::class, 'registerPage']); +$app->router->post('/register', [AuthController::class, 'registerPage']); + +$app->router->get('/profile', [AuthController::class, 'profile']); +$app->router->post('/profile', [AuthController::class, 'profile']); + +$app->router->get('/logout', [AuthController::class, 'logout']); + +$app->run(); \ No newline at end of file diff --git a/knowyourfood/migrations.php b/knowyourfood/migrations.php deleted file mode 100644 index 8924ef1..0000000 --- a/knowyourfood/migrations.php +++ /dev/null @@ -1,10 +0,0 @@ -db->applyMigrations(); diff --git a/knowyourfood/migrations/m01_initial.php b/knowyourfood/migrations/m01_initial.php deleted file mode 100644 index 3e5fef3..0000000 --- a/knowyourfood/migrations/m01_initial.php +++ /dev/null @@ -1,25 +0,0 @@ -db; - $SQL = "CREATE TABLE users( - id INT AUTO_INCREMENT, - email VARCHAR(255) NOT NULL, - firstname VARCHAR(255) NOT NULL, - lastname VARCHAR(255) NOT NULL, - status TINYINT NOT NULL, - create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (id) - ) Engine=INNODB; - "; - $db->pdo->exec($SQL); - } - - public function down(){ - $db = Application::$app->db; - $SQL = "DROP TABLE users"; - $db->pdo->exec($SQL); - } -} \ No newline at end of file diff --git a/knowyourfood/migrations/m02_add_password_column.php b/knowyourfood/migrations/m02_add_password_column.php deleted file mode 100644 index 5061466..0000000 --- a/knowyourfood/migrations/m02_add_password_column.php +++ /dev/null @@ -1,17 +0,0 @@ -db; - $SQL = "ALTER TABLE users ADD COLUMN password VARCHAR(512) NOT NULL"; - $db->pdo->exec($SQL); - } - - public function down(){ - $db = Application::$app->db; - $SQL = "ALTER TABLE users DROP COLUMN password"; - $db->pdo->exec($SQL); - } -} \ No newline at end of file diff --git a/knowyourfood/models/ContactForm.php b/knowyourfood/models/ContactForm.php old mode 100644 new mode 100755 index 083c247..a10229a --- a/knowyourfood/models/ContactForm.php +++ b/knowyourfood/models/ContactForm.php @@ -1,28 +1,28 @@ - [self::RULE_REQUIRED], - 'body' => [self::RULE_REQUIRED] - ]; - } - - public function labels(): array{ - return [ - 'subject' => 'Enter your subject', - 'body' => 'Enter the body' - ]; - } - - public function send(){ - return true; - } + [self::RULE_REQUIRED], + 'body' => [self::RULE_REQUIRED] + ]; + } + + public function labels(): array{ + return [ + 'subject' => 'Enter your subject', + 'body' => 'Enter the body' + ]; + } + + public function send(){ + return true; + } } \ No newline at end of file diff --git a/knowyourfood/models/LoginForm.php b/knowyourfood/models/LoginForm.php deleted file mode 100644 index b9e1894..0000000 --- a/knowyourfood/models/LoginForm.php +++ /dev/null @@ -1,40 +0,0 @@ - [self::RULE_REQUIRED, self::RULE_EMAIL], - 'password' => [self::RULE_REQUIRED] - ]; - } - - public function labels():array { - return [ - 'email' => 'Email', - 'password' => 'Password' - ]; - } - - public function login(){ - $user = new User(); - $user = $user->findOne(['email' => $this->email]); - if(!$user){ - $this->addError('email', 'User does not exist with this email'); - return false; - } - - if(!password_verify($this->password, $user->password)){ - $this->addError('password', 'Incorrect password'); - return false; - } - - return Application::$app->login($user); - } -} \ No newline at end of file diff --git a/knowyourfood/models/LoginModel.php b/knowyourfood/models/LoginModel.php new file mode 100755 index 0000000..41a886e --- /dev/null +++ b/knowyourfood/models/LoginModel.php @@ -0,0 +1,58 @@ + [self::RULE_REQUIRED, self::RULE_EMAIL], + 'password' => [self::RULE_REQUIRED] + ]; + } + + public function labels():array + { + return [ + 'email' => 'Email', + 'password' => 'Password' + ]; + } + + + public function createBody(): array + { + $body = array(); + $body["values"] = [ + "email" => $this->email, + "password" => $this->password + ]; + + return $body; + } + + public function createHeaders(string $body): array + { + $headers = array(); + $headers["Content-type"] = "application/json"; + $headers["Content-Length"] = strlen($body); + $headers["Authorization"] = hash('md5', 'api.knowyourfood'); + $headers["Auth-Request"] = "login"; + + return $this->formatHeaderArray($headers); + } + + protected function formatHeaderArray(array $headers): array{ + $array = array(); + + foreach ($headers as $key => $value){ + $array[] = $key . ": " . $value; + } + + return $array; + } +} \ No newline at end of file diff --git a/knowyourfood/models/RegisterModel.php b/knowyourfood/models/RegisterModel.php new file mode 100644 index 0000000..c2cd4ae --- /dev/null +++ b/knowyourfood/models/RegisterModel.php @@ -0,0 +1,59 @@ + [self::RULE_REQUIRED], + 'email' => [self::RULE_REQUIRED, self::RULE_EMAIL], + 'password' => [self::RULE_REQUIRED] + ]; + } + + public function labels():array { + return [ + 'username' => 'Username', + 'email' => 'Email', + 'password' => 'Password', + ]; + } + + public function createBody(): array + { + $body = array(); + $body["values"] = [ + "username" => $this->username, + "email" => $this->email, + "password" => $this->password + ]; + + return $body; + } + + public function createHeaders(string $body): array + { + $headers = array(); + $headers["Content-type"] = "application/json"; + $headers["Content-Length"] = strlen($body); + $headers["Authorization"] = hash('md5', 'api.knowyourfood'); + $headers["Auth-Request"] = "register"; + + return $this->formatHeaderArray($headers); + } + + protected function formatHeaderArray(array $headers): array{ + $array = array(); + + foreach ($headers as $key => $value){ + $array[] = $key . ": " . $value; + } + + return $array; + } +} \ No newline at end of file diff --git a/knowyourfood/models/User.php b/knowyourfood/models/User.php deleted file mode 100644 index 281b244..0000000 --- a/knowyourfood/models/User.php +++ /dev/null @@ -1,53 +0,0 @@ -status = self::STATUS_INACTIVE; - $this->password = password_hash($this->password, PASSWORD_DEFAULT); - return parent::save(); - } - - public function tableName(): string{ - return 'users'; - } - - public function rules(): array{ - return [ - 'firstname' => [self::RULE_REQUIRED], - 'lastname' => [self::RULE_REQUIRED], - 'email' => [self::RULE_REQUIRED, self::RULE_EMAIL, [self::RULE_UNIQUE, 'class' => self::class]], - 'password' => [self::RULE_REQUIRED, [self::RULE_MIN, 'min' => 8], [self::RULE_MAX, 'max' => 15]] - ]; - } - - public function primaryKey(): string{ - return 'id'; - } - - public function labels():array { - return [ - 'firstname' => 'First name', - 'lastname' => 'Last name', - 'email' => 'Email', - 'password' => 'Password' - ]; - } - - public function attributes(): array{ - return ['firstname', 'lastname', 'email', 'password', 'status']; - } -} \ No newline at end of file diff --git a/knowyourfood/runtime/.gitignore b/knowyourfood/runtime/.gitignore old mode 100644 new mode 100755 diff --git a/knowyourfood/views/Login.php b/knowyourfood/views/Login.php new file mode 100644 index 0000000..2b4d5b0 --- /dev/null +++ b/knowyourfood/views/Login.php @@ -0,0 +1,28 @@ +view->getModel(); +$loginError = Application::$app->view->getActionError(); + +if(!$loginError == ''){ + echo "

$loginError

"; +} + +echo '
'; +$form->beginForm(); + +foreach($model->labels() as $key=>$value){ + $form->renderInputField( + $key, $key, $value, $model->getValueForField($key), $model->getError($key) + ); +} + +echo '
'; + +$form->renderButton(); + +$form->endForm(); + diff --git a/knowyourfood/views/Register.php b/knowyourfood/views/Register.php new file mode 100644 index 0000000..0ada2e1 --- /dev/null +++ b/knowyourfood/views/Register.php @@ -0,0 +1,28 @@ +view->getModel(); +$loginError = Application::$app->view->getActionError(); + +if(!$loginError == ''){ + echo "

$loginError

"; +} + +echo '
'; +$form->beginForm(); + +foreach($model->labels() as $key=>$value){ + $form->renderInputField( + $key, $key, $value, $model->getValueForField($key), $model->getError($key) + ); +} + +echo '
'; + +$form->renderButton(); + +$form->endForm(); + diff --git a/knowyourfood/views/_error.php b/knowyourfood/views/_error.php deleted file mode 100644 index 53bbef0..0000000 --- a/knowyourfood/views/_error.php +++ /dev/null @@ -1 +0,0 @@ -

getCode() ?> - getMessage();?>

\ No newline at end of file diff --git a/knowyourfood/views/contact.php b/knowyourfood/views/contact.php deleted file mode 100644 index 63fcce0..0000000 --- a/knowyourfood/views/contact.php +++ /dev/null @@ -1,12 +0,0 @@ -title = 'Contact'; - -$form = Form::begin('', 'post'); -echo $form->inputField($model, 'subject'); -echo new TextareaField($model, 'body'); -echo $form->button(); - -Form::end(); -?> \ No newline at end of file diff --git a/knowyourfood/views/home.php b/knowyourfood/views/home.php deleted file mode 100644 index 8717747..0000000 --- a/knowyourfood/views/home.php +++ /dev/null @@ -1,6 +0,0 @@ -title = 'Home'; -?> - -

Home

-

Welcome to our site!

\ No newline at end of file diff --git a/knowyourfood/views/layouts/CSS/styleAuth.css b/knowyourfood/views/layouts/CSS/styleAuth.css new file mode 100755 index 0000000..48f052d --- /dev/null +++ b/knowyourfood/views/layouts/CSS/styleAuth.css @@ -0,0 +1,148 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Josefin Sans', sans-serif; + } + + html, + body{ + height: 100%; + } + + body{ + background-image: url("../Images/background/background.jpg"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + } + + body{ + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + } + + h1{ + color: white; + text-shadow: + -1px -1px 0 #000, + 0 -1px 0 #000, + 1px -1px 0 #000, + 1px 0 0 #000, + 1px 1px 0 #000, + 0 1px 0 #000, + -1px 1px 0 #000, + -1px 0 0 #000; + } + + .hr1{ + width: 70%; + } + + .Title{ + margin: 3vh; + margin-top: 0; + font-size: 3rem; + } + + input, button{ + margin: 1rem; + margin-left: 0; + margin-right: 0; + background-color: #60FF8C; + border: 0.1em solid black; + border-radius: 20px; + padding: 1vh; + padding-left: 5vh; + padding-right: 5vh; + min-width: 100%; + cursor: default; + } + + button{ + background-color: #FF5555 + } + + button:hover{ + background-color: #FF2B2B; + cursor: pointer; + } + + .Inputs{ + display: flex; + flex-direction: column; + } + + .Inputs > *, button{ + padding: 1rem; + } + + input[type="radio"]{ + margin:0; + } + + input:focus{ + outline: none; + } + + .LoginButtons{ + width: 70%; + } + + .LoginForm{ + display: flex; + flex-direction: column; + justify-content: center; + width: 100%; + } + + .errorStyle{ + text-align: center; + color: white; + } + + .LoginButtons hr{ + width:100%; + } + + .BigContainer{ + background-color: rgba(0, 0, 0, 0.5); + border-radius: 20px; + position: fixed; + display: flex; + flex-direction: column; + align-items: center; + padding: 2rem; + transform: scale(1); + flex: 100%; + width:50%; + } + + @media screen and (max-width: 800px){ + *{ + overflow: hidden; + } + .BigContainer{ + margin-top: 5vh; + margin-bottom: 5vh; + min-width: 70%; + transform: scale(1); + } + .Inputs > *{ + width: 100%; + } + h1{ + font-size: 1rem; + text-align: center; + } + .LoginButtons{ + width:100%; + } + .hr1{ + width:100%; + } + } + \ No newline at end of file diff --git a/knowyourfood/views/layouts/CSS/styleMain.css b/knowyourfood/views/layouts/CSS/styleMain.css new file mode 100755 index 0000000..d6c0690 --- /dev/null +++ b/knowyourfood/views/layouts/CSS/styleMain.css @@ -0,0 +1,100 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Josefin Sans', sans-serif; +} + +html, +body { + height: 100%; +} + +body { + background-image: url("../Images/background/background.jpg"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; +} + +body { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +h1, h3 { + color: white; + text-shadow: -1px -1px 0 #000, 0 -1px 0 #000, 1px -1px 0 #000, 1px 0 0 #000, 1px 1px 0 #000, 0 1px 0 #000, -1px 1px 0 #000, -1px 0 0 #000; +} + +.Title { + margin: 5vh; + font-size: 3rem; +} + +button { + margin: 1rem; + background-color: #60FF8C; + border: 0.1em solid black; + border-radius: 20px; + padding: 1vh; + padding-left: 5vh; + padding-right: 5vh; + max-width: 100%; + cursor: default; + width: 100%; +} + + button:hover { + margin: 1rem; + background-color: #FF5555; + border: 0.1em solid black; + border-radius: 20px; + padding: 1vh; + padding-left: 5vh; + padding-right: 5vh; + max-width: 100%; + cursor: pointer; + width: 100%; + } + +.RegisterButton { + margin-bottom: 0; +} + + .RegisterButton:hover { + margin-bottom: 0; + cursor: pointer; + } + +.LoginButtons { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 0; + margin-top: 0; +} + +.BigContainer { + position: fixed; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + transform: scale(1.5); + flex: 100%; +} + +@media screen and (max-width: 888px) { + .BigContainer { + width: 30%; + } + + h1, h3 { + font-size: 1rem; + text-align: center; + } +} diff --git a/knowyourfood/views/layouts/HTML/Auth.php b/knowyourfood/views/layouts/HTML/Auth.php new file mode 100644 index 0000000..6d409e8 --- /dev/null +++ b/knowyourfood/views/layouts/HTML/Auth.php @@ -0,0 +1,28 @@ + + + + + + + + + /> + + + + <?php echo Application::$app->view->getTitle()?> + + + +
+

view->getTitle()?>

+
+ {{content}} +
+
+ + + \ No newline at end of file diff --git a/knowyourfood/views/layouts/HTML/Main.php b/knowyourfood/views/layouts/HTML/Main.php new file mode 100644 index 0000000..5b20e36 --- /dev/null +++ b/knowyourfood/views/layouts/HTML/Main.php @@ -0,0 +1,28 @@ + + + + + + + + + > + + + + Know Your Food. + + + +
+

Know Your Food.

+
+

If you have an account already

+ +

or

+ +
+
+ + + \ No newline at end of file diff --git a/knowyourfood/views/layouts/Images/admin_files/admin_background.jpg b/knowyourfood/views/layouts/Images/admin_files/admin_background.jpg new file mode 100755 index 0000000000000000000000000000000000000000..33622d1039d82ae480a0fe2a35c0c66c76b556cd GIT binary patch literal 72622 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 D0c$P# literal 0 HcmV?d00001 diff --git a/knowyourfood/views/layouts/Images/admin_files/admin_background.psd b/knowyourfood/views/layouts/Images/admin_files/admin_background.psd new file mode 100755 index 0000000000000000000000000000000000000000..e1cc14757cd25ae172cafaf379b97bca70927602 GIT binary patch literal 690920 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

-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