diff --git a/APIDOCS.md b/APIDOCS.md index 9e122ea..767ae60 100644 --- a/APIDOCS.md +++ b/APIDOCS.md @@ -37,6 +37,7 @@ But in front end, the API will works with session. - POST `/api/messages` for create message. +**use ?limit&skip for skip and limit** - GET `/api/search/users?q=query` find users. - GET `/api/search/threads?q=query&authorID=not_required` find threads. - GET `/api/search/messages?q=query&authorID=not_required` find messages. diff --git a/README.md b/README.md index 71c6623..b839995 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,13 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn ## TO-DO list | To do | Is done? | Priority | | ----- | -------- | -------- | -| Category | 🟡 | MEDIUM | -| Page support for search | 🟡 | LOW | -| IPs of users will add SecretModel | 🔴 | MEDIUM | -| Profile Message | 🔴 | LOW | -| Last seen, last seen info | 🔴 | LOW | -| Better Auth | 🔴 | MEDIUM | -- Fix footer, theme -- Navbar manuel select +| Category | 🟢 | MEDIUM | +| Page support for search | 🟢 | LOW | +| Profile Message | 🟡 | LOW | +| Last seen, last seen info | 🟢 | LOW | +| IPs of users will add SecretModel | ⚪ | MEDIUM | +| Better Auth | ⚪ | MEDIUM | +- Fix footer, theme, sonra - Version info to footer - upload other photos, model for it diff --git a/routes/api/routes/search.js b/routes/api/routes/search.js index ef3e8bb..9918474 100644 --- a/routes/api/routes/search.js +++ b/routes/api/routes/search.js @@ -2,26 +2,36 @@ const { Router } = require("express") const { MessageModel, ThreadModel, UserModel } = require("../../../models"); const app = Router(); +app.use((req, res, next) => { + req.sq = {} + req.so = {} + const limit = Number(req.query.limit); + const skip = Number(req.query.skip); + if (!req.user.admin) req.sq.deleted = false; + if (limit) req.so.limit = limit; + if (skip) req.so.skip = skip; + next(); +}) 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); + const results = await UserModel.find({ ...req.sq, name: { $regex: req.query.q, $options: "i" } }, null, req.so); 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 = {}; + const query = { ...req.sq }; 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); + const results = await MessageModel.find(query, null, req.so) 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 = {}; + const query = { ...req.sq }; 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); + const results = await ThreadModel.find(query, null, req.so) res.complate(results); }); diff --git a/routes/search.js b/routes/search.js index 5f557e4..ee7eb19 100644 --- a/routes/search.js +++ b/routes/search.js @@ -5,28 +5,47 @@ const app = Router(); app.get("/", (req, res) => res.reply("search")); +app.use(async (req, res, next) => { + req.sq = {} + req.page = Number(req.query.page) || 0; + req.so = { limit: 10, skip: req.page * 10 } + if (!req.user?.admin) req.sq.deleted = false; + + next(); +}); + 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 }); + const users = await UserModel.find({ ...req.sq, name: { $regex: req.query.q, $options: "i" } }, null, req.so) + res.reply("users", { + users, page: req.page, + pages: Math.ceil(await UserModel.count(req.sq) / 10) + }); }); app.get("/messages", async (req, res) => { if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); - const query = {}; + const query = { ...req.sq }; 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}); + const messages = await MessageModel.find(query, null, req.so) + res.reply("messages", { + messages, page: req.page, + pages: Math.ceil(await MessageModel.count(query) / 10) + }); }); app.get("/threads", async (req, res) => { if (!Object.values(req.query).length) return res.error(400, "Missing query parameters in request body."); - const query = {}; + const query = { ...req.sq }; 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 }); + const threads = await ThreadModel.find(query, null, req.so) + res.reply("threads", { + threads, + page: null, page: req.page, + pages: Math.ceil(await ThreadModel.count(query) / 10) + }); }); module.exports = app;