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