Skip to content

Commit 1c410e5

Browse files
Merge PR #202 from TreinaDev/feat/api-endpoint-recusa-solicitação-convite
Feat/api endpoint recusa solicitação convite Co-authored-by: [email protected] <[email protected]>
2 parents 2e0f593 + 48fb49d commit 1c410e5

File tree

5 files changed

+163
-2
lines changed

5 files changed

+163
-2
lines changed

api_doc.md

+63
Original file line numberDiff line numberDiff line change
@@ -421,3 +421,66 @@ Retorno esperado:
421421
}
422422
```
423423
</details>
424+
425+
## 7. Alterar status de solicitação de convite
426+
427+
<details>
428+
<summary>PATCH /api/v1/invitation_requests/:id</summary>
429+
430+
<br>
431+
432+
### Endpoint
433+
434+
```shell
435+
PATCH /api/v1/invitation_requests/:id
436+
```
437+
438+
Retorno esperado caso a requisição seja bem sucedida. **(Status: 200)**
439+
440+
Resposta:
441+
```json
442+
{
443+
"id": 1,
444+
"profile_id": 1,
445+
"message": "exemplo de mensagem enviada pelo usuário do Portfoliorrr",
446+
"project_id": 1,
447+
"status": "refused"
448+
}
449+
```
450+
451+
### Erros tratados
452+
453+
Erro quando a solicitação não estiver com status Pendente **(Status: 409)**
454+
455+
Resposta:
456+
```json
457+
{
458+
"errors": "Solicitação de convite não está pendente para ser recusada."
459+
}
460+
```
461+
462+
Erro para id de solicitação de convite inválido **(Status: 404)**
463+
464+
Este erro acontece quando a requisição é feita com um id de solicitação de convite que não existe.
465+
466+
```shell
467+
PATCH /api/v1/invitation_requests/999999999999999
468+
```
469+
470+
Retorno esperado:
471+
472+
```json
473+
{
474+
"error": "Não encontrado"
475+
}
476+
```
477+
478+
Erro interno do servidor **(Status: 500)**
479+
480+
Resposta:
481+
```json
482+
{
483+
"errors": "Houve um erro interno no servidor ao processar sua solicitação."
484+
}
485+
```
486+
</details>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module Api
2+
module V1
3+
class InvitationRequestController < ApiController
4+
def update
5+
raise ActiveRecord::ParameterMissing if params[:id].blank?
6+
7+
invitation_request = InvitationRequest.find(params[:id])
8+
if invitation_request.pending?
9+
invitation_request.refused!
10+
render status: :ok, json: invitation_request.as_json(except: %i[created_at updated_at])
11+
else
12+
render status: :conflict, json: { errors: I18n.t('.api_not_pending_error') }
13+
end
14+
end
15+
end
16+
end
17+
end

config/locales/models/invitation_request.pt-BR.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ pt-BR:
2222
project_api_error: Não foi possível carregar informações dos projetos. Tente mais tarde
2323
no_invitation_request_msg: Você ainda não fez nenhuma solicitação de convite.
2424
no_filter_results_msg: Não existem solicitações com o status selecionado.
25-
time_ago: 'Enviada há %{time}'
25+
time_ago: 'Enviada há %{time}'
26+
api_not_pending_error: 'Solicitação de convite não está pendente para ser recusada.'

config/routes.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
resources :job_categories, only: %i[index show]
6363
resources :profiles, only: %i[show index]
6464
resources :invitations, only: %i[create update]
65-
65+
resources :invitation_request, only: %i[update]
66+
6667
get 'projects/request_invitation', controller: :projects
6768
end
6869
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
require 'rails_helper'
2+
3+
describe 'API solicitações' do
4+
context 'PATCH /api/v1/invitation_requests/:id' do
5+
it 'altera o status para recusado com sucesso' do
6+
user = create(:user)
7+
invitation_request = create(:invitation_request, profile: user.profile, status: :pending, message: 'oi projeto')
8+
9+
patch "/api/v1/invitation_request/#{invitation_request.id}"
10+
invitation_request.reload
11+
12+
expect(response).to have_http_status(200)
13+
expect(response.content_type).to include('application/json')
14+
json_response = JSON.parse(response.body)
15+
expect(json_response.class).to eq Hash
16+
expect(json_response['id']).to eq 1
17+
expect(json_response['profile_id']).to eq 1
18+
expect(json_response['message']).to eq 'oi projeto'
19+
expect(json_response['project_id']).to eq 1
20+
expect(json_response.keys).not_to include 'created_at'
21+
expect(json_response.keys).not_to include 'updated_at'
22+
expect(json_response['status']).to eq 'refused'
23+
end
24+
25+
it 'retorna erro 409 se a solicitação não estiver pendente' do
26+
request1 = create(:invitation_request, status: :processing)
27+
request2 = create(:invitation_request, status: :accepted)
28+
request3 = create(:invitation_request, status: :refused)
29+
request4 = create(:invitation_request, status: :error)
30+
request5 = create(:invitation_request, status: :aborted)
31+
32+
response_status1 = patch "/api/v1/invitation_request/#{request1.id}"
33+
response_status2 = patch "/api/v1/invitation_request/#{request2.id}"
34+
response_status3 = patch "/api/v1/invitation_request/#{request3.id}"
35+
response_status4 = patch "/api/v1/invitation_request/#{request4.id}"
36+
response_status5 = patch "/api/v1/invitation_request/#{request5.id}"
37+
request1.reload
38+
request2.reload
39+
request3.reload
40+
request4.reload
41+
request5.reload
42+
43+
expect(response_status1).to eq 409
44+
expect(response_status2).to eq 409
45+
expect(response_status3).to eq 409
46+
expect(response_status4).to eq 409
47+
expect(response_status5).to eq 409
48+
expect(request1).to be_processing
49+
expect(request2).to be_accepted
50+
expect(request3).to be_refused
51+
expect(request4).to be_error
52+
expect(request5).to be_aborted
53+
expect(response.content_type).to include 'application/json'
54+
json_last_response = JSON.parse(response.body)
55+
expect(json_last_response.class).to eq Hash
56+
expect(json_last_response['errors']).to include 'Solicitação de convite não está pendente para ser recusada.'
57+
end
58+
59+
it 'retorna erro 404 se a solicitação não for encontrada' do
60+
patch '/api/v1/invitation_request/1939'
61+
62+
expect(response.status).to eq 404
63+
expect(response.content_type).to include 'application/json'
64+
json_response = JSON.parse(response.body)
65+
expect(json_response['error']).to include 'Não encontrado'
66+
end
67+
68+
it 'retorna erro 500, com mensagem identificando erro do servidor' do
69+
allow(InvitationRequest).to receive(:find).and_raise(ActiveRecord::ActiveRecordError)
70+
invitation_request = create(:invitation_request)
71+
patch "/api/v1/invitation_request/#{invitation_request.id}"
72+
73+
expect(response.status).to eq 500
74+
expect(response.content_type).to include 'application/json'
75+
json_response = JSON.parse(response.body)
76+
expect(json_response['error']).to include 'Houve um erro interno no servidor ao processar sua solicitação.'
77+
end
78+
end
79+
end

0 commit comments

Comments
 (0)