Daaka Daaka - 1 month ago 7
reST (reStructuredText) Question

2 separate controllers for the same end point in html and json or a single one?

I have the end points "/customers" and "/api/v1/customers", in html and json respectively for a list of customers. Do I have to create 2 different controllers and thus actions for them? Or can I return html or json from a single controller and action depending a requested format: html or json? Note that for "/api/v1/customers" I need authentication via an Api Key.

Answer

You can have one controller and action for both endpoints, but I would advise against it.

You mentioned that those controllers need to do different stuff, so instead of adding stuff like "if json then check api key" make two separate controllers and extract common code of getting all the customers.

There is a great talk about untangling business logic from http interface: http://www.elixirconf.eu/elixirconf2016/lance-halvorsen Getting a list of customers might be out of your controllers, so at the end you will have two controllers like this:

defmodule MyApp.Api.CustomersController do
  plug MaApp.ApiAuth #plug for checking api key

  def index(conn, params) do
    ...
    customers = ActualLogic.get_customers()
    ...
  end
end

def MyApp.CustomersController do
  plug MyApp.UserAuth #for example checks if user is logged in

  def index(conn, params) do
    ...
    customers = ActualLogic.get_customers()
    ...
  end
end

At the end your controller does not perform any logic, it calls something else to do the job and action is responsible only for web stuff like parsing params, authentication via api key, session cookies and translating end result to json/html.