1 {-# LANGUAGE TemplateHaskell, QuasiQuotes, RecordWildCards, DataKinds #-}
    2 module Databrary.Model.VolumeState
    3   ( module Databrary.Model.VolumeState.Types
    4   , lookupVolumeState
    5   , changeVolumeState
    6   , removeVolumeState
    7   ) where
    8 
    9 import Control.Monad (void)
   10 import Database.PostgreSQL.Typed.Query
   11 import Database.PostgreSQL.Typed.Types
   12 import qualified Data.ByteString
   13 import Data.ByteString (ByteString)
   14 import qualified Data.String
   15 
   16 import Databrary.Service.DB
   17 import Databrary.Model.SQL
   18 import Databrary.Model.Permission.Types
   19 import Databrary.Model.Volume.Types
   20 import Databrary.Model.VolumeState.Types
   21 -- import Databrary.Model.VolumeState.SQL
   22 
   23 lookupVolumeState :: (MonadDB c m) => Volume -> m [VolumeState]
   24 lookupVolumeState v = do
   25   let _tenv_a7xjl = unknownPGTypeEnv
   26   rows <- 
   27     -- (selectQuery selectVolumeState "$WHERE volume = ${volumeId $ volumeRow v} AND (public OR ${(extractPermissionIgnorePolicy . volumeRolePolicy) v >= PermissionEDIT})")
   28      mapRunPrepQuery
   29       ((\ _p_a7xjm _p_a7xjn ->
   30                        (Data.String.fromString
   31                           "SELECT volume_state.key,volume_state.value,volume_state.public FROM volume_state WHERE volume = $1 AND (public OR $2)",
   32                        [pgEncodeParameter
   33                           _tenv_a7xjl (PGTypeProxy :: PGTypeName "integer") _p_a7xjm,
   34                         pgEncodeParameter
   35                           _tenv_a7xjl (PGTypeProxy :: PGTypeName "boolean") _p_a7xjn],
   36                        [pgBinaryColumn
   37                           _tenv_a7xjl (PGTypeProxy :: PGTypeName "character varying"),
   38                         pgBinaryColumn _tenv_a7xjl (PGTypeProxy :: PGTypeName "jsonb"),
   39                         pgBinaryColumn _tenv_a7xjl (PGTypeProxy :: PGTypeName "boolean")]))
   40          (volumeId $ volumeRow v) ((extractPermissionIgnorePolicy . volumeRolePolicy) v >= PermissionEDIT))
   41                (\ [_ckey_a7xjo, _cvalue_a7xjp, _cpublic_a7xjq]
   42                   -> (pgDecodeColumnNotNull
   43                         _tenv_a7xjl
   44                         (PGTypeProxy :: PGTypeName "character varying")
   45                         _ckey_a7xjo, 
   46                       pgDecodeColumnNotNull
   47                         _tenv_a7xjl (PGTypeProxy :: PGTypeName "jsonb") _cvalue_a7xjp, 
   48                       pgDecodeColumnNotNull
   49                         _tenv_a7xjl (PGTypeProxy :: PGTypeName "boolean") _cpublic_a7xjq))
   50   pure
   51     (fmap
   52       (\ (vkey_a7xhf, vvalue_a7xhg, vpublic_a7xhh)
   53          -> VolumeState vkey_a7xhf vvalue_a7xhg vpublic_a7xhh v)
   54       rows)
   55 
   56 mapQuery :: ByteString -> ([PGValue] -> a) -> PGSimpleQuery a
   57 mapQuery qry mkResult =
   58   fmap mkResult (rawPGSimpleQuery qry)
   59 
   60 changeVolumeState :: (MonadDB c m) => VolumeState -> m ()
   61 changeVolumeState VolumeState{..} = do
   62   let _tenv_a5HPz = unknownPGTypeEnv
   63       _tenv_a5FNg = unknownPGTypeEnv
   64   void $ updateOrInsert
   65     -- [pgSQL|UPDATE volume_state SET value = ${volumeStateValue}, public = ${volumeStatePublic} WHERE volume = ${volumeId $ volumeRow stateVolume} AND key = ${volumeStateKey}|]
   66     (mapQuery
   67         ((\ _p_a5FNh _p_a5FNi _p_a5FNj _p_a5FNk ->
   68                     (Data.ByteString.concat
   69                        [Data.String.fromString "UPDATE volume_state SET value = ",
   70                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
   71                           _tenv_a5FNg
   72                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
   73                              Database.PostgreSQL.Typed.Types.PGTypeName "jsonb")
   74                           _p_a5FNh,
   75                         Data.String.fromString ", public = ",
   76                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
   77                           _tenv_a5FNg
   78                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
   79                              Database.PostgreSQL.Typed.Types.PGTypeName "boolean")
   80                           _p_a5FNi,
   81                         Data.String.fromString " WHERE volume = ",
   82                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
   83                           _tenv_a5FNg
   84                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
   85                              Database.PostgreSQL.Typed.Types.PGTypeName "integer")
   86                           _p_a5FNj,
   87                         Data.String.fromString " AND key = ",
   88                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
   89                           _tenv_a5FNg
   90                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
   91                              Database.PostgreSQL.Typed.Types.PGTypeName "text")
   92                           _p_a5FNk]))
   93          volumeStateValue
   94          volumeStatePublic
   95          (volumeId $ volumeRow stateVolume)
   96          volumeStateKey)
   97         (\[] -> ()))
   98     -- [pgSQL|INSERT INTO volume_state (volume, key, value, public) VALUES (${volumeId $ volumeRow stateVolume}, ${volumeStateKey}, ${volumeStateValue}, ${volumeStatePublic})|]
   99     (mapQuery
  100        ((\ _p_a5HPA _p_a5HPB _p_a5HPC _p_a5HPD ->
  101                     (Data.ByteString.concat
  102                        [Data.String.fromString
  103                           "INSERT INTO volume_state (volume, key, value, public) VALUES (",
  104                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  105                           _tenv_a5HPz
  106                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  107                              Database.PostgreSQL.Typed.Types.PGTypeName "integer")
  108                           _p_a5HPA,
  109                         Data.String.fromString ", ",
  110                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  111                           _tenv_a5HPz
  112                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  113                              Database.PostgreSQL.Typed.Types.PGTypeName "character varying")
  114                           _p_a5HPB,
  115                         Data.String.fromString ", ",
  116                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  117                           _tenv_a5HPz
  118                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  119                              Database.PostgreSQL.Typed.Types.PGTypeName "jsonb")
  120                           _p_a5HPC,
  121                         Data.String.fromString ", ",
  122                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  123                           _tenv_a5HPz
  124                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  125                              Database.PostgreSQL.Typed.Types.PGTypeName "boolean")
  126                           _p_a5HPD,
  127                         Data.String.fromString ")"]))
  128          (volumeId $ volumeRow stateVolume)
  129          volumeStateKey
  130          volumeStateValue
  131          volumeStatePublic)
  132        (\[] -> ()))
  133 
  134 
  135 removeVolumeState :: (MonadDB c m) => Volume -> VolumeStateKey -> m Bool
  136 removeVolumeState v k = do
  137   let _tenv_a5N5m = unknownPGTypeEnv
  138   dbExecute1 -- [pgSQL|DELETE FROM volume_state WHERE volume = ${volumeId $ volumeRow v} AND key = ${k}|]
  139    (mapQuery
  140      ((\ _p_a5N5n _p_a5N5o ->
  141                     (Data.ByteString.concat
  142                        [Data.String.fromString "DELETE FROM volume_state WHERE volume = ",
  143                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  144                           _tenv_a5N5m
  145                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  146                              Database.PostgreSQL.Typed.Types.PGTypeName "integer")
  147                           _p_a5N5n,
  148                         Data.String.fromString " AND key = ",
  149                         Database.PostgreSQL.Typed.Types.pgEscapeParameter
  150                           _tenv_a5N5m
  151                           (Database.PostgreSQL.Typed.Types.PGTypeProxy ::
  152                              Database.PostgreSQL.Typed.Types.PGTypeName "text")
  153                           _p_a5N5o]))
  154       (volumeId $ volumeRow v) k)
  155      (\[] -> ()))
  156 
  157