UNPKG

waibu-db

Version:
80 lines (78 loc) 3.6 kB
/** * Handler for rendering the add view of a model. * * To use this handler, you must import it first and call it with the necessary parameters. For example: * ```javascript * const { importModule } = this.app.bajo * const addHandler = await importModule('waibuDb:/lib/crud/add-handler.js') * const result = await addHandler.call(this, { model: 'YourModelName', req, reply }) * ``` * @async * @memberof module:CRUDHandler * @method * @param {object} opts - Options object * @param {object} opts.req - Request object * @param {object} opts.reply - Reply object * @param {string} opts.model - Model name * @param {string} opts.template - Template path * @param {object} [opts.params={}] - Parameters for the template * @param {Function} [opts.addOnsHandler] - Add-ons handler function * @param {string} [opts.templateDisabled='waibuDb.template:/disabled.html'] - Disabled template path * @param {object} [opts.options={}] - Additional options * @returns {Promise<string>} Renders the add view */ async function addHandler (opts = {}) { let { req, reply, model, params = {}, template, addOnsHandler, templateDisabled = 'waibuDb.template:/disabled.html', options = {} } = opts const { pascalCase } = this.app.lib.aneka const { createRecord, getRecord, getSchemaExt } = this.app.waibuDb const { buildUrl } = this.app.waibuMpa const { defaultsDeep } = this.app.lib.aneka const { pick, map, merge, omit } = this.app.lib._ const _opts = merge({}, options.modelOpts) model = pascalCase(model ?? req.params.model) const mdl = this.app.dobo.getModel(model) const { schema } = await getSchemaExt(model, 'add', merge({ args: [{ req, model: mdl }] }, { params }, options)) if (schema.disabled.includes('create')) return await reply.view(templateDisabled, { action: 'add' }) // req.query.attachment = true _opts.fields = schema.view.fields delete req.query.query let def = {} if (req.method === 'GET') { const omitted = ['id', 'createdAt', 'updatedAt'] if (req.query.mode === 'clone' && req.query.id) { const resp = await getRecord({ model, req, id: req.query.id, options: { fields: map(schema.properties, 'name'), ..._opts } }) def = omit(resp.data, omitted) if (def._fmt) def._fmt = omit(def._fmt, omitted) } else { const picked = map(schema.properties, 'name') def = omit(pick(req.query, picked), omitted) } } let form = defaultsDeep({}, req.body, def) let error let resp if (req.method === 'POST') { req.session[`wdb${model}AddMore`] = form._addmore req.session[`wdb${model}ClonePrev`] = form._cloneprev try { resp = await createRecord({ model, req, reply, options: opts }) if (!form._addmore) return reply.redirectTo(buildUrl({ url: req.url, base: 'list', params: { page: 1 }, exclude: ['id', 'mode'] })) if (!form._cloneprev) form = pick(form, ['_addmore', '_cloneprev']) } catch (err) { if (err.orgMessage === 'accessDenied') throw err error = err } } else { form._addmore = req.session[`wdb${model}AddMore`] form._cloneprev = req.session[`wdb${model}ClonePrev`] } const addOns = addOnsHandler ? await addOnsHandler.call(this.app[req.ns], { req, reply, params, data: resp, schema, error, options }) : undefined merge(params, { form, schema, error, addOns }) if (schema.template) template = schema.template if (schema.layout) params.page.layout = schema.layout return await reply.view(template, params) } export default addHandler