http basic auth + posiciones

This commit is contained in:
fauno 2019-04-06 16:45:07 -03:00
parent 5d87144a98
commit 0a0fed78b7
No known key found for this signature in database
GPG key ID: 456032D717A4CD9C
6 changed files with 89 additions and 17 deletions

View file

@ -1,4 +1,29 @@
# frozen_string_literal: true
# El controlador desde el que descienden todos los controladores
class ApplicationController < ActionController::API
# authenticate! obtiene la pirata a partir de los datos de
# autenticacion y la pone en este atributo
attr_reader :current_pirata
# Vamos a usar HTTP Basic Auth
include ActionController::HttpAuthentication::Basic::ControllerMethods
private
# Autenticar a la pirata usando HTTP Basic Auth
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
def authenticate!
@current_pirata ||= authenticate_with_http_basic do |email, password|
pirata = Pirata.find_by_email(email)
if pirata&.authenticate(password)
session[:pirata_id] = pirata.id
pirata
end
end
# Si no la encuentra, no nos deja hacer nada
render(json: {}, status: :forbidden) unless current_pirata
end
end

View file

@ -2,6 +2,8 @@
# Consensos
class ConsensosController < ApplicationController
before_action :authenticate!
# Podemos ver todos los consensos
def index
@consensos = Consenso.all.order(:created_at, :desc)
@ -17,11 +19,14 @@ class ConsensosController < ApplicationController
# Podemos crear uno
def create
@consenso = Consenso.new(params.require(:consenso).permit(:titulo, :texto))
@consenso = current_pirata.consensos
.new(params.require(:consenso).permit(:titulo, :texto))
return if @consenso.save
render json: { errors: @consenso.errors.full_messages },
status: :unprocessable_entity
if @consenso.save
render status: :created
else
render json: { errors: @consenso.errors.full_messages },
status: :unprocessable_entity
end
end
end

View file

@ -2,13 +2,19 @@
# Las posiciones solo se pueden agregar a su consenso
class PosicionesController < ApplicationController
before_action :authenticate!
def create
@consenso = Consenso.find(params[:consenso_id])
@posicion = consenso.try(:posiciones).try(:build, posicion_params)
@posicion = @consenso.try(:posiciones).try(:build, posicion_params)
@posicion.try(:pirata=, current_pirata)
return if @posicion.try(:save)
render json: {}, status: :not_found
if @posicion.try(:save)
render status: :created
else
render json: @posicion.try(:errors).try(:full_messages),
status: :unprocessable_entity
end
end
private

View file

@ -0,0 +1,4 @@
# frozen_string_literal: true
json.call(@posicion, :id, :created_at, :pirata_id, :consenso_id, :estado,
:comentario)

View file

@ -1,34 +1,42 @@
# frozen_string_literal: true
require 'test_helper'
class ConsensosControllerTest < ActionDispatch::IntegrationTest
setup do
@pirata = create :pirata
@auth = { Authorization: ActionController::HttpAuthentication::Basic
.encode_credentials(@pirata.email, @pirata.password) }
end
test 'se pueden mostrar' do
2.times { create :consenso }
get consensos_url, as: :json
get consensos_url, as: :json, headers: @auth
body = JSON.parse(@response.body)
assert_equal 200, @response.status
assert_equal 2, body['consensos'].size
end
test 'se puede ver uno solo' do
consenso = create :consenso
get consenso_url(consenso), as: :json
get consenso_url(consenso), as: :json, headers: @auth
body = JSON.parse(@response.body)
assert_equal 200, @response.status
assert_equal consenso.titulo, body['titulo']
end
test 'se pueden crear' do
post consensos_url, as: :json, params: {
post consensos_url, as: :json, headers: @auth, params: {
consenso: {
titulo: 'hola',
texto: 'chau'
}
}
assert_equal 201, @response.status
body = JSON.parse(@response.body)
consenso = Consenso.find(body['id'])

View file

@ -3,7 +3,31 @@
require 'test_helper'
class PosicionesControllerTest < ActionDispatch::IntegrationTest
# test "the truth" do
# assert true
# end
setup do
@pirata = create :pirata
@auth = { Authorization: ActionController::HttpAuthentication::Basic
.encode_credentials(@pirata.email, @pirata.password) }
end
test 'se pueden crear' do
consenso = create :consenso
estado = Posicion::ESTADOS.sample
post consenso_posiciones_url(consenso), as: :json, headers: @auth,
params: {
posicion: {
estado: estado,
comentario: 'porque me place'
}
}
assert_equal 201, @response.status
body = JSON.parse(@response.body)
posicion = Posicion.find(body['id'])
assert_equal estado, posicion.estado
assert_equal consenso, posicion.consenso
assert_equal 'porque me place', posicion.comentario
end
end