1 {-# LANGUAGE TypeFamilies #-}
    2 module Model.RecordSlot.Types
    3   ( RecordSlot(..)
    4   , recordSlotId
    5   , getRecordSlotVolumePermission
    6   , getRecordSlotRelease
    7   ) where
    8 
    9 import Control.Applicative ((<|>))
   10 import Data.Foldable (fold)
   11 
   12 import Has (Has(..))
   13 import Model.Id.Types
   14 import Model.Permission
   15 import Model.Release
   16 import Model.Segment
   17 import Model.Volume.Types
   18 import Model.Container.Types
   19 import Model.Record.Types
   20 import Model.Category.Types
   21 import Model.Slot.Types
   22 
   23 data RecordSlotId = RecordSlotId
   24   { _slotRecordId :: !(Id Record)
   25   , _recordSlotId :: !(Id Slot)
   26   }
   27 
   28 type instance IdType RecordSlot = RecordSlotId
   29 
   30 data RecordSlot = RecordSlot
   31   { slotRecord :: Record
   32   , recordSlot :: Slot
   33   }
   34 
   35 recordSlotId :: RecordSlot -> Id RecordSlot
   36 recordSlotId (RecordSlot r s) = Id $ RecordSlotId (recordId $ recordRow r) (slotId s)
   37 
   38 instance Has Record RecordSlot where
   39   view = slotRecord
   40 instance Has (Id Record) RecordSlot where
   41   view = view . slotRecord
   42 instance Has Category RecordSlot where
   43   view = view . slotRecord
   44 instance Has (Id Category) RecordSlot where
   45   view = view . slotRecord
   46 instance Has Volume RecordSlot where
   47   view = view . slotRecord
   48 {- instance Has (Id Volume) RecordSlot where
   49   view = view . slotRecord -}
   50 getRecordSlotVolumePermission :: RecordSlot -> VolumeRolePolicy
   51 getRecordSlotVolumePermission = getRecordVolumePermission . slotRecord
   52 
   53 instance Has Slot RecordSlot where
   54   view = recordSlot
   55 instance Has Container RecordSlot where
   56   view = view . recordSlot
   57 instance Has (Id Container) RecordSlot where
   58   view = view . recordSlot
   59 instance Has Segment RecordSlot where
   60   view = view . recordSlot
   61 
   62 getRecordSlotRelease :: RecordSlot -> EffectiveRelease
   63 getRecordSlotRelease rs =
   64   EffectiveRelease {
   65       effRelPublic = fold (view (recordSlot rs) <|> view (slotRecord rs) :: Maybe Release)
   66     , effRelPrivate = ReleasePRIVATE
   67   }