1 {-# LANGUAGE TemplateHaskell #-} 2 module Databrary.Model.Notification.SQL 3 ( selectNotifyDelivery 4 , selectTargetNotification 5 , selectNotification 6 , selectPartyAuthorizationNotify 7 ) where 8 9 import qualified Language.Haskell.TH as TH 10 11 import Databrary.Has 12 import Databrary.Model.SQL.Select 13 import Databrary.Model.Time 14 import Databrary.Model.Id.Types 15 import Databrary.Model.Permission.Types 16 import Databrary.Model.Release.Types 17 import Databrary.Model.Party.Types 18 import Databrary.Model.Party.SQL 19 import Databrary.Model.Volume.Types 20 import Databrary.Model.Volume.SQL 21 import Databrary.Model.Container.Types 22 import Databrary.Model.Segment 23 import Databrary.Model.Asset.Types 24 import Databrary.Model.Tag.Types 25 import Databrary.Model.Tag.SQL 26 import Databrary.Model.Comment.Types 27 import Databrary.Model.Notification.Types 28 29 selectNotifyDelivery :: Selector 30 selectNotifyDelivery = selectMap (TH.VarE 'fromMaybeDelivery `TH.AppE`) $ selectColumn "notify_view" "delivery" 31 32 makePartyAuthorizationNotice :: (Party, Maybe Permission) -> Delivery -> (Party, Maybe Permission, Delivery) 33 makePartyAuthorizationNotice (p, a) d = (p, a, d) 34 35 selectPartyAuthorizationNotify :: TH.Name -- ^ 'Identity' 36 -> Selector -- ^ @('Party', Maybe 'Permission', 'Delivery')@ 37 selectPartyAuthorizationNotify ident = selectJoin 'makePartyAuthorizationNotice 38 [ selectPartyAuthorization ident 39 , joinOn "id = target" 40 selectNotifyDelivery 41 ] 42 43 makeNotification :: Id Notification -> Notice -> Timestamp -> Delivery -> Maybe Permission -> Maybe (Id Container) -> Maybe Segment -> Maybe (Id Asset) -> Maybe Release -> Maybe (Id Comment) -> PartyRow -> Maybe PartyRow -> Maybe VolumeRow -> Maybe Tag -> Account -> Notification 44 makeNotification i n t d e c s a r m w p v g u = Notification i (view u) n t d w p v e c s a r m g 45 46 notificationRow :: Selector -- ^ @'PartyRow' -> Maybe 'PartyRow' -> Maybe 'VolumeRow' -> Maybe 'Tag' -> 'Account' -> 'Notification'@ 47 notificationRow = selectColumns 'makeNotification "notification" ["id", "notice", "time", "delivered", "permission", "container", "segment", "asset", "release", "comment"] 48 49 selectTargetNotification :: Selector -- ^ @'Account' -> 'Notification'@ 50 selectTargetNotification = selectJoin '($) 51 [ notificationRow 52 , joinOn "notification.agent = agent.id" 53 $ selectPartyRow `fromAlias` "agent" 54 , maybeJoinOn "notification.party = nparty.id" 55 $ selectPartyRow `fromAlias` "nparty" 56 , maybeJoinOn "notification.volume = volume.id" 57 $ selectVolumeRow 58 , maybeJoinOn "notification.tag = tag.id" 59 $ selectTag 60 ] 61 62 selectNotification :: Selector -- ^ @'Notification'@ 63 selectNotification = selectJoin '($) 64 [ selectTargetNotification 65 , joinOn "notification.target = account.id" 66 selectUserAccount 67 ]