From eec7926703861b8ce6de95f7d3d90c55a7a485fc Mon Sep 17 00:00:00 2001
From: Angela Livia Arumsari <16521177@mahasiswa.itb.ac.id>
Date: Tue, 14 Nov 2023 00:45:33 +0700
Subject: [PATCH] feat: add endpoint to get image file

---
 src/App.php                        |  1 +
 src/controllers/FilmController.php | 26 ++++++++++++++++++++++++--
 src/services/FilmService.php       | 15 +++++++++++++++
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/src/App.php b/src/App.php
index 6a15a0f..57bdf84 100644
--- a/src/App.php
+++ b/src/App.php
@@ -41,6 +41,7 @@ class App
     $this->router->addRoute('/films', FilmController::class);
     $this->router->addRoute('/film-details', FilmController::class);
     $this->router->addRoute('/film-polling', FilmController::class);
+    $this->router->addRoute('/film-image', FilmController::class);
     $this->router->addRoute('/search', FilmController::class);
     $this->router->addRoute('/add-film', CreateFilmController::class);
     $this->router->addRoute('/update-film', UpdateFilmController::class);
diff --git a/src/controllers/FilmController.php b/src/controllers/FilmController.php
index ed0d2d1..470f30a 100644
--- a/src/controllers/FilmController.php
+++ b/src/controllers/FilmController.php
@@ -9,6 +9,7 @@ use app\services\FavoriteService;
 use app\services\FilmService;
 use app\services\ReviewService;
 use app\services\UserService;
+use Exception;
 
 class FilmController extends BaseController
 {
@@ -67,13 +68,34 @@ class FilmController extends BaseController
             parent::render($data, 'film-details', "layouts/base");
         } else if ($uri == '/film-polling') {
             $isInitialSync = $_GET['initial'] ?? 'no';
-            error_log($isInitialSync);
             $data = $this->service->polling($isInitialSync);
             $films = [];
             foreach ($data as $film) {
-                $films[] = $film->toResponse();
+                $films[] = array(
+                    'film_id' => $film->film_id,
+                    'image_path' => $film->image_path,
+                    'title' => $film->title);
             }
             response::send_json_response($films);
+        } else if ($uri == '/film-image') {
+            try {
+                $filmID = $_GET['id'];
+                $imagePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $this->service->getImagePath($filmID);
+                header('Content-Description: File Transfer');
+                header('Content-Type: application/octet-stream');
+                header('Content-Disposition: inline; filename="' . basename($imagePath) . '"');
+                header('Expires: 0');
+                header('Cache-Control: must-revalidate');
+                header('Pragma: public');
+                header('Content-Length: ' . filesize($imagePath));
+                readfile($imagePath);
+                exit;
+            }
+            catch (Exception $e) {
+                $msg = $e->getMessage();
+                $data["error_code"] = $msg;
+                response::send_json_response($data, 400);
+            }
         }
     }
 
diff --git a/src/services/FilmService.php b/src/services/FilmService.php
index 1ae946e..65459d4 100644
--- a/src/services/FilmService.php
+++ b/src/services/FilmService.php
@@ -3,6 +3,7 @@
 namespace app\services;
 
 use app\base\BaseService;
+use app\exceptions\BadRequestException;
 use app\models\FilmModel;
 use app\repositories\FilmRepository;
 use PDO;
@@ -74,6 +75,20 @@ class FilmService extends BaseService
     return null;
   }
 
+  public function getImagePath($film_id)
+  {
+    if (!$film_id) {
+      throw new BadRequestException("INVALID_ID");
+    }
+    $film = $this->repository->getById($film_id);
+
+    if ($film) {
+      return "public/" . $film["image_path"]; 
+    }
+
+    throw new BadRequestException("IMAGE_NOT_FOUND");
+  }
+
   public function update($film)
   {
     $arrParams = [];
-- 
GitLab