Skip to content

Commit 7175b14

Browse files
authored
Merge pull request #16 from tuanle03/clr-58-create-api-feedback
[CLR-58] Create API Feedback
2 parents 4b71cde + 96ddc03 commit 7175b14

File tree

4 files changed

+179
-20
lines changed

4 files changed

+179
-20
lines changed

app/api/web/feedbacks_api.rb

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,95 @@
11
module API
22
class Web::FeedbacksAPI < Grape::API
3-
resource :feedback do
3+
resource :feedbacks do
44
desc 'Create feedback'
55
params do
6-
requires :content, type: String
6+
requires :content, type: String, allow_blank: false
77
requires :post_id, type: Integer
88
end
99
post do
1010
authenticate_user!
11-
Feedback.create!({
12-
content: params[:content],
13-
user_id: current_user.id,
14-
post_id: params[:post_id]
15-
})
11+
feedback = current_user.feedbacks.new(content: params[:content], post_id: params[:post_id])
12+
if feedback.save
13+
status 200
14+
{
15+
success: true,
16+
message: 'Feedback created'
17+
}
18+
else
19+
status 400
20+
{
21+
success: false,
22+
message: feedback.error.full_messages
23+
}
24+
end
1625
end
1726

18-
desc 'Get feedback'
19-
get do
20-
Feedback.all
27+
desc 'detail of feedback'
28+
params do
29+
requires :id, type: Integer
30+
end
31+
get ':id' do
32+
feedback = Feedback.find_by(id: params[:id])
33+
if feedback
34+
status 200
35+
{
36+
success: true,
37+
feedback: feedback
38+
}
39+
else
40+
status 400
41+
{
42+
success: false,
43+
message: 'Feedback not found'
44+
}
45+
end
2146
end
2247

2348
desc 'Delete feedback'
2449
params do
2550
requires :id, type: Integer
26-
requires :user_id, type: Integer
2751
end
2852
delete ':id' do
29-
Feedback.find_by(id: params[:id], user_id: params[:user_id]).destroy
53+
authenticate_user!
54+
feedback = current_user.feedbacks.find_by(id: params[:id])
55+
return status 400 if feedback.blank?
56+
if feedback.destroy
57+
status 200
58+
{
59+
success: true,
60+
message: 'Feedback deleted'
61+
}
62+
else
63+
status 400
64+
{
65+
success: false,
66+
message: 'Feedback not found'
67+
}
68+
end
3069
end
3170

3271
desc 'Update feedback'
3372
params do
3473
requires :id, type: Integer
35-
requires :content, type: String
36-
requires :user_id, type: Integer
74+
requires :new_content, type: String, allow_blank: false
3775
end
38-
3976
put ':id' do
40-
feedback = Feedback.find_by(id: params[:id], user_id: params[:user_id])
41-
feedback.update!({
42-
content: params[:content],
43-
user_id: params[:user_id]
44-
})
77+
authenticate_user!
78+
feedback = current_user.feedbacks.find_by(id: params[:id])
79+
feedback.update(content: params[:new_content])
80+
if feedback.save
81+
status 200
82+
{
83+
success: true,
84+
message: 'Feedback updated'
85+
}
86+
else
87+
status 400
88+
{
89+
success: false,
90+
message: 'Feedback can not update'
91+
}
92+
end
4593
end
4694
end
4795
end

app/models/user.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ class User < ApplicationRecord
77
:recoverable, :rememberable, :validatable,
88
:jwt_authenticatable, jwt_revocation_strategy: self
99

10+
has_many :posts, dependent: :destroy
11+
has_many :feedbacks, dependent: :destroy
12+
1013
def generate_jwt
1114
payload = { user_id: id, exp: 1.day.from_now.to_i }
1215
JWT.encode(payload, Rails.application.credentials.devise_jwt_secret_key)

spec/api/web/feedbacks_api_spec.rb

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
require 'rack/test'
5+
6+
describe Web do
7+
include Rack::Test::Methods
8+
9+
def app
10+
Web::FeedbacksAPI
11+
end
12+
13+
let(:user) { create(:user) }
14+
let(:token) { user.generate_jwt }
15+
16+
describe 'POST /web/feedbacks' do
17+
context 'with valid parameters' do
18+
it 'creates a feedback' do
19+
post '/web/feedbacks', { content: 'Great post!', post_id: 1 }, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
20+
21+
expect(last_response.status).to eq(200)
22+
json = JSON.parse(last_response.body)
23+
expect(json['success']).to eq(true)
24+
expect(json['message']).to eq('Feedback created')
25+
end
26+
end
27+
28+
context 'with invalid parameters' do
29+
it 'returns an error message' do
30+
post '/web/feedbacks', { content: '', post_id: 1 }, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
31+
32+
expect(last_response.status).to eq(400)
33+
end
34+
end
35+
end
36+
37+
describe 'GET /web/feedbacks/:id' do
38+
let(:feedback) { create(:feedback, user_id: user.id) }
39+
40+
context 'with a valid feedback ID' do
41+
it 'returns the details of the feedback' do
42+
get "/web/feedbacks/#{feedback.id}", {}, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
43+
44+
expect(last_response.status).to eq(200)
45+
json = JSON.parse(last_response.body)
46+
expect(json['success']).to eq(true)
47+
expect(json['feedback']['id']).to eq(feedback.id)
48+
end
49+
end
50+
51+
context 'with an invalid feedback ID' do
52+
it 'returns an error message' do
53+
get '/web/feedbacks/999', {}, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
54+
55+
expect(last_response.status).to eq(400)
56+
json = JSON.parse(last_response.body)
57+
expect(json['success']).to eq(false)
58+
expect(json['message']).to eq('Feedback not found')
59+
end
60+
end
61+
end
62+
63+
describe 'DELETE /web/feedbacks/:id' do
64+
let(:feedback) { create(:feedback, user: user) }
65+
66+
context 'with a valid feedback ID' do
67+
it 'deletes the feedback' do
68+
delete "/web/feedbacks/#{feedback.id}", {}, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
69+
70+
expect(last_response.status).to eq(200)
71+
json = JSON.parse(last_response.body)
72+
expect(json['success']).to eq(true)
73+
expect(json['message']).to eq('Feedback deleted')
74+
end
75+
end
76+
77+
context 'with an invalid feedback ID' do
78+
it 'returns an error message' do
79+
delete '/web/feedbacks/999', {}, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
80+
81+
expect(last_response.status).to eq(400)
82+
end
83+
end
84+
end
85+
86+
describe 'PUT /web/feedbacks/:id' do
87+
let(:feedback) { create(:feedback, user: user) }
88+
89+
context 'with valid parameters' do
90+
it 'updates the feedback' do
91+
put "/web/feedbacks/#{feedback.id}", { new_content: 'Updated content' }, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
92+
93+
expect(last_response.status).to eq(200)
94+
json = JSON.parse(last_response.body)
95+
expect(json['success']).to eq(true)
96+
expect(json['message']).to eq('Feedback updated')
97+
end
98+
end
99+
100+
context 'with invalid parameters' do
101+
it 'returns an error message' do
102+
put "/web/feedbacks/#{feedback.id}", { new_content: '' }, 'HTTP_AUTHORIZATION' => "Bearer #{token}"
103+
104+
expect(last_response.status).to eq(400)
105+
end
106+
end
107+
end
108+
end

0 commit comments

Comments
 (0)