Skip to content

Commit

Permalink
feat: adds speaker event details endpoint
Browse files Browse the repository at this point in the history
Co-authored-by: Gabriel <[email protected]>
  • Loading branch information
marcos-grocha and gctoledo committed Feb 4, 2025
1 parent 80a93cf commit 6ae1dd0
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 48 deletions.
95 changes: 56 additions & 39 deletions app/controllers/api/v1/speakers_controller.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class Api::V1::SpeakersController < Api::V1::ApiController
before_action :find_speaker, only: [ :event, :events, :schedules, :schedule_item ]

def create
if params[:email].blank?
return render json: { error: "E-mail não fornecido" }, status: :bad_request
Expand All @@ -14,62 +16,77 @@ def create
end

def events
speaker = Speaker.find_by(code: params[:code])

if speaker
events = speaker.events.distinct.map do |event|
{
code: event.code,
name: event.name,
event_type: event.event_type,
description: event.description.body ? event.description.body.to_html : "",
address: event.address,
logo_url: event.logo.attached? ? url_for(event.logo) : nil,
banner_url: event.banner.attached? ? url_for(event.banner) : nil,
participants_limit: event.participants_limit,
event_owner: event.user.name,
start_date: event.start_date,
end_date: event.end_date
}
end
render json: events, status: :ok
else
render json: { error: "Código não pertence a nenhum palestrante." }, status: :not_found
events = @speaker.events.distinct.map do |event|
{
code: event.code,
name: event.name,
event_type: event.event_type,
description: event.description.body ? event.description.body.to_html : "",
address: event.address,
logo_url: event.logo.attached? ? url_for(event.logo) : nil,
banner_url: event.banner.attached? ? url_for(event.banner) : nil,
participants_limit: event.participants_limit,
event_owner: event.user.name,
start_date: event.start_date,
end_date: event.end_date
}
end

render json: events, status: :ok
end

def schedules
speaker = Speaker.find_by(code: params[:speaker_code])
return render json: { error: "Código não pertence a nenhum palestrante." }, status: :not_found unless speaker
def event
event = @speaker.events.find_by(code: params[:event_code])
return render json: { error: "Palestrante não possui nenhum evento com esse código." }, status: :not_found unless event

json_response = {
code: event.code,
name: event.name,
event_type: event.event_type,
description: event.description.body ? event.description.body.to_html : "",
address: event.address,
logo_url: event.logo.attached? ? url_for(event.logo) : nil,
banner_url: event.banner.attached? ? url_for(event.banner) : nil,
participants_limit: event.participants_limit,
event_owner: event.user.name,
start_date: event.start_date,
end_date: event.end_date
}

render json: json_response, status: :ok
end

event = Event.find_by(code: params[:event_code])
return render json: { error: "Código não pertence a nenhum evento." }, status: :not_found unless event
def schedules
event = @speaker.events.find_by(code: params[:event_code])
return render json: { error: "Palestrante não possui nenhum evento com esse código." }, status: :not_found unless event

json_response = event.schedules.where(id: speaker.schedules.pluck(:id)).map do |schedule|
json_response = event.schedules.where(id: @speaker.schedules.pluck(:id)).map do |schedule|
{
date: schedule.date.strftime("%Y-%m-%d"),
activities: schedule.schedule_items
.where(responsible_email: speaker.email)
.where(responsible_email: @speaker.email)
.as_json(except: [ :id, :schedule_id, :updated_at, :created_at ])
}
end

return render json: { error: "O palestrante não possui nenhuma atividade nesse evento." }, status: :not_found if json_response.empty?

render json: json_response, status: :ok
end

def schedule_item
speaker = Speaker.find_by(code: params[:speaker_code])
return render json: { error: "Código não pertence a nenhum palestrante." }, status: :not_found unless speaker
schedule_item = @speaker.schedule_items.find_by(code: params[:schedule_item_code])
return render json: { error: "Palestrante não possui nenhum item de agenda com esse código." }, status: :not_found unless schedule_item

schedule_item = ScheduleItem.find_by(code: params[:schedule_item_code])
return render json: { error: "Código não pertence a nenhum item de agenda." }, status: :not_found unless schedule_item

if speaker.code == schedule_item.speaker.code
render json: schedule_item.as_json(except: [ :id, :updated_at ]), status: :ok
else
render json: { error: "O item de agenda não pertence ao palestrante." }, status: :unauthorized
end
end

private

def find_speaker
@speaker = Speaker.find_by(code: speaker_code)
render json: { error: "Código não pertence a nenhum palestrante." }, status: :not_found unless @speaker
end

def speaker_code
params[:code] || params[:speaker_code]
end
end
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

resources :speakers, only: [ :create ], param: :code do
get "events", on: :member
get "events/:event_code", to: "speakers#event", as: :events
get "schedules/:event_code", to: "speakers#schedules", as: :schedules
get "schedule_item/:schedule_item_code", to: "speakers#schedule_item", as: :schedule_item
end
Expand Down
61 changes: 52 additions & 9 deletions spec/requests/api/v1/speaker_api_request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@
get "/api/v1/speakers/#{speaker.code}/schedules/INVALID_CODE"

json_response = JSON.parse(response.body)
expect(json_response["error"]). to eq 'Código não pertence a nenhum evento.'
expect(json_response["error"]). to eq 'Palestrante não possui nenhum evento com esse código.'
expect(response.status).to eq 404
expect(response.content_type).to include('application/json')
end
Expand All @@ -173,7 +173,7 @@
end
end

context 'Busca itens de agenda do palestrante' do
context 'Busca item de agenda do palestrante' do
it 'com sucesso' do
user = create(:user)
event = create(:event, user: user)
Expand All @@ -189,7 +189,7 @@
expect(response.content_type).to include('application/json')
end

it 'e código do participante não é encontrado' do
it 'e código do palestrante não é encontrado' do
user = create(:user)
event = create(:event, user: user)
schedule = create(:schedule, event: event)
Expand All @@ -214,7 +214,7 @@
get "/api/v1/speakers/#{speaker.code}/schedule_item/INVALID_CODE"

json_response = JSON.parse(response.body)
expect(json_response["error"]). to eq 'Código não pertence a nenhum item de agenda.'
expect(json_response["error"]). to eq 'Palestrante não possui nenhum item de agenda com esse código.'
expect(response.status).to eq 404
expect(response.content_type).to include('application/json')
end
Expand All @@ -231,21 +231,64 @@

expect(response.status).to eq 500
end
end

it 'e falha por não ter autorização' do
context 'Busca detalhes de um evento do palestrante' do
it 'com sucesso' do
user = create(:user)
event = create(:event, user: user, name: 'Tropical Rails Fake')
schedule = create(:schedule, event: event)
create(:schedule_item, schedule: schedule, responsible_email: "[email protected]")
speaker = Speaker.last

get "/api/v1/speakers/#{speaker.code}/events/#{event.code}"

json_response = JSON.parse(response.body)
expect(json_response['name']).to eq 'Tropical Rails Fake'
expect(response.status).to eq 200
expect(response.content_type).to include('application/json')
end

it 'e o código do palestrante não é encontrado' do
user = create(:user)
event = create(:event, user: user)
schedule = create(:schedule, event: event)
create(:schedule_item, schedule: schedule, responsible_email: "[email protected]")

get "/api/v1/speakers/INVALID_CODE/events/#{event.code}"

json_response = JSON.parse(response.body)
expect(json_response["error"]). to eq 'Código não pertence a nenhum palestrante.'
expect(response.status).to eq 404
expect(response.content_type).to include('application/json')
end

it 'e código do evento não é encontrado' do
user = create(:user)
event = create(:event, user: user)
schedule = create(:schedule, event: event)
create(:schedule_item, schedule: schedule, responsible_email: "[email protected]")
speaker = Speaker.last
schedule_item = create(:schedule_item, schedule: schedule, responsible_email: "[email protected]", start_time: (Time.now + 1.day).change(hour: 10, min: 0, sec: 0), end_time: (Time.now + 1.day).change(hour: 11, min: 0, sec: 0))

get "/api/v1/speakers/#{speaker.code}/schedule_item/#{schedule_item.code}"
get "/api/v1/speakers/#{speaker.code}/events/INVALID_CODE"

json_response = JSON.parse(response.body)
expect(json_response["error"]). to eq 'O item de agenda não pertence ao palestrante.'
expect(json_response["error"]). to eq 'Palestrante não possui nenhum evento com esse código.'
expect(response.status).to eq 404
expect(response.content_type).to include('application/json')
expect(response.status).to eq 401
end

it 'e falha com um erro interno de servidor' do
user = create(:user)
event = create(:event, user: user)
schedule = create(:schedule, event: event)
create(:schedule_item, schedule: schedule, responsible_email: "[email protected]")
speaker = Speaker.last
allow(Speaker).to receive(:find_by).and_raise(ActiveRecord::ActiveRecordError)

get "/api/v1/speakers/#{speaker.code}/events/#{event.code}"

expect(response.status).to eq 500
end
end
end

0 comments on commit 6ae1dd0

Please sign in to comment.