From 259ba11f0fe52c5d30431b880e778ba08051336a Mon Sep 17 00:00:00 2001
From: Akif9748 <akif9748@gmail.com>
Date: Sun, 13 Mar 2022 17:12:09 +0300
Subject: [PATCH] Added user delete

---
 README.md                 |  2 ++
 classes/thread.js         |  4 +--
 classes/user.js           | 33 ++++++++++++++-----
 routes/get/users.js       |  6 ++--
 routes/post/login.js      |  3 +-
 routes/post/userDelete.js | 18 +++++++++++
 views/admin.ejs           |  1 +
 views/user.ejs            | 67 +++++++++++++++++++++++----------------
 8 files changed, 92 insertions(+), 42 deletions(-)
 create mode 100644 routes/post/userDelete.js

diff --git a/README.md b/README.md
index e7a57fd..8fb5526 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,8 @@ A forum script written in Node.js.
   - [x] Logout
   - [x] Admin
   - [x] Message count
+  - [x] Delete User
+  - [ ] Singature & About me
 - [ ] Messages
   - [x] Send message
   - [x] Delete message
diff --git a/classes/thread.js b/classes/thread.js
index e2d907a..6acff78 100644
--- a/classes/thread.js
+++ b/classes/thread.js
@@ -17,7 +17,7 @@ module.exports = class Thread {
     }
 
     getId(id = this.id) {
-        const thread = db.get("threads."+id);
+        const thread = db.get("threads").find(t => t.id == id);
         if (!thread) return null;
         this.id = id;
         const { title, author, messages = [], time = new Date().getTime(), deleted = false } = thread;
@@ -27,7 +27,7 @@ module.exports = class Thread {
         this.time = time;
         this.deleted = deleted;
 
-        return this
+        return this;
     }
     takeId(){
 
diff --git a/classes/user.js b/classes/user.js
index 763f1b0..46e90f6 100644
--- a/classes/user.js
+++ b/classes/user.js
@@ -3,26 +3,45 @@ const db = require("quick.db")
 module.exports = class User {
 
 
-    constructor(name = "guest", avatar = "/images/guest.png", time = new Date().getTime(), admin= false) {
+    constructor(name = "guest", avatar = "/images/guest.png", time = new Date().getTime(), admin = false, deleted = false) {
 
         this.name = name;
         this.avatar = avatar;
         this.time = time;
         this.admin = admin;
+        this.deleted = deleted;
+
     }
 
     getId(id = this.id) {
-        const user = db.get("users." + id);
+        const user = db.get("users").find(u => u.id == id);
         if (!user) return null;
         this.id = Number(id);
-        const { name = "guest", avatar = "/images/guest.png", time = new Date().getTime(), admin = false } = user;
+        const { name = "guest", avatar = "/images/guest.png", time = new Date().getTime(), admin = false, deleted = false } = user;
         this.name = name;
         this.avatar = avatar;
-        this.time = time;   
+        this.time = time;
         this.admin = admin;
-        return this
+        this.deleted = deleted;
+        return this ;
+    
     }
-    takeId() {
+
+    getName(name1 = this.name) {
+
+        const user = db.get("users").find(u => u.name == name1);
+        if (!user) return null;
+        this.id = Number(user.id);
+        const { name = "guest", avatar = "/images/guest.png", time = new Date().getTime(), admin = false, deleted = false } = user;
+        this.name = name;
+        this.avatar = avatar;
+        this.time = time;
+        this.admin = admin;
+        this.deleted = deleted;
+        return this ;
+
+    }
+     takeId() {
         let id = db.get("users");
         this.id = id ? id.length : 0;
         return this
@@ -34,8 +53,6 @@ module.exports = class User {
     }
     getLink(id = this.id) {
         return "/users/" + id;
-
-
     }
 
 }
\ No newline at end of file
diff --git a/routes/get/users.js b/routes/get/users.js
index 565820f..e966456 100644
--- a/routes/get/users.js
+++ b/routes/get/users.js
@@ -10,9 +10,9 @@ module.exports = (req, res) => {
 
     if (!id) {
 
-        const users = db.get("users").slice(0, 10);
+        const users = db.get("users").slice(0);
 
-        const links = users.map(user => "/users/" + user.id)
+        const links = users.filter(user=> !user.deleted).map(user => "/users/" + user.id)
         return res.render("users", { users, links, user })
 
     }
@@ -20,7 +20,7 @@ module.exports = (req, res) => {
     const member = new User().getId(id);
 
 
-    if (member) {
+    if (member && (user.admin || !member.deleted)) {
         const message = db.get("messages").filter(message => message.author.id === Number(id)).length
         const thread = db.get("threads").filter(thread => thread.author.id === Number(id)).length
 
diff --git a/routes/post/login.js b/routes/post/login.js
index e5e947e..08ad768 100644
--- a/routes/post/login.js
+++ b/routes/post/login.js
@@ -1,5 +1,6 @@
 const db = require("quick.db");
 const error = require("../../errors/error.js")
+const { User, Message } = require("../../classes/index");
 
 module.exports = (req, res) => {
     req.session.loggedin = false;
@@ -12,7 +13,7 @@ module.exports = (req, res) => {
         if (user) {
             // Authenticate the user
             if (user.key !== password) return error(res, 404, 'Incorrect Password!')
-
+            if (new User().getName(username).deleted) return error(res, 404, 'Incorrect Username and/or Password!')
             req.session.loggedin = true;
             req.session.username = username;
             req.session.userid = user.id;
diff --git a/routes/post/userDelete.js b/routes/post/userDelete.js
new file mode 100644
index 0000000..7d0e0cf
--- /dev/null
+++ b/routes/post/userDelete.js
@@ -0,0 +1,18 @@
+const { User, Message } = require("../../classes/index");
+const error = require("../../errors/error.js");
+
+module.exports = (req, res) => {
+    if (!req.session.loggedin) return res.redirect('/login');
+    const user = new User().getId(req.session.userid);
+    if (!user.admin)
+        return error(res, 403, "You have not got permission for this.");
+
+    const id = req.url.slice(9 + 3)
+    const member = new User().getId(id);
+    if (!member || member.deleted) return error(res, 404, "We have not got any user declared as this id.");
+ 
+    member.deleted = true;
+    member.write();
+    
+    res.redirect("/admin");
+}
\ No newline at end of file
diff --git a/views/admin.ejs b/views/admin.ejs
index efb57a6..799c953 100644
--- a/views/admin.ejs
+++ b/views/admin.ejs
@@ -36,6 +36,7 @@
         <hr>
         <button class="buyuk" type="submit">Make admin!</button>
     </form>
+
     <script>
         if (<%= user2.admin %>) 
             alert("Making admin of '<%= user2.name %>'' is success");
diff --git a/views/user.ejs b/views/user.ejs
index 1ecd7e8..9ffa4c1 100644
--- a/views/user.ejs
+++ b/views/user.ejs
@@ -30,39 +30,50 @@
 
   <!-- Navbar end -->
 
- 
-    <ul>
-      <li>
-        <h1>Avatar:</h1>
-        <img style="width:256px;height:256px;" src=<%=member.avatar %> alt=<%= member.name %>>
-      </li>
 
-      <li>
-        <h2>Name: <%= member.name %>
-        </h2>
-      </li>
-      <li>
-        <h2>Created at:
-          <%= new Date(member.time).toLocaleString() %>
-        </h2>
+  <ul>
+    <li>
+      <h1>Avatar:</h1>
+      <img style="width:256px;height:256px;" src=<%=member.avatar %> alt=<%= member.name %>>
+    </li>
+
+    <li>
+      <h2>Name: <%= member.name %>
+      </h2>
+    </li>
+    <li>
+      <h2>Created at:
+        <%= new Date(member.time).toLocaleString() %>
+      </h2>
 
 
-      </li>
-      <li>
-        <h2>Is admin? <%= member.admin ? "Yes" : "No" %>
-        </h2>
-      </li>
+    </li>
+    <li>
+      <h2>Is admin? <%= member.admin ? "Yes" : "No" %>
+      </h2>
+    </li>
 
-      <li>
-        <h2> Message: <%= counts.message %>
-        </h2>
-      </li>
-      <li>
-        <h2> Thread: <%= counts.thread %>
-        </h2>
-      </li>
-    </ul>
+    <li>
+      <h2> Message: <%= counts.message %>
+      </h2>
+    </li>
+    <li>
+      <h2> Thread: <%= counts.thread %>
+      </h2>
+    </li>
+  </ul>
 
+  <% if (user.admin) {%>
+    <form action="/admin/" method="POST">
+      <input name="userid" type="hidden" value="<%= member.id %>"></input>
+      <button class="buyuk" type="submit">Make admin!</button>
+
+    </form>
+
+    <form action="/userDelete/<%= member.id %>" method="POST">
+      <button class="buyuk" type="submit">Delete user!</button>
+    </form>
+    <% }; %>
 
 </body>