1 {-# LANGUAGE TemplateHaskell #-}
    2 module Databrary.Model.Activity.SQL
    3   ( selectActivityParty
    4   , selectActivityAccount
    5   , selectActivityAuthorize
    6   , selectActivityVolume
    7   , selectActivityAccess
    8   , selectActivityContainer
    9   , selectActivityRelease
   10   , selectActivityAsset
   11   , selectActivityAssetSlot
   12   , selectActivityExcerpt
   13   , activityQual
   14   ) where
   15 
   16 import Data.List (stripPrefix)
   17 import qualified Language.Haskell.TH as TH
   18 
   19 import Databrary.Model.SQL.Select
   20 import Databrary.Model.Audit.Types
   21 import Databrary.Model.Audit.SQL
   22 import Databrary.Model.Party.SQL
   23 import Databrary.Model.Authorize.SQL
   24 import Databrary.Model.Volume.SQL
   25 import Databrary.Model.VolumeAccess.SQL
   26 import Databrary.Model.Container.SQL
   27 import Databrary.Model.Slot.SQL
   28 import Databrary.Model.Release.SQL
   29 import Databrary.Model.Asset.SQL
   30 import Databrary.Model.Activity.Types
   31 
   32 delim :: String -> Bool
   33 delim "" = True
   34 delim (' ':_) = True
   35 delim (',':_) = True
   36 delim _ = False
   37 
   38 makeActivity :: Audit -> ActivityTarget -> Activity
   39 makeActivity a x = Activity a x Nothing Nothing Nothing
   40 
   41 targetActivitySelector :: String -> Selector -> Selector
   42 targetActivitySelector t Selector{ selectOutput = o, selectSource = ts, selectJoined = (',':tj) }
   43   | Just s <- stripPrefix t ts, delim s, ts == tj =
   44     selector ("audit." ++ ts) $ OutputJoin False 'makeActivity [selectOutput (selectAudit t), o]
   45 targetActivitySelector t Selector{ selectSource = ts } = error $ "targetActivitySelector " ++ t ++ ": " ++ ts
   46 
   47 selectActivityParty :: Selector
   48 selectActivityParty = targetActivitySelector "party" $
   49   selectMap (TH.ConE 'ActivityParty `TH.AppE`) selectPartyRow
   50 
   51 selectActivityAccount :: Selector
   52 selectActivityAccount = targetActivitySelector "account" $
   53   selectColumns 'ActivityAccount "account" ["id", "email", "password"]
   54 
   55 selectActivityAuthorize :: TH.Name -> TH.Name -> Selector
   56 selectActivityAuthorize p ident = targetActivitySelector "authorize" $
   57   selectMap (TH.ConE 'ActivityAuthorize `TH.AppE`) (selectAuthorizeChild p ident)
   58 
   59 selectActivityVolume :: Selector
   60 selectActivityVolume = targetActivitySelector "volume" $
   61   selectMap (TH.ConE 'ActivityVolume `TH.AppE`) selectVolumeRow
   62 
   63 selectActivityAccess :: TH.Name -> TH.Name -> Selector
   64 selectActivityAccess vol ident = targetActivitySelector "volume_access" $
   65   selectMap (TH.ConE 'ActivityAccess `TH.AppE`) (selectVolumeAccess vol ident)
   66 
   67 selectActivityContainer :: Selector
   68 selectActivityContainer = targetActivitySelector "container" $
   69   selectMap (TH.ConE 'ActivityContainer `TH.AppE`) selectContainerRow
   70 
   71 selectActivityRelease :: Selector
   72 selectActivityRelease = targetActivitySelector "slot_release" $
   73   addSelects 'ActivityRelease (selectSlotId "slot_release") [selectOutput releaseRow]
   74 
   75 selectActivityAsset :: Selector
   76 selectActivityAsset = targetActivitySelector "asset" $
   77   selectMap (TH.ConE 'ActivityAsset `TH.AppE`) selectAssetRow
   78 
   79 selectActivityAssetSlot :: Selector
   80 selectActivityAssetSlot = targetActivitySelector "slot_asset" $
   81   addSelects 'ActivityAssetSlot
   82     (selectColumn "slot_asset" "asset")
   83     [selectOutput $ selectSlotId "slot_asset"]
   84 
   85 selectActivityExcerpt :: Selector
   86 selectActivityExcerpt = targetActivitySelector "excerpt" $
   87   selectColumns 'ActivityExcerpt "excerpt" ["asset", "segment", "release"]
   88 
   89 activityQual :: String
   90 activityQual = "audit_action >= 'add' ORDER BY audit_time"