move some admin endpoints to a independent controller

This commit is contained in:
SrGooglo 2023-07-31 11:47:31 +00:00
parent fb171c43c0
commit 0f3c749849
9 changed files with 192 additions and 26 deletions

View File

@ -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,
})
}
}

View File

@ -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
})
}
}

View File

@ -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)
}
}

View File

@ -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())
}
}

View File

@ -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

View File

@ -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)
}
})
}

View File

@ -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)

View File

@ -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)
}

View File

@ -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 },