diff --git a/src/FsCQRSShop.Domain/Basket.fs b/src/FsCQRSShop.Domain/Basket.fs index 18a65c0..572da39 100644 --- a/src/FsCQRSShop.Domain/Basket.fs +++ b/src/FsCQRSShop.Domain/Basket.fs @@ -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 @@ -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) -> diff --git a/src/FsCQRSShop.Domain/Customer.fs b/src/FsCQRSShop.Domain/Customer.fs index ed4a5ac..9b4415c 100644 --- a/src/FsCQRSShop.Domain/Customer.fs +++ b/src/FsCQRSShop.Domain/Customer.fs @@ -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) = diff --git a/src/FsCQRSShop.Domain/Order.fs b/src/FsCQRSShop.Domain/Order.fs index 8998c8b..918d9ed 100644 --- a/src/FsCQRSShop.Domain/Order.fs +++ b/src/FsCQRSShop.Domain/Order.fs @@ -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 = diff --git a/src/FsCQRSShop.Domain/Product.fs b/src/FsCQRSShop.Domain/Product.fs index 33943e5..df1d56b 100644 --- a/src/FsCQRSShop.Domain/Product.fs +++ b/src/FsCQRSShop.Domain/Product.fs @@ -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) =