Skip to content

Commit 35dab43

Browse files
authored
Merge pull request #41 from participateapp/23-delete-support
DELETE /support/:id
2 parents 60b5b8a + e13d929 commit 35dab43

File tree

4 files changed

+65
-11
lines changed

4 files changed

+65
-11
lines changed

spec/requests/supports_spec.exs

+50-1
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ defmodule ParticipateApi.SupportsSpec do
1212
{ :ok, jwt, _full_claims } = Guardian.encode_and_sign(account)
1313
jwt
1414
end
15+
16+
let! :proposal, do: insert(:proposal)
1517

1618
describe "POST /supports" do
17-
let! :proposal, do: insert(:proposal)
1819
let :params do
1920
%{
2021
"data" => %{
@@ -141,5 +142,53 @@ defmodule ParticipateApi.SupportsSpec do
141142
end
142143
end
143144
end
145+
146+
describe "DELETE /proposals/:id/support" do
147+
let! :support, do: insert(:support, proposal: proposal, author: current_participant)
148+
149+
subject do
150+
build_conn()
151+
|> put_req_header("accept", "application/vnd.api+json")
152+
|> put_req_header("content-type", "application/vnd.api+json")
153+
|> put_req_header("authorization", "Bearer #{token}")
154+
|> delete("/proposals/#{proposal.id}/support")
155+
end
156+
157+
it "deletes the support resource" do
158+
subject
159+
query = from Support, where: [id: ^support.id]
160+
expect(Repo.aggregate(query, :count, :id)).to eq 0
161+
end
162+
163+
it "204 No Content" do
164+
expect(subject).to have_http_status(204)
165+
expect(subject.resp_body).to eq ""
166+
end
167+
168+
context "current participant isn't the supporter" do
169+
let! :support, do: insert(:support)
170+
171+
it "403 Forbidden" do
172+
expect(subject).to have_http_status(403)
173+
expect(subject.resp_body).to eq ""
174+
end
175+
end
176+
177+
context "token is invalid" do
178+
let :token, do: "badtoken"
179+
180+
it "401 Unauthorized" do
181+
expect(subject).to have_http_status(401)
182+
end
183+
184+
it "Unauthenticated error" do
185+
# expect(subject.resp_body).to eq ""
186+
# this diverges from the oauth spec, but overriding
187+
# Guardian.Plug.EnsureAuthenticated's error handling isn't
188+
# worth it for now
189+
expect(subject.resp_body).to eq "{\"errors\":[\"Unauthenticated\"]}"
190+
end
191+
end
192+
end
144193
end
145194
end

web/controllers/proposal_controller.ex

-10
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,4 @@ defmodule ParticipateApi.ProposalController do
5757
end
5858
end
5959

60-
def delete(conn, %{"id" => id}) do
61-
proposal = Repo.get!(Proposal, id)
62-
63-
# Here we use delete! (with a bang) because we expect
64-
# it to always work (and if it does not, it will raise).
65-
Repo.delete!(proposal)
66-
67-
send_resp(conn, :no_content, "")
68-
end
69-
7060
end

web/controllers/support_controller.ex

+13
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,17 @@ defmodule ParticipateApi.SupportController do
4040
|> render(:errors, data: changeset)
4141
end
4242
end
43+
44+
def delete(conn, %{"proposal_id" => proposal_id}, account, _claims) do
45+
query = from Support, where: [proposal_id: ^proposal_id, author_id: ^account.participant_id]
46+
47+
support = Repo.one(query)
48+
49+
if support do
50+
Repo.delete(support)
51+
conn |> send_resp(:no_content, "")
52+
else
53+
conn |> send_resp(:forbidden, "")
54+
end
55+
end
4356
end

web/router.ex

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ defmodule ParticipateApi.Router do
2828
resources "/participants", ParticipantController, only: [:show]
2929
resources "/proposals", ProposalController
3030
resources "/supports", SupportController, only: [:create]
31+
32+
delete "/proposals/:proposal_id/support", SupportController, :delete
3133
end
3234

3335
end

0 commit comments

Comments
 (0)