-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgroup.js
105 lines (79 loc) · 3.27 KB
/
group.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var db = require('./db');
var uuid = require('uuid')
exports.create = async (groupName) => {
const id = uuid.v4();
console.log(`Group Object being saved: ${groupName}`)
db.run(`INSERT INTO groups (id, displayName) VALUES (?, ?)`,
[id, groupName],
function (err) {
if (err) {
console.log(`Group creation failed: ${groupName}`)
}
}
);
}
exports.getPaginatedGroups = async (req, res, next) => {
// Parse pagination parameters with defaults for SCIM compliance
const startIndex = parseInt(req.query.startIndex) || 1; // SCIM 1-based index
const count = parseInt(req.query.count) || 100; // Default to 10 users per page
// Calculate the offset for SQL (SQLite uses 0-based index)
const offset = startIndex - 1;
db.all(`SELECT * FROM groups LIMIT ? OFFSET ?`, [count, offset], (err, rows) => {
if (err) {
return res.status(500).json({ detail: "Error retrieving groups", status: 500 });
}
// Format the response in SCIM v2.0 pagination structure
const resources = rows.map(group => (
{
id: group.id,
displayName: group.displayName
}));
// Query the total number of users to include in response
db.get(`SELECT COUNT(*) AS totalResults FROM groups`, (err, countResult) => {
if (err) {
return res.status(500).json({ detail: "Error counting groups", status: 500 });
}
const scimResponse = {
schemas: ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
totalResults: countResult.totalResults,
startIndex: startIndex,
itemsPerPage: count,
Resources: resources
};
res.json(scimResponse);
});
});
}
exports.patchGroupMembership = async (req, res, next) => {
const groupId = req.params.id;
const { Operations } = req.body;
// Retrieve the group from the database
db.get('SELECT * FROM groups WHERE id = ?', [groupId], (err, group) => {
if (err) return res.status(500).json({ error: 'Internal server error' });
if (!group) return res.status(404).json({ error: 'Group not found' });
// Parse members as JSON if it's stored as a string
group.members = group.members ? JSON.parse(group.members) : [];
// Apply each operation in the request body
Operations.forEach((operation) => {
const { op, path, value } = operation;
switch (op) {
case 'add':
if (path === 'members') {
group.members = [...group.members, ...value];
}
break;
case 'remove':
if (path === 'members') {
// Remove specified members
group.members = group.members.filter(member => !value.includes(member.value));
}
break;
default:
res.status(400).json({ error: 'Unsupported operation' });
return;
}
});
console.log(group);
res.status(204).json(group);
});
}