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