diff --git a/README.md b/README.md
index 5614db31c485058c8277b93c72a82d02c6d04a21..104ad4174d1ec21d74803005a8f46873d3722eb3 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,103 @@
-## Panduan Pengerjaan
-Berikut adalah hal yang harus diperhatikan untuk pengumpulan tugas ini:
-1. Buatlah grup pada Gitlab dengan format "IF3110-2023-01-XX", dengan XX adalah nomor kelompok (untuk K1 dan K2) atau kode kelompok (untuk K3).
-2. Tambahkan anggota tim pada grup anda.
-3. **Fork** pada repository ini dengan organisasi yang telah dibuat.
-4. Ubah hak akses repository hasil Fork anda menjadi **private**.
-5. Hal-hal yang harus diperhatikan.
-    * Silakan commit pada repository anda (hasil fork)
-    * Lakukan beberapa commit dengan pesan yang bermakna, contoh: “add register form”, “fix logout bug”, jangan seperti “final”, “benerin dikit”, “fix bug”.
-    * Disarankan untuk tidak melakukan commit dengan perubahan yang besar karena akan mempengaruhi penilaian (contoh: hanya melakukan satu commit kemudian dikumpulkan).
-    * Commit dari setiap anggota tim akan mempengaruhi penilaian.
-    * Jadi, setiap anggota tim harus melakukan commit yang berpengaruh terhadap proses pembuatan aplikasi.
-    * Sebagai panduan bisa mengikuti [semantic commit](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716).
-6. Buatlah file README yang berisi:
-    * Deskripsi aplikasi web
-    * Daftar requirement
-    * Cara instalasi
-    * Cara menjalankan server
-    * Screenshot tampilan aplikasi (tidak perlu semua kasus, minimal 1 per halaman), dan 
-    * Penjelasan mengenai pembagian tugas masing-masing anggota (lihat formatnya pada bagian pembagian tugas).
+# Audiolibs
+> Disusun untuk memenuhi Tugas Besar Milestone 1 - Monolitic PHP & Vanilla Web Application IF3110 Pengembangan Aplikasi Berbasis Web
+
+## Daftar Isi
+* [Deskripsi Aplikasi Web](#deskripsi-aplikasi-web)
+* [Daftar Requirement](#daftar-requirementt)
+* [Cara Instalasi](#cara-instalasi)
+* [Cara Menjalankan Server](#cara-menjalankan-server)
+* [Screenshot Tampilan Aplikasi](#screenshot-tampilan-aplikasi)
+* [Pembagian Tugas](#deskripsi-aplikasi-web)
+
+## Deskripsi Aplikasi Web
+Aplikasi ini adalah aplikasi perpustakaan audiovisual. Di dalam aplikasi ini, pengguna dapat membaca buku yang telah disediakan oleh aplikasi. Selain membaca, pengguna juga dapat mendengarkan isi buku dengan narasi yang sudah disediakan oleh aplikasi pada setiap buku. Aplikasi ini dibuat dengan PHP murni beserta HTML, CSS, dan Javascript. DBMS yang digunakan adalah MySQL. 
+
+## Daftar Requirement
+1. Login
+2. Register
+3. Daftar Buku (Booklist)
+4. Detail Buku
+5. Bookmark
+6. Search, Sort, dan Filter
+7. Tambah, Edit, dan Hapus Buku
+8. Tambah, Edit, dan Hapus User
+9. Tambah, Edit, dan Hapus Author
+
+## Cara Instalasi
+1. Unduh _repository_ ini dengan menggunakan perintah 
+`git clone https://gitlab.informatika.org/kenndave/tugas-besar-1.git`
+2. Pastikan Anda telah melakukan instalasi Docker Desktop pada komputer Anda. Jika belum, Docker Desktop dapat diunduh pada link berikut:
+`https://www.docker.com/products/docker-desktop/`
+3. Lakukan pembuatan _image_ Docker yang akan digunakan oleh aplikasi dengan menjalankan perintah `docker build -t tubes-1:latest .` pada terminal _directory_ aplikasi
+
+## Cara Menjalankan Server
+1. Jalankan Docker Engine pada komputer Anda
+2. Program dapat dijalankan dengan menjalankan perintah `docker compose up -d` pada terminal _directory_ aplikasi
+3. Aplikasi web dapat diakses dengan menggunakan browser pada URL `http://localhost:8080/public/login`
+4. Aplikasi web dapat dihentikan dengan menjalankan perintah `docker compose down` pada terminal _directory_ aplikasi
+
+## Screenshot Tampilan Aplikasi
+
+### Login
+![Login Page](./screenshots/login-page.png)
+
+### Register
+![Register Page](./screenshots/register-page.png)
+
+### Daftar Buku (Booklist)
+![Booklist Page](./screenshots/booklist-page.png)
+
+### Detail Buku
+![Detail Book Page](./screenshots/detail-book.png)
+
+### Bookmark
+![Bookmark Page](./screenshots/bookmark-page.png)
+
+### Search, Sort, dan Filter
+![Search, Sort, and Filter](./screenshots/search-sort-filter.png)
+
+### Tambah, Edit, dan Hapus Buku
+![Book Page](./screenshots/book-admin-page.png)
+![Add Book](./screenshots/add-book.png)
+![Edit Book](./screenshots/edit-book.png)
+
+### Tambah, Edit, dan Hapus User
+![User Admin Page](./screenshots/user-admin-page.png)
+![Add User](./screenshots/add-user-page.png)
+![Edit User](./screenshots/edit-user.png)
+![Delete User](./screenshots/delete-user.png)
+
+### Tambah, Edit, dan Hapus Author
+![Author Admin Page](./screenshots/author-page.png)
+![Add Author](./screenshots/add-author.png)
+![Edit Author](./screenshots/edit-author.png)
+![Delete Author](./screenshots/delete-author.png)
+
+## Pembagian Tugas
+_Server Side_
+
+| Fitur                              | NIM                                       |
+| ---------------------------------- | ----------------------------------------- |
+| Login                              | 13521152, 13521145                        |
+| Register                           | 13521145                                  |
+| Booklist                           | 13521152                                  |
+| Detail Buku                        | 13521152                                  |
+| Bookmark                           | 13521152                                  |
+| Search, Sort, dan Filter           | 13521145, 13521152                        |
+| Tambah, Edit, dan Hapus Buku       | 13521145, 13521042                        |
+| Tambah, Edit, dan Hapus User       | 13521145                                  |
+| Tambah, Edit, dan Hapus Author     | 13521152, 13521145                        |
+
+_Client Side_
+
+| Fitur                              | NIM                                       |
+| ---------------------------------- | ----------------------------------------- |
+| Login                              | 13521145                                  |
+| Register                           | 13521042                                  |
+| Booklist                           | 13521145, 13521152                        |
+| Detail Buku                        | 13521042                                  |
+| Bookmark                           | 13521152                                  |
+| Search, Sort, dan Filter           | 13521145, 13521152                        |
+| Tambah, Edit, dan Hapus Buku       | 13521145, 13521042                        |
+| Tambah, Edit, dan Hapus User       | 13521145, 13521042                        |
+| Tambah, Edit, dan Hapus Author     | 13521152                                  |
\ No newline at end of file
diff --git a/app/controllers/About.php b/app/controllers/About.php
deleted file mode 100644
index 9c90568d0b0dd183dd05cf0288692aec257c056a..0000000000000000000000000000000000000000
--- a/app/controllers/About.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-class About{
-    public function index(){
-        echo 'About/index';
-    }
-}
\ No newline at end of file
diff --git a/app/controllers/Defaultx.php b/app/controllers/Defaultx.php
index 07a1df6453ea34d8744f744aef25a518b400e906..4e72f703092d8d8a5d4737cff376e7efc2d3d154 100644
--- a/app/controllers/Defaultx.php
+++ b/app/controllers/Defaultx.php
@@ -1,7 +1,7 @@
 <?php
 
 class Defaultx extends Controller {
-       public function index()
+    public function index()
     {
         // Default method kalau gk ada metode yang dipanggil
         $this->view('error/404');
diff --git a/app/controllers/Login.php b/app/controllers/Login.php
index 9ffa4181949751105cbbbeb380dd456df2fb267c..e2ad66e6c7dae7715785e0bc56f4ef27836e9c37 100644
--- a/app/controllers/Login.php
+++ b/app/controllers/Login.php
@@ -1,8 +1,10 @@
 <?php
 session_start();
 
-class Login extends Controller{
-    public function index($page = 1){
+class Login extends Controller
+{
+    public function index($page = 1)
+    {
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
             $limit = 10;
             $page = intval($page);
@@ -15,10 +17,10 @@ class Login extends Controller{
             $this->view('login/login');
         }
     }
+
     public function login()
     {
         if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-            
             // Handle form submission
             $username = $_POST['username'];
             $password = $_POST['password'];
@@ -30,33 +32,30 @@ class Login extends Controller{
                 $_SESSION['username'] = $username;
                 $id = $this->model('UserModel')->getUserByUsername($username);
                 $_SESSION['id'] = $id['id'];
-                
-                
-                header('Location:'. BASEURL . '/user/index'); 
+
+                header('Location:' . BASEURL . '/user/index');
                 exit;
-            } else if($this->authenticateAdmin($username, $password)){
+            } else if ($this->authenticateAdmin($username, $password)) {
                 $_SESSION['user_role'] = 'admin';
                 $_SESSION['username'] = $username;
-                
-                header('Location: ' . BASEURL . '/admin/index'); 
+
+                header('Location: ' . BASEURL . '/admin/index');
                 exit;
             } else {
                 // Authentication failed, display an error message
                 $data['error'] = 'Invalid username or password';
-                $this->view('login/login');
-               
+                $this->view('login/login', $data);
             }
         } else {
             // Display the login form
-            
             $this->view('login/login');
         }
     }
+
     public function logout()
     {
-       
         session_destroy();
-        header('Location: ' . BASEURL . '/login/index'); 
+        header('Location: ' . BASEURL . '/login/index');
         exit;
     }
 
@@ -84,4 +83,4 @@ class Login extends Controller{
         }
         return false;
     }
-}
\ No newline at end of file
+}
diff --git a/app/controllers/Register.php b/app/controllers/Register.php
index 411929bb2bd3b6638c0b30147d099feecf6aedd5..709b0d62b1bfd9a013f248fdd5513d9cabc576bf 100644
--- a/app/controllers/Register.php
+++ b/app/controllers/Register.php
@@ -1,43 +1,47 @@
 <?php
 
-class Register extends Controller{
-    public function index(){
+class Register extends Controller
+{
+    public function index()
+    {
         $this->view('register/register');
     }
 
     public function register()
     {
-        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-            
-            // isi form
-            $username = $_POST['newUsername'];
-            $password = $_POST['newPassword'];
-            $confirmPassword = $_POST['confirmPassword'];
-            
-            // Cek dulu password & confirm passwordnya sama
-            if($password !== $confirmPassword){
-                // lempar balik karna gk sama
-                $this->view('register/register');
-            }
+        try {
+            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+                // isi form
+                $username = $_POST['newUsername'];
+                $password = $_POST['newPassword'];
+                $confirmPassword = $_POST['confirmPassword'];
 
+                // Cek dulu password & confirm passwordnya sama
+                if ($password !== $confirmPassword) {
+                    throw new Exception("Password and confirm password do not match.");
+                }
 
-            // fetch data db buat ngecek
-            $data['user'] = $this->model('UserModel')->getAllUser();
-            $array = array_column($data['user'], "username");
+                // Fetch data from the database to check for existing usernames
+                $data['user'] = $this->model('UserModel')->getAllUser();
+                $array = array_column($data['user'], "username");
 
-            // Cek username udah exist atau belum
-            if (!in_array($username, $array, true)){
-                // Oh user baru, monggo insert
-                $this->model('UserModel')->insertUser($username, $password);
+                // Cek if the username already exists
+                if (!in_array($username, $array, true)) {
+                    // User does not exist, insert into the database
+                    $this->model('UserModel')->insertUser($username, $password);
 
-                // Kalau berhasil, dilempar ke page login.
-                $this->view('login/login');
+                    // Successfully registered, redirect to the login page
+                    header('Location:' . BASEURL . '/login/index');
+                    exit;
+                } else {
+                    throw new Exception("Username already exists.");
+                }
             } else {
-                // lempar balik karna user udah exist di database
-                $this->view('register/register');
+                throw new Exception("Invalid request.");
             }
-        } else {
-            $this->view('register/register');
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/error', ['error' => $error_message]);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/app/controllers/User.php b/app/controllers/User.php
index a9cfa914c1967099759227031f5a3fda19581932..d91e73f3da7ac48221d717239de9c236dcf00b15 100644
--- a/app/controllers/User.php
+++ b/app/controllers/User.php
@@ -1,147 +1,178 @@
 <?php
 session_start();
 
-class User extends Controller {
+class User extends Controller
+{
     public function index($page = 1)
     {
-        // Check if the user is logged in as 'user'
-        if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
-            $limit = 10;
-            $page = intval($page);
-            $offset = ($page - 1) * $limit;
-            $offset = intval($offset);
-            $data['book'] = $this->model('BookModel')->getAllBookList($limit, $offset);
-            // $data['book']['path'] = $this->model('BookModel')->getAllBookFilename($page);
-            
-            $this->view('library/booklist', $data);
-        } else {
-            $this->view('login/login');
+        try {
+            // Check if the user is logged in as 'user'
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                $limit = 10;
+                $page = intval($page);
+                $offset = ($page - 1) * $limit;
+                $offset = intval($offset);
+                $data['book'] = $this->model('BookModel')->getAllBookList($limit, $offset);
+
+                $this->view('library/booklist', $data);
+            } else {
+                throw new Exception("Unauthorized access.");
+            }
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
 
     public function bookmark($page = 1)
-    {   
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user'){
-            $limit = 10;
-            $offset = ($page - 1) * $limit;
-            $data['book'] = $this->model('BookModel')->getAllBookmark($limit, $offset);
-            $this->view('bookmark/bookmark', $data);
-        }
-        else{
-            $this->view('login/login');
+    {
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                $limit = 10;
+                $offset = ($page - 1) * $limit;
+                $data['book'] = $this->model('BookModel')->getAllBookmark($limit, $offset);
+                $this->view('bookmark/bookmark', $data);
+            } else {
+                throw new Exception("Unauthorized access.");
+            }
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
-        
     }
+
     public function addbookmark()
-    {   
-        if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
-            // Check if 'id' was sent via POST
-            if (isset($_POST['id']) && isset($_POST['bookid'])) {
-                // Access the 'id' value from $_POST
-                $id = $_POST['id'];
-                $bookid = $_POST['bookid'];
-                
-                $this->model('BookModel')->addBookmark($id, $bookid);
-                $this->bookdetail($bookid);
+    {
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                // Check if 'id' and 'bookid' were sent via POST
+                if (isset($_POST['id']) && isset($_POST['bookid'])) {
+                    // Access the 'id' and 'bookid' values from $_POST
+                    $id = $_POST['id'];
+                    $bookid = $_POST['bookid'];
 
-            } 
-        } else {
-            $this->view('login/login');
+                    $this->model('BookModel')->addBookmark($id, $bookid);
+                    $this->bookdetail($bookid);
+                } else {
+                    throw new Exception("Invalid request.");
+                }
+            } else {
+                throw new Exception("Unauthorized access.");
+            }
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
+
     public function deletebookmark()
-    {   
-        if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
-            // Check if 'id' was sent via POST
-            if (isset($_POST['id']) && isset($_POST['bookid'])) {
-                // Access the 'id' value from $_POST
-                $id = $_POST['id'];
-                $bookid = $_POST['bookid'];
-                
-                $this->model('BookModel')->deleteBookmark($id, $bookid);
-                $this->bookmark();
+    {
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                // Check if 'id' and 'bookid' were sent via POST
+                if (isset($_POST['id']) && isset($_POST['bookid'])) {
+                    // Access the 'id' and 'bookid' values from $_POST
+                    $id = $_POST['id'];
+                    $bookid = $_POST['bookid'];
 
-            } 
-        } else {
-            $this->view('login/login');
+                    $this->model('BookModel')->deleteBookmark($id, $bookid);
+                    $this->bookmark();
+                } else {
+                    throw new Exception("Invalid request.");
+                }
+            } else {
+                throw new Exception("Unauthorized access.");
+            }
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
 
-
     public function bookdetail($page = 1)
     {
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user'){
-            $data['book'] = $this->model('BookModel')->getBookDetail($page);
-            $data['path'] = $this->model('BookModel')->getBookFilename($page);
-            $this->view('library/detailbook', $data);
-        }
-        else{
-            $this->view('login/login');
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                $data['book'] = $this->model('BookModel')->getBookDetail($page);
+                $data['path'] = $this->model('BookModel')->getBookFilename($page);
+                $this->view('library/detailbook', $data);
+            } else {
+                throw new Exception("Unauthorized access.");
+            }
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
 
-
-
     public function bookmarkSearch($page = 1)
     {
-        if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
-            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                
-                $searchInput = isset($_POST['search']) ? $_POST['search'] : '';
-                $sortSelect = isset($_POST['sortSelect']) ? $_POST['sortSelect'] : 'title';
-                $sortOrder = isset($_POST['sortOrder']) ? $_POST['sortOrder'] : 'ASC';
-                $filterSelect = isset($_POST['filterSelect']) ? $_POST['filterSelect'] : 'none';
-                $filterQuery = isset($_POST['filterQuery']) ? $_POST['filterQuery'] : '';
-                
-                $limit = 10;
-                $page = intval($page);
-                $offset = ($page - 1) * $limit;
-                $offset = intval($offset);
-                // Perform a search using the parameters and the model method
-                $data['book'] = $this->model('BookModel')->searchBookmark($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset);
-    
-                // You can return the search results as JSON, for example
-                $this->view('bookmark/bookmark', $data);
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+                    $searchInput = isset($_POST['search']) ? $_POST['search'] : '';
+                    $sortSelect = isset($_POST['sortSelect']) ? $_POST['sortSelect'] : 'title';
+                    $sortOrder = isset($_POST['sortOrder']) ? $_POST['sortOrder'] : 'ASC';
+                    $filterSelect = isset($_POST['filterSelect']) ? $_POST['filterSelect'] : 'none';
+                    $filterQuery = isset($_POST['filterQuery']) ? $_POST['filterQuery'] : '';
+                    
+                    $limit = 10;
+                    $page = intval($page);
+                    $offset = ($page - 1) * $limit;
+                    $offset = intval($offset);
+                    // Perform a search using the parameters and the model method
+                    $data['book'] = $this->model('BookModel')->searchBookmark($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset);
+                    if (empty($data['book'])) {
+                        $data['message'] = 'No results found.';
+                    }
+                    $this->view('bookmark/bookmark', $data);
+                } else {
+                    throw new Exception("Invalid request.");
+                }
             } else {
-                // Handle non-POST requests (e.g., redirect to a different page)
-                $this->view('bookmark/bookmark');
+                throw new Exception("Unauthorized access.");
             }
-        } else {
-            $this->view('login/login');
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
-    public function booklistSearch($page = 1){
-        if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
-            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                
-                $searchInput = isset($_POST['search']) ? $_POST['search'] : '';
-                $sortSelect = isset($_POST['sortSelect']) ? $_POST['sortSelect'] : 'title';
-                $sortOrder = isset($_POST['sortOrder']) ? $_POST['sortOrder'] : 'ASC';
-                $filterSelect = isset($_POST['filterSelect']) ? $_POST['filterSelect'] : 'none';
-                $filterQuery = isset($_POST['filterQuery']) ? $_POST['filterQuery'] : '';
-                
-                $limit = 10;
-                $page = intval($page);
-                $offset = ($page - 1) * $limit;
-                $offset = intval($offset);
-                // Perform a search using the parameters and the model method
-                $data['book'] = $this->model('BookModel')->searchBookList($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset);
-                // You can return the search results as JSON, for example
-                $this->view('library/booklist', $data);
+
+    public function booklistSearch($page = 1)
+    {
+        try {
+            if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'user') {
+                if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+                    $searchInput = isset($_POST['search']) ? $_POST['search'] : '';
+                    $sortSelect = isset($_POST['sortSelect']) ? $_POST['sortSelect'] : 'title';
+                    $sortOrder = isset($_POST['sortOrder']) ? $_POST['sortOrder'] : 'ASC';
+                    $filterSelect = isset($_POST['filterSelect']) ? $_POST['filterSelect'] : 'none';
+                    $filterQuery = isset($_POST['filterQuery']) ? $_POST['filterQuery'] : '';
+                    
+                    $limit = 10;
+                    $page = intval($page);
+                    $offset = ($page - 1) * $limit;
+                    $offset = intval($offset);
+                    // Perform a search using the parameters and the model method
+                    $data['book'] = $this->model('BookModel')->searchBookList($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset);
+                    $this->view('library/booklist', $data);
+                } else {
+                    $limit = 10;
+                    $page = intval($page);
+                    $offset = ($page - 1) * $limit;
+                    $offset = intval($offset);
+                    $data['book'] = $this->model('BookModel')->getAllBookList($limit, $offset);
+                    if (empty($data['book'])) {
+                        $data['message'] = 'No results found.';
+                    }
+                    $this->view('library/booklist', $data);
+                }
             } else {
-                $limit = 10;
-                $page = intval($page);
-                $offset = ($page - 1) * $limit;
-                $offset = intval($offset);
-                $data['book'] = $this->model('BookModel')->getAllBookList($limit, $offset);
-                
-                $this->view('library/booklist', $data);
+                throw new Exception("Unauthorized access.");
             }
-        } else {
-            $this->view('login/login');
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
     }
-
-
-
 }
\ No newline at end of file
diff --git a/app/controllers/admin.php b/app/controllers/admin.php
index 37e7d3da3d44badc271d7f599537e9a5494be9b1..d5d189ccf42563695cbe0381b6abbf8118db8855 100644
--- a/app/controllers/admin.php
+++ b/app/controllers/admin.php
@@ -2,49 +2,63 @@
 session_start();
 class Admin extends Controller {
     public function index(){
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin'){
-            $data['book'] = $this->model('BookModel')->getAllBookAdmin();;
+        try {
+            if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
+                throw new Exception("Unauthorized access.");
+            }
+            
+            $data['book'] = $this->model('BookModel')->getAllBookAdmin();
             $data['author'] = $this->model('AuthorModel')->getAuthor();
         
-            $this->view('admin/sidebar',$data);
-        }
-        else{
-            $this->view('login/login');
+            $this->view('admin/sidebar', $data);
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
-        
     }
 
     public function bookadmin(){
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin'){
+        try {
+            if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
+                throw new Exception("Unauthorized access.");
+            }
+
             $data['book'] = $this->model('BookModel')->getAllBookAdmin();
             $data['author'] = $this->model('AuthorModel')->getAuthor();
         
-            $this->view('admin/bookadmin',$data);
-        }
-        else{
-            $this->view('login/login');
+            $this->view('admin/bookadmin', $data);
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
-        
     }
+
     public function useradmin(){
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin'){
+        try {
+            if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
+                throw new Exception("Unauthorized access.");
+            }
+
             $data['user'] = $this->model('UserModel')->getAllUser();
-            $this->view('admin/useradmin',$data);
-        }
-        else{
-            $this->view('login/login');
+            $this->view('admin/useradmin', $data);
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
-        
     }
+
     public function authoradmin(){
-        if(isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin'){
+        try {
+            if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
+                throw new Exception("Unauthorized access.");
+            }
+
             $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-            $this->view('admin/authoradmin',$data);
+            $this->view('admin/authoradmin', $data);
+        } catch (Exception $e) {
+            $error_message = $e->getMessage();
+            $this->view('error/403', ['error' => $error_message]);
         }
-        else{
-            $this->view('login/login');
-        }
-        
     }
 
     public function model($model){
@@ -92,14 +106,28 @@ class Admin extends Controller {
     public function addUser(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin' ){
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                $newUsername = $_POST['newUsername'];
-                $newPassword = $_POST['newPassword'];
-                $data['user'] = $this->model('UserModel')->getAllUser();
-                $array = array_column($data['user'], "username");
+                try {
+                    $newUsername = $_POST['newUsername'];
+                    $newPassword = $_POST['newPassword'];
+                    $data['user'] = $this->model('UserModel')->getAllUser();
+                    $array = array_column($data['user'], "username");
+
+                    // Cek stringnya kosong ato g && exist ato g usernya 
+                    if (empty($newUsername) || empty($newPassword)) {
+                        throw new Exception("Username and Password cannot be empty.");
+                    }
+
+                    if (in_array($newUsername, $array, true)) {
+                        throw new Exception("Username already exists.");
+                    }
 
-                // Cek stringnya kosong ato g && exist ato g usernya 
-                if (!(empty($newUsername) || empty($newPassword)) && !in_array($newUsername, $array, true)){
                     $this->model('UserModel')->insertUser($newUsername, $newPassword);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['user'] = $this->model('UserModel')->getAllUser();
+                    $this->view('admin/useradmin', ['error' => $error_message] + $data);
+                    return;
                 }
             }
             $data['user'] = $this->model('UserModel')->getAllUser();
@@ -108,7 +136,7 @@ class Admin extends Controller {
             $this->view('error/404');
         }
     }
-    
+
     public function editBook(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
@@ -150,24 +178,37 @@ class Admin extends Controller {
             $this->view('error/404');
         }
     }
+
     public function editUser(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                // Dapetin nilai dari input formnye ya
-                $oldUsername = $_POST['username'];
-                $newUsername = $_POST['newUsername'];
-                $newPassword = $_POST['newPassword'];
-                $userId = $_POST['userId'];
-                $data['user'] = $this->model('UserModel')->getAllUser();
-                // Bikin kolom array list username buat pengecekkan
-                $array = array_column($data['user'], "username");
-
-                // Cek password kosong dan user kosong atau udah exist di db atau gk diganti
-                if (!(empty($newUsername) || empty($newPassword))  && (!in_array($newUsername, $array, true) || $newUsername === $oldUsername)){
-                   $this->model('UserModel')->updateUser($userId, $newUsername, $newPassword);
-                }
+                try {
+                    // Dapetin nilai dari input formnye ya
+                    $oldUsername = $_POST['username'];
+                    $newUsername = $_POST['newUsername'];
+                    $newPassword = $_POST['newPassword'];
+                    $userId = $_POST['userId'];
+                    $data['user'] = $this->model('UserModel')->getAllUser();
+                    // Bikin kolom array list username buat pengecekkan
+                    $array = array_column($data['user'], "username");
 
-                
+                    // Cek password kosong dan user kosong atau udah exist di db atau gk diganti
+                    if (empty($newUsername) || empty($newPassword)) {
+                        throw new Exception("Username and Password cannot be empty.");
+                    }
+
+                    if (in_array($newUsername, $array, true) && $newUsername !== $oldUsername) {
+                        throw new Exception("Username already exists.");
+                    }
+
+                    $this->model('UserModel')->updateUser($userId, $newUsername, $newPassword);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['user'] = $this->model('UserModel')->getAllUser();
+                    $this->view('admin/useradmin', ['error' => $error_message] + $data);
+                    return;
+                }
             }
             $data['user'] = $this->model('UserModel')->getAllUser();
             $this->view('admin/useradmin', $data);
@@ -179,58 +220,92 @@ class Admin extends Controller {
     public function addAuthor(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin' ){
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                $newAuthorName = $_POST['newAuthorName']; 
+                try {
+                    $newAuthorName = $_POST['newAuthorName'];
 
-    
+                    $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
+                    $authorNames = array_column($data['authors'], "author_name");
 
-                $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-                $authorNames = array_column($data['authors'], "author_name");
-                
-                // Cek exist atau kosong
-                if (!in_array($newAuthorName, $authorNames, true) && !empty($newAuthorName)){
+                    // Cek exist atau kosong
+                    if (empty($newAuthorName)) {
+                        throw new Exception("Author name cannot be empty.");
+                    }
 
-                    $this->model('AuthorModel')->insertAuthor($newAuthorName); 
+                    if (in_array($newAuthorName, $authorNames, true)) {
+                        throw new Exception("Author name already exists.");
+                    }
+
+                    $this->model('AuthorModel')->insertAuthor($newAuthorName);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
+                    $this->view('admin/authoradmin', ['error' => $error_message] + $data);
+                    return;
                 }
             }
 
             $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-            $this->view('admin/authoradmin', $data); 
+            $this->view('admin/authoradmin', $data);
         } else {
             $this->view('login/login');
         }
     }
-    
+
     public function editAuthor(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+                try {
+                    $newAuthorName = $_POST['newAuthorName'];
+                    $oldAuthorName = $_POST['authorName'];
+                    $authorid = $_POST['authorId'];
 
-                $newAuthorName = $_POST['newAuthorName']; 
-                $oldAuthorName = $_POST['authorName']; 
+                    $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
+                    $authorNames = array_column($data['authors'], "author_name");
 
-                $authorid = $_POST['authorId'];
+                    // Cek exist atau kosong
+                    if (empty($newAuthorName)) {
+                        throw new Exception("Author name cannot be empty.");
+                    }
 
-                $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-                $authorNames = array_column($data['authors'], "author_name");
-                
-                if (!in_array($newAuthorName, $authorNames, true || $newAuthorName === $oldAuthorName) && !empty($newAuthorName)){
-                    $this->model('AuthorModel')->updateAuthor($authorid, $newAuthorName); 
+                    if (in_array($newAuthorName, $authorNames, true) && $newAuthorName !== $oldAuthorName) {
+                        throw new Exception("Author name already exists.");
+                    }
+
+                    $this->model('AuthorModel')->updateAuthor($authorid, $newAuthorName);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
+                    $this->view('admin/authoradmin', ['error' => $error_message] + $data);
+                    return;
                 }
             }
 
             $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-            $this->view('admin/authoradmin', $data); 
+            $this->view('admin/authoradmin', $data);
         } else {
             $this->view('login/login');
         }
     }
+
     public function deleteAuthor(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                $authorId = $_POST['deleteId']; 
-                $this->model('AuthorModel')->deleteAuthor($authorId); 
+                try {
+                    $authorId = $_POST['deleteId'];
+                    $this->model('AuthorModel')->deleteAuthor($authorId);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
+                    $this->view('admin/authoradmin', ['error' => $error_message] + $data);
+                    return;
+                }
             }
+
             $data['authors'] = $this->model('AuthorModel')->getAllAuthor();
-            $this->view('admin/authoradmin', $data); 
+            $this->view('admin/authoradmin', $data);
         } else {
             $this->view('login/login');
         }
@@ -239,9 +314,18 @@ class Admin extends Controller {
     public function deleteUser(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                $userId = $_POST['deleteId']; 
-                $this->model('UserModel')->deleteUser($userId);
+                try {
+                    $userId = $_POST['deleteId'];
+                    $this->model('UserModel')->deleteUser($userId);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['user'] = $this->model('UserModel')->getAllUser();
+                    $this->view('admin/useradmin', ['error' => $error_message] + $data);
+                    return;
+                }
             }
+
             $data['user'] = $this->model('UserModel')->getAllUser();
             $this->view('admin/useradmin', $data);
         } else {
@@ -251,8 +335,17 @@ class Admin extends Controller {
     public function deleteBook(){
         if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
             if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-                $bookId = $_POST['deleteId']; 
-                $this->model('BookModel')->deleteBook($bookId);
+                try {
+                    $bookId = $_POST['deleteId']; 
+                    $this->model('BookModel')->deleteBook($bookId);
+                } catch (Exception $e) {
+                    // Handle the error, you can redirect or display a message
+                    $error_message = $e->getMessage();
+                    $data['book'] = $this->model('BookModel')->getAllBookAdmin();
+                    $data['author'] = $this->model('AuthorModel')->getAuthor();
+                    $this->view('admin/bookadmin', ['error' => $error_message] + $data);
+                    return;
+                }
             }
             $data['book'] = $this->model('BookModel')->getAllBookAdmin();
             $data['author'] = $this->model('AuthorModel')->getAuthor();
@@ -262,4 +355,5 @@ class Admin extends Controller {
         }
     }
     
+    
 }
\ No newline at end of file
diff --git a/app/core/connection.php b/app/core/connection.php
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/app/models/BookModel.php b/app/models/BookModel.php
index 63aa5ea0230181ac736095d9747bad138c5780f0..a1a8eb3c64582ca647e21495c7f9a4fca0a411c5 100644
--- a/app/models/BookModel.php
+++ b/app/models/BookModel.php
@@ -117,7 +117,7 @@ class BookModel
 
     public function searchBookmark($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset){
         // Construct the SQL query based on the provided parameters
-        $sql = "SELECT book.id, title, author.name, category FROM book JOIN author ON book.author_id = author.id JOIN inventory ON book.id = inventory.book_id JOIN user ON user.id = inventory.user_id WHERE 1=1"; // Initial WHERE condition
+        $sql = "SELECT book.id, title, author.name, category, audio_path, image_path FROM book JOIN author ON book.author_id = author.id JOIN inventory ON book.id = inventory.book_id JOIN user ON user.id = inventory.user_id WHERE 1=1"; // Initial WHERE condition
     
         if ($filterSelect && $filterQuery) {
             $sql .= " AND $filterSelect = '$filterQuery'";
@@ -141,6 +141,9 @@ class BookModel
                 // Default to ascending if sortOrder is not valid
                 $sortOrder = 'ASC';
             }
+            if ($sortSelect = "author"){
+                $sortSelect = "author.name";
+            }
     
             $sql .= " ORDER BY $sortSelect $sortOrder";
         }
@@ -151,7 +154,7 @@ class BookModel
     }
     public function searchBookList($searchInput, $sortSelect, $sortOrder, $filterSelect, $filterQuery, $limit, $offset){
         // Construct the SQL query based on the provided parameters
-        $sql = "SELECT book.id, title, author.name, category FROM book JOIN author ON book.author_id = author.id WHERE 1=1"; // Initial WHERE condition
+        $sql = "SELECT book.id, title, author.name, category, audio_path, image_path FROM book JOIN author ON book.author_id = author.id WHERE 1=1"; // Initial WHERE condition
     
         if ($filterSelect && $filterQuery) {
             $sql .= " AND $filterSelect = '$filterQuery'";
@@ -175,7 +178,9 @@ class BookModel
                 // Default to ascending if sortOrder is not valid
                 $sortOrder = 'ASC';
             }
-    
+            if ($sortSelect = "author"){
+                $sortSelect = "author.name";
+            }
             $sql .= " ORDER BY $sortSelect $sortOrder";
         }
         $sql .= " LIMIT $limit OFFSET $offset";
diff --git a/app/views/bookmark/bookmark.php b/app/views/bookmark/bookmark.php
index 8f6ea672ad554cf9243467982ff1b9449d178303..1ba5a34a5a0fa4b9cbe5fe3e379b88f2f147b325 100644
--- a/app/views/bookmark/bookmark.php
+++ b/app/views/bookmark/bookmark.php
@@ -17,10 +17,12 @@
 <div class="header">
     <h1>Bookmark</h1>
 </div>
-
+    <?php if (isset($data['message'])) { ?>
+            <div class="error-message"><?php echo $data['message']; ?></div>
+        <?php } ?>
     <?php
     $boxCount = 0;
-
+    
     if (!empty($data['book'])) {
         foreach ($data['book'] as $row) {
             $bookid = $row['id'];
diff --git a/app/views/bookmark/delete.php b/app/views/bookmark/delete.php
deleted file mode 100644
index 18786a0ce4a591eb35522e7626fa367b286b7d8c..0000000000000000000000000000000000000000
--- a/app/views/bookmark/delete.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-include('C:\xampp\htdocs\tugas-besar-1\app'.'/core/connection.php');
-
-// Check if an employee number is provided in the request
-if (isset($_POST['title'])) {
-    $title = $_POST['title'];
-
-    // Sanitize and validate the employee number input to prevent SQL injection
-
-    // Perform the DELETE operation based on the employee number
-    $deleteSql = "DELETE FROM book WHERE title = '$title'";
-
-    if ($conn->query($deleteSql) === TRUE) {
-        // Deletion was successful
-        $response = array('success' => true, 'message' => 'Record deleted successfully');
-    } else {
-        // Deletion failed
-        $response = array('success' => false, 'message' => 'Error deleting record: ' . $conn->error);
-    }
-
-    // Return a JSON response to the client
-    header('Content-Type: application/json');
-    echo json_encode($response);
-} else {
-    // Handle missing or invalid input
-    $response = array('success' => false, 'message' => 'Invalid input');
-    header('Content-Type: application/json');
-    echo json_encode($response);
-}
-
-// Close the database connection
-$conn->close();
-?>
diff --git a/app/views/bookmark/search.php b/app/views/bookmark/search.php
deleted file mode 100644
index a508602f06202e17dcefb818f3c8edfad6871541..0000000000000000000000000000000000000000
--- a/app/views/bookmark/search.php
+++ /dev/null
@@ -1,84 +0,0 @@
-
-<?php
-/*
-include(APPURL .'/core/connection.php');
-
-// Read URL parameters
-$sortSelect = isset($_GET['sortSelect']) ? $_GET['sortSelect'] : "title";
-$sortOrder = isset($_GET['sortOrder']) ? $_GET['sortOrder'] : "ASC";
-$filterSelect = isset($_GET['filterSelect']) ? $_GET['filterSelect'] : "none";
-$filterQuery = isset($_GET['filterQuery']) ? $_GET['filterQuery'] : "";
-$searchInput = isset($_GET['searchInput']) ? $_GET['searchInput'] : "";
-$activePage = isset($_GET['page']) ? intval($_GET['page']) : 1;
-
-$itemsPerPage = 10;
-
-
-// Calculate the offset
-$offset = ($activePage - 1) * $itemsPerPage;
-
-$countSql = "SELECT COUNT(*) as totalRecords FROM book";
-$countResult = $conn->query($countSql);
-$row = $countResult->fetch_assoc();
-$totalRecords = $row['totalRecords'];
-
-$totalPages = ceil($totalRecords / $itemsPerPage);
-
-
-// Check if sortSelect and sortOrder values are set in the URL
-if (isset($_GET['sortSelect']) && isset($_GET['sortOrder'])) {
-    // Sanitize and validate the sortSelect and sortOrder values to prevent SQL injection
-    $sortSelect = $_GET['sortSelect'] === "title" ? "title" : "author_id";
-    $sortOrder = $_GET['sortOrder'] === "descending" ? "DESC" : "ASC";
-
-    if ($_GET['sortSelect'] === "none") {
-        $sortSelect = null; 
-        $sortOrder = null;   
-    }
-}
-
-// Check if filterSelect and filterQuery values are set in the URL for filtering
-if(isset($_GET['filterSelect']) && isset($_GET['filterQuery'])) {
-    // Sanitize and validate the filterSelect and filterQuery values to prevent SQL injection
-    $filterSelect = $_GET['filterSelect'] === "category" ? "category" : "author_id";
-    $filterQuery = $_GET['filterQuery'];
-
-    if ($_GET['filterSelect'] === "none") {
-        $filterSelect = null; 
-        $filterQuery = null;  
-    }
-}
-
-$searchInput = isset($_GET['searchInput']) ? $_GET['searchInput'] : '';
-// Check if the search input is provided
-$searchQuery = "";
-if (isset($_GET['searchInput']) && !empty($_GET['searchInput'])) {
-    // Sanitize the search input to prevent SQL injection
-    $searchInput = mysqli_real_escape_string($conn, $_GET['searchInput']);
-    
-    // Create a search query using LIKE clause for substring search
-    $searchQuery = " AND (title LIKE '%$searchInput%' OR author_id LIKE '%$searchInput%')";
-}
-
-// Construct the final SQL query based on sorting, filtering, and searching
-$sql = "SELECT title, author_id, category FROM book WHERE 1=1"; // Initial WHERE condition
-
-if ($filterSelect && $filterQuery) {
-    $sql .= " AND $filterSelect = '$filterQuery'";
-}
-
-if ($searchQuery) {
-    $sql .= $searchQuery;
-}
-
-if ($sortSelect && $sortOrder) {
-    $sql .= " ORDER BY $sortSelect $sortOrder";
-}
-
-$sql .= " LIMIT $itemsPerPage OFFSET $offset";
-
-$result = $conn->query($sql);
-
-?>
-<script src="http://localhost:8080/public/js/search.js"></script>
-*/
\ No newline at end of file
diff --git a/app/views/error/403.php b/app/views/error/403.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ce25a838aecc7b40b56a249e2cd29a999c4d6a4
--- /dev/null
+++ b/app/views/error/403.php
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>403 Error Forbidden Access</title>
+    <link href='https://fonts.googleapis.com/css?family=Hanuman' rel='stylesheet'>
+    <link rel="stylesheet" type="text/css" href="http://localhost:8080/public/style/403.css">
+</head>
+
+<body>
+    <div class="wrapper">
+        <div class="error">403</div>
+        <div class="text">FORBIDDEN ACCESS</div>
+        <?php if (isset($error)) { ?>
+            <div class="error-message"><?php echo $error; ?></div>
+        <?php } ?>
+        <div class="login-link">
+            <p>Please sign in to access this page <br>
+                <a href="http://localhost:8080/public/login">Sign in</a>
+            </p>
+        </div>
+    </div>
+</body>
+</html>
diff --git a/app/views/library/addbook.php b/app/views/library/addbook.php
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/app/views/library/editbook.php b/app/views/library/editbook.php
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/app/views/library/editlist.php b/app/views/library/editlist.php
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/app/views/navbar/navbar.php b/app/views/navbar/navbar.php
index 951207956dc026441940083438647f9b3deeaa3b..69a9c8289c8947cfb72ab48e0238ba2eddbba802 100644
--- a/app/views/navbar/navbar.php
+++ b/app/views/navbar/navbar.php
@@ -35,7 +35,7 @@
     <nav>
         <div class="icon">AudioLib</div>
         <?php
-        if($lastSegment == 'bookmark'){
+        if($lastSegment == 'bookmark' || $lastSegment == 'bookmarkSearch'){
             $searching = 'bookmarkSearch';
         }
         else{
diff --git a/public/style/403.css b/public/style/403.css
new file mode 100644
index 0000000000000000000000000000000000000000..8d95deca2c4a90bfaebcd8cabf7ea54b953d6295
--- /dev/null
+++ b/public/style/403.css
@@ -0,0 +1,35 @@
+body {
+    justify-content:center;
+    align-items: center;
+    min-height: 100vh;
+    background: #FFF5E1;
+}
+
+.wrapper {
+    text-align: center;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    color: #FFAC7F;
+}
+
+.error{
+    font-family: Helvetica;
+    font-size: 150px;
+    font-weight: 700;
+}
+.text{
+    font-family: Helvetica;
+    font-size: 23px;
+
+}
+.login-link p a {
+    color: #FFAC7F;
+    text-decoration: none;
+    font-weight: 600;
+}
+
+.login-link p a:hover {
+    text-decoration: underline;
+}
\ No newline at end of file
diff --git a/public/style/bookadmin.css b/public/style/bookadmin.css
index 8cdadfd3829132746f8ca6c2999829e0d168de09..70238289791b33951599f23028d0cd2d8288d47d 100644
--- a/public/style/bookadmin.css
+++ b/public/style/bookadmin.css
@@ -137,7 +137,7 @@ body {
     background: black;
     min-height: 100vh;
     margin-left: -270px;
-    margin-top: -85px;
+    margin-top: -90px;
     height: 100%;
     width: 100%;
     position: fixed;
diff --git a/screenshots/add-author.png b/screenshots/add-author.png
new file mode 100644
index 0000000000000000000000000000000000000000..276855d4bf25e962e6eaefacbb8987e0e7bb1d47
Binary files /dev/null and b/screenshots/add-author.png differ
diff --git a/screenshots/add-book.png b/screenshots/add-book.png
new file mode 100644
index 0000000000000000000000000000000000000000..c963cdc34a6c639e12989b698f45ae2d2c429eee
Binary files /dev/null and b/screenshots/add-book.png differ
diff --git a/screenshots/add-user-page.png b/screenshots/add-user-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..df31a55c6a27220b11f1f2f258532fef4b901d14
Binary files /dev/null and b/screenshots/add-user-page.png differ
diff --git a/screenshots/author-page.png b/screenshots/author-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f2033f3ebb3df80b510e25597e994c4786b3294
Binary files /dev/null and b/screenshots/author-page.png differ
diff --git a/screenshots/book-1-search.png b/screenshots/book-1-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c2ba6c607c199756b1913f299f84e02f0d4f1c3
Binary files /dev/null and b/screenshots/book-1-search.png differ
diff --git a/screenshots/book-admin-page.png b/screenshots/book-admin-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..a052901aea1bd36e63949a3dc90701841a28c22b
Binary files /dev/null and b/screenshots/book-admin-page.png differ
diff --git a/screenshots/booklist-page.png b/screenshots/booklist-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..e510f7192ce2720be82ea8564db6da4300fca11c
Binary files /dev/null and b/screenshots/booklist-page.png differ
diff --git a/screenshots/bookmark-page.png b/screenshots/bookmark-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..2cf97c27ec888cb54fe341be72710f77dcb16b53
Binary files /dev/null and b/screenshots/bookmark-page.png differ
diff --git a/screenshots/delete-author.png b/screenshots/delete-author.png
new file mode 100644
index 0000000000000000000000000000000000000000..f55921acac05678820d113767fac09fe0ff3e8d6
Binary files /dev/null and b/screenshots/delete-author.png differ
diff --git a/screenshots/delete-user.png b/screenshots/delete-user.png
new file mode 100644
index 0000000000000000000000000000000000000000..6905637a681a6ca1191e54457e14a79e6a90ccb7
Binary files /dev/null and b/screenshots/delete-user.png differ
diff --git a/screenshots/detail-book.png b/screenshots/detail-book.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd13a2164c150730cbea4dd7eabdb1c2f857d3b6
Binary files /dev/null and b/screenshots/detail-book.png differ
diff --git a/screenshots/edit-author.png b/screenshots/edit-author.png
new file mode 100644
index 0000000000000000000000000000000000000000..9efd9ce3b4a74b932007cf9e3924e28f21ea18f8
Binary files /dev/null and b/screenshots/edit-author.png differ
diff --git a/screenshots/edit-book.png b/screenshots/edit-book.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b4a24f2f069034655827eb1cbbe92489e7694ad
Binary files /dev/null and b/screenshots/edit-book.png differ
diff --git a/screenshots/edit-user.png b/screenshots/edit-user.png
new file mode 100644
index 0000000000000000000000000000000000000000..88c728ab25d957f7ae5577fda8d28cddde5f7722
Binary files /dev/null and b/screenshots/edit-user.png differ
diff --git a/screenshots/login-page.png b/screenshots/login-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..30d7650cc05dcaa38885325a8bb2e97c71f9a1d6
Binary files /dev/null and b/screenshots/login-page.png differ
diff --git a/screenshots/register-page.png b/screenshots/register-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..fccfec10e4bf28cf2557b048393d9f772d2173cd
Binary files /dev/null and b/screenshots/register-page.png differ
diff --git a/screenshots/search-sort-filter.png b/screenshots/search-sort-filter.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0fc63f7d19fbc83d01a3d3729a2af7423f228c9
Binary files /dev/null and b/screenshots/search-sort-filter.png differ
diff --git a/screenshots/user-admin-page.png b/screenshots/user-admin-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2e159a9b4a44c83a60000d415749ad860ec23e1
Binary files /dev/null and b/screenshots/user-admin-page.png differ