1 {-# LANGUAGE TypeFamilies #-}
    2 module Databrary.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 Databrary.Has (Has(..))
   13 import Databrary.Model.Id.Types
   14 import Databrary.Model.Permission
   15 import Databrary.Model.Release
   16 import Databrary.Model.Segment
   17 import Databrary.Model.Volume.Types
   18 import Databrary.Model.Container.Types
   19 import Databrary.Model.Record.Types
   20 import Databrary.Model.Category.Types
   21 import Databrary.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   }