http basic auth + posiciones
This commit is contained in:
parent
5d87144a98
commit
0a0fed78b7
6 changed files with 89 additions and 17 deletions
|
@ -1,4 +1,29 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# El controlador desde el que descienden todos los controladores
|
||||||
class ApplicationController < ActionController::API
|
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
|
end
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
# Consensos
|
# Consensos
|
||||||
class ConsensosController < ApplicationController
|
class ConsensosController < ApplicationController
|
||||||
|
before_action :authenticate!
|
||||||
|
|
||||||
# Podemos ver todos los consensos
|
# Podemos ver todos los consensos
|
||||||
def index
|
def index
|
||||||
@consensos = Consenso.all.order(:created_at, :desc)
|
@consensos = Consenso.all.order(:created_at, :desc)
|
||||||
|
@ -17,11 +19,14 @@ class ConsensosController < ApplicationController
|
||||||
|
|
||||||
# Podemos crear uno
|
# Podemos crear uno
|
||||||
def create
|
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
|
|
||||||
|
|
||||||
|
if @consenso.save
|
||||||
|
render status: :created
|
||||||
|
else
|
||||||
render json: { errors: @consenso.errors.full_messages },
|
render json: { errors: @consenso.errors.full_messages },
|
||||||
status: :unprocessable_entity
|
status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -2,13 +2,19 @@
|
||||||
|
|
||||||
# Las posiciones solo se pueden agregar a su consenso
|
# Las posiciones solo se pueden agregar a su consenso
|
||||||
class PosicionesController < ApplicationController
|
class PosicionesController < ApplicationController
|
||||||
|
before_action :authenticate!
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@consenso = Consenso.find(params[:consenso_id])
|
@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)
|
if @posicion.try(:save)
|
||||||
|
render status: :created
|
||||||
render json: {}, status: :not_found
|
else
|
||||||
|
render json: @posicion.try(:errors).try(:full_messages),
|
||||||
|
status: :unprocessable_entity
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
4
app/views/posiciones/create.json.jbuilder
Normal file
4
app/views/posiciones/create.json.jbuilder
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
json.call(@posicion, :id, :created_at, :pirata_id, :consenso_id, :estado,
|
||||||
|
:comentario)
|
|
@ -1,34 +1,42 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'test_helper'
|
|
||||||
|
|
||||||
class ConsensosControllerTest < ActionDispatch::IntegrationTest
|
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
|
test 'se pueden mostrar' do
|
||||||
2.times { create :consenso }
|
2.times { create :consenso }
|
||||||
|
|
||||||
get consensos_url, as: :json
|
get consensos_url, as: :json, headers: @auth
|
||||||
body = JSON.parse(@response.body)
|
body = JSON.parse(@response.body)
|
||||||
|
|
||||||
|
assert_equal 200, @response.status
|
||||||
assert_equal 2, body['consensos'].size
|
assert_equal 2, body['consensos'].size
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'se puede ver uno solo' do
|
test 'se puede ver uno solo' do
|
||||||
consenso = create :consenso
|
consenso = create :consenso
|
||||||
|
|
||||||
get consenso_url(consenso), as: :json
|
get consenso_url(consenso), as: :json, headers: @auth
|
||||||
body = JSON.parse(@response.body)
|
body = JSON.parse(@response.body)
|
||||||
|
|
||||||
|
assert_equal 200, @response.status
|
||||||
assert_equal consenso.titulo, body['titulo']
|
assert_equal consenso.titulo, body['titulo']
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'se pueden crear' do
|
test 'se pueden crear' do
|
||||||
post consensos_url, as: :json, params: {
|
post consensos_url, as: :json, headers: @auth, params: {
|
||||||
consenso: {
|
consenso: {
|
||||||
titulo: 'hola',
|
titulo: 'hola',
|
||||||
texto: 'chau'
|
texto: 'chau'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert_equal 201, @response.status
|
||||||
|
|
||||||
body = JSON.parse(@response.body)
|
body = JSON.parse(@response.body)
|
||||||
consenso = Consenso.find(body['id'])
|
consenso = Consenso.find(body['id'])
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,31 @@
|
||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class PosicionesControllerTest < ActionDispatch::IntegrationTest
|
class PosicionesControllerTest < ActionDispatch::IntegrationTest
|
||||||
# test "the truth" do
|
setup do
|
||||||
# assert true
|
@pirata = create :pirata
|
||||||
# end
|
@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
|
end
|
||||||
|
|
Loading…
Reference in a new issue