diff --git a/public/css/navbar.css b/public/css/navbar.css index 993c2db8f2c03e7132920c45b53f47b0c10a3fe8..80e33119d93bfe21a66a9f6985e9ee4d67081b66 100644 --- a/public/css/navbar.css +++ b/public/css/navbar.css @@ -128,6 +128,10 @@ li { display: none; } +.logo { + font-weight: bolder; +} + @media screen and (max-width: 800px) { .mobile-view { display: flex; diff --git a/src/App.php b/src/App.php index c3ecd1adab5aece3fc2716109213b3568bad381c..c6d9097fede08d91b4dd48b05c57c3d248867a23 100644 --- a/src/App.php +++ b/src/App.php @@ -7,6 +7,7 @@ use app\base\BaseController; use app\controllers\CreateFilmController; use app\controllers\LoginController; use app\controllers\MainController; +use app\controllers\ProfileController; use app\controllers\ReviewController; use app\controllers\RegisterController; use app\controllers\UpdateFilmController; @@ -36,5 +37,6 @@ class App $this->router->addRoute('/register', RegisterController::class); $this->router->addRoute('/add-film', CreateFilmController::class); $this->router->addRoute('/update-film', UpdateFilmController::class); + $this->router->addRoute('/profile', ProfileController::class); } } diff --git a/src/base/BaseController.php b/src/base/BaseController.php index d976e3a2b42d5a94a2b626184ccbb5ae6b90bea9..86d3848bee8974a5d09272ec6a52954c4b4429a5 100644 --- a/src/base/BaseController.php +++ b/src/base/BaseController.php @@ -48,8 +48,12 @@ abstract class BaseController include_once __DIR__ . "/../../views/{$layout}.php"; } - protected static function redirect($url, $statusCode = 303) + protected static function redirect($url, $data = [], $statusCode = 303) { - header('Location: ' . $url, true, $statusCode); + $params = ""; + foreach ($data as $key => $value) { + $params .= "$key=$value&"; + } + header('Location: ' . $url . "?" . $params, true, $statusCode); } } diff --git a/src/controllers/CreateFilmController.php b/src/controllers/CreateFilmController.php index dbd98255fc8530d4fe5fc053d1c3ba48e52178d1..560fad08f5d468ea55dcbde05498f9018aab9c04 100644 --- a/src/controllers/CreateFilmController.php +++ b/src/controllers/CreateFilmController.php @@ -40,7 +40,7 @@ class CreateFilmController extends BaseController { if (!isset($_SESSION['role']) or $_SESSION['role'] != 'admin') { // TODO: make error controller - parent::redirect("/error", 401); + parent::redirect("/error", [], 401); return; } parent::render($urlParams, "create_film", "layouts/base"); diff --git a/src/controllers/ProfileController.php b/src/controllers/ProfileController.php new file mode 100644 index 0000000000000000000000000000000000000000..fc9f2daff2c8a7fc1e2ac74d5372934161fc1a55 --- /dev/null +++ b/src/controllers/ProfileController.php @@ -0,0 +1,73 @@ +<?php + +namespace app\controllers; + +use app\base\BaseController; +use app\exceptions\BadRequestException; +use app\models\UserModel; +use app\Request; +use app\services\UserService; +use Exception; + +class ProfileController extends BaseController +{ + public function __construct() + { + parent::__construct(UserService::getInstance()); + } + + protected function get($urlParams) + { + + $user = $this->service->getById($_SESSION['user_id']); + $data = []; + $data['email'] = $user->email; + $data['username'] = $user->username; + parent::render($data, "profile", "layouts/base"); + } + + protected function post($urlParams) + { + try { + $user = $this->service->getById($_SESSION['user_id']); + $old_pass = $user->password; + + // Get data + $email = $_POST['email']; + $username = $_POST['username']; + $password = $_POST['password'] ? $_POST['password'] : $old_pass; + $confirm_password = $_POST['confirm-password'] ? $_POST['confirm-password'] : $old_pass; + + if ($this->service->isEmailExist($email) and $user->email != $email) { + throw new BadRequestException("Email Already Exists!"); + } + + if ($this->service->isUsernameExist($username) and $user->username != $username) { + throw new BadRequestException("Username Already Exists!"); + } + + if ($password != $confirm_password) { + throw new BadRequestException("Password does not match!"); + } + + $user + ->set('email', $email) + ->set('username', $username) + ->set('password', $_POST['password'] ? password_hash($password, PASSWORD_DEFAULT) : $password); + + // Call service + $response = $this->service->update($user); + echo $response; + $msg = ""; + + $_SESSION['username'] = $username; + $msg = "Successfully updated profile!"; + + // Render response + parent::redirect("/", ["Msg" => $msg]); + } catch (Exception $e) { + $msg = $e->getMessage(); + parent::render(["errorMsg" => $msg], "profile", "layouts/base"); + } + } +} diff --git a/src/controllers/UpdateFilmController.php b/src/controllers/UpdateFilmController.php index 5d82e550aa5830092957aceab14f3631e5d5c95c..31af038d5f9e5aba008f47890fb36399e59e442c 100644 --- a/src/controllers/UpdateFilmController.php +++ b/src/controllers/UpdateFilmController.php @@ -46,10 +46,17 @@ class UpdateFilmController extends BaseController return; } - $film_id = $urlParams['film-id']; + $film_id = $urlParams['film_id']; $film = $this->service->getById($film_id); - - parent::render($film, "update_film", "layouts/base"); + $data = []; + $data['title'] = $film->title; + $data['released_year'] = $film->released_year; + $data['director'] = $film->director; + $data['description'] = $film->description; + $data['cast'] = $film->cast; + $data['genre'] = $film->genre; + + parent::render($data, "update_film", "layouts/base"); } protected function post($urlParams) @@ -59,20 +66,22 @@ class UpdateFilmController extends BaseController return; } try { - $film_id = $urlParams['film-id']; + $film_id = $urlParams['film_id']; $film = $this->service->getById($film_id); // Get data - $film['title'] = $_POST['title']; - $film['released_year'] = $_POST['released-year']; - $film['director'] = $_POST['director']; - $film['description'] = $_POST['description']; - $film['cast'] = $_POST['cast']; - $film['genre'] = $_POST['genre']; + $data = []; + $data['film_id'] = $film->film_id; + $data['title'] = $_POST['title']; + $data['released_year'] = $_POST['released-year']; + $data['director'] = $_POST['director']; + $data['description'] = $_POST['description']; + $data['cast'] = $_POST['cast']; + $data['genre'] = $_POST['genre']; // Check if file is valid if ($_FILES['image-path']['error'] == UPLOAD_ERR_NO_FILE) { - $image_path = $film['image_path']; + $data['image_path'] = $film->image_path; } else { if ($_FILES['image-path']['error'] == UPLOAD_ERR_OK) { $image_tmp = $_FILES['image-path']['tmp_name']; @@ -89,7 +98,7 @@ class UpdateFilmController extends BaseController } if ($_FILES['trailer-path']['error'] == UPLOAD_ERR_NO_FILE) { - $trailer_path = $film['trailer_path']; + $data['trailer_path'] = $film->trailer_path; } else { if ($_FILES['trailer-path']['error'] == UPLOAD_ERR_OK) { $trailer_tmp = $_FILES['trailer-path']['tmp_name']; @@ -107,15 +116,14 @@ class UpdateFilmController extends BaseController // Call service $filmModel = new FilmModel(); - $filmModel->constructFromArray($film); + $filmModel->constructFromArray($data); $response = $this->service->update($filmModel); if ($response) { - var_dump($response); $msg = "Successfully updated film!"; } // Render response - parent::render(["Msg" => $msg], "home", "layouts/base"); + parent::redirect("/", ["Msg" => $msg]); } catch (Exception $e) { $msg = $e->getMessage(); parent::render(["errorMsg" => $msg], "create_film", "layouts/base"); diff --git a/src/services/FilmService.php b/src/services/FilmService.php index e90743a9f2249f0a63dfdbe1b040d5c560f41155..de99aad9df6d7704dae16e2220d3b9415e262e69 100644 --- a/src/services/FilmService.php +++ b/src/services/FilmService.php @@ -59,7 +59,15 @@ class FilmService extends BaseService public function getById($film_id) { - return $this->repository->getById($film_id); + $film = $this->repository->getById($film_id); + + if ($film) { + $filmModel = new filmModel(); + $filmModel->constructFromArray($film); + return $filmModel; + } + + return null; } public function update($film) diff --git a/src/services/UserService.php b/src/services/UserService.php index d9f4ad9e299982db81b784fb81c62f0000c82df8..f3dccab139ba0b3adac590fee428c3b641dbba8f 100644 --- a/src/services/UserService.php +++ b/src/services/UserService.php @@ -119,7 +119,11 @@ class UserService extends BaseService { // $user = (new UserModel())->set('nama', $nama)->set('username', $username)->set('email', $email)->set('password', password_hash($password, PASSWORD_DEFAULT)); $user = new UserModel(); - $user->set('email', $email)->set('username', $username)->set('password', password_hash($password, PASSWORD_DEFAULT))->set('role', $role); + $user + ->set('email', $email) + ->set('username', $username) + ->set('password', password_hash($password, PASSWORD_DEFAULT)) + ->set('role', $role); $id = $this->repository->insert($user, array( 'email' => PDO::PARAM_STR, @@ -187,4 +191,15 @@ class UserService extends BaseService return null; } + + public function update($user) + { + $arrParams = []; + $arrParams['user_id'] = PDO::PARAM_INT; + $arrParams['email'] = PDO::PARAM_STR; + $arrParams['username'] = PDO::PARAM_STR; + $arrParams['password'] = PDO::PARAM_STR; + $arrParams['role'] = PDO::PARAM_STR; + $this->repository->update($user, $arrParams); + } } diff --git a/views/layouts/base.php b/views/layouts/base.php index caa409e20d0892183c530de0cc1abc17e988d3de..e602316656d6b08fb73725225dc16efd44d1da87 100644 --- a/views/layouts/base.php +++ b/views/layouts/base.php @@ -10,6 +10,9 @@ <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap" rel="stylesheet"> + <link rel="preconnect" href="https://fonts.googleapis.com"> + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> + <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet"> <!-- <link rel="stylesheet" href="public/css/lib.css"> <link rel="stylesheet" href="public/css/shared.css"> <link rel="stylesheet" href="public/css/home.css"> --> @@ -27,7 +30,7 @@ <ul class='nav-links'> <div class='menu'> <li class='menu-item'><a href='/'>Home</a></li> - <li class='menu-item'><a href='/film'>Films</a></li> + <li class='menu-item'><a href='/add-film'>Films</a></li> <?php @@ -42,11 +45,11 @@ } } else { $username = $_SESSION['username']; - echo "<p class='profile'><a href='/'> <img src='/public/assets/person.svg'></img> <span>username</span></a></p>"; + echo "<p class='profile'><a href='/profile'> <img src='/public/assets/person.svg'></img> <span>$username</span></a></p>"; echo "<button class='logout-button'><a href='/logout'>Logout</a></button>"; } ?> - + </div> </ul> <!-- <div class='mobile-view'> diff --git a/views/profile.php b/views/profile.php new file mode 100644 index 0000000000000000000000000000000000000000..fb53e08e0138c42802480eb46e067fc52939963e --- /dev/null +++ b/views/profile.php @@ -0,0 +1,31 @@ +<div class="form-container"> + <h2 class="header-title">Profile</h2> + <p class="error-msg"><?php if (isset($errorMsg)) { + echo "$errorMsg"; + } ?></p> + <form class="form" method="post" enctype="multipart/form-data"> + <div class="form-group"> + <label for="email">Email</label> + <br> + <input class="input" type="text" id="email" name="email" value="<?= $email ?>" required> + </div> + <div class="form-group"> + <label for="username">Username</label> + <br> + <input class="input" type="text" id="username" name="username" value="<?= $username ?>" required> + </div> + <div class="form-group"> + <label for="password">Password</label> + <br> + <input class="input" type="password" id="password" name="password"> + </div> + <div class="form-group"> + <label for="confirm-password">Confirm Password</label> + <br> + <input class="input" type="password" id="confirm-password" name="confirm-password"> + </div> + <div class="form-group"> + <button class="button" ctype="submit">Add</button> + </div> + </form> +</div> \ No newline at end of file