1 {-# LANGUAGE OverloadedStrings, TypeFamilies #-}
    2 module Model.Container.Types
    3   ( ContainerRow(..)
    4   , Container(..)
    5   , getContainerVolumeRole
    6   , getContainerRelease
    7   ) where
    8 
    9 import Data.Foldable (fold)
   10 import qualified Data.Text as T
   11 
   12 import Has (Has(..))
   13 import Model.Time
   14 import Model.Kind
   15 import Model.Release.Types
   16 import Model.Id.Types
   17 import Model.Volume.Types
   18 import Model.Permission.Types
   19 
   20 type instance IdType Container = Int32
   21 
   22 data ContainerRow = ContainerRow
   23   { containerId :: Id Container
   24   , containerTop :: Bool
   25   , containerName :: Maybe T.Text
   26   , containerDate :: Maybe Date
   27   }
   28 
   29 data Container = Container
   30   { containerRow :: !ContainerRow
   31   , containerRelease :: Maybe Release
   32   , containerVolume :: Volume
   33   }
   34 
   35 getContainerVolumeRole :: Container -> VolumeRolePolicy
   36 getContainerVolumeRole = volumeRolePolicy . containerVolume
   37 
   38 getContainerRelease :: Container -> EffectiveRelease
   39 getContainerRelease c =
   40   EffectiveRelease {
   41       effRelPublic = (fold . containerRelease) c
   42     , effRelPrivate = ReleasePRIVATE -- TODO: name hardcoded default level for Private release centrally
   43     }
   44 
   45 instance Kinded Container where
   46   kindOf _ = "container"
   47 
   48 instance Has (Id Container) ContainerRow where
   49   view = containerId
   50 
   51 instance Has (Id Container) Container where
   52   view = view . containerRow
   53 instance Has (Maybe Release) Container where
   54   view = containerRelease
   55 instance Has Volume Container where
   56   view = containerVolume
   57 instance Has Permission Container where
   58   view = view . containerVolume
   59