bla
bla

Reputation: 1055

How can I create a method that I will use in more than 1 controller in adonis?

I have this method that I will use in more than 1 controller. How can I make this method sharable?

I'm a little confused if I have to use service providers or traits...

async verificaExisteUsuarioAdministrador(){
    const checkUserAdmin = await User
           .findBy('username', 'admin')

            if (checkUserAdmin ){
                return true
            }else{
                return false
            }
}

So, in more than one controller I need to call this function, how can I make this possible? The service providers document don't look so clear.

Upvotes: 1

Views: 1645

Answers (1)

crbast
crbast

Reputation: 2302

I advise you to create a middleware.

AdonisJS - Middleware documentation

You can configure it to run before or after the controller code.

Example

middleware :

'use strict'
/** @typedef {import('@adonisjs/framework/src/Request')} Request */
/** @typedef {import('@adonisjs/framework/src/Response')} Response */
/** @typedef {import('@adonisjs/framework/src/View')} View */

class AuthVerif {
  /**
   * @param {object} ctx
   * @param {Request} ctx.request
   * @param {Function} next
   */
  async handle({ response, auth }, next) {
    // call next to advance the request

    /* Your code */

    await next()// Controller execution
  }
}

module.exports = AuthVerif

route :

Route.get("/", "youController").middleware(["authVerif"])

OR

You can create Helpers (app/Helpers/)

Example (app/Helpers/Answer.js) :

'use strict'

/**
 * @summary API answer convention
 */
class Answer {
    /**
     * Success answer
     * @param {*} data 
     * @returns {JSON} JSON answer
     */
    static success(data) {
        return { 'success': true, 'data': data }
    }
}

module.exports = {
    Answer
}

Import object (controllers, ...):

/** @type {typeof import('../Helpers/Answer')} */ //Documentation
const { Answer } = use('App/Helpers/Answer')

Upvotes: 3

Related Questions