diff --git a/packages/server/src/controllers/AdminController/endpoints/accounts_statistics.js b/packages/server/src/controllers/AdminController/endpoints/accounts_statistics.js new file mode 100644 index 00000000..a2bf9566 --- /dev/null +++ b/packages/server/src/controllers/AdminController/endpoints/accounts_statistics.js @@ -0,0 +1,58 @@ +import { User, Session, Post } from "@shared-classes/DbModels" + +export default { + method: "GET", + route: "/accounts_statistics", + middlewares: ["withAuthentication", "onlyAdmin"], + fn: async (req, res) => { + // get number of users registered, + const users = await User.count() + + // calculate the last 5 days logins from diferent users + let last5D_logins = await Session.find({ + date: { + $gte: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000), + $lte: new Date(), + } + }) + + const last5D_logins_counts = [] + + // filter from different users + last5D_logins.forEach((session) => { + if (!last5D_logins_counts.includes(session.user_id)) { + last5D_logins_counts.push(session.user_id) + } + }) + + // calculate active users within 1 week (using postings) + const active_1w_posts_users = await Post.count({ + user_id: { + $in: last5D_logins_counts + }, + created_at: { + $gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), + $lte: new Date(), + } + }) + + // calculate total posts + const total_posts = await Post.count() + + // calculate total post (1week) + const total_posts_1w = await Post.count({ + created_at: { + $gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), + $lte: new Date(), + } + }) + + return res.json({ + accounts_registered: users, + last5D_logins: last5D_logins_counts.length, + active_1w_posts_users: active_1w_posts_users, + total_posts: total_posts, + total_posts_1w: total_posts_1w, + }) + } +} \ No newline at end of file diff --git a/packages/server/src/controllers/AdminController/endpoints/delete_featured_wallpaper.js b/packages/server/src/controllers/AdminController/endpoints/delete_featured_wallpaper.js new file mode 100644 index 00000000..529638d1 --- /dev/null +++ b/packages/server/src/controllers/AdminController/endpoints/delete_featured_wallpaper.js @@ -0,0 +1,26 @@ +import { FeaturedWallpaper } from "@shared-classes/DbModels" + +export default { + method: "DELETE", + route: "/featured_wallpaper/:id", + middlewares: ["withAuthentication", "onlyAdmin"], + fn: async (req, res) => { + const id = req.params.id + + const wallpaper = await FeaturedWallpaper.findById(id) + + if (!wallpaper) { + return res.status(404).json({ + error: "Cannot find wallpaper" + }) + } + + await FeaturedWallpaper.deleteOne({ + _id: id + }) + + return res.json({ + done: true + }) + } +} \ No newline at end of file diff --git a/packages/server/src/controllers/AdminController/endpoints/featured_wallpaper.js b/packages/server/src/controllers/AdminController/endpoints/featured_wallpaper.js new file mode 100644 index 00000000..35fa8cd2 --- /dev/null +++ b/packages/server/src/controllers/AdminController/endpoints/featured_wallpaper.js @@ -0,0 +1,39 @@ +import { FeaturedWallpaper } from "@shared-classes/DbModels" +import momentTimezone from "moment-timezone" + +export default { + method: "PUT", + route: "/featured_wallpaper", + middlewares: ["withAuthentication", "onlyAdmin"], + fn: async (req, res) => { + const data = req.body.wallpaper + + if (!data) { + return res.status(400).json({ + error: "Invalid data" + }) + } + + // try to find if data._id exists, else create a new one + let wallpaper = null + + if (data._id) { + wallpaper = await FeaturedWallpaper.findOne({ + _id: data._id + }) + } else { + wallpaper = new FeaturedWallpaper() + } + + const current_timezone = momentTimezone.tz.guess() + + wallpaper.active = data.active ?? wallpaper.active ?? true + wallpaper.date = data.date ?? momentTimezone.tz(Date.now(), current_timezone).format() + wallpaper.url = data.url ?? wallpaper.url + wallpaper.author = data.author ?? wallpaper.author + + await wallpaper.save() + + return res.json(wallpaper) + } +} \ No newline at end of file diff --git a/packages/server/src/controllers/AdminController/endpoints/update_user_data.js b/packages/server/src/controllers/AdminController/endpoints/update_user_data.js new file mode 100644 index 00000000..5072d54e --- /dev/null +++ b/packages/server/src/controllers/AdminController/endpoints/update_user_data.js @@ -0,0 +1,35 @@ +import { User } from "@shared-classes/DbModels" + +export default { + method: "POST", + route: "/update_data/:user_id", + middlewares: ["withAuthentication", "onlyAdmin"], + fn: async (req, res) => { + const targetUserId = req.params.user_id + + const user = await User.findById(targetUserId).catch((err) => { + return false + }) + + if (!user) { + return res.status(404).json({ error: "No user founded" }) + } + + const updateKeys = Object.keys(req.body.update) + + updateKeys.forEach((key) => { + user[key] = req.body.update[key] + }) + + await user.save() + + global.websocket_instance.io.emit(`user.update`, { + ...user.toObject(), + }) + global.websocket_instance.io.emit(`user.update.${targetUserId}`, { + ...user.toObject(), + }) + + return res.json(user.toObject()) + } +} \ No newline at end of file diff --git a/packages/server/src/controllers/PublicController/endpoints/featuredWallpapers.js b/packages/server/src/controllers/PublicController/endpoints/featuredWallpapers.js index 9545fcf0..74082ff9 100755 --- a/packages/server/src/controllers/PublicController/endpoints/featuredWallpapers.js +++ b/packages/server/src/controllers/PublicController/endpoints/featuredWallpapers.js @@ -4,9 +4,19 @@ export default { method: "GET", route: "/featured_wallpapers", fn: async (req, res) => { - const featuredWallpapers = await FeaturedWallpaper.find({}) + const { all } = req.query + + const query = { + active: true + } + + if (all) { + delete query.active + } + + const featuredWallpapers = await FeaturedWallpaper.find(query) .sort({ date: -1 }) - .limit(10) + .limit(all ? undefined : 10) .catch(err => { return res.status(500).json({ error: err.message diff --git a/packages/server/src/controllers/PublicController/endpoints/newFeaturedWallpaper.js b/packages/server/src/controllers/PublicController/endpoints/newFeaturedWallpaper.js deleted file mode 100755 index 64bd8ae3..00000000 --- a/packages/server/src/controllers/PublicController/endpoints/newFeaturedWallpaper.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Schematized } from "@lib" -import { FeaturedWallpaper } from "@shared-classes/DbModels" - -export default { - method: "POST", - route: "/featured_wallpaper", - middlewares: ["withAuthentication", "onlyAdmin"], - fn: Schematized({ - select: ["url", "date", "author"], - required: ["url"], - }, async (req, res) => { - const newFeaturedWallpaper = new FeaturedWallpaper(req.selection) - - const result = await newFeaturedWallpaper.save().catch((err) => { - res.status(400).json({ message: err.message }) - return null - }) - - if (result) { - return res.json(newFeaturedWallpaper) - } - }) -} \ No newline at end of file diff --git a/packages/server/src/controllers/SearchController/endpoints/getSearch.js b/packages/server/src/controllers/SearchController/endpoints/getSearch.js index 0f28f83e..df766564 100644 --- a/packages/server/src/controllers/SearchController/endpoints/getSearch.js +++ b/packages/server/src/controllers/SearchController/endpoints/getSearch.js @@ -47,8 +47,24 @@ export default { } ] + let selectedSearchers = [] + + if (!Array.isArray(params.select)) { + selectedSearchers = searchers + } else { + const findedSearchers = [] + + for (const searcher of searchers) { + if (params.select.includes(searcher.id)) { + findedSearchers.push(searcher) + } + } + + selectedSearchers = findedSearchers + } + await pmap( - searchers, + selectedSearchers, async (searcher) => { let results = await searcher.model.find(searcher.query) .limit(searcher.limit ?? 5) diff --git a/packages/server/src/controllers/UserController/endpoints/getUserData.js b/packages/server/src/controllers/UserController/endpoints/getUserData.js index e4c9b917..b0901c0a 100755 --- a/packages/server/src/controllers/UserController/endpoints/getUserData.js +++ b/packages/server/src/controllers/UserController/endpoints/getUserData.js @@ -28,6 +28,10 @@ export default { return res.status(404).json({ error: "User not exists" }) } + if (req.user.roles.includes("admin")) { + return res.json(user) + } + if (req.user._id.toString() !== user._id.toString()) { user = lodash.pick(user, publicGetters) } diff --git a/shared/classes/DbModels/featuredWallpaper/index.js b/shared/classes/DbModels/featuredWallpaper/index.js index c6e3701b..74fe331e 100755 --- a/shared/classes/DbModels/featuredWallpaper/index.js +++ b/shared/classes/DbModels/featuredWallpaper/index.js @@ -2,6 +2,7 @@ export default { name: "FeaturedWallpaper", collection: "featuredWallpapers", schema: { + active: { type: Boolean, default: true }, date: { type: Date, default: Date.now }, url: { type: String, required: true }, author: { type: String },