From b9bc3eb16abdc3e107d909f2e5236c4ee802fbbb Mon Sep 17 00:00:00 2001
From: william <nixon@williams-MacBook-Air.local>
Date: Thu, 26 Oct 2023 17:18:48 +0700
Subject: [PATCH] add api routes

---
 index.php                                 |   8 ++
 src/controllers/api/CatApiController.php  |  59 ++++++++++++
 src/controllers/api/UserApiController.php | 107 ++++++++++++++++++++++
 src/services/UserSrv.php                  |   7 ++
 4 files changed, 181 insertions(+)
 create mode 100644 src/controllers/api/CatApiController.php
 create mode 100644 src/controllers/api/UserApiController.php

diff --git a/index.php b/index.php
index 9342ee3..4bf138e 100644
--- a/index.php
+++ b/index.php
@@ -12,6 +12,8 @@ require_once PROJECT_ROOT_PATH . "/src/controllers/auth/RegisterController.php";
 require_once PROJECT_ROOT_PATH . "/src/controllers/cat/CatController.php";
 require_once PROJECT_ROOT_PATH . "/src/controllers/sightings/SightingController.php";
 require_once PROJECT_ROOT_PATH . "/src/controllers/user/UserController.php";
+require_once PROJECT_ROOT_PATH . "/src/controllers/api/CatApiController.php";
+require_once PROJECT_ROOT_PATH . "/src/controllers/api/UserApiController.php";
 session_start();
 
 $router = new Router();
@@ -29,4 +31,10 @@ $router->route("/sighting/*", SightingController::getInstance(), ["POST" => "aut
 $router->route("/user", UserController::getInstance(), ["GET" => "admin"]);
 $router->route("/user/*", UserController::getInstance(), ["POST" => "admin", "PUT" => "admin", "DELETE" => "admin"]);
 
+$router->route("/api/cat", CatApiController::getInstance(),[]);
+$router->route("/api/cat/*", CatApiController::getInstance(),[]);
+
+$router->route("/api/user", UserApiController::getInstance(),[]);
+$router->route("/api/user/*", UserApiController::getInstance(),[]);
+
 $router->run($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']);
\ No newline at end of file
diff --git a/src/controllers/api/CatApiController.php b/src/controllers/api/CatApiController.php
new file mode 100644
index 0000000..f0a1eaf
--- /dev/null
+++ b/src/controllers/api/CatApiController.php
@@ -0,0 +1,59 @@
+<?php
+
+require_once PROJECT_ROOT_PATH . "/src/bases/BaseController.php";
+require_once PROJECT_ROOT_PATH . "/src/services/CatSrv.php";
+require_once PROJECT_ROOT_PATH . "/src/utils/FileUploader.php";
+require_once PROJECT_ROOT_PATH . "/src/services/SightingSrv.php";
+
+class CatApiController extends BaseController
+{
+    protected static $instance;
+
+    private function __construct($srv)
+    {
+        parent::__construct($srv);
+    }
+
+    public static function getInstance()
+    {
+        if (!isset(self::$instance)) {
+            self::$instance = new static(
+                CatSrv::getInstance()
+            );
+        }
+        return self::$instance;
+    }
+
+    public function get($urlParams)
+    {
+        if (!$urlParams) {
+            // Return all cats in JSON format
+            $cats = $this->srv->getAll([        "search" => $_GET['search'] ?? null,
+            "gender" => $_GET['gender'] ?? null,
+            "spayed" => $_GET['spayed'] ?? null,
+            "order" => $_GET['order'] ?? null,
+            "pageNo" => $_GET['pageNo'] ?? null,
+            "pageSize" => $_GET['pageSize'] ?? null,
+            "isDesc" => $_GET['isDesc'] ?? null]);
+            $responseCats = array_map(function ($cat) {
+                return $cat->toResponse();
+            }, $cats["result"]);
+
+            $response = new BaseResponse(true, $responseCats, "Cats retrieved successfully", 200);
+        } else {
+            // Return a single cat by ID in JSON format
+            $cat_id = $urlParams[0];
+            $cat = $this->srv->getCatById($cat_id)->toResponse();
+
+            if ($cat) {
+                $response = new BaseResponse(true, $cat, "Cat retrieved successfully", 200);
+            } else {
+                $response = new BaseResponse(false, null, "Cat not found", 404);
+            }
+        }
+
+        header('Content-Type: application/json');
+        echo $response->toJSON();
+    }
+
+}
diff --git a/src/controllers/api/UserApiController.php b/src/controllers/api/UserApiController.php
new file mode 100644
index 0000000..3e0d8eb
--- /dev/null
+++ b/src/controllers/api/UserApiController.php
@@ -0,0 +1,107 @@
+<?php
+
+require_once PROJECT_ROOT_PATH . "/src/bases/BaseController.php";
+require_once PROJECT_ROOT_PATH . "/src/services/UserSrv.php";
+
+class UserApiController extends BaseController
+{
+    protected static $instance;
+
+    private function __construct($srv)
+    {
+        parent::__construct($srv);
+    }
+
+    public static function getInstance()
+    {
+        if (!isset(self::$instance)) {
+            self::$instance = new static(
+                UserSrv::getInstance()
+            );
+        }
+        return self::$instance;
+    }
+
+    public function get($urlParams)
+    {
+        if (!$urlParams) {
+            $users = $this->srv->getAll([
+                "order" => "registration_date",
+                "pageNo" => $_GET['pageNo'] ?? 1,
+                "pageSize" => $_GET['pageSize'] ?? 10
+            ]);
+
+            $responseUsers = array_map(function ($user) {
+                return $user->toResponse();
+            }, $users["result"]);
+
+            $_count = $users["count"];
+
+            $response = new BaseResponse(true, $responseUsers, "Cats retrieved successfully", 200);
+        } else {
+           
+            $user_id = $urlParams[0];
+            $user = $this->srv->getById($user_id)->toResponse();
+            
+            if ($user) {
+                $response = new BaseResponse(true, $user, "Cat retrieved successfully", 200);
+            } else {
+                $response = new BaseResponse(false, null, "Cat not found", 404);
+            }
+        }
+        header('Content-Type: application/json');
+        return $response->toJSON();
+    }
+
+    public function post($urlParams)
+    {
+        if ($urlParams) {
+            $userIdFromUrl = $urlParams[0];
+            // $authenticatedUserId = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null;
+
+            // // Check if the authenticated user is authorized to edit the user's data
+            // if (($authenticatedUserId !== $userIdFromUrl)) {
+            //     return (new BaseResponse(false, null, "You are not authorized to edit this user's data", 403))->toJSON();
+            // }
+            $name = $_POST["nama"];
+
+            $updatedUserData = [
+                "nama" => $name,
+            ];
+
+            $user = $this->srv->updateUser($userIdFromUrl, $updatedUserData);
+
+            if ($user) {
+                $response = new BaseResponse(true, $user->toResponse(), "User data updated successfully", 200);
+            } else {
+                $response = new BaseResponse(false, null, "Failed to update user data", 400);
+            }
+
+            return $response->toJSON();
+        }
+        return (new BaseResponse(false, null, "NOT AVAILABLE", 404))->toJSON();
+    }
+
+    public function delete($urlParams)
+    {
+        if ($urlParams) {
+            $userIdToDelete = $urlParams[0];
+            $authenticatedUserId = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null;
+
+            if (!$_SESSION['isAdmin'] && $authenticatedUserId !== $userIdToDelete) {
+                return (new BaseResponse(false, null, "You are not authorized to delete this user", 403))->toJSON();
+            }
+
+            $user = $this->srv->deleteUser($userIdToDelete);
+
+            if ($user) {
+                $response = new BaseResponse(true, $user->toResponse(), "User deleted successfully", 200);
+            } else {
+                $response = new BaseResponse(false, null, "Failed to delete user", 400);
+            }
+
+            return $response->toJSON();
+        }
+        return (new BaseResponse(false, null, "NOT IMPLEMENTED", 404))->toJSON();
+    }
+}
\ No newline at end of file
diff --git a/src/services/UserSrv.php b/src/services/UserSrv.php
index 01270b2..0934822 100644
--- a/src/services/UserSrv.php
+++ b/src/services/UserSrv.php
@@ -69,6 +69,13 @@ class UserSrv extends BaseSrv
     return $user->constructFromArray($sqlRes);
   }
 
+  public function getById($id) {
+    $sqlRes = $this->repository->getById($id);
+    $user = new UserModel();
+
+    return $user->constructFromArray($sqlRes);
+  }
+
   public function getAll($config)
   {
     $order = ["registration_date"];
-- 
GitLab