Files
mykb/src/services/docs/docs.hooks.js
2018-06-01 16:52:12 -05:00

101 lines
2.5 KiB
JavaScript

const { authenticate } = require('@feathersjs/authentication').hooks
const { checkDir, checkName } = require('../../../util/checkDirParts')
const { disable, invalid, adminOnly } = require('../hooksUtil')
const getUrl = require('../../../util/getUrl')
const nameIsValid = name => {
name = checkName(name)
if (!name) return invalid('name')
if (name.substr(name.length - 3).toLowerCase() !== '.md') {
name += '.md'
}
return name
}
const dirIsValid = dir => {
dir = checkDir(dir)
if (!dir && dir !== 0) return invalid('dir')
else if (dir === 0) return ''
return dir
}
const mdIsValid = md => {
if (typeof md !== 'string' || md.trim().length === 0) {
return invalid('md')
}
return md
}
const pathTaken = async (name, dir, app) => {
const matches = await app
.service(getUrl('docs'))
.find({ query: { name, dir } })
if (matches.total > 0) {
return invalid(null, 'filename is taken')
}
}
module.exports = {
before: {
all: [authenticate('jwt')],
find: [],
get: [],
create: [
async ctx => {
const { app, data } = ctx
let { name, dir, md } = data
const k = {}
k.name = nameIsValid(name)
k.dir = dirIsValid(dir)
k.md = mdIsValid(md)
await pathTaken(k.name, k.dir, app)
ctx.data = k
return ctx
},
],
update: [disable],
patch: [
async ctx => {
const { data, app } = ctx
const { name, dir, md } = data
const k = {}
if (name) k.name = nameIsValid(name)
if (typeof dir === 'string') k.dir = dirIsValid(dir) // allow empty string
if (name || typeof dir === 'string') {
let checkName, checkDir
if (!name || typeof dir !== 'string') {
const doc = await app.service(getUrl('docs')).get(ctx.id)
if (!name) checkName = doc.name
if (typeof dir !== 'string') checkDir = doc.dir
}
await pathTaken(
k.name || checkName,
typeof k.dir === 'string' ? k.dir : checkDir,
app
)
}
if (md) k.md = mdIsValid(md)
if (Object.keys(k).length === 0) invalid(null, 'nothing to update')
ctx.data = k
return ctx
},
],
remove: [adminOnly],
},
after: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: [],
},
error: {
all: [],
find: [],
get: [],
create: [],
update: [],
patch: [],
remove: [],
},
}