@nictool/api
Advanced tools
Comparing version 3.0.0-alpha.4 to 3.0.0-alpha.5
@@ -6,2 +6,11 @@ # CHANGES | ||
### [3.0.0-alpha.5] - 2024-03-06 | ||
- feat(lib/zone): added, with tests, fixes #22 | ||
- feat(lib/zone_record): added, with tests, fixes #23 | ||
- feat: default GET sets deleted=false | ||
- group, nameserver, permission, user, zone | ||
- sql: return indicative boolean for delete | ||
- test(zr): added maps from NT SQL 2 to dns-rr std formats | ||
### [3.0.0-alpha.4] - 2024-03-05 | ||
@@ -25,1 +34,2 @@ | ||
[3.0.0-alpha.4]: https://github.com/NicTool/api/releases/tag/3.0.0-alpha.4 | ||
[3.0.0-alpha.5]: https://github.com/NicTool/api/releases/tag/3.0.0-alpha.5 |
@@ -24,2 +24,5 @@ import Mysql from './mysql.js' | ||
async get(args) { | ||
args = JSON.parse(JSON.stringify(args)) | ||
if (args.deleted === undefined) args.deleted = false | ||
const rows = await Mysql.execute( | ||
@@ -35,6 +38,7 @@ ...Mysql.select( | ||
) | ||
for (const r of rows) { | ||
for (const row of rows) { | ||
for (const b of boolFields) { | ||
r[b] = r[b] === 1 | ||
row[b] = row[b] === 1 | ||
} | ||
if (args.deleted === false) delete row.deleted | ||
} | ||
@@ -48,3 +52,2 @@ return rows | ||
delete args.id | ||
// Mysql.debug(1) | ||
const r = await Mysql.execute( | ||
@@ -57,3 +60,2 @@ ...Mysql.update( | ||
) | ||
// console.log(r) | ||
return r.changedRows === 1 | ||
@@ -63,13 +65,15 @@ } | ||
async delete(args) { | ||
await Mysql.execute(`UPDATE nt_group SET deleted=? WHERE nt_group_id=?`, [ | ||
args.deleted ?? 1, | ||
args.id, | ||
]) | ||
return true | ||
const r = await Mysql.execute( | ||
...Mysql.update(`nt_group`, `nt_group_id=${args.id}`, { | ||
deleted: args.deleted ?? 1, | ||
}), | ||
) | ||
return r.changedRows === 1 | ||
} | ||
async destroy(args) { | ||
return await Mysql.execute( | ||
const r = await Mysql.execute( | ||
...Mysql.delete(`nt_group`, { nt_group_id: args.id }), | ||
) | ||
return r.affectedRows === 1 | ||
} | ||
@@ -76,0 +80,0 @@ } |
@@ -23,3 +23,2 @@ import assert from 'node:assert/strict' | ||
parent_gid: 0, | ||
deleted: false, | ||
}) | ||
@@ -34,3 +33,2 @@ }) | ||
parent_gid: 0, | ||
deleted: false, | ||
}) | ||
@@ -46,3 +44,2 @@ }) | ||
parent_gid: 0, | ||
deleted: false, | ||
}, | ||
@@ -59,4 +56,4 @@ ]) | ||
g = await Group.get({ id: testCase.id }) | ||
assert.equal(g[0].deleted, false) | ||
assert.equal(g[0].deleted, undefined) | ||
}) | ||
}) |
@@ -38,2 +38,5 @@ import Mysql from './mysql.js' | ||
async get(args) { | ||
args = JSON.parse(JSON.stringify(args)) | ||
if (args.deleted === undefined) args.deleted = false | ||
if (args.name !== undefined) { | ||
@@ -65,6 +68,7 @@ args['ns.name'] = args.name | ||
) | ||
for (const r of rows) { | ||
for (const row of rows) { | ||
for (const b of boolFields) { | ||
r[b] = r[b] === 1 | ||
row[b] = row[b] === 1 | ||
} | ||
if (args.deleted === false) delete row.deleted | ||
} | ||
@@ -86,3 +90,2 @@ return dbToObject(rows) | ||
) | ||
// console.log(r) | ||
return r.changedRows === 1 | ||
@@ -92,13 +95,15 @@ } | ||
async delete(args) { | ||
await Mysql.execute( | ||
`UPDATE nt_nameserver SET deleted=? WHERE nt_nameserver_id=?`, | ||
[args.deleted ?? 1, args.id], | ||
const r = await Mysql.execute( | ||
...Mysql.update(`nt_nameserver`, `nt_nameserver_id=${args.id}`, { | ||
deleted: args.deleted ?? 1, | ||
}), | ||
) | ||
return true | ||
return r.changedRows === 1 | ||
} | ||
async destroy(args) { | ||
return await Mysql.execute( | ||
const r = await Mysql.execute( | ||
...Mysql.delete(`nt_nameserver`, { nt_nameserver_id: args.id }), | ||
) | ||
return r.affectedRows === 1 | ||
} | ||
@@ -105,0 +110,0 @@ } |
@@ -44,4 +44,4 @@ import assert from 'node:assert/strict' | ||
g = await Nameserver.get({ id: testCase.id }) | ||
assert.equal(g[0].deleted, false) | ||
assert.equal(g[0].deleted, undefined) | ||
}) | ||
}) |
@@ -29,2 +29,5 @@ import Mysql from './mysql.js' | ||
async get(args) { | ||
args = JSON.parse(JSON.stringify(args)) | ||
if (args.deleted === undefined) args.deleted = false | ||
const query = `SELECT p.nt_perm_id AS id | ||
@@ -38,4 +41,2 @@ , p.nt_user_id AS uid | ||
FROM nt_perm p` | ||
// Mysql.debug(1) | ||
if (args.deleted === undefined) args.deleted = false | ||
@@ -51,3 +52,5 @@ const rows = await Mysql.execute( | ||
} | ||
return dbToObject(rows[0]) | ||
const row = dbToObject(rows[0]) | ||
if (args.deleted === false) delete row.deleted | ||
return row | ||
} | ||
@@ -65,7 +68,9 @@ | ||
INNER JOIN nt_user u ON p.nt_group_id = u.nt_group_id | ||
WHERE p.deleted=0 | ||
WHERE p.deleted=${args.deleted === true ? 1 : 0} | ||
AND u.deleted=0 | ||
AND u.nt_user_id=?` | ||
const rows = await Mysql.execute(...Mysql.select(query, [args.uid])) | ||
return dbToObject(rows[0]) | ||
const row = dbToObject(rows[0]) | ||
if ([false, undefined].includes(args.deleted)) delete row.deleted | ||
return row | ||
} | ||
@@ -77,3 +82,2 @@ | ||
delete args.id | ||
// Mysql.debug(1) | ||
const r = await Mysql.execute( | ||
@@ -90,13 +94,16 @@ ...Mysql.update( | ||
async delete(args) { | ||
await Mysql.execute(`UPDATE nt_perm SET deleted=? WHERE nt_perm_id=?`, [ | ||
args.deleted ?? 1, | ||
args.id, | ||
]) | ||
return true | ||
if (!args.id) return false | ||
const r = await Mysql.execute( | ||
...Mysql.update(`nt_perm`, `nt_perm_id=${args.id}`, { | ||
deleted: args.deleted ?? 1, | ||
}), | ||
) | ||
return r.changedRows === 1 | ||
} | ||
async destroy(args) { | ||
return await Mysql.execute( | ||
const r = await Mysql.execute( | ||
...Mysql.delete(`nt_perm`, mapToDbColumn(args, permDbMap)), | ||
) | ||
return r.affectedRows === 1 | ||
} | ||
@@ -194,9 +201,9 @@ } | ||
function dbToObject(row) { | ||
const newRow = JSON.parse(JSON.stringify(row)) | ||
row = JSON.parse(JSON.stringify(row)) | ||
for (const f of ['group', 'nameserver', 'zone', 'zonerecord', 'user']) { | ||
for (const p of ['create', 'write', 'delete', 'delegate']) { | ||
if (newRow[`${f}_${p}`] !== undefined) { | ||
if (newRow[f] === undefined) newRow[f] = {} | ||
newRow[f][p] = newRow[`${f}_${p}`] === 1 | ||
delete newRow[`${f}_${p}`] | ||
if (row[`${f}_${p}`] !== undefined) { | ||
if (row[f] === undefined) row[f] = {} | ||
row[f][p] = row[`${f}_${p}`] === 1 | ||
delete row[`${f}_${p}`] | ||
} | ||
@@ -206,47 +213,48 @@ } | ||
for (const b of boolFields) { | ||
newRow[b] = newRow[b] === 1 | ||
row[b] = row[b] === 1 | ||
} | ||
if (newRow.uid !== undefined) { | ||
newRow.user.id = newRow.uid | ||
delete newRow.uid | ||
if (row.uid !== undefined) { | ||
row.user.id = row.uid | ||
delete row.uid | ||
} | ||
if (newRow.gid !== undefined) { | ||
newRow.group.id = newRow.gid | ||
delete newRow.gid | ||
if (row.gid !== undefined) { | ||
row.group.id = row.gid | ||
delete row.gid | ||
} | ||
newRow.nameserver.usable = [] | ||
if (![undefined, ''].includes(newRow.usable_ns)) { | ||
newRow.nameserver.usable = newRow.usable_ns.split(',') | ||
row.nameserver.usable = [] | ||
if (![undefined, ''].includes(row.usable_ns)) { | ||
row.nameserver.usable = row.usable_ns.split(',') | ||
} | ||
delete newRow.usable_ns | ||
return newRow | ||
delete row.usable_ns | ||
return row | ||
} | ||
function objectToDb(row) { | ||
const newRow = JSON.parse(JSON.stringify(row)) | ||
if (newRow?.user?.id !== undefined) { | ||
newRow.uid = newRow.user.id | ||
delete newRow.user.id | ||
row = JSON.parse(JSON.stringify(row)) | ||
if (row?.user?.id !== undefined) { | ||
row.uid = row.user.id | ||
delete row.user.id | ||
} | ||
if (newRow?.group?.id !== undefined) { | ||
newRow.gid = newRow.group.id | ||
delete newRow.group.id | ||
if (row?.group?.id !== undefined) { | ||
row.gid = row.group.id | ||
delete row.group.id | ||
} | ||
if (newRow?.nameserver?.usable !== undefined) { | ||
newRow.usable_ns = newRow.nameserver.usable.join(',') | ||
delete newRow.nameserver.usable | ||
if (row?.nameserver?.usable !== undefined) { | ||
row.usable_ns = row.nameserver.usable.join(',') | ||
delete row.nameserver.usable | ||
} | ||
for (const f of ['group', 'nameserver', 'zone', 'zonerecord', 'user']) { | ||
for (const p of ['create', 'write', 'delete', 'delegate']) { | ||
if (newRow[f] === undefined) continue | ||
if (newRow[f][p] === undefined) continue | ||
newRow[`${f}_${p}`] = newRow[f][p] === true ? 1 : 0 | ||
delete newRow[f][p] | ||
if (row[f] === undefined) continue | ||
if (row[f][p] === undefined) continue | ||
row[`${f}_${p}`] = row[f][p] === true ? 1 : 0 | ||
delete row[f][p] | ||
} | ||
delete newRow[f] | ||
delete row[f] | ||
} | ||
for (const b of boolFields) { | ||
newRow[b] = newRow[b] === true ? 1 : 0 | ||
row[b] = row[b] === true ? 1 : 0 | ||
} | ||
return newRow | ||
return row | ||
} |
@@ -69,8 +69,7 @@ import assert from 'node:assert/strict' | ||
p = await Permission.get({ id: permTestCase.id }) | ||
assert.equal(p.deleted, false) | ||
assert.equal(p.deleted, undefined) | ||
}) | ||
it('destroys a permission', async () => { | ||
const r = await Permission.destroy({ id: permTestCase.id }) | ||
assert.equal(r.affectedRows, 1) | ||
assert.ok(await Permission.destroy({ id: permTestCase.id })) | ||
const p = await Permission.get({ id: permTestCase.id }) | ||
@@ -77,0 +76,0 @@ assert.equal(p, undefined) |
{ | ||
"id": 4096, | ||
"parent_gid": 0, | ||
"name": "example.com", | ||
"deleted": false | ||
"name": "example.com" | ||
} |
@@ -17,4 +17,3 @@ { | ||
}, | ||
"ttl": 3600, | ||
"deleted": false | ||
"ttl": 3600 | ||
} |
@@ -6,3 +6,2 @@ { | ||
"self_write": false, | ||
"deleted": false, | ||
"group": { "id": 4096, "create": false, "write": false, "delete": false }, | ||
@@ -9,0 +8,0 @@ "nameserver": { |
@@ -9,4 +9,3 @@ { | ||
"last_name": "Test", | ||
"is_admin": false, | ||
"deleted": false | ||
"is_admin": false | ||
} |
@@ -18,3 +18,3 @@ import crypto from 'node:crypto' | ||
async authenticate(authTry) { | ||
if (this.debug) console.log(authTry) | ||
// if (this.debug) console.log(authTry) | ||
let [username, groupName] = authTry.username.split('@') | ||
@@ -70,2 +70,4 @@ if (!groupName) groupName = this.cfg.group ?? 'NicTool' | ||
args = JSON.parse(JSON.stringify(args)) | ||
if (args.password) { | ||
@@ -83,3 +85,5 @@ if (!args.pass_salt) args.pass_salt = this.generateSalt() | ||
async get(args) { | ||
args = JSON.parse(JSON.stringify(args)) | ||
if (args.deleted === undefined) args.deleted = false | ||
const rows = await Mysql.execute( | ||
@@ -103,2 +107,3 @@ ...Mysql.select( | ||
} | ||
if (args.deleted === false) delete r.deleted | ||
} | ||
@@ -124,4 +129,5 @@ return rows | ||
const r = await Mysql.execute( | ||
`UPDATE nt_user SET deleted=? WHERE nt_user_id=?`, | ||
[args.deleted ?? 1, args.id], | ||
...Mysql.update(`nt_user`, `nt_user_id=${args.id}`, { | ||
deleted: args.deleted ?? 1, | ||
}), | ||
) | ||
@@ -132,5 +138,6 @@ return r.changedRows === 1 | ||
async destroy(args) { | ||
await Mysql.execute( | ||
const r = await Mysql.execute( | ||
...Mysql.delete(`nt_user`, mapToDbColumn({ id: args.id }, userDbMap)), | ||
) | ||
return r.affectedRows === 1 | ||
} | ||
@@ -137,0 +144,0 @@ |
@@ -7,3 +7,3 @@ import assert from 'node:assert/strict' | ||
import testCase from './test/user.json' with { type: 'json' } | ||
import userCase from './test/user.json' with { type: 'json' } | ||
import groupCase from './test/group.json' with { type: 'json' } | ||
@@ -30,5 +30,5 @@ | ||
it('creates a user', async () => { | ||
assert.ok(await User.create(testCase)) | ||
let users = await User.get({ id: testCase.id }) | ||
assert.deepEqual(users[0], sanitize(testCase)) | ||
assert.ok(await User.create(userCase)) | ||
let users = await User.get({ id: userCase.id }) | ||
assert.deepEqual(users[0], sanitize(userCase)) | ||
}) | ||
@@ -39,5 +39,5 @@ }) | ||
it('finds existing user by id', async () => { | ||
const u = await User.get({ id: testCase.id }) | ||
const u = await User.get({ id: userCase.id }) | ||
// console.log(u) | ||
assert.deepEqual(u[0], sanitize(testCase)) | ||
assert.deepEqual(u[0], sanitize(userCase)) | ||
}) | ||
@@ -47,3 +47,3 @@ | ||
const u = await User.get({ username: 'unit-test' }) | ||
assert.deepEqual(u[0], sanitize(testCase)) | ||
assert.deepEqual(u[0], sanitize(userCase)) | ||
}) | ||
@@ -54,6 +54,6 @@ }) | ||
it('modifies existing user', async () => { | ||
assert.ok(await User.put({ id: testCase.id, first_name: 'Untie' })) | ||
let users = await User.get({ id: testCase.id }) | ||
assert.ok(await User.put({ id: userCase.id, first_name: 'Untie' })) | ||
let users = await User.get({ id: userCase.id }) | ||
assert.equal(users[0].first_name, 'Untie') | ||
await User.put({ id: testCase.id, first_name: 'Unit' }) | ||
await User.put({ id: userCase.id, first_name: 'Unit' }) | ||
}) | ||
@@ -64,8 +64,8 @@ }) | ||
it('deletes a user', async () => { | ||
assert.ok(await User.delete({ id: testCase.id })) | ||
let u = await User.get({ id: testCase.id, deleted: 1 }) | ||
assert.ok(await User.delete({ id: userCase.id })) | ||
let u = await User.get({ id: userCase.id, deleted: true }) | ||
assert.equal(u[0].deleted, true) | ||
await User.delete({ id: testCase.id, deleted: 0 }) // restore | ||
u = await User.get({ id: testCase.id }) | ||
assert.equal(u[0].deleted, false) | ||
await User.delete({ id: userCase.id, deleted: false }) // restore | ||
u = await User.get({ id: userCase.id }) | ||
assert.equal(u[0].deleted, undefined) | ||
}) | ||
@@ -138,4 +138,4 @@ }) | ||
const u = await User.authenticate({ | ||
username: 'unit-test@example.com', | ||
password: 'Wh@tA-Decent#P6ssw0rd', | ||
username: `${userCase.username}@${groupCase.name}`, | ||
password: userCase.password, | ||
}) | ||
@@ -142,0 +142,0 @@ assert.ok(u) |
{ | ||
"name": "@nictool/api", | ||
"version": "3.0.0-alpha.4", | ||
"version": "3.0.0-alpha.5", | ||
"description": "NicTool API", | ||
@@ -46,2 +46,3 @@ "main": "index.js", | ||
"@hapi/vision": "^7.0.3", | ||
"@nictool/dns-resource-record": "^1.2.1", | ||
"@nictool/validate": "^0.8.0", | ||
@@ -48,0 +49,0 @@ "hapi-swagger": "^17.2.1", |
@@ -50,3 +50,2 @@ import validate from '@nictool/validate' | ||
handler: async (request, h) => { | ||
const users = await User.get({ | ||
@@ -143,4 +142,3 @@ deleted: request.query.deleted ?? 0, | ||
const action = request.query.destroy === 'true' ? 'destroy' : 'delete' | ||
await User[action]({ id: users[0].id }) | ||
await User.delete({ id: users[0].id }) | ||
@@ -147,0 +145,0 @@ delete users[0].gid |
@@ -119,6 +119,6 @@ import assert from 'node:assert/strict' | ||
// console.log(res.result) | ||
assert.equal(res.statusCode, 204) | ||
assert.ok([200, 204].includes(res.statusCode)) | ||
}) | ||
it(`GET /user/${userId2}?deleted=1`, async () => { | ||
it(`GET /user/${userId2}?deleted=true`, async () => { | ||
const res = await server.inject({ | ||
@@ -132,3 +132,3 @@ method: 'GET', | ||
// console.log(res.result) | ||
assert.equal(res.statusCode, 200) | ||
assert.ok([200, 204].includes(res.statusCode)) | ||
}) | ||
@@ -135,0 +135,0 @@ |
@@ -10,5 +10,9 @@ 'use strict' | ||
import Nameserver from './lib/nameserver.js' | ||
import Zone from './lib/zone.js' | ||
// import ZoneRecord from './lib/zone_record.js' | ||
import groupCase from './lib/test/group.json' with { type: 'json' } | ||
import userCase from './lib/test/user.json' with { type: 'json' } | ||
import zoneCase from './lib/test/zone.json' with { type: 'json' } | ||
// import zrCase from './lib/test/zone_record.json' with { type: 'json' } | ||
import groupCaseR from './routes/test/group.json' with { type: 'json' } | ||
@@ -51,2 +55,4 @@ import userCaseR from './routes/test/user.json' with { type: 'json' } | ||
async function teardown() { | ||
// await ZoneRecord.destroy({ id: zrCase.id }) | ||
await Zone.destroy({ id: zoneCase.id }) | ||
await Nameserver.destroy({ id: nsCaseR.id }) | ||
@@ -53,0 +59,0 @@ await Nameserver.destroy({ id: nsCaseR.id - 1 }) |
141585
92
3635
11
+ Added@nictool/dns-resource-record@1.2.1(transitive)