diff --git a/README.md b/README.md index 01d3b29..71c6623 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn - Navbar manuel select - Version info to footer - upload other photos, model for it -- black theme is broken ## Major Version History - V4: Caching diff --git a/index.js b/index.js index b37e510..dbeb6d3 100644 --- a/index.js +++ b/index.js @@ -22,8 +22,9 @@ app.use( session({ secret: 'secret', resave: true, saveUninitialized: true }), express.static("public"), express.json(), ipBlock(app.ips), async (req, res, next) => { - req.headers["x-forwarded-for"]; - req.user = await UserModel.get(req.session.userID); + if (req.session.userID) + req.user = await UserModel.findOneAndUpdate({ id: req.session.userID }, { lastSeen: Date.now() }); + res.reply = (page, options = {}, status = 200) => res.status(status) .render(page, { user: req.user, theme: req.user?.theme || def_theme, forum_name, desp, ...options }); diff --git a/models/User.js b/models/User.js index 3805b9f..df946b4 100644 --- a/models/User.js +++ b/models/User.js @@ -10,7 +10,9 @@ const schema = new mongoose.Schema({ edited: { type: Boolean, default: false }, about: { type: String, default: "" }, admin: { type: Boolean, default: false }, - theme: { type: String, default: def_theme } + theme: { type: String, default: def_theme }, + lastSeen: { type: Date, default: Date.now,select:false }, + hideLastSeen: { type: Boolean, default: false } }); @@ -25,6 +27,6 @@ schema.methods.getLink = function (id = this.id) { const model = mongoose.model('user', schema); -model.get = id => model.findOne({ id }); +model.get = (id,select) => model.findOne({ id }).select(select); module.exports = model; \ No newline at end of file diff --git a/routes/api/routes/categories.js b/routes/api/routes/categories.js index 46a9a4d..cac0c3a 100644 --- a/routes/api/routes/categories.js +++ b/routes/api/routes/categories.js @@ -20,12 +20,12 @@ app.get("/", async (req, res) => { }); app.get("/:id", async (req, res) => { - const {category} = req; + const { category } = req; res.complate(category); }); app.patch("/:id", async (req, res) => { - const {category} = req; + const { category } = req; if (req.body.name) category.name = req.body.name; if (req.body.desp) category.name = req.body.name; res.complate(await category.save()); @@ -36,7 +36,7 @@ app.delete("/:id", async (req, res) => { }); app.post("/", async (req, res) => { - const {name,desp} = req.body; + const { name, desp } = req.body; if (!name) return res.error(400, "You have to give a name for the category."); if (await CategoryModel.exists({ name })) return res.error(400, "This category is already opened."); diff --git a/routes/api/routes/users.js b/routes/api/routes/users.js index 1da4624..a974924 100644 --- a/routes/api/routes/users.js +++ b/routes/api/routes/users.js @@ -6,10 +6,10 @@ const multer = require("multer"); const app = Router(); app.param("id", async (req, res, next, id) => { - req.member = await UserModel.get(id); + req.member = await UserModel.get(id, req.user.admin ? "+lastSeen": ""); if (!req.member) return res.error(404, `We don't have any user with id ${id}.`); - + if (req.member.deleted && !req.user?.admin) return res.error(404, `You do not have permissions to view this user with id ${id}.`); diff --git a/routes/users.js b/routes/users.js index dc6396b..195da44 100644 --- a/routes/users.js +++ b/routes/users.js @@ -23,7 +23,7 @@ app.get("/:id/avatar", async (req, res) => { app.get("/:id", async (req, res) => { const user = req.user const { id } = req.params; - const member = await UserModel.get(id); + const member = await UserModel.get(id,"+lastSeen"); if (member && (user?.admin || !member.deleted)) { diff --git a/views/user.ejs b/views/user.ejs index a316b1e..7b1aa41 100644 --- a/views/user.ejs +++ b/views/user.ejs @@ -115,6 +115,12 @@ color: var(--anti);

Created at:

<%= new Date(member.time).toLocaleString() %>

+ <% if(!member.hideLastSeen || user?.admin) {%> +
+

Last seen at:

+

<%= new Date(member.lastSeen).toLocaleString() %>

+
+ <% } %>

Message:

<%= counts.message %>