From 92cf2ea616bef75c22e574ff7e9faf931e3a156b Mon Sep 17 00:00:00 2001 From: fauno Date: Sat, 3 Aug 2019 15:20:40 -0300 Subject: [PATCH] las barcas se pueden abordar o abandonar --- app/controllers/barcas_controller.rb | 41 ++++++++++++++++++++-- app/views/barcas/abandonar.json.jbuilder | 3 ++ app/views/barcas/abordar.json.jbuilder | 3 ++ config/routes.rb | 2 ++ test/controllers/barcas_controller_test.rb | 24 +++++++++++-- 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 app/views/barcas/abandonar.json.jbuilder create mode 100644 app/views/barcas/abordar.json.jbuilder diff --git a/app/controllers/barcas_controller.rb b/app/controllers/barcas_controller.rb index 16dd395..277ae45 100644 --- a/app/controllers/barcas_controller.rb +++ b/app/controllers/barcas_controller.rb @@ -36,6 +36,8 @@ class BarcasController < ApplicationController # nombre: @string, descripcion: @text } def create @barca = Barca.new(barca_params) + # La pirata se une a la barca que crea + @barca.piratas << current_pirata if @barca.save render status: :created @@ -53,7 +55,8 @@ class BarcasController < ApplicationController # @return hash { id: @int, created_at: @date, updated_at: @date, # nombre: @string, descripcion: @text } def update - @barca = Barca.find(params[:id]) + # Las piratas solo pueden modificar sus propias barcas + @barca = current_pirata.barcas.find(params[:id]) if @barca.update_attributes barca_params render status: :no_content @@ -70,7 +73,7 @@ class BarcasController < ApplicationController # @return hash { id: @int, created_at: @date, updated_at: @date, # nombre: @string, descripcion: @text } def destroy - @barca = Barca.find(params[:id]) + @barca = current_pirata.barcas.find(params[:id]) if @barca.destroy render status: :no_content @@ -80,9 +83,43 @@ class BarcasController < ApplicationController end end + # PUT /barcas/:barca_id/abordar + # + # La pirata actual aborda la barca + def abordar + find_barca + + @barca.piratas << current_pirata + + if @barca.save + render status: :no_content + else + render json: { errors: @barca.errors.messages }, + status: :unprocessable_entity + end + end + + # DELETE /barcas/:barca_id/abandonar + # + # La pirata actual abandona la barca! + def abandonar + find_barca + + if @barca.tripulaciones.find_by(pirata: current_pirata).destroy + render status: :no_content + else + render json: { errors: @barca.errors.messages }, + status: :unprocessable_entity + end + end + private def barca_params params.require(:barca).permit(:nombre, :descripcion) end + + def find_barca + @barca = Barca.find(params[:barca_id]) + end end diff --git a/app/views/barcas/abandonar.json.jbuilder b/app/views/barcas/abandonar.json.jbuilder new file mode 100644 index 0000000..79f7de2 --- /dev/null +++ b/app/views/barcas/abandonar.json.jbuilder @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +# empty diff --git a/app/views/barcas/abordar.json.jbuilder b/app/views/barcas/abordar.json.jbuilder new file mode 100644 index 0000000..79f7de2 --- /dev/null +++ b/app/views/barcas/abordar.json.jbuilder @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +# empty diff --git a/config/routes.rb b/config/routes.rb index 1e0ddb7..4411cf1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,8 @@ Rails.application.routes.draw do resources :webpush_subscriptions, only: %i[create] # Podemos crear barcas y dentro de ellas consensos resources :barcas, only: %i[index show create update destroy] do + put 'abordar', to: 'barcas#abordar' + delete 'abandonar', to: 'barcas#abandonar' # Podemos crear consensos pero no modificarlos resources :consensos, only: %i[index show create destroy] do # Y solo le podemos agregar posiciones diff --git a/test/controllers/barcas_controller_test.rb b/test/controllers/barcas_controller_test.rb index 22e8bd7..b6e19c1 100644 --- a/test/controllers/barcas_controller_test.rb +++ b/test/controllers/barcas_controller_test.rb @@ -9,7 +9,7 @@ class BarcasControllerTest < ActionDispatch::IntegrationTest test 'se pueden ver todas' do 2.times do - create :barca + create :barca, piratas: [@pirata] end get barcas_url, as: :json, headers: @auth @@ -33,7 +33,7 @@ class BarcasControllerTest < ActionDispatch::IntegrationTest end test 'se pueden editar' do - barca = create :barca + barca = create :barca, piratas: [@pirata] nombre = SecureRandom.hex put barca_url(barca), as: :json, headers: @auth, @@ -43,7 +43,7 @@ class BarcasControllerTest < ActionDispatch::IntegrationTest end test 'se pueden eliminar' do - barca = create :barca + barca = create :barca, piratas: [@pirata] delete barca_url(barca), as: :json, headers: @auth @@ -52,4 +52,22 @@ class BarcasControllerTest < ActionDispatch::IntegrationTest barca.reload end end + + test 'se pueden abandonar' do + barca = create :barca, piratas: [@pirata] + + delete barca_abandonar_url(barca), as: :json, headers: @auth + + assert_equal 204, @response.status + assert_not barca.reload.piratas.include?(@pirata) + end + + test 'se pueden abordar' do + barca = create :barca + + put barca_abordar_url(barca), as: :json, headers: @auth + + assert_equal 204, @response.status + assert barca.reload.piratas.include?(@pirata) + end end