packages feed

cqrs-example-0.7.0: src/CQRSExample/Instances.hs

module CQRSExample.Instances
       (
       ) where

import           CQRSExample.Aggregates
import           CQRSExample.Events
import           Data.CQRS (Eventable(..))
import qualified Data.Map as M
import qualified Data.Set as S
import qualified Data.Text as T

instance Eventable Project Event where
  applyEvent (ProjectCreated name shortDesc) DefaultProject =
    ActiveProject name shortDesc  -- Project changes to "active".
  applyEvent (ProjectCreated _    _        ) (ActiveProject _ _) =
    error "Invalid ProjectCreated event for project that already exists"
  applyEvent (ProjectRenamed _   ) DefaultProject =
    error "Cannot rename inactive project"
  applyEvent (ProjectRenamed name) project@(ActiveProject _ _) =
    project { projectName = name }
  applyEvent (TaskAdded _ _) DefaultProject =
    error "Cannot add task to inactive project"
  applyEvent (TaskAdded _ _) project@(ActiveProject _ _) =
    project -- Project doesn't change
  applyEvent (RecordedWorkUnit _ _ _ _ _) DefaultProject =
    error "Cannot record work on inactive project"
  applyEvent (RecordedWorkUnit _ _ _ _ _) project@(ActiveProject _ _) =
    project -- Project doesn't change
  applyEvent (TaskStarred _) project =
    project -- Project doesn't change
  applyEvent (TaskUnstarred _) project =
    project -- Project doesn't change
  applyEvent (UserCreated _ _ _ _) project =
    project
  applyEvent (UserRegistered _) project =
    project

instance Eventable Task Event where
  applyEvent (ProjectCreated _ _) task = task
  applyEvent (ProjectRenamed _) task = task
  applyEvent (TaskAdded pId tsd) NewTask =
    ActiveTask pId tsd T.empty M.empty
  applyEvent (TaskAdded _ _) (ActiveTask _ _ _ _) =
    error "Cannot add task which already exists"
  applyEvent (RecordedWorkUnit _ _ _ _ _) NewTask =
    error "Cannot record work on inactive task"
  applyEvent (RecordedWorkUnit wuId wuDay wuDuration wuComment wuUserId) task@(ActiveTask _ _ _ workUnits) =
    task { taskWorkUnits = M.insert wuDay (WorkUnit wuId wuComment wuDuration wuUserId) workUnits }
  applyEvent (UserCreated _ _ _ _) task = task
  applyEvent (TaskStarred _) task = task
  applyEvent (TaskUnstarred _) task = task
  applyEvent (UserRegistered _) task = task

instance Eventable User Event where
  applyEvent (ProjectCreated _ _) user = user
  applyEvent (ProjectRenamed _) user = user
  applyEvent (TaskAdded _ _) user = user
  applyEvent (RecordedWorkUnit _ _ _ _ _) user = user
  applyEvent (TaskStarred _) user = user
  applyEvent (TaskUnstarred _) user = user
  applyEvent (UserCreated _ _ _ _) (ActiveUser _ _ _ _) =
    error "User already exists"
  applyEvent (UserCreated ucUserName ucPassword ucFirstName ucLastName) UncreatedUser =
    ActiveUser ucUserName ucPassword ucFirstName ucLastName
  applyEvent (UserRegistered _) user = user

instance Eventable Site Event where
  applyEvent (ProjectCreated _ _) site = site
  applyEvent (ProjectRenamed _) site = site
  applyEvent (TaskAdded _ _) site = site
  applyEvent (RecordedWorkUnit _ _ _ _ _) site = site
  applyEvent (TaskStarred _) site = site
  applyEvent (TaskUnstarred _) site = site
  applyEvent (UserCreated _ _ _ _) site = site
  applyEvent (UserRegistered ucUserName) site =
    site { sUserNames = S.insert ucUserName $ sUserNames site }