@@ -46,16 +46,20 @@ defmodule CodeCorpsWeb.GithubEventController do
4646 type = conn |> get_event_type
4747 delivery_id = conn |> get_delivery_id ( )
4848 action = payload |> Map . get ( "action" , "" )
49+ event_support = type |> EventSupport . status ( action )
50+ event_support |> process_event ( type , delivery_id , payload )
51+ conn |> respond_to_webhook ( event_support )
52+ end
4953
50- case type |> EventSupport . status ( action ) do
51- :supported ->
52- Processor . process ( fn -> Handler . handle_supported ( type , delivery_id , payload ) end )
53- conn |> send_resp ( 200 , "" )
54- :unsupported ->
55- Processor . process ( fn -> Handler . handle_unsupported ( type , delivery_id , payload ) end )
56- conn |> send_resp ( 200 , "" )
57- :ignored ->
58- conn |> send_resp ( 202 , "" )
54+ @ spec update ( Conn . t , map ) :: Conn . t
55+ def update ( % Conn { } = conn , % { "id" => id } = params ) do
56+ with % GithubEvent { } = github_event <- GithubEvent |> Repo . get ( id ) ,
57+ % User { } = current_user <- conn |> Guardian.Plug . current_resource ,
58+ { :ok , :authorized } <- current_user |> Policy . authorize ( :update , github_event , params ) ,
59+ changeset <- github_event |> GithubEvent . update_changeset ( params ) ,
60+ { :ok , updated_github_event } <- changeset |> retry_event ( )
61+ do
62+ conn |> render ( "show.json-api" , data: updated_github_event )
5963 end
6064 end
6165
@@ -76,4 +80,39 @@ defmodule CodeCorpsWeb.GithubEventController do
7680 defp paginate ( query , _ ) do
7781 query |> Repo . all ( )
7882 end
83+
84+ @ spec process_event ( atom , String . t , String . t , map ) :: any | :ok
85+ defp process_event ( :supported , type , delivery_id , payload ) do
86+ Processor . process ( fn -> Handler . handle_supported ( type , delivery_id , payload ) end )
87+ end
88+ defp process_event ( :unsupported , type , delivery_id , payload ) do
89+ Processor . process ( fn -> Handler . handle_unsupported ( type , delivery_id , payload ) end )
90+ end
91+ defp process_event ( :ignored , _ , _ , _ ) , do: :ok
92+
93+ @ type retry_outcome :: { :ok , GithubEvent . t } | { :error , Ecto.Changeset . t } | :ok
94+
95+ @ spec retry_event ( Ecto.Changeset . t ) :: retry_outcome
96+ defp retry_event ( % Ecto.Changeset { data: % GithubEvent { action: action , type: type } } = changeset ) do
97+ type
98+ |> EventSupport . status ( action )
99+ |> do_retry_event ( changeset )
100+ end
101+
102+ @ spec do_retry_event ( atom , Ecto.Changeset . t ) :: retry_outcome
103+ defp do_retry_event ( :ignored , _changeset ) , do: nil
104+ defp do_retry_event ( support , % Ecto.Changeset { data: % GithubEvent { github_delivery_id: delivery_id , payload: payload , type: type } } = changeset ) do
105+ case changeset |> Repo . update ( ) do
106+ { :ok , % GithubEvent { } = github_event } ->
107+ process_event ( support , type , delivery_id , payload )
108+ { :ok , github_event }
109+ { :error , error } ->
110+ { :error , error }
111+ end
112+ end
113+
114+ @ spec respond_to_webhook ( Conn . t , atom ) :: Conn . t
115+ defp respond_to_webhook ( conn , :supported ) , do: conn |> send_resp ( 200 , "" )
116+ defp respond_to_webhook ( conn , :unsupported ) , do: conn |> send_resp ( 200 , "" )
117+ defp respond_to_webhook ( conn , :ignored ) , do: conn |> send_resp ( 202 , "" )
79118end
0 commit comments