From 5b2399bec5984181f982cd55b7d3013b2a2477aa Mon Sep 17 00:00:00 2001 From: Akif9748 Date: Thu, 1 Sep 2022 16:23:46 +0300 Subject: [PATCH] Added search --- README.md | 26 ++++++-------------------- public/css/messages.css | 34 ++++++++++++++++++++++++++++++++++ public/css/search.css | 3 +++ routes/api/routes/search.js | 28 ++++++++++++++++++++++++++++ routes/search.js | 31 +++++++++++++++++++++++++++++++ views/extra/navbar.ejs | 10 ++++++---- views/messages.ejs | 33 +++++++++++++++++++++++++++++++++ views/search.ejs | 35 +++++++++++++++++++++++++++++++++++ views/thread.ejs | 2 -- views/threads.ejs | 4 ++++ views/users.ejs | 3 +++ 11 files changed, 183 insertions(+), 26 deletions(-) create mode 100644 public/css/messages.css create mode 100644 public/css/search.css create mode 100644 routes/api/routes/search.js create mode 100644 routes/search.js create mode 100644 views/messages.ejs create mode 100644 views/search.ejs diff --git a/README.md b/README.md index 1e1eba9..db6c729 100644 --- a/README.md +++ b/README.md @@ -31,31 +31,17 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn -## Roadmap -### TO-DO: +## TO-DO list | To do | Is done? | Priority | | ----- | -------- | -------- | -| Profile Message | 🔴 | LOW | -| Search | 🔴 | MEDIUM | +| Search & message a | 🟡 | MEDIUM | | Footer | 🟡 | LOW | -| Better Auth | 🔴 | MEDIUM | | Local pfp store | 🔴 | MEDIUM | | IPs of users will add SecretModel | 🔴 | MEDIUM | - -- message counts for API -- better theme patch UserModel -- ajax, delete update thread dom - -### API -| To do | Is done? -| ----- | -------- -| RATELIMITS | 🟢 -| Get a lots of message & thread & user | 🔴 -| Create message & thread & user | 🟢 -| Get message & thread & user | 🟢 -| Delete message & thread & user | 🟢 -| Undelete message & thread & user | 🟢 -| Edit message & thread & user | 🟢 +| better theme patch UserModel | 🟡 | VERY LOW | +| Category | ⚪ | MEDIUM | +| Profile Message | 🔴 | LOW | +| Better Auth | 🔴 | MEDIUM | ## Major Version History - V4: Caching diff --git a/public/css/messages.css b/public/css/messages.css new file mode 100644 index 0000000..3ad4bc6 --- /dev/null +++ b/public/css/messages.css @@ -0,0 +1,34 @@ +.date { + color: var(--second); +} + +.message { + max-width: 800px; + box-shadow: 0 0 5px 0 var(--box-shadow); + margin: 10px auto; + padding: 20px; + display: flex; + gap: 10px; + position: relative; +} + +.message .left { + text-align: center; + border-right: 2px solid var(--borders); +} + +.message .left img { + width: 100px; + height: 100px; + border-radius: 50%; + margin-right: 5px; +} + +.message .left .username a { + color: var(--t-username); +} + +.content { + width: 70%; + color: var(--reaction-hover); +} \ No newline at end of file diff --git a/public/css/search.css b/public/css/search.css new file mode 100644 index 0000000..af0f326 --- /dev/null +++ b/public/css/search.css @@ -0,0 +1,3 @@ +.search { + padding: 10px; +} \ No newline at end of file diff --git a/routes/api/routes/search.js b/routes/api/routes/search.js new file mode 100644 index 0000000..ef3e8bb --- /dev/null +++ b/routes/api/routes/search.js @@ -0,0 +1,28 @@ +const { Router } = require("express") +const { MessageModel, ThreadModel, UserModel } = require("../../../models"); + +const app = Router(); + +app.get("/users", async (req, res) => { + if (!req.query.q) return res.error(400, "Missing query parameter 'q' in request body."); + const results = await UserModel.find({ name: { $regex: req.query.q, $options: "i" } }).limit(10); + res.complate(results); +}); +app.get("/messages", async (req, res) => { + if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); + const query = {}; + if (req.query.q) query.content = { $regex: req.query.q, $options: "i" }; + if (req.query.authorID) query.authorID = req.query.authorID; + const results = await MessageModel.find(query).limit(10); + res.complate(results); +}); +app.get("/threads", async (req, res) => { + if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); + const query = {}; + if (req.query.q) query.title = { $regex: req.query.q, $options: "i" }; + if (req.query.authorID) query.authorID = req.query.authorID; + const results = await ThreadModel.find(query).limit(10); + res.complate(results); +}); + +module.exports = app; \ No newline at end of file diff --git a/routes/search.js b/routes/search.js new file mode 100644 index 0000000..92b30e6 --- /dev/null +++ b/routes/search.js @@ -0,0 +1,31 @@ +const { UserModel, ThreadModel, MessageModel } = require("../models") +const { Router } = require("express"); + +const app = Router(); + +app.get("/", (req, res) => res.reply("search")); + +app.get("/users", async (req, res) => { + if (!req.query.q) return res.error(400, "Missing query parameter 'q' in request body."); + const users = await UserModel.find({ name: { $regex: req.query.q, $options: "i" } }).limit(10); + res.reply("users", { users, page: null }); +}); +app.get("/messages", async (req, res) => { + if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); + const query = {}; + if (req.query.q) query.content = { $regex: req.query.q, $options: "i" }; + if (req.query.authorID) query.authorID = req.query.authorID; + const messages = await MessageModel.find(query).limit(10); + res.reply("messages",{messages}); +}); +app.get("/threads", async (req, res) => { + if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); + const query = {}; + if (req.query.q) query.title = { $regex: req.query.q, $options: "i" }; + if (req.query.authorID) query.authorID = req.query.authorID; + const threads = await ThreadModel.find(query).limit(10); + res.reply("threads", { threads, page: null }); +}); + +module.exports = app; + diff --git a/views/extra/navbar.ejs b/views/extra/navbar.ejs index 475df87..268cea3 100644 --- a/views/extra/navbar.ejs +++ b/views/extra/navbar.ejs @@ -20,7 +20,7 @@ Logout <%=(user.theme === "default" ? "black" : "default" ) + " mode" %> <% } else { %> @@ -45,15 +45,17 @@ \ No newline at end of file diff --git a/views/messages.ejs b/views/messages.ejs new file mode 100644 index 0000000..338ad04 --- /dev/null +++ b/views/messages.ejs @@ -0,0 +1,33 @@ + + + +<%- include("extra/meta", {title:"Message search!" }) %> + + + + <%- include("extra/navbar") %> + + +
+ + <% messages.filter(Boolean).forEach(message=>{ %> + +
+
+ + +
+ <%= new Date(message.time).toLocaleDateString() %> +
+
+ <%= new Date(message.time).toLocaleTimeString() %> +
+
+
<%- message.content %>
+
+ + <% }); %> +
+ + + \ No newline at end of file diff --git a/views/search.ejs b/views/search.ejs new file mode 100644 index 0000000..cf6e917 --- /dev/null +++ b/views/search.ejs @@ -0,0 +1,35 @@ + + + +<%- include("extra/meta", {title: "Search page!" }) %> + + + + <%- include("extra/navbar") %> + + + + + + + + + + \ No newline at end of file diff --git a/views/thread.ejs b/views/thread.ejs index fa1adec..80ef2d9 100644 --- a/views/thread.ejs +++ b/views/thread.ejs @@ -25,8 +25,6 @@
- - <% if (user && !thread.deleted){ %> DELETE diff --git a/views/threads.ejs b/views/threads.ejs index af13387..c404433 100644 --- a/views/threads.ejs +++ b/views/threads.ejs @@ -33,6 +33,8 @@ <% }); %>
+ <% if(typeof page === "number"){ %> + + <% } %> + \ No newline at end of file diff --git a/views/users.ejs b/views/users.ejs index 43b6b1c..ee34bc8 100644 --- a/views/users.ejs +++ b/views/users.ejs @@ -24,6 +24,7 @@ <% }); %> + <% if(typeof page === "number"){ %> + <% } %> + \ No newline at end of file