Description
I am about to implement a business process which can be more or less modeled as a state machine. In abstract terms, here is how the state machine would look like
[Entity1] --process1--> [state1]--process2-->[state2]--process3-->[final state]
Every state transition is atomic operation. The reason we want to model it as a state machine is that complete operation can take long time to run and we do not want the caller to be blocked. So idea is that we would accept the request from caller and return 202 Accepted
is request looks ok.
After that, a scheduled process would pick up the request from database and trigger process1
by calling a REST endpoint. Same for process2
and process3
.
There are two ways that this can be modeled. First is implement a single REST endpoint like below
PUT http://api.com/entity/{id}/process
Because we know the current state of the entity, we can determine which process to execute next. But then I feel this API is not expressive and following would look better
PUT http://api.com/entity/{id}/process1
PUT http://api.com/entity/{id}/process2
PUT http://api.com/entity/{id}/process3
In the above, there is a distinct endpoint for every process that can be triggered on the entity. If you trigger process1
on an entity which is in final state
then you would get back an error.
I am not sure which one is right or if both of these approaches are wrong. Anyone has any experience of doing something like this in past?