module Model.VolumeAccess.SQL
( selectVolumeAccess
, selectVolumeAccessParty
, selectPartyVolumeAccess
, updateVolumeAccess
, insertVolumeAccess
, deleteVolumeAccess
, selectVolumeActivity
) where
import qualified Language.Haskell.TH as TH
import Model.Permission.Types
import Model.Party.Types
import Model.Volume.Types
import Model.SQL.Select
import Model.Audit.SQL
import Model.Party.SQL
import Model.Volume.SQL
import Model.VolumeAccess.Types
volumeAccessRow :: Selector
volumeAccessRow = selectColumns 'VolumeAccess "volume_access" ["individual", "children", "sort", "share_full"]
selectVolumeAccess :: TH.Name
-> TH.Name
-> Selector
selectVolumeAccess vol ident = selectMap (`TH.AppE` TH.VarE vol) $ selectJoin '($)
[ volumeAccessRow
, joinOn ("volume_access.party = party.id AND volume_access.volume = ${volumeId $ volumeRow " ++ nameRef vol ++ "}")
$ selectAuthParty ident
]
makeVolumeAccessParty :: Party -> Maybe (Party -> Volume -> VolumeAccess) -> Volume -> VolumeAccess
makeVolumeAccessParty p Nothing v = VolumeAccess PermissionNONE PermissionNONE Nothing (getShareFullDefault p PermissionNONE) p v
makeVolumeAccessParty p (Just af) v = af p v
selectVolumeAccessParty :: TH.Name
-> TH.Name
-> Selector
selectVolumeAccessParty vol ident = selectMap (`TH.AppE` TH.VarE vol) $ selectJoin 'makeVolumeAccessParty
[ selectAuthParty ident
, maybeJoinOn ("party.id = volume_access.party AND volume_access.volume = ${volumeId $ volumeRow " ++ nameRef vol ++ "}")
volumeAccessRow
]
selectPartyVolumeAccess :: TH.Name
-> TH.Name
-> Selector
selectPartyVolumeAccess p ident = selectJoin '($)
[ selectMap (`TH.AppE` TH.VarE p) volumeAccessRow
, joinOn ("volume_access.volume = volume.id AND volume_access.party = ${partyId $ partyRow " ++ nameRef p ++ "}")
$ selectVolume ident
]
type ColumnName = String
type ColumnValueExp = String
volumeAccessKeys :: String
-> [(ColumnName, ColumnValueExp)]
volumeAccessKeys a =
[ ("volume", "${volumeId $ volumeRow $ volumeAccessVolume " ++ a ++ "}")
, ("party", "${partyId $ partyRow $ volumeAccessParty " ++ a ++ "}")
]
volumeAccessSets :: String
-> [(ColumnName, ColumnValueExp)]
volumeAccessSets a =
[ ("individual", "${volumeAccessIndividual " ++ a ++ "}")
, ("children", "${volumeAccessChildren " ++ a ++ "}")
, ("sort", "${volumeAccessSort " ++ a ++ "}")
, ("share_full", "${volumeAccessShareFull " ++ a ++ "}")
]
type SQLFilterClause = String
noReturning :: Maybe SelectOutput
noReturning = Nothing
updateVolumeAccess :: TH.Name
-> TH.Name
-> TH.ExpQ
updateVolumeAccess ident a = auditUpdate ident "volume_access"
(volumeAccessSets as)
(whereEq $ volumeAccessKeys as :: SQLFilterClause)
noReturning
where as = nameRef a
insertVolumeAccess :: TH.Name
-> TH.Name
-> TH.ExpQ
insertVolumeAccess ident a = auditInsert ident "volume_access"
(volumeAccessKeys as ++ volumeAccessSets as)
noReturning
where as = nameRef a
deleteVolumeAccess :: TH.Name
-> TH.Name
-> TH.ExpQ
deleteVolumeAccess ident a = auditDelete ident "volume_access"
(whereEq $ volumeAccessKeys as)
Nothing
where as = nameRef a
selectVolumeActivity :: TH.Name
-> Selector
selectVolumeActivity ident = selectJoin '(,)
[ selectAuditActivity "volume_access"
, joinOn "audit.volume = volume.id"
$ selectVolume ident
]