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 }