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 }