Polaris helps you create, store and run workflows. A workflow is a series of multiple steps, and can often be long running.
You don't need to worry about:
- Sequence of steps (it will figure out which the sequence along with the ones that can run concurrently)
- Explicitly pausing workflows (when it runs out of new data to move the workflow ahead, it pauses)
Polaris is especially useful for payments, e-commerce and fulfilment use cases. Consider a payment gateway trying to process payments via cards and netbanking.
Often, a lot of the logic would overlap - such as invoicing, settlements, etc. Polaris can neatly structure your code, making it more maintainable than ever.
type CardPaymentWorkflow struct{}
func (w CPW) GetWorkflowMeta() WorkflowMeta {
return WorkflowMeta{
Builders: []IBuilder{
InitiateReq{},
EncryptCardInfo{},
TokenizeCard{},
ProcessPayment{},
OTPVerification{},
PaymentComplete{},
GenerateInvoice{},
},
TargetData: PaymentCompletedData{},
}
} |
type NetbankingPaymentWorkflow struct{}
func (w NPW) GetWorkflowMeta() WorkflowMeta {
return WorkflowMeta{
Builders: []IBuilder{
InitiateReq{},
FetchBankRedirectURL{},
RedirectAndCollect{},
ProcessBankPayment{},
OTPVerification{},
PaymentComplete{},
GenerateInvoice{},
},
TargetData: PaymentCompletedData{},
}
} |
Each builder (workflow's unit of work) would maintain and process some logic, which can be reused across multiple workflows.
For example,
type TokenizeCard struct {
TokenService TokenService
DB TokenStore
}
func (b TokenizeCard) GetBuilderInfo() BuilderInfo {
return BuilderInfo{
Consumes: []IData{ EncryptedCardData{} },
Produces: CardTokenData{},
}
}
func (b TokenizeCard) Process(ctx BuilderContext) IData {
enc := ctx.Get(EncryptedCardData{})
token := b.TokenService.Generate(enc)
b.DB.Save(token)
return CardTokenData{ Token: token }
}
For more details, dive into the docs!