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