lib_crud_delete-handler.js

/**
 * Handler for deleting records 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 deleteHandler = await importModule('waibuDb:/lib/crud/delete-handler.js')
 * await deleteHandler.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 {object} [opts.params={}] - Parameters for the template
 * @param {string} [opts.templateDisabled='waibuDb.template:/disabled.html'] - Disabled template path
 * @param {object} [opts.options={}] - Additional options
 * @returns {Promise<void>} Redirects to the list view
 */
async function deleteHandler (opts = {}) {
  let { req, reply, model, params = {}, templateDisabled = 'waibuDb.template:/disabled.html', options = {} } = opts
  const { pascalCase } = this.app.lib.aneka
  const { removeRecord, getSchemaExt } = this.app.waibuDb
  const { buildUrl } = this.app.waibuMpa
  const { reduce, merge } = 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, 'delete', merge({ args: [{ req, model: mdl }] }, { params }, options))
  if (schema.disabled.includes('remove')) return await reply.view(templateDisabled, { action: 'delete' })
  _opts.fields = schema.view.fields
  delete req.query.query
  const ids = (req.body.ids ?? '').split(',')
  if (ids.length > 0) {
    const result = []
    // _opts.noResult = true
    _opts.noFlash = true
    for (const id of ids) {
      try {
        await removeRecord({ model, id, req, reply, options: _opts })
        result.push(true)
      } catch (err) {
        if (err.orgMessage === 'accessDenied') throw err
        console.log(err)
        result.push(err.message)
      }
    }
    const success = reduce(result, (sum, n) => {
      return n === true ? (sum + 1) : sum
    }, 0)
    let type = 'danger'
    if (success > 0) type = 'warning'
    if (success === ids.length) type = 'info'
    req.flash('notify', req.t('%d of %d record(s) successfully removed', success, ids.length) + '\t' + type)
    req.query.page = 1
  }

  const url = buildUrl({ url: req.url, base: 'list', params: { page: 1 } })
  return reply.redirectTo(url)
}

export default deleteHandler