UNPKG

adonis-rest

Version:

An Restful api addon for AdonisJs 4 + MongoDB

125 lines (104 loc) 3.49 kB
'use strict' const _ = require('lodash') const { HttpException } = require('@adonisjs/generic-exceptions') const Config = use('Config') const toNumber = (val, defaultValue = 0) => Number(val) || defaultValue class Query { async handle(ctx, next, param) { const [configKey = 'api'] = param const { request, params, auth } = ctx const resource = params.resource let query = request.input('query', {}) if (typeof query === 'string') { query = JSON.parse(query) } if (!query.where) { query.where = {} } // if (_.isString(query.perPage)) { // const pagesize = await Option.get('pagesize', 'name', 'value') // query.perPage = parseInt(pagesize[query.perPage]) || 10 // } _.mapValues(query.where, (v, k) => { if (v === '' || v === null || _.isEqual(v, []) || _.isEqual(v, [null])) { return delete query.where[k] } const isDate = ['created_at', 'updated_at'].includes(k) if (isDate) { // v = _.map(v, d => d.replace(/(\d{4}-\d{2}-\d{2})/, '$1')) let [begin, end] = v if (!end) { end = begin + 1 } const endDate = new Date(end) // end = endDate.setDate(endDate.getDate() + 1) query.where[k] = { $gte: begin, $lte: end } return } if (_.isString(v) && v.includes('*')) { query.where[k] = new RegExp(v.replace('*', ''), 'i') } if (_.isArray(v) && !_.isObject(v[0])) { query.where[k] = { $in: v } } }) if (params.id) { let where = { _id: params.id } if (params.id.length !== 24) { where = { $or: [{ name: params.id }, { key: params.id }] } if (!isNaN(params.id)) { where.$or.push({ id: parseInt(params.id) }) } } query.where = _.defaultsDeep({}, query.where, where) } if (configKey) { const resourceConfig = Config.get(`rest.${configKey}.resources.${resource}`, {}) if (resourceConfig.auth) { if (!auth.user) { throw new HttpException('Login required', 401) } if (!query.where) { query.where = {} } } // const AdminUser = use('Rest/Models/AdminUser') // if (auth.user instanceof AdminUser) { // try { // await auth.user.load('roles') // } catch (e) { } // // Allow access my resource only // if (resourceConfig.restrictOwner && !auth.user.isSystemAdmin()) { // const { field, isArray } = resourceConfig.restrictOwner // query.where[field] = auth.user._id // } // } if (params.id) { // show const defaultQuery = _.get(resourceConfig, `query.show`, {}) query = _.defaultsDeep({}, query, defaultQuery) } else { // index const defaultQuery = _.get(resourceConfig, `query.index`, {}) query = _.defaultsDeep({}, query, defaultQuery) let page = toNumber(request.input('page', 1)) if (!query.page) { query.page = page } if (query.where && query.where.perPage) { query.perPage = toNumber(query.where.perPage) || 10 } delete query.where.perPage query.page = Math.max(toNumber(query.page, 1), 1) query.perPage = Math.min(Math.max(toNumber(query.perPage, 10), 1), 100000) } } ctx.query = query await next() } } module.exports = Query