From 7f89f360111d490ceae98cbde4228678b09afeed Mon Sep 17 00:00:00 2001
From: Bitha17 <16521076@mahasiswa.itb.ac.id>
Date: Thu, 16 Nov 2023 21:24:35 +0700
Subject: [PATCH] feat: temp changes

---
 Dockerfile                                    |  12 +-
 database/6-seed.sql                           |  10 +-
 src/.htaccess                                 |  13 ++
 {styles => src/Client}/auth.css               |   0
 src/Client/components/navbar.php              |   2 +-
 {styles => src/Client}/container.css          |   0
 {styles => src/Client}/dropdown.css           |   0
 {styles => src/Client}/footer.css             |   0
 {styles => src/Client}/form.css               |   0
 {styles => src/Client}/global.css             |   0
 {styles => src/Client}/navbar.css             |   0
 src/Client/pages/event/create.php             |   5 +-
 src/Client/pages/event/update.php             |   5 +-
 src/Client/pages/history/history.php          |   5 +-
 src/Client/pages/home/home.php                |  50 ++++----
 src/Client/pages/login/login.php              |  61 +++++-----
 src/Client/pages/login/register.php           |  11 +-
 src/Client/pages/pembelian/pembelian.php      |   5 +-
 src/Client/pages/profile/view_profile.php     |   5 +-
 {styles => src/Client}/pagination.css         |   0
 src/Server/Controllers/EventController.php    |   5 +-
 src/Server/Controllers/HomeController.php     |  11 ++
 .../Controllers/PembelianController.php       |   3 +-
 src/Server/Controllers/TicketController.php   |   2 +-
 src/Server/Controllers/UserController.php     | 114 +++++++++++++++---
 src/Server/Models/Event.php                   |  49 ++++----
 src/Server/Models/User.php                    |   3 +
 src/Server/Router/Router.php                  |  21 ++--
 src/Server/web.php                            |  61 ++++++----
 src/index.php                                 |  11 ++
 30 files changed, 312 insertions(+), 152 deletions(-)
 create mode 100644 src/.htaccess
 rename {styles => src/Client}/auth.css (100%)
 rename {styles => src/Client}/container.css (100%)
 rename {styles => src/Client}/dropdown.css (100%)
 rename {styles => src/Client}/footer.css (100%)
 rename {styles => src/Client}/form.css (100%)
 rename {styles => src/Client}/global.css (100%)
 rename {styles => src/Client}/navbar.css (100%)
 rename {styles => src/Client}/pagination.css (100%)
 create mode 100644 src/Server/Controllers/HomeController.php
 create mode 100644 src/index.php

diff --git a/Dockerfile b/Dockerfile
index e29d064..1d2b0aa 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 75d29b1..36241df 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 0000000..122631d
--- /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 ec8dd2a..d8b9f31 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 b486caa..75b6a10 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 3d63800..84f1251 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 b2e0263..10b8f57 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 701666b..1cd9d38 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 2ca035a..017eba7 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 bdd3a09..660b237 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 00d8ce4..e8b2cfa 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 2eab3bc..7c3c492 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 21dd49f..0e5c9be 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 0000000..edb1b11
--- /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 9f5526d..5f5701d 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 962586f..8d2944d 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 3ae2e6c..6bf0731 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 a9c3285..85a9021 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 43d1dc9..818b24b 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 c6d4249..7849f64 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 773e259..d3dbe64 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 0000000..f6f970c
--- /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';
+
+?>
-- 
GitLab