diff --git a/routes/acl.js b/routes/acl.js index fb83518..4f7e860 100644 --- a/routes/acl.js +++ b/routes/acl.js @@ -180,4 +180,56 @@ router.get('/delete/:cardNumber', async (req, res) => { // Delete ACL entry. Fai } }); +router.get('/bulk-add', async (req, res) => { // Render form to bulk add ACL entries + res.render('acl-bulk-add', { user: req.session.user }); +}); + +router.post('/bulk-add', async (req, res) => { // Process bulk add of ACL entries + const data = req.body; + if (!Array.isArray(data)) { + return res.status(400).json({ error: 'Invalid data format' }); + } + + const results = []; + for (const entry of data) { + const cardNumber = Number(entry.CardNumber); + if (isNaN(cardNumber) || cardNumber <= 0) { + results.push({ cardNumber: entry.CardNumber, status: 'error', error: 'Invalid card number' }); + continue; + } + try { + const exists = await db.query('SELECT * FROM ACL WHERE CardNumber = ?', [cardNumber]); + if (exists && exists.length > 0) { + results.push({ cardNumber, status: 'error', error: 'Card number already exists' }); + continue; + } + const fields = ['Name', 'CardNumber', 'StartDate', 'EndDate']; + const placeholders = ['?', '?', '?', '?']; + const values = [ + entry.Name || "Unknown/Not Set", + cardNumber, + entry.StartDate || new Date(), + entry.EndDate || new Date(new Date().setFullYear(new Date().getFullYear() + 99)) + ]; + if (entry.Doors && typeof entry.Doors === 'object') { + for (const door in entry.Doors) { + if (entry.Doors.hasOwnProperty(door)) { + fields.push(door); + placeholders.push('?'); + values.push(entry.Doors[door] ? 1 : 0); + } + } + } + const sql = `INSERT INTO ACL (${fields.join(', ')}) VALUES (${placeholders.join(', ')})`; + await db.query(sql, values); + results.push({ cardNumber, status: 'success' }); + } catch (err) { + log.error(`Bulk add error for card ${cardNumber}: ${err}`); + results.push({ cardNumber, status: 'error', error: 'Internal server error' }); + } + } + + return res.status(200).json({ results }); +}); + module.exports = router; \ No newline at end of file diff --git a/views/acl-bulk-add.ejs b/views/acl-bulk-add.ejs new file mode 100644 index 0000000..ef03d3f --- /dev/null +++ b/views/acl-bulk-add.ejs @@ -0,0 +1,143 @@ + + + + + + + Add ACL Entry + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ Doors + <% Object.keys(doorList).forEach(function(door) { %> +
+ +
+ <% }) %> +
+ +
+ + + + + \ No newline at end of file diff --git a/views/acl.ejs b/views/acl.ejs index 83ebf07..9f081d8 100644 --- a/views/acl.ejs +++ b/views/acl.ejs @@ -37,6 +37,8 @@

Access Control List

+ Add New Entry + Add from reader