|
24 | 24 | -define(NS, <<"invoice">>). |
25 | 25 |
|
26 | 26 | -export([process_callback/2]). |
| 27 | +-export([process_session_change_by_tag/2]). |
27 | 28 |
|
28 | 29 | -export_type([activity/0]). |
29 | 30 | -export_type([invoice/0]). |
@@ -211,22 +212,42 @@ get_payment_state(PaymentSession) -> |
211 | 212 | %% |
212 | 213 |
|
213 | 214 | -type tag() :: dmsl_base_thrift:'Tag'(). |
| 215 | +-type session_change() :: hg_session:change(). |
214 | 216 | -type callback() :: {provider, dmsl_proxy_provider_thrift:'Callback'()}. |
215 | 217 | -type callback_response() :: dmsl_proxy_provider_thrift:'CallbackResponse'(). |
216 | 218 |
|
217 | 219 | -spec process_callback(tag(), callback()) -> |
218 | 220 | {ok, callback_response()} | {error, invalid_callback | notfound | failed} | no_return(). |
219 | 221 | process_callback(Tag, Callback) -> |
| 222 | + process_with_tag(Tag, fun(MachineID) -> |
| 223 | + case hg_machine:call(?NS, MachineID, {callback, Tag, Callback}) of |
| 224 | + {ok, _} = Ok -> |
| 225 | + Ok; |
| 226 | + {exception, invalid_callback} -> |
| 227 | + {error, invalid_callback}; |
| 228 | + {error, _} = Error -> |
| 229 | + Error |
| 230 | + end |
| 231 | + end). |
| 232 | + |
| 233 | +-spec process_session_change_by_tag(tag(), session_change()) -> |
| 234 | + ok | {error, notfound | failed} | no_return(). |
| 235 | +process_session_change_by_tag(Tag, SessionChange) -> |
| 236 | + process_with_tag(Tag, fun(MachineID) -> |
| 237 | + case hg_machine:call(?NS, MachineID, {session_change, Tag, SessionChange}) of |
| 238 | + ok -> |
| 239 | + ok; |
| 240 | + {exception, invalid_callback} -> |
| 241 | + {error, notfound}; |
| 242 | + {error, _} = Error -> |
| 243 | + Error |
| 244 | + end |
| 245 | + end). |
| 246 | + |
| 247 | +process_with_tag(Tag, F) -> |
220 | 248 | case hg_machine_tag:get_binding(namespace(), Tag) of |
221 | 249 | {ok, _EntityID, MachineID} -> |
222 | | - case hg_machine:call(?NS, MachineID, {callback, Tag, Callback}) of |
223 | | - {ok, _} = Ok -> |
224 | | - Ok; |
225 | | - {exception, invalid_callback} -> |
226 | | - {error, invalid_callback}; |
227 | | - {error, _} = Error -> |
228 | | - Error |
229 | | - end; |
| 250 | + F(MachineID); |
230 | 251 | {error, _} = Error -> |
231 | 252 | Error |
232 | 253 | end. |
@@ -339,7 +360,8 @@ handle_expiration(St) -> |
339 | 360 |
|
340 | 361 | -type thrift_call() :: hg_machine:thrift_call(). |
341 | 362 | -type callback_call() :: {callback, tag(), callback()}. |
342 | | --type call() :: thrift_call() | callback_call(). |
| 363 | +-type session_change_call() :: {session_change, tag(), session_change()}. |
| 364 | +-type call() :: thrift_call() | callback_call() | session_change_call(). |
343 | 365 | -type call_result() :: #{ |
344 | 366 | changes => [invoice_change()], |
345 | 367 | action => hg_machine_action:t(), |
@@ -455,14 +477,20 @@ handle_call({{'Invoicing', 'CreatePaymentAdjustment'}, {_InvoiceID, PaymentID, P |
455 | 477 | hg_invoice_payment:create_adjustment(Timestamp, Params, PaymentSession, Opts), |
456 | 478 | St |
457 | 479 | ); |
458 | | -handle_call({callback, Tag, Callback}, St) -> |
459 | | - dispatch_callback(Tag, Callback, St). |
460 | | - |
461 | | --spec dispatch_callback(tag(), callback(), st()) -> call_result(). |
462 | | -dispatch_callback(Tag, {provider, Payload}, St = #st{activity = {payment, PaymentID}}) -> |
| 480 | +handle_call({callback, _Tag, _Callback} = Call, St) -> |
| 481 | + dispatch_to_session(Call, St); |
| 482 | +handle_call({session_change, _Tag, _SessionChange} = Call, St) -> |
| 483 | + dispatch_to_session(Call, St). |
| 484 | + |
| 485 | +-spec dispatch_to_session({callback, tag(), callback()} | {session_change, tag(), session_change()}, st()) -> |
| 486 | + call_result(). |
| 487 | +dispatch_to_session({callback, Tag, {provider, Payload}}, St = #st{activity = {payment, PaymentID}}) -> |
463 | 488 | PaymentSession = get_payment_session(PaymentID, St), |
464 | 489 | process_payment_call({callback, Tag, Payload}, PaymentID, PaymentSession, St); |
465 | | -dispatch_callback(_Tag, _Callback, _St) -> |
| 490 | +dispatch_to_session({session_change, _Tag, _SessionChange} = Call, St = #st{activity = {payment, PaymentID}}) -> |
| 491 | + PaymentSession = get_payment_session(PaymentID, St), |
| 492 | + process_payment_call(Call, PaymentID, PaymentSession, St); |
| 493 | +dispatch_to_session(_Call, _St) -> |
466 | 494 | throw(invalid_callback). |
467 | 495 |
|
468 | 496 | assert_no_pending_payment(#st{activity = {payment, PaymentID}}) -> |
|
0 commit comments