From 585e96f288d3da010794b6acfc6ac3b6a0cbfbe9 Mon Sep 17 00:00:00 2001
From: Fawwaz Anugrah Wiradhika Dharmasatya <13520086.std.stei.itb.ac.id>
Date: Wed, 30 Nov 2022 07:58:26 +0700
Subject: [PATCH] fix: fix sorting and filtering and turn it into less bloaty
 (for runtime

---
 Controller/LaguController.php      | 26 ++++++++-
 Controller/SubsciberController.php |  2 +-
 Router/AppRoutes.php               |  1 +
 View/Pages/SearchLagu.php          |  2 +-
 View/Partials/Header.php           |  2 -
 static/js/searchlagu.js            | 91 ++++++++++++------------------
 6 files changed, 61 insertions(+), 63 deletions(-)

diff --git a/Controller/LaguController.php b/Controller/LaguController.php
index 282410c..2536f64 100644
--- a/Controller/LaguController.php
+++ b/Controller/LaguController.php
@@ -127,13 +127,27 @@ const SONG_sIZE = 10;
         }
 
 
+        static function redirectSearchLagu(IRequest $req, IResponse $res){
+            $sortType = $req->getQuery("sortsType")!==null?$req->getQuery("sortsType"):"titleASC";
+            $genre = $req->getQuery("filteredGenre")!==null?$req->getQuery("filteredGenre"):"nofilter";
+            $filteredGenre = strtolower($genre);
+            $queryString = strtolower($req->getQuery("q"));          
+            return $res->redirect("/search?sortsType=$sortType&q=$queryString+&filteredGenre=$filteredGenre");  
+        }
+
         static function searchLagu(IRequest $req,IResponse $res){
             $lagu_db = new Song($req->db);
             $transaction = $lagu_db->transaction();
-            $sortType = $req->getQuery("sortsType");
-            $filteredGenre = strtolower($req->getQuery("filteredGenre"));
+            $sortType = $req->getQuery("sortsType")!==null?$req->getQuery("sortsType"):"titleASC";
+            $genre = $req->getQuery("filteredGenre")!==null?$req->getQuery("filteredGenre"):"nofilter";
+            $filteredGenre = strtolower($genre);
             $lagu = $transaction->select(["*"]);
             $queryString = strtolower($req->getQuery("q"));
+            if($req->getHeader("accept")==="text/html"){
+                $res->setHeader("content-type","text/html");
+                return $res->redirect("/search?sortsType=$sortType&q=$queryString+&filteredGenre=$filteredGenre");
+            }
+            
             if(!is_null($queryString) && strlen($queryString)>0){
                 $lagu->where("LOWER(title) LIKE ?",["%".$queryString."%"]);
             }
@@ -176,7 +190,12 @@ const SONG_sIZE = 10;
         }
     
         if ($page > $total_page) {
-          return $res->redirect("/");
+          if($total_page>0){
+            return $res->redirect("/search?sortsType=$sortType&q=$queryString&filteredGenre=$filteredGenre&page=1");
+          }
+          else{
+            return $res->redirect("/");
+          }
         }
         
             $transaction->commit();
@@ -186,6 +205,7 @@ const SONG_sIZE = 10;
             }
          //   print_r($hasil);
        //     print_r($total_page);
+            print_r($filteredGenre);
             return $res->view("Pages/SearchLagu",
             [ "songs" =>$hasil,
               "sortsType"=>$sortType,
diff --git a/Controller/SubsciberController.php b/Controller/SubsciberController.php
index 98abb2a..7c44346 100644
--- a/Controller/SubsciberController.php
+++ b/Controller/SubsciberController.php
@@ -205,7 +205,7 @@ class SubsciberController {
       ($req->getQuery("limit")>0?$req->getQuery("limit"):SubsciberController::DEFAULT_LIMIT)
       :SubsciberController::DEFAULT_LIMIT;
     $data = SubsciberController::fetchSubscriptions($page,$limit,$user_id,$req->db);
-    if(!$data){
+    if($data===false){
       // return $res->json([
       //   "status"=>"failed",
       //   "message"=>"fetch operations failed",
diff --git a/Router/AppRoutes.php b/Router/AppRoutes.php
index bda1908..7e5bdbb 100644
--- a/Router/AppRoutes.php
+++ b/Router/AppRoutes.php
@@ -27,6 +27,7 @@ class AppRoutes
     $route->route(HttpMethod::Get, "/", [HomeController::class, "homepage"]);
 
     //halaman lihat lagu
+    $route->route(HttpMethod::Get, "/redirect/search", [LaguController::class, "redirectSearchLagu"]);
     $route->route(HttpMethod::Get, "/search", [LaguController::class, "searchLagu"]);
     $route->route(HttpMethod::Post, "/lagu/add", [LaguController::class, "addLagu"]);
     $route->route(HttpMethod::Get, "/lagu/:id", [LaguController::class, "getLagu"]);
diff --git a/View/Pages/SearchLagu.php b/View/Pages/SearchLagu.php
index 5f122a1..2d45bc3 100644
--- a/View/Pages/SearchLagu.php
+++ b/View/Pages/SearchLagu.php
@@ -35,7 +35,7 @@
   <?php foreach($genreList as $_genre){ ?>
      <option 
       value="<?=$_genre["genre"]?>" 
-    <?php if($selectedGenre===$_genre){ ?>
+    <?php if($selectedGenre===strtolower($_genre["genre"])){ ?>
       selected
     <?php } ?>
     >
diff --git a/View/Partials/Header.php b/View/Partials/Header.php
index b75ebc1..96f89c4 100644
--- a/View/Partials/Header.php
+++ b/View/Partials/Header.php
@@ -14,8 +14,6 @@
           <img src="/static/img/search.png" alt="Webtune logo" />
         </div>
         <input type="text" name="q" placeholder="Lagu Dinosaurus" />
-        <input type="hidden" name="sortsType" value="titleASC"/>
-        <input type="hidden" name="filteredGenre" value="nofilter" />
       </label>
     </form>
   </div>
diff --git a/static/js/searchlagu.js b/static/js/searchlagu.js
index 65dd62d..9fbbd27 100644
--- a/static/js/searchlagu.js
+++ b/static/js/searchlagu.js
@@ -3,9 +3,9 @@ const container = document.querySelector("#list__container")
 //const searchBar = document.querySelector("#searchbar")
 const searchBar = document.querySelector(".header__search-bar > input")
 const genreFilter = document.querySelector("#filteredGenre")
+const pagination_number = document.querySelector(".pagination__page")
 //const searchButton = document.querySelector("#searchButton")
 
-
 function regenerateData(data){
     html = ''
     data.forEach(song => {
@@ -32,28 +32,11 @@ function regenerateData(data){
     container.innerHTML = html
 }
 
-async function fetchContent(type){
-    const data = await http.get("/search?sortsType="+type+"&q="+searchBar.value+"&filteredGenre="+genreFilter.value, {
-                json: true,
-                headers: {
-                  "Accept": "application/json"
-                },
-        });
-        const lagu = data["data"]["hasil"]
-        document.querySelector(".pagination__page").innerHTML = "Page "+data["data"]["page"]
-        page = data["data"]["page"]
-        let total_page = data["data"]["total_page"]
-        if(page>total_page){
-            document.querySelector("#next_button").display = "hidden";
-        }
-        if(page<=1){
-            document.querySelector("#prev_button").display = "hidden";
-        }
-    console.log(lagu)
-    container.innerHTML = ''
-    console.log(container)
-    console.log(lagu)
-    regenerateData(lagu)
+async function resortPage(type){
+    let page = pagination_number.innerText.split(" ")[1]
+    let url = `/search?sortsType=${type}&q=${searchBar.value}&filteredGenre=${genreFilter.value}&page=${page}`
+    await http.get(url, {});
+    window.location = url
 }
 
 async function searchResult(query){
@@ -82,35 +65,40 @@ async function searchResult(query){
 }
 
 async function filterSearch(genre){
-    console.log("/search?sortsType="+sort_type_selector.value+"&q="+searchBar.value+"&filteredGenre="+genre)
-    const data = await http.get("/search?sortsType="+sort_type_selector.value+"&q="+searchBar.value+"&filteredGenre="+genre, {
-        json: true,
-        headers: {
-          "Accept": "application/json"
-        },
-    });
-    const lagu = data["data"]["hasil"]
-    document.querySelector(".pagination__page").innerHTML = "Page "+data["data"]["page"]
-    page = data["data"]["page"]
-    let total_page = data["data"]["total_page"]
-    if(page>total_page){
-        document.querySelector("#next_button").display = "hidden";
-    }
-    if(page<=1){
-        document.querySelector("#prev_button").display = "hidden";
-    }
-    console.log(lagu)
-    container.innerHTML = ''
-    console.log(container)
-    console.log(lagu)
-    regenerateData(lagu)
+    let page = pagination_number.innerText.split(" ")[1]
+    let url = `/search?sortsType=${sort_type_selector.value}&q=${searchBar.value}&filteredGenre=${genre}&page=${page}`
+    await http.get(url, {});
+    window.location = url
+
+    // console.log("/search?sortsType="+sort_type_selector.value+"&q="+searchBar.value+"&filteredGenre="+genre)
+    // const data = await http.get("/search?sortsType="+sort_type_selector.value+"&q="+searchBar.value+"&filteredGenre="+genre, {
+    //     json: true,
+    //     headers: {
+    //       "Accept": "application/json"
+    //     },
+    // });
+    // const lagu = data["data"]["hasil"]
+    // document.querySelector(".pagination__page").innerHTML = "Page "+data["data"]["page"]
+    // page = data["data"]["page"]
+    // let total_page = data["data"]["total_page"]
+    // if(page>total_page){
+    //     document.querySelector("#next_button").display = "hidden";
+    // }
+    // if(page<=1){
+    //     document.querySelector("#prev_button").display = "hidden";
+    // }
+    // console.log(lagu)
+    // container.innerHTML = ''
+    // console.log(container)
+    // console.log(lagu)
+    // regenerateData(lagu)
 }
 
 sort_type_selector.onchange = 
 (e)=>{
     type = e.target.value;
     setTimeout(() => {
-        fetchContent(type)
+        resortPage(type)
       }, 100);
 }
 
@@ -119,13 +107,4 @@ genreFilter.onchange = (e)=>{
     setTimeout(()=>{
         filterSearch(genre)
     },100)
-}
-
-/*
-searchButton.onclick = (e)=>
-{
-    query = searchBar.value
-    setTimeout(()=>{
-        searchResult(query)
-    },100)
-}*/
\ No newline at end of file
+}
\ No newline at end of file
-- 
GitLab