dynamic dashboard

pull/1/head
Valentin PUCCETTI 2023-09-11 22:54:59 +02:00
parent 7c6c82f47b
commit c106dd9868
5 changed files with 67 additions and 23 deletions

View File

@ -7,6 +7,7 @@ const databaseService = require('./services/database.service');
require('dotenv').config() require('dotenv').config()
userService = require("./services/users.service"); userService = require("./services/users.service");
serverService = require("./services/server.service");
const User = require('./model/user.model') const User = require('./model/user.model')
const Key = require('./model/key.model') const Key = require('./model/key.model')
@ -59,8 +60,9 @@ app.get("/", (req, res) => {
stats["keys"] = result stats["keys"] = result
Member.count({ where: { userId: req.session.user.id } }).then((result) => { Member.count({ where: { userId: req.session.user.id } }).then((result) => {
stats["groups"] = result stats["groups"] = result
serverService.getServerListForUserId(req.session.user.id).then((servers) => {
res.render('index', { user: req.session.user, stats: stats }) res.render('index', { user: req.session.user, stats: stats, servers: servers })
})
}) })
}) })

View File

@ -6,10 +6,16 @@ var router = express.Router();
router.use('*', (req, res, next) => { router.use('*', (req, res, next) => {
if (req.session.loggedin === true) { if (req.session.loggedin === true) {
User.findOne({ where: { id: req.session.user.id } }).then((result) => { User.findOne({ where: { id: req.session.user.id } }).then((result) => {
if (result.admin === true) { try {
next() if (result.admin === true) {
} else { next()
} else {
res.redirect('/')
}
} catch (e) {
console.log(e)
res.redirect('/') res.redirect('/')
} }
}) })
} else { } else {

View File

@ -23,9 +23,13 @@ router.get("/",async (req, res) => {
router.get("/delete/:userId", (req, res) => { router.get("/delete/:userId", (req, res) => {
try { try {
userService.delUser(req.params.userId).then((result) => { if (req.params.userId != req.session.user.id) {
userService.delUser(req.params.userId).then((result) => {
res.redirect("/admin/users")
})
} else {
res.redirect("/admin/users") res.redirect("/admin/users")
}) }
} catch(e) { } catch(e) {
console.log(e) console.log(e)
} }

View File

@ -72,9 +72,28 @@ async function getServerKeys(server) {
return result return result
} }
async function getServerListForUserId(userId) {
const dump = await sequelize.query('SELECT hostname, username, ip, lastPull FROM servers JOIN accesses ON servers.hostname = accesses.serverHostname JOIN members ON members.groupName = accesses.groupName WHERE userId = \'' + userId + '\'', {});
result = {}
for (x in dump[0]) {
if (dump[0][x].hostname) {
if (!dump[0][x].lastPull) {
dump[0][x].lastPull = ' never'
}
result[(dump[0][x].hostname).toString()] = {
'username': dump[0][x].username,
'ip': dump[0][x].ip,
'lastPull': dump[0][x].lastPull
}
}
}
return result
}
module.exports = { module.exports = {
addServer, addServer,
delServer, delServer,
getServerKeys getServerKeys,
getServerListForUserId
}; };

View File

@ -34,28 +34,41 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-6 col-xl-3 mb-4">
<div class="card shadow border-start-info py-2">
<div class="card-body">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<div class="text-uppercase text-warning fw-bold text-xs mb-1"><span>my servers</span></div>
<div class="row g-0 align-items-center">
<div class="col-auto">
<div class="text-dark fw-bold h5 mb-0 me-3"><span><%= Object.keys(servers).length %></span></div>
</div>
</div>
</div>
<div class="col-auto"><i class="fas fa-hdd fa-2x text-gray-300"></i></div>
</div>
</div>
</div>
</div>
</div> </div>
<div class="card shadow mb-4"> <div class="card shadow mb-4">
<div class="card-header py-3"> <div class="card-header py-3">
<h6 class="text-primary fw-bold m-0">Server list</h6> <h6 class="text-primary fw-bold m-0">Server list</h6>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item"> <% for (x in servers) { %>
<div class="row align-items-center no-gutters"> <li class="list-group-item">
<div class="col me-2"> <div class="row align-items-center no-gutters">
<h6 class="mb-0"><strong>pve-iut.local</strong></h6><span class="text-xs">Granted 10 september 2023</span> <div class="col me-2">
<h6 class="mb-0 text-primary"><strong><%= x %></strong></h6><span class="text-xs"><i class="fas fa-clock"> </i> <b>Last pull:</b> <%= servers[x].lastPull %></span>
</div>
<div class="col-auto"><code><%= servers[x].username %>@<%= servers[x].ip %></code></div>
</div> </div>
<div class="col-auto"><code>root@172.17.0.1</code></div> </li>
</div> <% } %>
</li>
<li class="list-group-item">
<div class="row align-items-center no-gutters">
<div class="col me-2">
<h6 class="mb-0"><strong>vscode.pve-iut.local</strong></h6><span class="text-xs">Granted 10 september 2023</span>
</div>
<div class="col-auto"><code>root@172.17.0.2</code></div>
</div>
</li>
</ul> </ul>
</div> </div>
</div> </div>