2020-05-22 01:31:23 +12:00
|
|
|
const CouchDB = require("../../db")
|
|
|
|
const {
|
|
|
|
generateAdminPermissions,
|
|
|
|
generatePowerUserPermissions,
|
|
|
|
POWERUSER_LEVEL_ID,
|
|
|
|
ADMIN_LEVEL_ID,
|
|
|
|
} = require("../../utilities/accessLevels")
|
2020-10-02 05:22:08 +13:00
|
|
|
const {
|
|
|
|
generateAccessLevelID,
|
|
|
|
getAccessLevelParams,
|
|
|
|
} = require("../../db/utils")
|
2020-05-22 01:31:23 +12:00
|
|
|
|
|
|
|
exports.fetch = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-10-02 05:22:08 +13:00
|
|
|
const body = await db.allDocs(
|
|
|
|
getAccessLevelParams(null, {
|
|
|
|
include_docs: true,
|
|
|
|
})
|
|
|
|
)
|
2020-05-22 01:31:23 +12:00
|
|
|
const customAccessLevels = body.rows.map(row => row.doc)
|
|
|
|
|
|
|
|
const staticAccessLevels = [
|
|
|
|
{
|
|
|
|
_id: ADMIN_LEVEL_ID,
|
|
|
|
name: "Admin",
|
2020-06-19 03:59:31 +12:00
|
|
|
permissions: await generateAdminPermissions(ctx.user.instanceId),
|
2020-05-22 01:31:23 +12:00
|
|
|
},
|
|
|
|
{
|
|
|
|
_id: POWERUSER_LEVEL_ID,
|
|
|
|
name: "Power User",
|
2020-06-19 03:59:31 +12:00
|
|
|
permissions: await generatePowerUserPermissions(ctx.user.instanceId),
|
2020-05-22 01:31:23 +12:00
|
|
|
},
|
|
|
|
]
|
|
|
|
|
|
|
|
ctx.body = [...staticAccessLevels, ...customAccessLevels]
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.find = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-05-22 01:31:23 +12:00
|
|
|
ctx.body = await db.get(ctx.params.levelId)
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.update = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-05-22 01:31:23 +12:00
|
|
|
const level = await db.get(ctx.params.levelId)
|
|
|
|
level.name = ctx.body.name
|
|
|
|
level.permissions = ctx.request.body.permissions
|
|
|
|
const result = await db.put(level)
|
|
|
|
level._rev = result.rev
|
|
|
|
ctx.body = level
|
|
|
|
ctx.message = `Level ${level.name} updated successfully.`
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.patch = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-05-22 01:31:23 +12:00
|
|
|
const level = await db.get(ctx.params.levelId)
|
|
|
|
const { removedPermissions, addedPermissions, _rev } = ctx.request.body
|
|
|
|
|
|
|
|
if (!_rev) throw new Error("Must supply a _rev to update an access level")
|
|
|
|
|
|
|
|
level._rev = _rev
|
|
|
|
|
|
|
|
if (removedPermissions) {
|
|
|
|
level.permissions = level.permissions.filter(
|
|
|
|
p =>
|
|
|
|
!removedPermissions.some(
|
|
|
|
rem => rem.name === p.name && rem.itemId === p.itemId
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (addedPermissions) {
|
|
|
|
level.permissions = [
|
|
|
|
...level.permissions.filter(
|
|
|
|
p =>
|
|
|
|
!addedPermissions.some(
|
|
|
|
add => add.name === p.name && add.itemId === p.itemId
|
|
|
|
)
|
|
|
|
),
|
|
|
|
...addedPermissions,
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
const result = await db.put(level)
|
|
|
|
level._rev = result.rev
|
|
|
|
ctx.body = level
|
|
|
|
ctx.message = `Access Level ${level.name} updated successfully.`
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.create = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-05-22 01:31:23 +12:00
|
|
|
|
|
|
|
const level = {
|
|
|
|
name: ctx.request.body.name,
|
|
|
|
_rev: ctx.request.body._rev,
|
|
|
|
permissions: ctx.request.body.permissions || [],
|
2020-10-03 00:37:46 +13:00
|
|
|
_id: generateAccessLevelID(),
|
2020-05-22 01:31:23 +12:00
|
|
|
type: "accesslevel",
|
|
|
|
}
|
|
|
|
|
|
|
|
const result = await db.put(level)
|
|
|
|
level._rev = result.rev
|
|
|
|
ctx.body = level
|
|
|
|
ctx.message = `Access Level '${level.name}' created successfully.`
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.destroy = async function(ctx) {
|
2020-06-19 03:59:31 +12:00
|
|
|
const db = new CouchDB(ctx.user.instanceId)
|
2020-05-22 01:31:23 +12:00
|
|
|
await db.remove(ctx.params.levelId, ctx.params.rev)
|
|
|
|
ctx.message = `Access Level ${ctx.params.id} deleted successfully`
|
|
|
|
ctx.status = 200
|
|
|
|
}
|