diff --git a/admin/server/controllers/systems.js b/admin/server/controllers/systems.js index 190f1ca..6075de4 100644 --- a/admin/server/controllers/systems.js +++ b/admin/server/controllers/systems.js @@ -13,6 +13,42 @@ exports.isLoggedIn = function (req, res, next) { // ------------------------------------------- +exports.listActiveUsers = async function (req,res,next) { + if (!req.user.admin) { + res.status(401); + res.json({ success: false, message: "Not Authorized" }); + return; + } + let users = {}; + let fromDate = new Date(Date.now() - 60 * 60 * 24 * 30 * 1000); + const systems = await System.find({lastActive: {$gte: fromDate}}).populate('userId', "screenName").catch( err => { + console.error("Error - get_systems: " + err.message); + res.json({ + success: false, + message: err + }); + return; + }); + for (let index = 0; index < systems.length; index++) { + const system = systems[index]; + + if (!users.hasOwnProperty(system.userId.toString())) { + const user = await User.findById(system.userId, "_id email firstName lastName lastLogin"); + users[system.userId.toString()] = user.email; + } + + } + + let list = []; + for (const id in users) { + list.push(users[id]); + } + + res.json(list); + return; +} + + exports.listUserSystems = async function (req,res,next) { if (!req.user.admin) { res.status(401); diff --git a/admin/server/index.js b/admin/server/index.js index d6ddb96..8033f75 100644 --- a/admin/server/index.js +++ b/admin/server/index.js @@ -153,6 +153,7 @@ app.get("/groups/:shortName/:groupId?", isLoggedIn, groups.getGroups); app.delete("/groups/:shortName/:groupId", isLoggedIn, groups.deleteGroup); app.get("/systems", isLoggedIn, systems.listSystems) app.get("/admin/systems", isAdmin, systems.listAllSystems) +app.get("/admin/users/active", isAdmin, systems.listActiveUsers) app.get("/admin/users", isAdmin, systems.listUserSystems) app.delete("/systems/:shortName", isLoggedIn, systems.deleteSystem) app.post("/systems/:shortName", [isLoggedIn, systems.ownSystem, systems.validateSystem, systems.updateSystem]) diff --git a/admin/src/ActiveUsers/ActiveUsers.js b/admin/src/ActiveUsers/ActiveUsers.js new file mode 100644 index 0000000..7facb25 --- /dev/null +++ b/admin/src/ActiveUsers/ActiveUsers.js @@ -0,0 +1,37 @@ +import { + Container, + Header, + Table, + Icon +} from "semantic-ui-react"; +import { useGetActiveUsersQuery, } from '../features/api/apiSlice' + + + +// ---------------------------------------------------- +const ActiveUsers = () => { + const { data: users, isSuccess } = useGetActiveUsersQuery(); + + +//https://stackoverflow.com/questions/36559661/how-can-i-dispatch-from-child-components-in-react-redux +//https://stackoverflow.com/questions/42597602/react-onclick-pass-event-with-parameter + + return ( +