diff --git a/Dockerfile b/Dockerfile index e29d064d6b5e3eaafad16cd0da74d5ab9db3f8e4..1d2b0aa6ff4ad1548abfb3c16a5a76a2509afb21 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,11 @@ -FROM php:8.0-apache +FROM php:8.1-apache + +RUN apt-get update && apt-get upgrade -y +RUN apt-get install -y libxml2-dev libpq-dev +RUN docker-php-ext-install pgsql pdo pdo_pgsql && docker-php-ext-enable pgsql pdo pdo_pgsql +RUN a2enmod rewrite && service apache2 restart +RUN chown -R :www-data /var/www/html/ -RUN docker-php-ext-install pdo pdo_mysql \ No newline at end of file +WORKDIR /var + +EXPOSE 80 \ No newline at end of file diff --git a/database/6-seed.sql b/database/6-seed.sql index 75d29b1f268885ce1d4d9e2761e17b244d865042..36241df86b2e292f4b88fdba181e83692d30af87 100644 --- a/database/6-seed.sql +++ b/database/6-seed.sql @@ -29,8 +29,8 @@ END $$; -- Insert user data INSERT INTO users (user_name, username, user_email, user_hashedPass, isAdmin) VALUES - ('John Doe', 'john_doe', 'john@example.com', crypt('password_1', gen_salt('bf', 8)), 1), - ('Jane Smith', 'jane_smith', 'jane@example.com', crypt('password_2', gen_salt('bf', 8)), 0), - ('Admin User', 'admin_user', 'admin@example.com', crypt('password_3', gen_salt('bf', 8)), 1), - ('Alice Johnson', 'alice', 'alice@example.com', crypt('password_4', gen_salt('bf', 8)), 0), - ('Bob Williams', 'bob', 'bob@example.com', crypt('password_5', gen_salt('bf', 8)), 0); + ('John Doe', 'john_doe', 'john@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'true'), + ('Jane Smith', 'jane_smith', 'jane@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false'), + ('Admin User', 'admin_user', 'admin@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'true'), + ('Alice Johnson', 'alice', 'alice@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false'), + ('Bob Williams', 'bob', 'bob@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false'); diff --git a/src/.htaccess b/src/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..122631ddccca95f9c7deb4126fa8f005bb799d5f --- /dev/null +++ b/src/.htaccess @@ -0,0 +1,13 @@ +DirectoryIndex index.php + +RewriteEngine On + +RewriteBase / + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +RewriteRule ^(.*)$ index.php [QSA] + +php_value post_max_size 16M +php_value upload_max_filesize 16M \ No newline at end of file diff --git a/styles/auth.css b/src/Client/auth.css similarity index 100% rename from styles/auth.css rename to src/Client/auth.css diff --git a/src/Client/components/navbar.php b/src/Client/components/navbar.php index ec8dd2abb5c9159fc789683ffbc72588471a9771..d8b9f315cf42e553115cdee21afd786606fc9056 100644 --- a/src/Client/components/navbar.php +++ b/src/Client/components/navbar.php @@ -7,7 +7,7 @@ <li><a href="/app/Views/history/history.php">History</a></li> <!-- Logout Button --> <li> - <form method="post" action="/app/router.php"> + <form method="post" action="/logout"> <button type="submit" name="userAction" value="logout">Logout</button> </form> </li> diff --git a/styles/container.css b/src/Client/container.css similarity index 100% rename from styles/container.css rename to src/Client/container.css diff --git a/styles/dropdown.css b/src/Client/dropdown.css similarity index 100% rename from styles/dropdown.css rename to src/Client/dropdown.css diff --git a/styles/footer.css b/src/Client/footer.css similarity index 100% rename from styles/footer.css rename to src/Client/footer.css diff --git a/styles/form.css b/src/Client/form.css similarity index 100% rename from styles/form.css rename to src/Client/form.css diff --git a/styles/global.css b/src/Client/global.css similarity index 100% rename from styles/global.css rename to src/Client/global.css diff --git a/styles/navbar.css b/src/Client/navbar.css similarity index 100% rename from styles/navbar.css rename to src/Client/navbar.css diff --git a/src/Client/pages/event/create.php b/src/Client/pages/event/create.php index b486caa397b265e68072d2f4b78ee48646346236..75b6a10b2118c919657b3faf07bebba8ccdc766d 100644 --- a/src/Client/pages/event/create.php +++ b/src/Client/pages/event/create.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; diff --git a/src/Client/pages/event/update.php b/src/Client/pages/event/update.php index 3d638008c04ae889ba49048259af52b843fa0c29..84f1251705869979df5035fc2a46c0a1d5aaa7d7 100644 --- a/src/Client/pages/event/update.php +++ b/src/Client/pages/event/update.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; diff --git a/src/Client/pages/history/history.php b/src/Client/pages/history/history.php index b2e02634119d3edb062c656a5cdf4a3e41ac6c9d..10b8f5740cda2ae192de1506f1c1c55f56cca2cf 100644 --- a/src/Client/pages/history/history.php +++ b/src/Client/pages/history/history.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; diff --git a/src/Client/pages/home/home.php b/src/Client/pages/home/home.php index 701666b3ed1ed21f2fa786cc27dd08f05d741bf5..1cd9d381a804b98e292ce9be199e106815df1614 100644 --- a/src/Client/pages/home/home.php +++ b/src/Client/pages/home/home.php @@ -1,22 +1,25 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; // User is not authenticated; redirect to login page - header("Location: /app/Views/login/login.php"); + header("Location: login"); ob_end_flush(); } - require_once '../../Controllers/PembelianController.php'; - require_once '../../Controllers/TicketController.php'; - require_once '../../Controllers/UserController.php'; - require_once '../../Controllers/EventController.php'; + require_once (__DIR__.'/../../../Server/Controllers/PembelianController.php'); + require_once (__DIR__.'/../../../Server/Controllers/TicketController.php'); + require_once (__DIR__.'/../../../Server/Controllers/UserController.php'); + require_once (__DIR__.'/../../../Server/Controllers/EventController.php'); $eventController = new EventController(); $pembelianController = new PembelianController(); $ticketController = new TicketController(); - $userController = new UserController(); + $userController = new \Server\Controllers\UserController(); // Handle search query $searchQuery = isset($_GET['search']) ? $_GET['search'] : ''; @@ -36,7 +39,7 @@ $currentPage = $paginationData['page']; $maxPage = $paginationData['maxpage']; - $isAdmin = $userController->getUser($_SESSION['user_id'])['isAdmin']; + $isAdmin = $userController->getUser($_SESSION['user_id'])['isadmin']; ?> <!DOCTYPE html> @@ -46,20 +49,20 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HOME • TICKET KU</title> - <link rel="stylesheet" type="text/css" href="/../../styles/global.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/form.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/footer.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/navbar.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/container.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/auth.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/dropdown.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/pagination.css"> - <link rel="stylesheet" type="text/css" href="/../../styles/media.css"> + <link rel="stylesheet" type="text/css" href="/../../global.css"> + <link rel="stylesheet" type="text/css" href="/../../form.css"> + <link rel="stylesheet" type="text/css" href="/../../footer.css"> + <link rel="stylesheet" type="text/css" href="/../../navbar.css"> + <link rel="stylesheet" type="text/css" href="/../../container.css"> + <link rel="stylesheet" type="text/css" href="/../../auth.css"> + <link rel="stylesheet" type="text/css" href="/../../dropdown.css"> + <link rel="stylesheet" type="text/css" href="/../../pagination.css"> + <link rel="stylesheet" type="text/css" href="/../../media.css"> </head> <body> <!-- Navbar --> - <?php include '../template/navbar.php';?> + <?php include (__DIR__.'/../../components/navbar.php');?> <div class="main-content"> <div class="column"> @@ -67,19 +70,20 @@ <button onclick="openCreateEventPage()" id="createEventBtn" class="admin">Create Event</button> <?php endif; ?> <div class="row"> - <input type="text" id="searchInput" placeholder="Search.." value="<?= htmlspecialchars($searchQuery)?>" style="width:250%;"> + <input type="text" id="searchInput" placeholder="Search.." value="<?= isset($searchQuery) ? htmlspecialchars($searchQuery) : '' ?>" style="width:250%;"> <select name="sort" id="sortSelect" class="styled-select"> <option value="" <?= empty($sortKey) ? 'selected' : '' ?>>No Sorting</option> <option value="name" <?= $sortKey === 'name' ? 'selected' : '' ?>>Sort by Name</option> <option value="location" <?= $sortKey === 'location' ? 'selected' : '' ?>>Sort by Location</option> </select> <!-- Change input type to "text" for minimum stock --> - <input type="text" id="minStockInput" name="min_stock" placeholder="Min Stock" value="<?= htmlspecialchars($minStock) ?>"> + <input type="text" id="minStockInput" name="min_stock" placeholder="Min Stock" value="<?= isset($minStock) ? htmlspecialchars($minStock) : 0 ?>" +"> <button type="submit" id="search-button">Search</button> </div> <?php foreach ($events as $event) : - include '../template/event.php'; + include (__DIR__.'/../../components/event.php'); endforeach;?> <div class="pagination"> @@ -112,7 +116,7 @@ </div> </div> - <?php include '../template/footer.php';?> + <?php include (__DIR__.'/../../components/footer.php');?> <script defer> function toggleMenu() { @@ -142,7 +146,7 @@ const sortKey = document.getElementById('sortSelect').value; // Construct the URL with search, min_stock, and sort parameters - const url = `/app/Views/home/home.php?search=${encodeURIComponent(searchQuery)}&min_stock=${encodeURIComponent(minStock)}&sort=${encodeURIComponent(sortKey)}`; + const url = `/home?search=${encodeURIComponent(searchQuery)}&min_stock=${encodeURIComponent(minStock)}&sort=${encodeURIComponent(sortKey)}`; // Redirect to the updated URL window.location.href = url; diff --git a/src/Client/pages/login/login.php b/src/Client/pages/login/login.php index 2ca035a560f262411451a7f910311c690fa21fdb..017eba77ce35f882a7c4bf9b1cbf47ab1f9522d4 100644 --- a/src/Client/pages/login/login.php +++ b/src/Client/pages/login/login.php @@ -1,37 +1,40 @@ <?php +if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one session_start(); +} ?> <!DOCTYPE html> <html lang="en"> - <head> - <title>Login • TICKET KU</title> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link rel="stylesheet" type="text/css" href="../../../styles/auth.css"> - </head> +<head> + <title>Login • TICKET KU</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="stylesheet" type="text/css" href="../../auth.css"> +</head> - <body> - <div class="login-container"> - <h1>Login</h1> - <form id="loginForm" method="post" action="../../router.php"> - <!-- Aslinya email atau username bisa(?) --> - <label for="email">Email or Username</label> - <input type="text" id="identifier" name="loginIdentifier" required> - - <label for="password">Password</label> - <input type="password" id="password" name="loginPassword" required> +<body> + <div class="login-container"> + <h1>Login</h1> + <form id="loginForm" method="post" action="login"> + <!-- Aslinya email atau username bisa(?) --> + <label for="email">Email or Username</label> + <input type="text" id="identifier" name="loginIdentifier" required> + + <label for="password">Password</label> + <input type="password" id="password" name="loginPassword" required> - <?php - // Check if there is an error message in the session - if (isset($_SESSION['message'])) { - echo '<p>' . $_SESSION['message'] . '</p>'; - unset($_SESSION['message']); // Remove the error message from the session - } - ?> - <button type="submit" name="userAction" value="login">Login</button> - </form> - <p>Don't have an account? <a href="register.php">Register</a></p> - </div> - </body> -</html> \ No newline at end of file + <?php + // Check if there is an error message in the session + if (isset($_SESSION['message'])) { + echo '<p>' . $_SESSION['message'] . '</p>'; + unset($_SESSION['message']); // Remove the error message from the session + } + ?> + <button type="submit" name="userAction" value="login">Login</button> + </form> + <p>Don't have an account? <a href="register">Register</a></p> + </div> +</body> +</html> diff --git a/src/Client/pages/login/register.php b/src/Client/pages/login/register.php index bdd3a0966d3145b309d50affbab88467c515ea29..660b237cd1d8bd7427fe0e40d4941d6492bc5095 100644 --- a/src/Client/pages/login/register.php +++ b/src/Client/pages/login/register.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ?> <!DOCTYPE html> <html lang="en"> @@ -8,13 +11,13 @@ <title>Register • TICKET KU</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link rel="stylesheet" type="text/css" href="../../../styles/auth.css"> + <link rel="stylesheet" type="text/css" href="../../auth.css"> </head> <body> <div class="register-container"> <h1>Register</h1> - <form id="registerForm" method="post" action="../../router.php"> + <form id="registerForm" method="post" action="register"> <label for="userName">Name</label> <input type="text" id="userName" name="userName" required> @@ -41,7 +44,7 @@ <button type="submit" name="userAction" value="createUser">Register</button> </form> - <p>Already have an account? <a href="login.php">Login</a></p> + <p>Already have an account? <a href="login">Login</a></p> </div> </body> </html> \ No newline at end of file diff --git a/src/Client/pages/pembelian/pembelian.php b/src/Client/pages/pembelian/pembelian.php index 00d8ce4560b65c3e8d7c566cda67c1ad52ecbfbc..e8b2cfad7daad63cfd7b0bac446709cd840bc7c6 100644 --- a/src/Client/pages/pembelian/pembelian.php +++ b/src/Client/pages/pembelian/pembelian.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; diff --git a/src/Client/pages/profile/view_profile.php b/src/Client/pages/profile/view_profile.php index 2eab3bcced344f665141e7c4879a072fa6607f73..7c3c492596ce2e88bac20d1e174093508d4ecf5c 100644 --- a/src/Client/pages/profile/view_profile.php +++ b/src/Client/pages/profile/view_profile.php @@ -1,5 +1,8 @@ <?php - session_start(); + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } ob_start(); if (!isset($_SESSION["user_id"])) { echo "here"; diff --git a/styles/pagination.css b/src/Client/pagination.css similarity index 100% rename from styles/pagination.css rename to src/Client/pagination.css diff --git a/src/Server/Controllers/EventController.php b/src/Server/Controllers/EventController.php index 21dd49f3bc080f8c3967dc42a85bd96d772f0ebd..0e5c9be2ce8f9e58f260092527fa55aa20a80549 100644 --- a/src/Server/Controllers/EventController.php +++ b/src/Server/Controllers/EventController.php @@ -1,8 +1,7 @@ <?php -// app/Controllers/EventController.php ob_start(); -require_once(__DIR__ . '/../../Models/Event.php'); +include(__DIR__ . '../../Models/Event.php'); require_once(__DIR__ . '/TicketController.php'); @@ -10,7 +9,7 @@ class EventController { private $eventModel; public function __construct() { - $this->eventModel = new EventModel(); + $this->eventModel = new \Server\Models\EventModel(); } public function createEvent($event_name, $stock, $event_price, $event_date, $event_location, $gambar, $vid){ diff --git a/src/Server/Controllers/HomeController.php b/src/Server/Controllers/HomeController.php new file mode 100644 index 0000000000000000000000000000000000000000..edb1b11791f9ff6066ce07cc2a7fc8906eccbc2d --- /dev/null +++ b/src/Server/Controllers/HomeController.php @@ -0,0 +1,11 @@ +<?php + +namespace Server\Controllers; + +class HomeController { + public function __construct(){} + public function home() + { + include (__DIR__.'/../../Client/pages/home/home.php'); + } +} \ No newline at end of file diff --git a/src/Server/Controllers/PembelianController.php b/src/Server/Controllers/PembelianController.php index 9f5526def638e8436eec7807ffeff1778b9b542e..5f5701d1ca0c89316e0a11613fe54f96c3b84971 100644 --- a/src/Server/Controllers/PembelianController.php +++ b/src/Server/Controllers/PembelianController.php @@ -10,11 +10,10 @@ class PembelianController { public function __construct() { - $this->pembelianModel = new PembelianModel(); + $this->pembelianModel = new \Server\Models\PembelianModel(); } public function createPembelian($ticketId, $userId, $createdTime) { - $pembelianModel = new PembelianModel(); return $this->pembelianModel->createPembelian($ticketId, $userId, $createdTime); } diff --git a/src/Server/Controllers/TicketController.php b/src/Server/Controllers/TicketController.php index 962586f10ebe910073345edf0e57faa66d2b421c..8d2944d1caebee23162052f5944727596ac0f275 100644 --- a/src/Server/Controllers/TicketController.php +++ b/src/Server/Controllers/TicketController.php @@ -8,7 +8,7 @@ class TicketController { private $ticketModel; public function __construct() { - $this->ticketModel = new TicketModel(); + $this->ticketModel = new \Server\Models\TicketModel(); } public function createTicket($name, $eventId) { diff --git a/src/Server/Controllers/UserController.php b/src/Server/Controllers/UserController.php index 3ae2e6c4c5ede827e7bf481525c9e222bda0eafd..6bf0731f73c13ca45eca90d6520f1afe6bcb44b4 100644 --- a/src/Server/Controllers/UserController.php +++ b/src/Server/Controllers/UserController.php @@ -1,14 +1,15 @@ <?php -// app/controllers/userController.php -ob_start(); -require_once(__DIR__ . '/../Models/User.php'); + +namespace Server\Controllers; + +include (__DIR__.'/../Models/User.php'); class UserController { private $userModel; public function __construct() { - $this->userModel = new UserModel(); + $this->userModel = new \Server\Models\UserModel(); } public function createUser($name, $username, $email, $hashedPass, $isAdmin) { @@ -32,8 +33,15 @@ class UserController { } public function registerUser($name, $username, $email, $password, $isAdmin) { - return $this->createUser($name, $username, $email, password_hash($password,PASSWORD_DEFAULT), $isAdmin); + $hashedPassword = password_hash($password, PASSWORD_DEFAULT); + + if ($hashedPassword === false) { + return ['success' => false, 'message' => 'Password hashing failed']; + } + + return $this->createUser($name, $username, $email, $hashedPassword, $isAdmin); } + public function loginByEmail($email,$password) { $user = $this->userModel->getUserByEmail($email); @@ -45,18 +53,6 @@ class UserController { return "wrong credentials"; } } - - public function loginByUsername($username,$password) { - $user = $this->userModel->getUserByUsername($username); - if ($user !== false && password_verify($password, $user['user_hashedPass'])) { - session_start(); - $_SESSION["user_id"] = $user['user_ID']; - return "success"; - } else { - session_start(); - return "wrong credentials"; - } - } public function logout() { session_start(); @@ -72,6 +68,90 @@ class UserController { public function editProfile($user_id, $name, $username, $email) { return $this->userModel->editProfile($user_id, $name, $username, $email); } + + public function loginview() { + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } + // Check if the user is already logged in, redirect to home if true + if (isset($_SESSION['user_id'])) { + header("Location: /home"); + ob_end_flush(); + exit(); + } + + include (__DIR__.'/../../Client/pages/login/login.php'); + } + + public function login() { + // Check if the required parameters are set in the POST request + if (isset($_POST['loginIdentifier']) && isset($_POST['loginPassword'])) { + $emailOrUsername = $_POST['loginIdentifier']; + $password = $_POST['loginPassword']; + + if (filter_var($emailOrUsername, FILTER_VALIDATE_EMAIL)) { + $user = $this->userModel->getUserByEmail($emailOrUsername); + } else { + $user = $this->userModel->getUserByUsername($emailOrUsername); + } + + if ($user !== false) { + if (password_verify($password, $user['user_hashedpass'])) { + session_start(); + $_SESSION["user_id"] = $user['user_id']; + header("Location: /home"); + ob_end_flush(); + exit(); + } else { + session_start(); + $_SESSION['message'] = "Wrong Password"; + header("Location: /login"); + ob_end_flush(); + exit(); + } + } else { + session_start(); + $_SESSION['message'] = "Wrong credentials"; + header("Location: /login"); + ob_end_flush(); + exit(); + } + } else { + // Handle missing parameters + session_start(); + $_SESSION['message'] = "Missing login parameters"; + header("Location: /login"); + ob_end_flush(); + exit(); + } + } + + public function registerview() { + include (__DIR__."/../../Client/pages/login/register.php"); + } + + public function register() { + $userName = $_POST['userName']; + $userUsername = $_POST['userUsername']; + $userEmail = $_POST['userEmail']; + $userPassword = $_POST['userPassword']; + $isAdmin = isset($_POST['isAdmin']) ? 1 : 0; + $response = $this->registerUser($userName,$userUsername,$userEmail,$userPassword,$isAdmin); + + $success = $response['success']; + if($success){ + session_start(); + $_SESSION['message'] = "You have successfully registered. Please log in"; + header("Location:login"); + ob_end_flush(); + } else { + session_start(); + $_SESSION['error_message'] = $response['message']; + header("Location:register"); + ob_end_flush(); + } + } public function handleRequest() { if (isset($_POST['userAction'])) { diff --git a/src/Server/Models/Event.php b/src/Server/Models/Event.php index a9c3285e659d0735b7aafcf35d06c8893318edd4..85a902113d132e4f336c19aa5caa940d90963c53 100644 --- a/src/Server/Models/Event.php +++ b/src/Server/Models/Event.php @@ -146,38 +146,31 @@ class EventModel extends Model { public function searchEvents($searchQuery, $sortKey, $minStock) { try { - $sql = "SELECT * FROM events WHERE 1"; - - if (!empty($searchQuery)) { - $sql .= " AND (LOWER(event_name) LIKE CONCAT('%', :query, '%') OR LOWER(event_location) LIKE CONCAT('%', :query, '%'))"; - } - - if ($minStock !== null) { - $sql .= " AND event_stock >= :minStock"; + if ($minStock == null) { + $minStock = 0; } - - if ($sortKey === 'name') { - $sql .= " ORDER BY event_name ASC"; - } elseif ($sortKey === 'location') { - $sql .= " ORDER BY event_location ASC"; + + $stmt = "SELECT * FROM events + WHERE (LOWER(event_name) LIKE LOWER(?) OR LOWER(event_location) LIKE LOWER(?)) + AND event_stock >= ?"; + + if (!empty($sortKey)) { + $stmt .= " ORDER BY "; + + if ($sortKey === 'name') { + $stmt .= "event_name ASC"; + } elseif ($sortKey === 'location') { + $stmt .= "event_location ASC"; + } } - - $stmt = $this->database->prepare($sql); - - if (!empty($searchQuery)) { - $lowerSearchQuery = strtolower("%" . $searchQuery . "%"); - $stmt->bindParam(':query', $lowerSearchQuery, PDO::PARAM_STR); - } - - if ($minStock !== null) { - $stmt->bindParam(':minStock', $minStock, PDO::PARAM_INT); - } - - $stmt->execute(); - - return $stmt->fetchAll(PDO::FETCH_ASSOC); + + $query = $this->database->prepare($stmt); + $query->execute(array('%'.$searchQuery.'%', '%'.$searchQuery.'%', $minStock)); + + return $query->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { throw new Exception("Error searching events: " . $e->getMessage()); } } + } diff --git a/src/Server/Models/User.php b/src/Server/Models/User.php index 43d1dc9d132c4d9fb2d9c41e58246d66eb30a63b..818b24b9f3bd2248e51ebeac3aeb12b429a078d6 100644 --- a/src/Server/Models/User.php +++ b/src/Server/Models/User.php @@ -4,6 +4,9 @@ namespace Server\Models; use PDO; +include (__DIR__."/Model.php"); + + class UserModel extends Model { public function createUser($name, $username, $email, $hashedPass, $isAdmin) { $response = [ diff --git a/src/Server/Router/Router.php b/src/Server/Router/Router.php index c6d4249373602c3d6de945a5a89ea4071d82de03..7849f64bc71a714ec681b609040178f0203db7c3 100644 --- a/src/Server/Router/Router.php +++ b/src/Server/Router/Router.php @@ -39,16 +39,23 @@ class Router { } } - if(is_string($callback)) { + if (is_string($callback)) { $parts = explode('@', $callback); - if(is_array($parts)) { - $className = array_shift($parts); + if (is_array($parts)) { + $className = array_shift($parts); + $method = array_shift($parts); + + // Check if the class exists before creating an instance + if (class_exists($className)) { $handler = new $className; - - $method = array_shift($parts); - $callback = [$handler, $method]; + + // Check if the method exists before setting the callback + if (method_exists($handler, $method)) { + $callback = [$handler, $method]; + } } - } + } + } if(!$callback) { include 'Client/pages/Errors/NotFound.php'; diff --git a/src/Server/web.php b/src/Server/web.php index 773e259ec4f4f6120347bfcf9c1b5223e3e84b66..d3dbe64a0333eb86605abd2ca487bc32fc95b9e7 100644 --- a/src/Server/web.php +++ b/src/Server/web.php @@ -2,43 +2,54 @@ declare(strict_types=1); -namespace Server; - -include "Router/Router.php"; -include "Controllers/UserController.php"; -include "Controllers/EventsController.php"; +include (__DIR__."/Router/Router.php"); +include (__DIR__."/Controllers/UserController.php"); +include (__DIR__."/Controllers/EventController.php"); +include (__DIR__."/Controllers/HomeController.php"); $router = new \Server\Router\Router(); -function checkLoggedIn() { - session_start(); - if (!isset($_SESSION['user_id'])) { - header('Location: /login'); // Redirect to the login page if not logged in - exit(); +function checkLoggedIn(): bool { + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); } + return isset($_SESSION['user_id']); } $router->get('/', function() { header('Location: /home'); - + exit(); }); +// Routes for HomeController +$router->get('/home', [new \Server\Controllers\HomeController(),'home']); + // Routes for UserController -$router->get('/register', [checkLoggedIn, \Server\Controllers\UserController::class, 'registerview']); -$router->post('/register', [checkLoggedIn, \Server\Controllers\UserController::class, 'register']); -$router->post('/register/search-email', [checkLoggedIn, \Server\Controllers\UserController::class, 'findEmail']); -$router->post('/register/search-username', [checkLoggedIn, \Server\Controllers\UserController::class, 'findByUsername']); -$router->get('/login', [\Server\Controllers\UserController::class, 'loginview']); -$router->post('/login', [\Server\Controllers\UserController::class, 'login']); -$router->post('/logout', [checkLoggedIn, \Server\Controllers\UserController::class, 'logout']); -$router->post('/profile', [checkLoggedIn, \Server\Controllers\UserController::class, 'viewProfile']); -$router->post('/profile/edit', [checkLoggedIn, \Server\Controllers\UserController::class, 'editProfile']); +$router->get('/register', [new \Server\Controllers\UserController(), 'registerview']); +$router->post('/register', [new \Server\Controllers\UserController(), 'register']); +$router->post('/register/search-email', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'findEmail']]); +$router->post('/register/search-username', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'findByUsername']]); +$router->get('/login', [new \Server\Controllers\UserController(), 'loginview']); +$router->post('/login', [new \Server\Controllers\UserController(), 'login']); +$router->post('/logout', function() { + // No need to checkLoggedIn() here, as users can access this even if not logged in + if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); + } + session_destroy(); + header('Location: /login'); + exit(); +}); +$router->post('/profile', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'viewProfile']]); +$router->post('/profile/edit', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'editProfile']]); // Routes for EventsController -$router->get('/events', [checkLoggedIn, \Server\Controllers\EventsController::class, 'eventList10view']); -$router->post('/events/create', [checkLoggedIn, \Server\Controllers\EventsController::class, 'createEvent']); -$router->post('/events/update', [checkLoggedIn, \Server\Controllers\EventsController::class, 'updateEvent']); -$router->post('/events/delete', [checkLoggedIn, \Server\Controllers\EventsController::class, 'deleteEvent']); -$router->get('/events/search', [checkLoggedIn, \Server\Controllers\EventsController::class, 'searchview']); +// $router->get('/events', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'eventList10view']]); +// $router->post('/events/create', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'createEvent']]); +// $router->post('/events/update', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'updateEvent']]); +// $router->post('/events/delete', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'deleteEvent']]); +// $router->get('/events/search', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'searchview']]); $router->run(); diff --git a/src/index.php b/src/index.php new file mode 100644 index 0000000000000000000000000000000000000000..f6f970c24bd5e2e3475cc2b39d935ed8bb2f456e --- /dev/null +++ b/src/index.php @@ -0,0 +1,11 @@ +<?php +declare(strict_types=1); + +if (session_status() == PHP_SESSION_NONE) { + // If a session is not already started, start a new one + session_start(); +} + +include 'Server/web.php'; + +?>