From 1567a6d48f8538a635ccec4323b12e7c9906ed7d Mon Sep 17 00:00:00 2001
From: Kenneth Ezekiel <88850771+KenEzekiel@users.noreply.github.com>
Date: Sun, 8 Oct 2023 14:06:53 +0700
Subject: [PATCH] fix: update, delete and styling for review

---
 public/css/film-detail.css           |  13 ++-
 public/css/styles.css                |   2 +
 src/base/BaseRepository.php          |  16 +--
 src/controllers/ReviewController.php | 106 +++++++++++-------
 views/film-detail.php                | 155 --------------------------
 views/review.php                     | 157 +++++++++++++++++++++++++++
 6 files changed, 244 insertions(+), 205 deletions(-)
 delete mode 100644 views/film-detail.php
 create mode 100644 views/review.php

diff --git a/public/css/film-detail.css b/public/css/film-detail.css
index d387521..7e12f23 100644
--- a/public/css/film-detail.css
+++ b/public/css/film-detail.css
@@ -2,10 +2,11 @@
   display: flex;
   justify-content: center;
   align-items: center;
+  background-color: black;
 }
 
 .insert-review {
-  background-color: black;
+  background-color: var(--neutral-black, #17181D);
   padding: 2rem 8rem;
 }
 
@@ -39,7 +40,8 @@
 
 .submit-btn button {
   background-color: #5360dc;
-  border-radius: 0.5rem;
+  border:none;
+  border-radius: 8px;
   padding: 0.5rem 1rem;
   font-size: 1rem;
   font-style: normal;
@@ -60,13 +62,14 @@
 }
 
 .delete-btn button {
-  background-color: #404650;
-  border-radius: 0.5rem;
+  background-color: #de2727;
+  border:none;
+  border-radius: 8px;
   padding: 0.5rem 1rem;
   font-size: 1rem;
   font-style: normal;
   font-weight: 500;
-  color: #FB4646;
+  color: #fff;
 }
 
 .stars {
diff --git a/public/css/styles.css b/public/css/styles.css
index 74246b2..3be55bf 100644
--- a/public/css/styles.css
+++ b/public/css/styles.css
@@ -179,6 +179,8 @@ textarea {
   flex-direction: row;
   justify-content: center;
   align-items: center;
+  padding-left: 30px;
+  padding-right: 30px;
 }
 
 .nav-here p {
diff --git a/src/base/BaseRepository.php b/src/base/BaseRepository.php
index 795f04b..7848a3b 100644
--- a/src/base/BaseRepository.php
+++ b/src/base/BaseRepository.php
@@ -221,28 +221,30 @@ abstract class BaseRepository
       return "$key = :$key";
     }, array_keys($arrParams), array_values($arrParams)));
     $primaryKey = $model->get('_primary_key');
-    $sql .= " WHERE $primaryKey = :primaryKey";
-
-    $stmt = $this->pdo->prepare($sql);
-    // Hydrating and sanitizing
-    foreach ($arrParams as $key => $value) {
-      $stmt->bindValue(":$key", $model->get($key), $value);
-    }
 
     if (is_array($primaryKey)) {
+      $sql .= " WHERE ";
       $sql .= implode(" AND ", array_map(function ($key, $value) {
         return "$value = :$value"; // Menggunakan nama parameter yang sesuai
       }, array_keys($primaryKey), array_values($primaryKey)));
 
+      $stmt = $this->pdo->prepare($sql);
+
       foreach ($primaryKey as $key => $value) {
         $stmt->bindValue(":$value", $model->get($value), PDO::PARAM_STR); // Menggunakan nama parameter yang sesuai
       }
     } else {
+      $sql .= " WHERE ";
       $sql .= "$primaryKey = :primaryKey";
       $stmt = $this->pdo->prepare($sql);
       $stmt->bindValue(":primaryKey", $model->get($primaryKey), PDO::PARAM_INT);
     }
 
+    // Hydrating and sanitizing
+    foreach ($arrParams as $key => $value) {
+      $stmt->bindValue(":$key", $model->get($key), $value);
+    }
+
     $stmt->execute();
     return $stmt->rowCount();
   }
diff --git a/src/controllers/ReviewController.php b/src/controllers/ReviewController.php
index 46fb665..6adc263 100644
--- a/src/controllers/ReviewController.php
+++ b/src/controllers/ReviewController.php
@@ -3,21 +3,25 @@
 namespace app\controllers;
 
 use app\base\BaseController;
+use app\exceptions\BadRequestException;
 use app\Request;
 use app\services\ReviewService;
 use app\services\UserService;
 use Exception;
 
-class ReviewController extends BaseController {
+class ReviewController extends BaseController
+{
     protected $userService;
 
-    public function __construct() {
+    public function __construct()
+    {
         parent::__construct(ReviewService::getInstance());
         $this->userService = UserService::getInstance();
     }
 
-    protected function get($urlParams) {
-        $film_id = 1;
+    protected function get($urlParams)
+    {
+        $film_id = $urlParams['film_id'];
         $reviews = $this->service->getAllReviewByFilmId($film_id);
         foreach ($reviews as $review) {
             $user_id = $review->user_id;
@@ -26,41 +30,41 @@ class ReviewController extends BaseController {
         }
         $urlParams["reviews"] = $reviews;
         if (isset($_SESSION['user_id'])) {
-            try {
-                // echo 'MASUK';
+            if (isset($urlParams['isset']) and $urlParams['isset'] == 'yes') {
+                unset($urlParams['errorMsg']);
                 $user_id = $_SESSION['user_id'];
                 $user_review = $this->service->getReviewByUserFilmId($user_id, $film_id);
-                // var_dump($user_review);
                 if (isset($user_review->user_id, $user_review->film_id)) {
                     $urlParams["user_review"] = $user_review;
                 }
-            } catch (Exception $e) {
-                echo $e;
+            } else {
+                if (isset($urlParams['isset']) and $urlParams['isset'] == 'no') {
+                    $user_id = $_SESSION['user_id'];
+                    $user_review = $this->service->getReviewByUserFilmId($user_id, $film_id);
+                    if (isset($user_review)) {
+                        $urlParams['rating'] = $user_review->rating;
+                        $urlParams['notes'] = $review->notes;
+                        $urlParams['published_time'] = $review->published_time;
+                    }
+                }
             }
+            parent::render($urlParams, 'review', 'layouts/base');
+        } else {
+            parent::redirect("/login");
         }
-        parent::render($urlParams, 'film-detail', 'layouts/base');
     }
 
-    protected function post($urlParams) {
+    protected function post($urlParams)
+    {
         if (isset($_SESSION['user_id'])) {
             if (isset($_POST['action'])) {
                 $action = $_POST['action'];
                 if ($action == 'edit') {
                     try {
-                        $user_id = $_SESSION['user_id'];
-                        $film_id = 1;
-                        $review = $this->service->getReviewByUserFilmId($user_id, $film_id);
-                        // GET DATA
-                        $rating = $review->rating;
-                        $notes = $review->notes;
-                        $published_time = $review->published_time;
-                        $review ->set('rating', $rating) ->set('notes', $notes)->set('published_time', $published_time);
-                        $response = $this->service->update($review);
-                        if ($response == 1) {
-                            $msg = "Review updated successfully!";
-                            $urlParams['msg'] = $msg;
-                        }
-                        parent::redirect('/review', $urlParams);
+                        $data = [];
+                        $data['film_id'] = $urlParams['film_id'];
+                        $data['isset'] = 'no';
+                        parent::redirect('/review', $data);
                     } catch (Exception $e) {
                         $msg = $e->getMessage();
                         $urlParams['errorMsg'] = $msg;
@@ -69,16 +73,17 @@ class ReviewController extends BaseController {
                 } elseif ($action == 'delete') {
                     try {
                         $user_id = $_SESSION['user_id'];
-                        $film_id = 1;
+                        $film_id = $urlParams['film_id'];
                         $notes = $this->service->getReviewByUserFilmId($user_id, $film_id);
                         $response = $this->service->deleteByUserFilmId($notes->user_id, $notes->film_id);
                         if ($response == 1) {
                             $msg = "Review deleted successfully";
                             $urlParams['msg'] = $msg;
+                            $urlParams['isset'] = 'no';
                         }
                         parent::redirect("/review", $urlParams);
-                        // parent::render($urlParams, 'film-detail', 'layouts/base');
-                    } catch (Exception $e){
+                        // parent::render($urlParams, 'review', 'layouts/base');
+                    } catch (Exception $e) {
                         $msg = $e->getMessage();
                         $urlParams['errorMsg'] = $msg;
                         parent::redirect("/review", $urlParams);
@@ -86,21 +91,46 @@ class ReviewController extends BaseController {
                 }
             } else {
                 try {
-                    // GET DATA
                     $user_id = $_SESSION['user_id'];
-                    // $film_id = $urlParams['film_id'];
-                    $film_id = 1;
-                    $rating = $_POST['rating'];
-                    $notes = $_POST['notes'];
-                    date_default_timezone_set('Asia/Jakarta');
-                    $published_time = date('Y-m-d H:i:s');
-                    $response = $this->service->create($user_id, $film_id, $rating, $notes, $published_time);
+                    $film_id = $urlParams['film_id'];
+                    $review = $this->service->getReviewByUserFilmId($user_id, $film_id);
+                    if (!isset($_POST['notes']) or !isset($_POST['rating'])) {
+                        throw new BadRequestException("Rating or notes can't be empty!");
+                    }
+                    if ($review == null) {
+                        // No review, user review is empty
+                        // GET DATA
+                        $rating = $_POST['rating'];
+                        $notes = $_POST['notes'];
+                        date_default_timezone_set('Asia/Jakarta');
+                        $published_time = date('Y-m-d H:i:s');
+                        $response = $this->service->create($user_id, $film_id, $rating, $notes, $published_time);
+                        unset($urlParams['msg']);
+                        $urlParams['isset'] = 'yes';
+                        unset($urlParams['errorMsg']);
+                        parent::redirect('review', $urlParams);
+                    } else {
+                        // Has a review, want to update
+                        // GET DATA
+                        $rating = $_POST['rating'];
+                        $notes = $_POST['notes'];
+                        $published_time = $review->published_time;
+                        $review->set('rating', $rating)->set('notes', $notes)->set('published_time', $published_time);
+                        $response = $this->service->update($review);
+                        if ($response == 1) {
+                            $msg = "Review updated successfully!";
+                            $urlParams['msg'] = $msg;
+                        }
+                        $urlParams['isset'] = 'yes';
+                        unset($urlParams['errorMsg']);
+                        parent::redirect('/review', $urlParams);
+                    }
                 } catch (Exception $e) {
                     $msg = $e->getMessage();
-                    parent::render(['errorMsg' => $msg], 'film-detail', 'layouts/base');
+                    $urlParams['errorMsg'] = $msg;
+                    parent::redirect("/review", $urlParams);
                 }
             }
-            parent::render($urlParams, 'film-detail', 'layouts/base');
         } else {
             // parent::render($urlParams, 'login', 'layouts/base');
             parent::redirect("/login");
diff --git a/views/film-detail.php b/views/film-detail.php
deleted file mode 100644
index c6d1f9a..0000000
--- a/views/film-detail.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<html>
-<head>
-    <link rel='stylesheet' href='/public/css/film-detail.css'>
-    <link rel='stylesheet' href='/public/css/styles.css'>
-</head>
-<body>
-<div class='insert-review'>
-    <h2>Write your review</h2>
-    <p class='error-msg'>
-        <?php if (isset($errorMsg)) {
-            echo $errorMsg;
-        } ?>
-    </p>
-    <?php 
-    if (!isset($user_review)) {
-        echo '<form class="review-form" method="post">
-        <div class="review-group">
-            <div class="stars">
-                <label>
-                    <input type="radio" name="rating" value="1" />
-                    <span class="icon">★</span>
-                </label>
-                <label>
-                    <input type="radio" name="rating" value="2" />
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                </label>
-                <label>
-                    <input type="radio" name="rating" value="3" />
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                </label>
-                <label>
-                    <input type="radio" name="rating" value="4" />
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                </label>
-                <label>
-                    <input type="radio" name="rating" value="5" />
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                    <span class="icon">★</span>
-                </label>
-            </div>
-            <br>
-            <input class="input" type="text" id="notes" name="notes" placeholder="Write review here..." required>
-            <br>
-        </div>
-        <div class="submit-btn">
-            <button type="submit">Submit Review</button>
-        </div>
-    </form>';    
-    } else {
-        $rating = $user_review->rating;
-        $notes = $user_review->notes;
-        $film_id = $user_review->film_id;
-        $published_time = $user_review->published_time;
-        $timestamp = strtotime($published_time);
-        $formatted_time = date("j F Y H:i", $timestamp);
-        $user_id = $user_review->user_id;
-        $username = $_SESSION['username'];
-        echo '<div class="review-group">
-            <div class="review-info">
-                <div class="loop">';
-
-        for ($i = 0; $i < 5; $i++) {
-            if ($i < $rating) {
-                echo '<span class="icon-rating">★</span>';
-            } else {
-                echo '<span class="icon-rating-non">★</span>';
-            }
-        }
-
-        echo '</div>
-            <p>by ' . $username . '</p>
-            </div>
-            <h3 class="review-result">' . $notes . '</h3>
-            <h3 class="time">' . $formatted_time . '</h3>
-        </div>
-        <div class="buttons">
-            <div class="submit-btn">
-                <form method="post">
-                    <input type="hidden" name="action" value="edit">
-                    <button type="submit">Edit Review</button>
-                </form>
-            </div>
-            <div class="delete-btn">
-                <form method="post">
-                    <input type="hidden" name="action" value="delete">
-                    <button type="submit">Delete Review</button>
-                </form>
-            </div>
-        </div>';  
-    }
-    ?>
-</div>
-
-<div class='insert-review'>
-    <h2>What people say</h2>
-    <h3>
-    <?php 
-    foreach ($reviews as $review) {
-        $rating = $review->rating;
-        $notes = $review->notes;
-        $film_id = $review->film_id;
-        $published_time = $review->published_time;
-        $timestamp = strtotime($published_time);
-        $formatted_time = date("j F Y H:i", $timestamp);
-        $user_id = $review->user_id;
-        $username = $review->username;
-    ?>
-    </h3>
-    <form class='review-form' method='get'>
-        <div class='review-group'>
-            <div class='review-info'>
-                <div class='loop'>
-                    <?php 
-                    for ($i=0; $i<5; $i++) {
-                        if ($i < $rating) {
-                            echo '<span class="icon-rating">★</span>';
-                        } else {
-                            echo '<span class="icon-rating-non">★</span>';
-                        }
-                    }
-                    ?>
-                </div>
-                <p?>by <?php echo $username; ?></p>
-                <!-- <?php
-                // $user = $this->service->getById($film_id);
-                // $username = $user->$username;
-                // $data = getById($user_id);
-                // $username = $data->$username;
-                // echo "<span>$username</span>"
-                // Cari nama user dengan user_id
-                ?></p> -->
-            </div>
-            <h3 class='review-result'><?php echo $notes; ?></h3>
-            <h3 class='time'><?php echo $formatted_time; ?></h3>
-            
-            <!-- <label name='rating'></label>
-            <label name='notes'></label> -->
-        </div>
-    </form>
-    <?php
-    }
-    ?>
-</div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/views/review.php b/views/review.php
new file mode 100644
index 0000000..a381213
--- /dev/null
+++ b/views/review.php
@@ -0,0 +1,157 @@
+<html>
+
+<head>
+    <link rel='stylesheet' href='/public/css/film-detail.css'>
+    <link rel='stylesheet' href='/public/css/styles.css'>
+</head>
+
+<body>
+    <div class='insert-review'>
+        <h2>Write your review</h2>
+        <p class='error-msg'>
+            <?php if (isset($errorMsg)) {
+                echo $errorMsg;
+            } ?>
+        </p>
+        <?php
+        if (!isset($user_review) or $isset == 'no') {
+            echo '<form class="review-form" method="post">
+        <div class="review-group">
+            <div class="stars">
+                <label>
+                    <input type="radio" name="rating" value="1" />
+                    <span class="icon">★</span>
+                </label>
+                <label>
+                    <input type="radio" name="rating" value="2" />
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                </label>
+                <label>
+                    <input type="radio" name="rating" value="3" />
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                </label>
+                <label>
+                    <input type="radio" name="rating" value="4" />
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                </label>
+                <label>
+                    <input type="radio" name="rating" value="5" />
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                    <span class="icon">★</span>
+                </label>
+            </div>
+            <br>
+            <input class="input" type="text" id="notes" name="notes" placeholder="Write review here..." value="' . (isset($notes) and $notes != "" ? $notes : "") . '"required>
+            <br>
+        </div>
+        <div class="submit-btn">
+            <button type="submit">Submit Review</button>
+        </div>
+    </form>';
+        } else {
+            $rating = $user_review->rating;
+            $notes = $user_review->notes;
+            $film_id = $user_review->film_id;
+            $published_time = $user_review->published_time;
+            $timestamp = strtotime($published_time);
+            $formatted_time = date("j F Y H:i", $timestamp);
+            $user_id = $user_review->user_id;
+            $username = $_SESSION['username'];
+            echo '<div class="review-group">
+            <div class="review-info">
+                <div class="loop">';
+
+            for ($i = 0; $i < 5; $i++) {
+                if ($i < $rating) {
+                    echo '<span class="icon-rating">★</span>';
+                } else {
+                    echo '<span class="icon-rating-non">★</span>';
+                }
+            }
+
+            echo '</div>
+            <p>by ' . $username . '</p>
+            </div>
+            <h3 class="review-result">' . $notes . '</h3>
+            <h3 class="time">' . $formatted_time . '</h3>
+        </div>
+        <div class="buttons">
+            <div class="submit-btn">
+                <form method="post">
+                    <input type="hidden" name="action" value="edit">
+                    <button type="submit">Edit Review</button>
+                </form>
+            </div>
+            <div class="delete-btn">
+                <form method="post">
+                    <input type="hidden" name="action" value="delete">
+                    <button type="submit">Delete Review</button>
+                </form>
+            </div>
+        </div>';
+        }
+        ?>
+    </div>
+
+    <div class='insert-review'>
+        <h2>What people say</h2>
+        <h3>
+            <?php
+            foreach ($reviews as $review) {
+                $rating = $review->rating;
+                $notes = $review->notes;
+                $film_id = $review->film_id;
+                $published_time = $review->published_time;
+                $timestamp = strtotime($published_time);
+                $formatted_time = date("j F Y H:i", $timestamp);
+                $user_id = $review->user_id;
+                $username = $review->username;
+            ?>
+        </h3>
+        <form class='review-form' method='get'>
+            <div class='review-group'>
+                <div class='review-info'>
+                    <div class='loop'>
+                        <?php
+                        for ($i = 0; $i < 5; $i++) {
+                            if ($i < $rating) {
+                                echo '<span class="icon-rating">★</span>';
+                            } else {
+                                echo '<span class="icon-rating-non">★</span>';
+                            }
+                        }
+                        ?>
+                    </div>
+                    <p?>by <?php echo $username; ?></p>
+                        <!-- <?php
+                                // $user = $this->service->getById($film_id);
+                                // $username = $user->$username;
+                                // $data = getById($user_id);
+                                // $username = $data->$username;
+                                // echo "<span>$username</span>"
+                                // Cari nama user dengan user_id
+                                ?></p> -->
+                </div>
+                <h3 class='review-result'><?php echo $notes; ?></h3>
+                <h3 class='time'><?php echo $formatted_time; ?></h3>
+
+                <!-- <label name='rating'></label>
+            <label name='notes'></label> -->
+            </div>
+        </form>
+    <?php
+            }
+    ?>
+    </div>
+</body>
+
+</html>
\ No newline at end of file
-- 
GitLab