mirror of
https://github.com/valitydev/wapi-lib.git
synced 2024-11-07 10:38:52 +00:00
Fix ff_transfer_machine actions (#18)
This commit is contained in:
parent
2e83eb06a5
commit
f34daad30c
@ -126,9 +126,9 @@ events(ID, Range) ->
|
|||||||
%% ff_transfer_machine behaviour
|
%% ff_transfer_machine behaviour
|
||||||
|
|
||||||
-spec process_transfer(deposit()) ->
|
-spec process_transfer(deposit()) ->
|
||||||
{ok, [ff_transfer_machine:event(ff_transfer:event())]} |
|
{ok, {ff_transfer_machine:action(), [ff_transfer_machine:event(ff_transfer:event())]}} |
|
||||||
{error, _Reason}.
|
{error, _Reason}.
|
||||||
process_transfer(#{status := pending, p_transfer := #{status := prepared}}) ->
|
process_transfer(#{status := pending, p_transfer := #{status := prepared}}) ->
|
||||||
{ok, [{status_changed, succeeded}]};
|
{ok, {continue, [{status_changed, succeeded}]}};
|
||||||
process_transfer(Transfer) ->
|
process_transfer(Transfer) ->
|
||||||
ff_transfer:process_transfer(Transfer).
|
ff_transfer:process_transfer(Transfer).
|
||||||
|
@ -118,7 +118,7 @@ construct_p_transfer_id(ID) ->
|
|||||||
%% ff_transfer_machine behaviour
|
%% ff_transfer_machine behaviour
|
||||||
|
|
||||||
-spec process_transfer(transfer(_)) ->
|
-spec process_transfer(transfer(_)) ->
|
||||||
{ok, [ff_transfer_machine:event(event())] | poll} |
|
{ok, {ff_transfer_machine:action(), [ff_transfer_machine:event(event())]}} |
|
||||||
{error, _Reason}.
|
{error, _Reason}.
|
||||||
|
|
||||||
process_transfer(Transfer) ->
|
process_transfer(Transfer) ->
|
||||||
@ -142,13 +142,19 @@ deduce_activity(_) ->
|
|||||||
undefined.
|
undefined.
|
||||||
|
|
||||||
process_activity(prepare_transfer, Transfer) ->
|
process_activity(prepare_transfer, Transfer) ->
|
||||||
with(p_transfer, Transfer, fun ff_postings_transfer:prepare/1);
|
do(fun () ->
|
||||||
|
{continue, unwrap(with(p_transfer, Transfer, fun ff_postings_transfer:prepare/1))}
|
||||||
|
end);
|
||||||
|
|
||||||
process_activity(commit_transfer, Transfer) ->
|
process_activity(commit_transfer, Transfer) ->
|
||||||
with(p_transfer, Transfer, fun ff_postings_transfer:commit/1);
|
do(fun () ->
|
||||||
|
{undefined, unwrap(with(p_transfer, Transfer, fun ff_postings_transfer:commit/1))}
|
||||||
|
end);
|
||||||
|
|
||||||
process_activity(cancel_transfer, Transfer) ->
|
process_activity(cancel_transfer, Transfer) ->
|
||||||
with(p_transfer, Transfer, fun ff_postings_transfer:cancel/1).
|
do(fun () ->
|
||||||
|
{undefined, unwrap(with(p_transfer, Transfer, fun ff_postings_transfer:cancel/1))}
|
||||||
|
end).
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -17,19 +17,21 @@
|
|||||||
%% Behaviour definition
|
%% Behaviour definition
|
||||||
|
|
||||||
-type st(T) :: ff_machine:st(transfer(T)).
|
-type st(T) :: ff_machine:st(transfer(T)).
|
||||||
|
-type action() :: poll | continue | undefined.
|
||||||
|
|
||||||
-export_type([id/0]).
|
-export_type([id/0]).
|
||||||
-export_type([ns/0]).
|
-export_type([ns/0]).
|
||||||
|
-export_type([action/0]).
|
||||||
-export_type([st/1]).
|
-export_type([st/1]).
|
||||||
-export_type([event/1]).
|
-export_type([event/1]).
|
||||||
-export_type([events/1]).
|
-export_type([events/1]).
|
||||||
|
|
||||||
-callback process_transfer(transfer(_)) ->
|
-callback process_transfer(transfer(_)) ->
|
||||||
{ok, [event(_)] | poll} |
|
{ok, {action(), [event(_)]}} |
|
||||||
{error, _Reason}.
|
{error, _Reason}.
|
||||||
|
|
||||||
-callback process_call(_CallArgs, transfer(_)) ->
|
-callback process_call(_CallArgs, transfer(_)) ->
|
||||||
{ok, [event(_)] | poll} |
|
{ok, {action(), [event(_)]}} |
|
||||||
{error, _Reason}.
|
{error, _Reason}.
|
||||||
|
|
||||||
-optional_callbacks([process_call/2]).
|
-optional_callbacks([process_call/2]).
|
||||||
@ -142,21 +144,26 @@ process_call(CallArgs, Machine, _, _Opts) ->
|
|||||||
Transfer = transfer(St),
|
Transfer = transfer(St),
|
||||||
{ok, process_result((ff_transfer:handler(Transfer)):process_call(CallArgs, Transfer), St)}.
|
{ok, process_result((ff_transfer:handler(Transfer)):process_call(CallArgs, Transfer), St)}.
|
||||||
|
|
||||||
process_result({ok, poll}, St) ->
|
process_result({ok, {Action, Events}}, St) ->
|
||||||
#{
|
genlib_map:compact(#{
|
||||||
action => set_poll_timer(St)
|
events => set_events(Events),
|
||||||
};
|
action => set_action(Action, St)
|
||||||
process_result({ok, Events}, _St) ->
|
});
|
||||||
#{
|
|
||||||
events => ff_machine:emit_events(Events),
|
|
||||||
action => continue
|
|
||||||
};
|
|
||||||
process_result({error, Reason}, _St) ->
|
process_result({error, Reason}, _St) ->
|
||||||
#{
|
#{
|
||||||
events => emit_failure(Reason)
|
events => emit_failure(Reason)
|
||||||
}.
|
}.
|
||||||
|
|
||||||
set_poll_timer(St) ->
|
set_events([]) ->
|
||||||
|
undefined;
|
||||||
|
set_events(Events) ->
|
||||||
|
ff_machine:emit_events(Events).
|
||||||
|
|
||||||
|
set_action(continue, _St) ->
|
||||||
|
continue;
|
||||||
|
set_action(undefined, _St) ->
|
||||||
|
undefined;
|
||||||
|
set_action(poll, St) ->
|
||||||
Now = machinery_time:now(),
|
Now = machinery_time:now(),
|
||||||
Timeout = erlang:max(1, machinery_time:interval(Now, ff_machine:updated(St)) div 1000),
|
Timeout = erlang:max(1, machinery_time:interval(Now, ff_machine:updated(St)) div 1000),
|
||||||
{set_timer, {timeout, Timeout}}.
|
{set_timer, {timeout, Timeout}}.
|
||||||
|
@ -130,7 +130,7 @@ events(ID, Range) ->
|
|||||||
%% ff_transfer_machine behaviour
|
%% ff_transfer_machine behaviour
|
||||||
|
|
||||||
-spec process_transfer(withdrawal()) ->
|
-spec process_transfer(withdrawal()) ->
|
||||||
{ok, [ff_transfer_machine:event(ff_transfer:event())]} |
|
{ok, {ff_transfer_machine:action(), [ff_transfer_machine:event(ff_transfer:event())]}} |
|
||||||
{error, _Reason}.
|
{error, _Reason}.
|
||||||
|
|
||||||
process_transfer(Transfer = #{status := pending, session := _}) ->
|
process_transfer(Transfer = #{status := pending, session := _}) ->
|
||||||
@ -152,7 +152,7 @@ create_session(Withdrawal) ->
|
|||||||
},
|
},
|
||||||
do(fun () ->
|
do(fun () ->
|
||||||
ok = unwrap(ff_withdrawal_session_machine:create(ID, TransferData, #{destination => destination(Withdrawal)})),
|
ok = unwrap(ff_withdrawal_session_machine:create(ID, TransferData, #{destination => destination(Withdrawal)})),
|
||||||
[{session_started, ID}]
|
{continue, [{session_started, ID}]}
|
||||||
end).
|
end).
|
||||||
|
|
||||||
construct_session_id(ID) ->
|
construct_session_id(ID) ->
|
||||||
@ -163,16 +163,16 @@ poll_session_completion(#{session := SID}) ->
|
|||||||
do(fun () ->
|
do(fun () ->
|
||||||
case ff_withdrawal_session_machine:status(Session) of
|
case ff_withdrawal_session_machine:status(Session) of
|
||||||
active ->
|
active ->
|
||||||
poll;
|
{poll, []};
|
||||||
{finished, {success, _}} ->
|
{finished, {success, _}} ->
|
||||||
[
|
{continue, [
|
||||||
{session_finished, SID},
|
{session_finished, SID},
|
||||||
{status_changed, succeeded}
|
{status_changed, succeeded}
|
||||||
];
|
]};
|
||||||
{finished, {failed, Failure}} ->
|
{finished, {failed, Failure}} ->
|
||||||
[
|
{continue, [
|
||||||
{session_finished, SID},
|
{session_finished, SID},
|
||||||
{status_changed, {failed, Failure}}
|
{status_changed, {failed, Failure}}
|
||||||
]
|
]}
|
||||||
end
|
end
|
||||||
end).
|
end).
|
||||||
|
Loading…
Reference in New Issue
Block a user