Skip to content

Instantly share code, notes, and snippets.

@alxtz
Last active May 25, 2023 07:05
Show Gist options
  • Save alxtz/6e4b4d1acd710ba88605ccbfdfabbe11 to your computer and use it in GitHub Desktop.
Save alxtz/6e4b4d1acd710ba88605ccbfdfabbe11 to your computer and use it in GitHub Desktop.
const Event /* OrderProcessingEvents */ = {
REQUESTED: "REQUESTED",
PAYMENT_REQUESTED: "PAYMENT_REQUESTED",
PAYMENT_REJECTED: "PAYMENT_REJECTED",
REPLY_PAYMENT_FAILED: "REPLY_PAYMENT_FAILED",
REPLY_PAYMENT_COMPLETED: "REPLY_PAYMENT_COMPLETED",
};
const OrderState = {
INITIATED: "INITIATED",
CHARGE_INITIALIZED: "CHARGE_INITIALIZED",
CHARGE_PENDING: "CHARGE_PENDING",
CHARGE_REJECTED: "CHARGE_REJECTED",
INITIALIZE_CANCELLED: "INITIALIZE_CANCELLED",
CHARGE_FAILED: "CHARGE_FAILED",
CHARGE_COMPLETED: "CHARGE_COMPLETED",
};
class MutualFundOrderingOrchestrator {
constructor() {
StateMachine
/*
OrderState.INITIATE
(transitionToChargeInitialized) -> OrderState.CHARGE_INITIALIZED
*/
.on(Event.REQUESTED, OrderCreateCommand)
/*
OrderState.CHARGE_INITIALIZED
(replyTransitionToChargePending) -> OrderState.CHARGE_PENDING
(transitionToChargeRejected) -> OrderState.CHARGE_REJECTED
*/
.on(Event.PAYMENT_REQUESTED, OrderPaymentCreateCommand);
StateMachine
/*
OrderState.CHARGE_REJECTED
(transitionToInitializeCancelled) -> OrderState.INITIALIZE_CANCELLED
*/
.on(Event.PAYMENT_REJECTED, OrderInitializeFailedCommand);
StateMachine
/*
OrderState.CHARGE_PENDING
(Adapter::replyPaymentFailed) -> OrderState.CHARGE_FAILED
*/
.on(Event.REPLY_PAYMENT_FAILED, OrderPaymentFailedCommand)
/*
OrderState.CHARGE_PENDING
(Adapter::replyPaymentCompleted) -> OrderState.CHARGE_COMPLETED
*/
.on(Event.REPLY_PAYMENT_COMPLETED, OrderBookingStartCommand);
}
static transitionToChargeInitialized(order) {
if (order.state !== OrderState.INITIATED)
throw new Error("invalid state transition");
order.state = OrderState.CHARGE_INITIALIZED;
publish(Event.PAYMENT_REQUESTED, order);
}
static replyTransitionToChargePending(order) {
if (order.state !== OrderState.CHARGE_INITIALIZED)
throw new Error("invalid state transition");
order.state = OrderState.CHARGE_PENDING;
}
static transitionToChargeRejected(order) {
if (order.state !== OrderState.CHARGE_INITIALIZED)
throw new Error("invalid state transition");
order.state = OrderState.CHARGE_REJECTED;
publish(Event.PAYMENT_REJECTED, order);
}
static finalTransitionToInitializeCancelled(order) {
if (order.state !== OrderState.CHARGE_REJECTED)
throw new Error("invalid state transition");
order.state = OrderState.INITIALIZE_CANCELLED;
}
}
const PaymentMethodEvent = {
BPR_PAYMENT_COMPLETED: "BPR_PAYMENT_COMPLETED",
BAAS_PAYMENT_COMPLETED: "BAAS_PAYMENT_COMPLETED",
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment