bug fix when multiple memberships & minors

pull/1/head
Valentin PUCCETTI 2023-09-10 22:22:28 +02:00
parent a3b8a865fd
commit c8efefdc4e
9 changed files with 108 additions and 70 deletions

View File

@ -65,7 +65,6 @@ app.get("/login", (req, res) => {
app.use('/admin/', require('./routes/admin.route')); app.use('/admin/', require('./routes/admin.route'));
app.use('/auth/', require('./routes/auth.route')); app.use('/auth/', require('./routes/auth.route'));
app.use('/keys/', require('./routes/keys.route')); app.use('/keys/', require('./routes/keys.route'));

View File

@ -6,11 +6,9 @@ class Member extends Model {}
Member.init({ Member.init({
groupName: { groupName: {
type: DataTypes.STRING, type: DataTypes.STRING,
required: true,
}, },
userId: { userId: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
required: true,
}, },
role: { role: {
type: DataTypes.STRING, type: DataTypes.STRING,

View File

@ -1,10 +1,9 @@
const express = require('express'); const express = require('express');
const User = require("../model/user.model"); const User = require("../model/user.model");
const Group = require("../model/group.model"); const Group = require("../model/group.model");
const keyService = require("../services/keys.service");
groupService = require("../services/group.service"); groupService = require("../services/group.service");
const Member = require("../model/member.model"); const Member = require("../model/member.model");
memberService = require("../services/members.service");
var router = express.Router(); var router = express.Router();
router.use('*', (req, res, next) => { router.use('*', (req, res, next) => {
@ -22,9 +21,10 @@ router.use('*', (req, res, next) => {
}); });
router.get("/users", (req, res) => { router.get("/users",async (req, res) => {
User.findAll().then((users) => { User.findAll().then((users) => {
res.render('admin/users', { "users": users}) res.render('admin/users', { "users": users})
}) })
}) })
@ -46,6 +46,7 @@ router.post("/groups/add", (req, res) => {
router.get("/groups/delete/:group", (req, res) => { router.get("/groups/delete/:group", (req, res) => {
groupService.delGroup(req.params.group).then((result) => { groupService.delGroup(req.params.group).then((result) => {
res.redirect("/admin/groups") res.redirect("/admin/groups")
}) })
@ -75,48 +76,15 @@ router.get("/groups/:name", async (req, res) => {
}) })
router.get('/members/:name/add/:user', (req, res) => { router.get('/members/:name/add/:user', (req, res) => {
Group.findOne({ where: { name: req.params.name } }).then((result) => { memberService.addMember(req.params.user, req.params.name).then((result) => {
if (result) { res.redirect('/admin/groups/' + req.params.name)
User.findOne({ where: { id: req.params.user } }).then((user) => {
if (user) {
Member.findOne({ where: { groupname: result.name, userId: user.id } }).then((member) => {
if (!member) {
Member.create({
userId: user.id,
groupName: result.name
}).then((member) => {
console.log('member added to database' + '(' + member.userId + ',' + member.groupName + ')')
res.redirect('/admin/groups/' + result.name)
}); });
}
})
}
})
}
})
}) })
router.get('/members/:name/delete/:user', (req, res) => { router.get('/members/:name/delete/:user', (req, res) => {
Group.findOne({ where: { name: req.params.name } }).then((result) => { memberService.delMember(req.params.user, req.params.name).then((result) => {
if (result) { res.redirect('/admin/groups/' + req.params.name)
User.findOne({ where: { id: req.params.user } }).then((user) => {
if (user) {
Member.findOne({ where: { groupname: result.name, userId: user.id } }).then((member) => {
if (member) {
Member.destroy({ where: { groupname: result.name, userId: user.id }}).then((member) => {
console.log('member deleted from database' + '(' + member.userId + ',' + member.groupName + ')')
res.redirect('/admin/groups/' + result.name)
}); });
}
})
}
})
}
})
}) })

View File

@ -3,7 +3,7 @@ const Sequelize = require('sequelize');
const sequelize = new Sequelize('accessgate', 'user', 'password', { const sequelize = new Sequelize('accessgate', 'user', 'password', {
dialect: 'sqlite', dialect: 'sqlite',
host: './database.db', host: './database.db',
logging: false logging: true
}) })

View File

@ -1,5 +1,5 @@
const Group = require('../model/group.model') const Group = require('../model/group.model')
const Members = require('../model/member.model') const Member = require('../model/member.model')
const regexp = /^\S*$/; const regexp = /^\S*$/;
const User = require('../model/user.model') const User = require('../model/user.model')
@ -28,6 +28,13 @@ async function delGroup(name) {
result.destroy() result.destroy()
.then(() => { .then(() => {
console.log('group ' + result.name + ' added to database') console.log('group ' + result.name + ' added to database')
Member.findAll({where: { groupName: name}}).then((members) => {
for (x in members) {
members[x].destroy().then(() => {
console.log('member ' + members[x].userId + ' deleted from database')
})
}
});
}); });
} else { } else {
return false; return false;
@ -37,23 +44,39 @@ async function delGroup(name) {
}); });
} }
async function groupUserList(groupName) { async function userGroupList(userId) {
User.hasMany(Members); const members = await Member.findAll({where: { userId: userId}})
Members.belongsTo(User);
const users = await User.findAll({ include: Members });
var result = [] var result = []
for (x in members) {
result[x] = (members[x].dataValues)
}
return result
}
async function groupUserList(groupName) {
User.hasMany(Member);
Member.belongsTo(User);
const users = await User.findAll({ include: Member });
var result = []
console.log(users)
for (x in users) { for (x in users) {
try { try {
if (users[x].dataValues.members[0].dataValues.groupName === groupName) { for (y in users[x].dataValues.members) {
if (users[x].dataValues.members[y].dataValues.groupName === groupName) {
result[x] = (users[x].dataValues) result[x] = (users[x].dataValues)
} }
}
} catch (error) { } catch (error) {
}} }}
console.log(result)
return result return result
}; };
module.exports = { module.exports = {
addGroup, addGroup,
delGroup, delGroup,
groupUserList groupUserList,
userGroupList
}; };

View File

@ -0,0 +1,54 @@
const Member = require('../model/member.model')
const Group = require("../model/group.model");
const User = require("../model/user.model");
const regexp = /^\S*$/;
async function addMember(userId, groupName) {
Group.findOne({ where: { name: groupName} }).then((result) => {
if (result) {
User.findOne({ where: { id: userId } }).then((user) => {
if (user) {
Member.findOne({ where: { groupname: result.name, userId: user.id } }).then((member) => {
if (!member) {
Member.create({
userId: user.id,
groupName: result.name
}).then((member) => {
console.log('member added to database' + '(' + member.userId + ',' + member.groupName + ')')
});
}
})
}
})
}
})
}
async function delMember(userId, groupName) {
Group.findOne({ where: { name: groupName} }).then((result) => {
if (result) {
User.findOne({ where: { id: userId } }).then((user) => {
if (user) {
Member.findOne({ where: { groupname: result.name, userId: user.id } }).then((member) => {
if (member) {
member.destroy()
.then(() => {
console.log('member deleted from database' + '(' + member.userId + ',' + member.groupName + ')')
});
}
})
}
})
}
})
}
module.exports = {
addMember,
delMember
};

View File

@ -15,7 +15,7 @@ function makeAdmin(userId) {
}); });
} }
module.exports = { module.exports = {
userList,
makeAdmin makeAdmin
}; };

View File

@ -25,15 +25,15 @@
<table class="table my-0" id="tableEnabled"> <table class="table my-0" id="tableEnabled">
<thead> <thead>
<tr> <tr>
<th>Display name</th> <th>Username</th>
<th>github id</th> <th>id</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% outGroup.forEach(function (member) { %> <% outGroup.forEach(function (member) { %>
<tr> <tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.displayName %></td> <td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.login %></td>
<td><%= member.id %></td> <td><%= member.id %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-success" href="/admin/members/<%= group.name %>/add/<%= member.id %>"><i class="text-white fa fa-plus"></i></button></td> <td style="text-align: right;"><a class="btn btn-sm btn-success" href="/admin/members/<%= group.name %>/add/<%= member.id %>"><i class="text-white fa fa-plus"></i></button></td>
</tr> </tr>
@ -44,7 +44,6 @@
</tfoot> </tfoot>
</table> </table>
</div> </div>
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Update group</button></div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
@ -64,15 +63,15 @@
<table class="table my-0" id="tableEnabled"> <table class="table my-0" id="tableEnabled">
<thead> <thead>
<tr> <tr>
<th>Display name</th> <th>username</th>
<th>github id</th> <th>id</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% inGroup.forEach(function (member) { %> <% inGroup.forEach(function (member) { %>
<tr> <tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.displayName %></td> <td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.login %></td>
<td><%= member.id %></td> <td><%= member.id %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/admin/members/<%= group.name %>/delete/<%= member.id %>"><i class="far fa-trash-alt"></i></a></td> <td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/admin/members/<%= group.name %>/delete/<%= member.id %>"><i class="far fa-trash-alt"></i></a></td>

View File

@ -22,22 +22,19 @@
<table class="table my-0" id="tableEnabled"> <table class="table my-0" id="tableEnabled">
<thead> <thead>
<tr> <tr>
<th>Display name</th> <th>Username</th>
<th>github id</th> <th>id</th>
<th>Admin</th> <th>Admin</th>
<th>Groups</th>
<th>Last login</th> <th>Last login</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% users.forEach(function (user) { %> <% users.forEach(function (user) { %>
<tr> <tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= user.avatar %>"><%= user.displayName %></td> <td><img class="rounded-circle me-2" width="30" height="30" src="<%= user.avatar %>"><%= user.login %></td>
<td><%= user.id %></td> <td><%= user.id %></td>
<td><%= user.admin %></td> <td><%= user.admin %></td>
<td>
<span class="badge bg-primary">admin</span>
</td>
<td><%= user.updatedAt %></td> <td><%= user.updatedAt %></td>
</tr> </tr>
<% }) %> <% }) %>