From d6f301da7210f525075fd3d17dab4018e470fcc9 Mon Sep 17 00:00:00 2001
From: Akif9748 <akif9748@gmail.com>
Date: Sun, 28 Aug 2022 18:19:03 +0300
Subject: [PATCH] thread rendering is updated, guest can view msg

---
 public/css/user.css | 37 +++++++++++++++++++------------------
 public/js/thread.js | 12 ++++--------
 routes/threads.js   | 16 +++++++++++-----
 views/thread.ejs    | 37 +++++++++++++++++++++----------------
 4 files changed, 55 insertions(+), 47 deletions(-)

diff --git a/public/css/user.css b/public/css/user.css
index a0ecc09..55b4b89 100644
--- a/public/css/user.css
+++ b/public/css/user.css
@@ -3,25 +3,26 @@
   font-weight: 700;
 }
 
-.content{
-display: flex;
-flex-direction: column;
-box-shadow: 0 0 5px 0 #bebebe;
-max-width: 900px;
-margin: 0 auto;
-padding:10px;
+.content {
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0 0 5px 0 #bebebe;
+  max-width: 900px;
+  margin: 0 auto;
+  padding: 10px;
 }
 
-.box{
-display: flex;
-align-items: center;
-justify-content: space-between;
-margin: 0 auto;
-max-width: 800px;
-width:100%;
+.box {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin: 0 auto;
+  max-width: 800px;
+  width: 100%;
 }
 
-.box-title, .box-value{
-color: #606060;
-font-weight: 300;
-}
+.box-title,
+.box-value {
+  color: #606060;
+  font-weight: 300;
+}
\ No newline at end of file
diff --git a/public/js/thread.js b/public/js/thread.js
index 77d9e50..97c0c51 100644
--- a/public/js/thread.js
+++ b/public/js/thread.js
@@ -1,12 +1,8 @@
 import request from "./request.js";
-
 const message_div = document.getElementById("messages");
 
-const messages_raw = await fetch(`/api/threads/${message_div.getAttribute("value")}/messages/`).then(res => res.json());
-for (const message of messages_raw)
-    renderMessage(message);
 
-function renderMessage(message) {
+function render_message(message) {
     const messageElement = document.createElement("div");
     messageElement.classList.add("message");
     messageElement.setAttribute("id", "message-" + message.id);
@@ -16,7 +12,7 @@ function renderMessage(message) {
     <h3 style="float:right;">${new Date(message.time).toLocaleString()}</h3>
 
     <h2>
-      <img class="circle" src="${message.author.avatar}" alt="${message.author.name}">
+      <img class="circle" src="${message.author.avatar}">
         <a href="/users/${message.author.id}"> ${message.author.name}</a>:
     </h2>
 
@@ -34,7 +30,7 @@ function renderMessage(message) {
         }
     </div>
     <div style="float: right;">
-    <h3 id="count${message.id}" style="display:inline;">0</h3>
+    <h3 id="count${message.id}" style="display:inline;">${message.reactCount}</h3>
     <a onclick="react('${message.id}', 'like');">+🔼</a>
     <a onclick="react('${message.id}', 'dislike');">-🔽</a>
     </div>
@@ -59,7 +55,7 @@ document.getElementById("send").addEventListener("submit", async e => {
             if (!res) return;
             form.reset();
             res.reactCount = 0;
-            renderMessage(res);
+            render_message(res);
         });
 });
 
diff --git a/routes/threads.js b/routes/threads.js
index b1a03f9..c46c982 100644
--- a/routes/threads.js
+++ b/routes/threads.js
@@ -1,7 +1,7 @@
 const { Router } = require("express");
 const app = Router();
 
-const { ThreadModel } = require("../models")
+const { ThreadModel,MessageModel } = require("../models")
 
 
 app.get("/", async (req, res) => {
@@ -21,11 +21,17 @@ app.get("/:id", async (req, res) => {
     const thread = await ThreadModel.get(id);
     thread.views++;
 
-    if (thread && (req.user?.admin || !thread.deleted)) 
-        res.reply("thread", { thread, scroll: req.query.scroll || false });
-    else
+    if (thread && (req.user?.admin || !thread.deleted)) {
+        const messages = await Promise.all(thread.messages.map(async id => {
+            const message = await MessageModel.get(id)
+            message.content = message.content.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;").replaceAll("\n", "<br>")
+            return req.user?.admin || !message?.deleted ? message.toObject({ virtuals: true }) : null;
+        }));
+
+        res.reply("thread", { thread, messages, scroll: req.query.scroll || false });
+    } else
         res.error(404, "We have not got this thread.");
-    thread.save();    
+    thread.save();
 });
 
 
diff --git a/views/thread.ejs b/views/thread.ejs
index c9a636a..7c59c47 100644
--- a/views/thread.ejs
+++ b/views/thread.ejs
@@ -35,33 +35,38 @@
 
 
         <div id="messages" value="<%= thread.id %>">
-          <% if (!user){ %>
-            <h1>Guests cant view messages!</h1>
-            <% }%>
+       
+            <% messages.filter(Boolean).forEach(message=>{ %>
 
-            <!--EXAMPLE MESSAGE-->
-            <div class="message" id="message-3">
+            <div class="message" id="message-<%= message.id %>">
     
-              <h3 style="float:right;">26.08.2022 15:37:42</h3>
+              <h3 style="float:right;"><%= new Date(message.time).toLocaleString() %> </h3>
           
               <h2>
-                <img class="circle" src="https://cdn.discordapp.com/avatars/539506680140922890/abd74d10aac094fc8a5ad5c86f29fdb9.png?size=1024">
-                  <a href="/users/0"> Akif9748</a>:
+                <img class="circle" src="<%= message.author.avatar %>">
+                  <a href="/users/<%=message.author.id %>"><%=message.author.name %></a>:
               </h2>
           
-              <p>Example message for development</p><br>
-              <div id="message-delete-3">
-                <a onclick="delete_message('3');">DELETE</a>
-                <a onclick="edit_message('3');">EDIT</a>
+              <p><%= message.content%></p><br>
+              <div id="message-delete-<%=message.id %>">
+              
+                <% if (!message.deleted){ %>
+              
+                <a onclick="delete_message('<%=message.id %>');">DELETE</a>
+                <a onclick="edit_message('<%=message.id %>');">EDIT</a>
+                <% }else{ %>
+                  <h3 style="display:inline;">This message has been deleted</h3>
+            <a onclick="undelete_message('<%=message.id %>');">UNDELETE</a>
+                  <% } %>
 
               </div>
               <div style="float: right;">
-                  <h3 id="count3" style="display:inline;">0</h3>
-                  <a onclick="react('3', 'like');">+🔼</a>
-                  <a onclick="react('3', 'dislike');">-🔽</a>
+                  <h3 id="count<%=message.id %>" style="display:inline;"><%=message.reactCount %></h3>
+                  <a onclick="react('<%=message.id %>', 'like');">+🔼</a>
+                  <a onclick="react('<%=message.id %>', 'dislike');">-🔽</a>
               </div>
           </div>
-                      <!--EXAMPLE MESSAGE END-->
+                      <% }); %>
 
         </div>