Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions src/FsCQRSShop.Domain/Basket.fs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ module Basket =
| Init
| Created of BasketInfo * OrderLine list

let evolveOneBasket state = function
| BasketCreated(basketId, customerId, discount) -> Success (Created ({Id = basketId; Discount = discount},[]))
| ItemAdded(basketId, orderLine) -> match state with
| Created (info, lines) -> Success (Created(info, orderLine::lines))
let evolveOneBasket state event =
match state, event with
| Init, BasketCreated(basketId, customerId, discount) -> Success (Created ({Id = basketId; Discount = discount},[]))
| Created (info, lines), ItemAdded(basketId, orderLine) ->Success (Created(info, orderLine::lines))
| _ -> stateTransitionFail state event

let evolveBasket = evolve evolveOneBasket

let handleBasket deps pc =
let getState id = evolveBasket Init ((deps.readEvents id) |> (fun (_, e) -> e))
let getState id = evolveBasket Init ((deps.readEvents id) |> snd)

let createBasket id customerId discountResult (version,state) =
match state, discountResult with
Expand Down Expand Up @@ -66,6 +68,7 @@ module Basket =
let events = if orderTotal > 100000 then [NeedsApproval(orderId)] else [OrderApproved(orderId)]
Success (orderGuid, -1, (OrderCreated(orderId, b.Id, lines)::events))
| _ -> Failure InvalidPaymentAmount
| _ -> Failure (InvalidState "Basket")

match pc with
| CreateBasket(BasketId id, CustomerId customerId) ->
Expand Down
17 changes: 6 additions & 11 deletions src/FsCQRSShop.Domain/Customer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,15 @@ module Customer =
| Init -> invalidCustomerState

let evolveOneCustomer state event =
match state with
| Init -> match event with
| CustomerCreated(id, name) -> Success ( Created{Id = id; Name = name})
| _ -> stateTransitionFail event state
| Created info -> match event with
| CustomerMarkedAsPreferred(id, discount) -> Success (Preferred(info,discount))
| _ -> stateTransitionFail event state
| Preferred (info, _) -> match event with
| CustomerMarkedAsPreferred(id, discount) -> Success (Preferred(info,discount))
| _ -> stateTransitionFail event state
match state, event with
| Init, CustomerCreated(id, name) -> Success ( Created{Id = id; Name = name})
| Created info, CustomerMarkedAsPreferred(id, discount) -> Success (Preferred(info,discount))
| Preferred (info, _), CustomerMarkedAsPreferred(id, discount) -> Success (Preferred(info,discount))
| _ -> stateTransitionFail event state

let evolveCustomer = evolve evolveOneCustomer

let getCustomerState deps id = evolveCustomer Init ((deps.readEvents id) |> (fun (_, e) -> e))
let getCustomerState deps id = evolveCustomer Init ((deps.readEvents id) |> snd)

let handleCustomer deps cc =
let createCustomer id name (version, state) =
Expand Down
3 changes: 2 additions & 1 deletion src/FsCQRSShop.Domain/Order.fs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ module Order =
| OrderCreated (id, basketId, lines) -> Success (Created(id))
| OrderCancelled (id) -> Success (Cancelled(id))
| ShippingProcessStarted (id) -> Success (ShippingStarted(id))
| e -> stateTransitionFail state e

let evolveOrder = evolve evolveOneOrder
let getOrder deps id = evolveOrder Init ((deps.readEvents id) |> (fun (_, e) -> e))
let getOrder deps id = evolveOrder Init ((deps.readEvents id) |> snd)

let handleOrder deps pc =
let handleCommand id fn =
Expand Down
8 changes: 3 additions & 5 deletions src/FsCQRSShop.Domain/Product.fs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,12 @@ module Product =
| Created of ProductInfo

let evolveOneProduct state event =
match state with
| Init -> match event with
| ProductCreated(id, name, price) -> Success (Created {Id = id; Name = name; Price = price})
| _ -> stateTransitionFail state event
match state, event with
| Init, ProductCreated(id, name, price) -> Success (Created {Id = id; Name = name; Price = price})
| _ -> stateTransitionFail state event

let evolveProduct = evolve evolveOneProduct
let getProduct deps id = evolveProduct Init ((deps.readEvents id) |> (fun (_, e) -> e))
let getProduct deps id = evolveProduct Init ((deps.readEvents id) |> snd)

let handleProduct deps pc =
let createProduct id name price (version,state) =
Expand Down