From f4836368811023c774d88d898208ff1d31527c23 Mon Sep 17 00:00:00 2001
From: SulthanDA28 <13521159@std.stei.itb.ac.id>
Date: Sat, 11 Nov 2023 05:13:13 +0700
Subject: [PATCH] add click post in home and like integration

---
 src/app/controllers/Home/LikeController.php | 26 ++++++++++
 src/app/models/HomeModel.php                | 31 +++++++++++-
 src/app/view/home.php                       |  2 +-
 src/app/view/post.php                       | 25 ++++++++++
 src/index.php                               |  5 +-
 src/public/css/home.css                     | 53 +++++++++++++++++++--
 src/public/js/home.js                       | 43 +++++++++++++++++
 src/public/js/post.js                       |  8 ++++
 8 files changed, 187 insertions(+), 6 deletions(-)
 create mode 100644 src/app/controllers/Home/LikeController.php
 create mode 100644 src/app/view/post.php
 create mode 100644 src/public/js/post.js

diff --git a/src/app/controllers/Home/LikeController.php b/src/app/controllers/Home/LikeController.php
new file mode 100644
index 0000000..37a67a2
--- /dev/null
+++ b/src/app/controllers/Home/LikeController.php
@@ -0,0 +1,26 @@
+<?php
+
+require_once SRC_ROOT_PATH . "/app/baseclasses/BaseController.php";
+require_once SRC_ROOT_PATH . "/app/models/HomeModel.php";
+class LikeController extends BaseController{
+    protected static $instance;
+    public static function getInstance(){
+        if(!isset(self::$instance)){
+            self::$instance = new static(HomeModel::getInstance());
+        }
+        return self::$instance;
+    }
+    public function post($urlParams){
+        $post_id = $_POST['post_id'];
+        $owner = $_POST['owner'];
+        $result = $this->srv->likes($post_id,$owner);
+        if($result){
+            return json_encode(array('status' => 'success'));
+        }
+        else{
+            return json_encode(array('status' => 'failed'));
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/src/app/models/HomeModel.php b/src/app/models/HomeModel.php
index f58dfd2..bbc6d68 100644
--- a/src/app/models/HomeModel.php
+++ b/src/app/models/HomeModel.php
@@ -19,7 +19,7 @@ class HomeModel
         try{
             $db = PDOHandler::getInstance()->getPDO();
             $page = $page * 10;
-            $sql = "SELECT * FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id ORDER BY p.post_id DESC LIMIT 10 OFFSET $page";
+            $sql = "SELECT p.post_id,u.id,u.username,u.profile_name,u.profile_picture_path,p.body,pr.path FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id ORDER BY p.post_id DESC LIMIT 10 OFFSET $page";
             $count = "SELECT COUNT(*) as count FROM posts as p LEFT JOIN post_resources as pr ON p.post_id=pr.post_id AND p.owner_id=pr.post_owner_id JOIN users as u ON p.owner_id=u.id ";
             $result = $db->query($sql);
             $result2 = $db->query($count);
@@ -41,6 +41,35 @@ class HomeModel
         }
         
     }
+    public function likes($post_id,$owner){
+        try{
+            $user_id = $_SESSION['user_id'];
+            $db = PDOHandler::getInstance()->getPDO();
+            $sql = "INSERT INTO likes (post_id,post_owner_id,user_id) VALUES ($post_id,$owner,$user_id)";
+            $check = "SELECT * FROM likes WHERE post_id=$post_id AND post_owner_id=$owner AND user_id=$user_id";
+            $result2 = $db->query($check);
+            if($result2){
+                $result = $result2->fetchAll(PDO::FETCH_ASSOC);
+                if(count($result) > 0){
+                    return false;
+                }
+                else{
+                    $result = $db->query($sql);
+                    if($result){
+                        return true;
+                    }
+                    else{
+                        return false;
+                    }
+                }
+            }
+            else{
+                return false;
+            }
+        }catch(Exception $e){
+            return false;
+        }
+    }
 }
 
 ?>
\ No newline at end of file
diff --git a/src/app/view/home.php b/src/app/view/home.php
index e17783b..158fa87 100644
--- a/src/app/view/home.php
+++ b/src/app/view/home.php
@@ -4,13 +4,13 @@ require_once PAGE_PATH . "/templates/navbar.php";
 
 <!DOCTYPE html>
 <html>
-
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Home</title>
     <link rel="stylesheet" href="/public/css/home.css" />
     <link rel="stylesheet" href="/public/css/shared.css" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css">
 </head>
 
 <body>
diff --git a/src/app/view/post.php b/src/app/view/post.php
new file mode 100644
index 0000000..a29bff1
--- /dev/null
+++ b/src/app/view/post.php
@@ -0,0 +1,25 @@
+<?php
+require_once PAGE_PATH . "/templates/navbar.php";
+?>
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <link rel="stylesheet" href="/public/css/home.css" />
+    <link rel="stylesheet" href="/public/css/shared.css" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+</head>
+<body>
+    <div class="layout">
+    <?php
+      echo Navbar();
+    ?>
+    <div id="test">
+        test
+    </div>
+  </div>
+    <script src="/public/js/post.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/index.php b/src/index.php
index d66c2c3..464d3ef 100644
--- a/src/index.php
+++ b/src/index.php
@@ -17,6 +17,7 @@ require_once CONTROLLER_PATH . "/Admin/UnbanController.php";
 require_once CONTROLLER_PATH . "/Admin/SetAdmin.php";
 require_once CONTROLLER_PATH . "/Admin/DeleteUserController.php";
 require_once CONTROLLER_PATH . "/Home/GetPostController.php";
+require_once CONTROLLER_PATH . "/Home/LikeController.php";
 
 require_once CONTROLLER_PATH . "/Page/HomePage.php";
 require_once CONTROLLER_PATH . "/Page/LoginPage.php";
@@ -44,6 +45,8 @@ $router->addHandler("/api/unban", UnbanController::getInstance(), []);
 $router->addHandler("/api/setadmin", SetAdminController::getInstance(), []);
 $router->addHandler("/api/deleteuser", DeleteUserController::getInstance(), []);
 $router->addHandler("/api/getpost/*", GetPostController::getInstance(), []);
+$router->addHandler("/api/like", LikeController::getInstance(), []);
+
 
 $router->addHandler("/", HomePage::getInstance(), []);
 $router->addHandler("/login", LoginPage::getInstance(), []);
@@ -53,6 +56,6 @@ $router->addHandler("/*", UserPage::getInstance(), []);
 $router->addHandler("/settings/*", SettingsPage::getInstance(), [CheckLogin::getInstance()]);
 $router->addHandler("/admin/*", AdminPage::getInstance(), [CheckAdmin::getInstance()]);
 $router->addHandler("/admin/unban/*", AdminPageUnban::getInstance(), [CheckAdmin::getInstance()]);
-$router->addHandler("/*/status/*", PostPage::getInstance(), []);
+$router->addHandler("/post/*/*", PostPage::getInstance(), []);
 
 $router->run($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']);
\ No newline at end of file
diff --git a/src/public/css/home.css b/src/public/css/home.css
index 6bc067b..d918d01 100644
--- a/src/public/css/home.css
+++ b/src/public/css/home.css
@@ -35,20 +35,22 @@
     position: absolute;
     top: 10%;
     left: 40%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
 }
 
 .box {
     border: 2px solid #333;
     padding: 20px;
-    max-width: 100%;
+    max-width: 600px;
     margin-top: 10px;
     display: flex;
     flex-direction: column;
-    width: 500%;
+    width: 600px;
     word-wrap: break-word; 
     overflow: hidden;
     border-radius: 20px;
-
 }
 
 img {
@@ -73,6 +75,12 @@ img {
     max-width: 100%;
     border-bottom: 1px solid #333;
 }
+.iden:hover{
+    cursor: pointer;
+}
+.isitext:hover{
+    cursor: pointer;
+}
 .kolom{
     display: flex;
     flex-direction: column;
@@ -143,4 +151,43 @@ img {
 
     font-weight: 600;
     color: #fff;
+}
+.like-button {
+    padding: 10px 20px;
+    background-color: #007bff;
+    color: #fff;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+    font-size: 16px;
+}
+
+.share-button {
+    padding: 10px 20px;
+    background-color: #3b5998;
+    color: #fff;
+    border: none;
+    border-radius: 5px;
+    cursor: pointer;
+    font-size: 16px;
+}
+.like-button:hover, .share-button:hover {
+    background-color: #0056b3;
+}
+
+.like-button:focus, .share-button:focus {
+    box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
+}
+
+.like-button, .share-button {
+    text-align: center;
+}
+
+.like-button i, .share-button i {
+    margin-right: 5px; 
+}
+
+.button-container {
+    display: flex;
+    align-items: center;
 }
\ No newline at end of file
diff --git a/src/public/js/home.js b/src/public/js/home.js
index 54925e7..8c2f589 100644
--- a/src/public/js/home.js
+++ b/src/public/js/home.js
@@ -27,6 +27,7 @@ function createPost(data,totalsemuapage,pagenow){
         identitas.classList.add('iden');
         identitas.appendChild(fotoprofile);
         identitas.appendChild(simpanidentitas);
+        identitas.addEventListener('click',function(){gotoProfile(element.id)});
 
         const box = document.createElement('div');
         box.classList.add('box');
@@ -34,6 +35,8 @@ function createPost(data,totalsemuapage,pagenow){
 
         const isitext = document.createElement('p');
         isitext.textContent = element.body;
+        isitext.classList.add('isitext');
+        isitext.addEventListener('click',function(){gotoPost(element.post_id,element.id)});
         box.appendChild(isitext);
         var pathToRemove = "/var/www/html";
         var path = element.path;
@@ -63,6 +66,16 @@ function createPost(data,totalsemuapage,pagenow){
                 box.appendChild(isiaudio);
             }
         }
+        const logolike = document.createElement('i');
+        logolike.classList.add('fas','fa-thumbs-up');
+        const like = document.createElement('button');
+        like.classList.add('like-button');
+        like.addEventListener('click',function(){likeId(element.post_id,element.id)});
+        like.appendChild(logolike);
+        const buatbutton = document.createElement('div');
+        buatbutton.classList.add('button-container');
+        buatbutton.appendChild(like);
+        box.appendChild(buatbutton);
         post.appendChild(box);
     });
     const list = document.createElement('ul');
@@ -72,6 +85,36 @@ function createPost(data,totalsemuapage,pagenow){
     post.appendChild(pagination);
     makePagination(totalsemuapage,pagenow);
 }
+function gotoPost(postid,ownerid){
+    console.log(postid,"post");
+    window.location.href = "/post/"+ownerid+"/"+postid;
+}
+function gotoProfile(userid){
+    console.log(userid,"user");
+}
+function likeId(postid,userid){
+    console.log("like",postid);
+    const xhr = new XMLHttpRequest();
+    const url = '/api/like';
+    xhr.open('POST', url, true);
+    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+    xhr.onreadystatechange = function () {
+        if (xhr.readyState === 4) {
+        if (xhr.status === 200) {
+            const response = JSON.parse(xhr.responseText);
+            if(response.status==="failed"){
+                alert("Failed to like post");
+            }
+            else if(response.status==="success"){
+                console.log(response);
+            }
+        } else {
+            console.error('Gagal melakukan permintaan');
+        }
+        }
+    };
+    xhr.send(`post_id=${encodeURIComponent(postid)}&owner=${encodeURIComponent(userid)}`);
+}
 const xhr = new XMLHttpRequest();
 const url = '/api/getpost/0';
 
diff --git a/src/public/js/post.js b/src/public/js/post.js
new file mode 100644
index 0000000..8f4ee6a
--- /dev/null
+++ b/src/public/js/post.js
@@ -0,0 +1,8 @@
+let currUrl = window.location.href;
+currUrl = currUrl.split('/');
+postid = currUrl[currUrl.length-1];
+ownerid = currUrl[currUrl.length-2];
+console.log(postid);
+console.log(ownerid);
+const ambil = document.getElementById('test');
+ambil.textContent = postid;
-- 
GitLab