1 {-# LANGUAGE TemplateHaskell, QuasiQuotes, DataKinds #-} 2 module Databrary.Model.AssetRevision 3 ( module Databrary.Model.AssetRevision.Types 4 , replaceAsset 5 , assetIsReplaced 6 , lookupAssetReplace 7 , lookupAssetTranscode 8 ) where 9 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.Has 17 import Databrary.Service.DB 18 import Databrary.Model.Id 19 import Databrary.Model.Party 20 import Databrary.Model.Identity 21 import Databrary.Model.Asset 22 import Databrary.Model.Asset.SQL 23 import Databrary.Model.AssetRevision.Types 24 import Databrary.Model.Volume.SQL 25 import Databrary.Model.Volume.Types 26 27 mapQuery :: ByteString -> ([PGValue] -> a) -> PGSimpleQuery a 28 mapQuery qry mkResult = 29 fmap mkResult (rawPGSimpleQuery qry) 30 31 replaceAsset :: MonadDB c m => Asset -> Asset -> m () 32 replaceAsset old new = do 33 let _tenv_a8Fao = unknownPGTypeEnv 34 dbExecute1' -- [pgSQL|SELECT asset_replace(${assetId $ assetRow old}, ${assetId $ assetRow new})|] 35 (mapQuery 36 ((\ _p_a8Fap _p_a8Faq -> 37 (Data.ByteString.concat 38 [Data.String.fromString "SELECT asset_replace(", 39 Database.PostgreSQL.Typed.Types.pgEscapeParameter 40 _tenv_a8Fao 41 (Database.PostgreSQL.Typed.Types.PGTypeProxy :: 42 Database.PostgreSQL.Typed.Types.PGTypeName "integer") 43 _p_a8Fap, 44 Data.String.fromString ", ", 45 Database.PostgreSQL.Typed.Types.pgEscapeParameter 46 _tenv_a8Fao 47 (Database.PostgreSQL.Typed.Types.PGTypeProxy :: 48 Database.PostgreSQL.Typed.Types.PGTypeName "integer") 49 _p_a8Faq, 50 Data.String.fromString ")"])) 51 (assetId $ assetRow old) (assetId $ assetRow new)) 52 (\[_casset_replace_a8Far] 53 -> (Database.PostgreSQL.Typed.Types.pgDecodeColumnNotNull 54 _tenv_a8Fao 55 (Database.PostgreSQL.Typed.Types.PGTypeProxy :: 56 Database.PostgreSQL.Typed.Types.PGTypeName "void") 57 _casset_replace_a8Far))) 58 59 60 assetIsReplaced :: MonadDB c m => Asset -> m Bool 61 assetIsReplaced a = do 62 let _tenv_a8FgX = unknownPGTypeEnv 63 dbExecute1 -- [pgSQL|SELECT ''::void FROM asset_replace WHERE orig = ${assetId $ assetRow a} LIMIT 1|] 64 (mapQuery 65 ((\ _p_a8FgY -> 66 (Data.ByteString.concat 67 [Data.String.fromString 68 "SELECT ''::void FROM asset_replace WHERE orig = ", 69 Database.PostgreSQL.Typed.Types.pgEscapeParameter 70 _tenv_a8FgX 71 (Database.PostgreSQL.Typed.Types.PGTypeProxy :: 72 Database.PostgreSQL.Typed.Types.PGTypeName "integer") 73 _p_a8FgY, 74 Data.String.fromString " LIMIT 1"])) 75 (assetId $ assetRow a)) 76 (\[_cvoid_a8FgZ] 77 -> (Database.PostgreSQL.Typed.Types.pgDecodeColumnNotNull 78 _tenv_a8FgX 79 (Database.PostgreSQL.Typed.Types.PGTypeProxy :: 80 Database.PostgreSQL.Typed.Types.PGTypeName "void") 81 _cvoid_a8FgZ))) 82 83 84 lookupAssetReplace :: (MonadHasIdentity c m, MonadDB c m) => Asset -> m (Maybe AssetRevision) 85 lookupAssetReplace a = do 86 let _tenv_abkQ9 = unknownPGTypeEnv 87 ident <- peek 88 mRow <- -- dbQuery1 ($ a) <$> $(selectQuery (selectAssetRevision "asset_replace" 'ident) "$WHERE asset_replace.asset = ${assetId $ assetRow a}") 89 (mapRunPrepQuery1 90 ((\ _p_abkQa _p_abkQb _p_abkQc _p_abkQd _p_abkQe -> 91 (Data.String.fromString 92 "SELECT asset.id,asset.format,asset.release,asset.duration,asset.name,asset.sha1,asset.size,volume.id,volume.name,volume.body,volume.alias,volume.doi,volume_creation(volume.id),volume_owners.owners,volume_permission.permission,volume_permission.share_full FROM asset_replace JOIN asset JOIN volume LEFT JOIN volume_owners ON volume.id = volume_owners.volume JOIN LATERAL (VALUES ( CASE WHEN $1 THEN enum_last(NULL::permission) ELSE volume_access_check(volume.id, $2) END , CASE WHEN $3 THEN null ELSE (select share_full from volume_access_view where volume = volume.id and party = $4 limit 1) END ) ) AS volume_permission (permission, share_full) ON volume_permission.permission >= 'PUBLIC'::permission ON asset.volume = volume.id ON asset_replace.orig = asset.id WHERE asset_replace.asset = $5", 93 [pgEncodeParameter 94 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "boolean") _p_abkQa, 95 pgEncodeParameter 96 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer") _p_abkQb, 97 pgEncodeParameter 98 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "boolean") _p_abkQc, 99 pgEncodeParameter 100 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer") _p_abkQd, 101 pgEncodeParameter 102 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer") _p_abkQe], 103 [pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer"), 104 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "smallint"), 105 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "release"), 106 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "interval"), 107 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text"), 108 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "bytea"), 109 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "bigint"), 110 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer"), 111 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text"), 112 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text"), 113 pgBinaryColumn 114 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "character varying"), 115 pgBinaryColumn 116 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "character varying"), 117 pgBinaryColumn 118 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "timestamp with time zone"), 119 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text[]"), 120 pgBinaryColumn 121 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "permission"), 122 pgBinaryColumn _tenv_abkQ9 (PGTypeProxy :: PGTypeName "boolean")])) 123 (identitySuperuser ident) 124 (view ident :: Id Party) 125 (identitySuperuser ident) 126 (view ident :: Id Party) 127 (assetId $ assetRow a)) 128 (\ 129 [_cid_abkQf, 130 _cformat_abkQg, 131 _crelease_abkQh, 132 _cduration_abkQi, 133 _cname_abkQj, 134 _csha1_abkQk, 135 _csize_abkQl, 136 _cid_abkQm, 137 _cname_abkQn, 138 _cbody_abkQo, 139 _calias_abkQp, 140 _cdoi_abkQq, 141 _cvolume_creation_abkQr, 142 _cowners_abkQs, 143 _cpermission_abkQt, 144 _cshare_full_abkQu] 145 -> (pgDecodeColumnNotNull 146 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer") _cid_abkQf, 147 pgDecodeColumnNotNull 148 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "smallint") _cformat_abkQg, 149 pgDecodeColumn 150 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "release") _crelease_abkQh, 151 pgDecodeColumn 152 _tenv_abkQ9 153 (PGTypeProxy :: PGTypeName "interval") 154 _cduration_abkQi, 155 pgDecodeColumn 156 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text") _cname_abkQj, 157 pgDecodeColumn 158 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "bytea") _csha1_abkQk, 159 pgDecodeColumn 160 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "bigint") _csize_abkQl, 161 pgDecodeColumnNotNull 162 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "integer") _cid_abkQm, 163 pgDecodeColumnNotNull 164 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text") _cname_abkQn, 165 pgDecodeColumn 166 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text") _cbody_abkQo, 167 pgDecodeColumn 168 _tenv_abkQ9 169 (PGTypeProxy :: PGTypeName "character varying") 170 _calias_abkQp, 171 pgDecodeColumn 172 _tenv_abkQ9 173 (PGTypeProxy :: PGTypeName "character varying") 174 _cdoi_abkQq, 175 pgDecodeColumn 176 _tenv_abkQ9 177 (PGTypeProxy :: PGTypeName "timestamp with time zone") 178 _cvolume_creation_abkQr, 179 pgDecodeColumnNotNull 180 _tenv_abkQ9 (PGTypeProxy :: PGTypeName "text[]") _cowners_abkQs, 181 pgDecodeColumn 182 _tenv_abkQ9 183 (PGTypeProxy :: PGTypeName "permission") 184 _cpermission_abkQt, 185 pgDecodeColumn 186 _tenv_abkQ9 187 (PGTypeProxy :: PGTypeName "boolean") 188 _cshare_full_abkQu))) 189 pure 190 (fmap 191 (\ (vid_abkPn, vformat_abkPo, vrelease_abkPp, vduration_abkPq, 192 vname_abkPr, vc_abkPs, vsize_abkPt, vid_abkPu, vname_abkPv, 193 vbody_abkPw, valias_abkPx, vdoi_abkPy, vc_abkPz, vowners_abkPA, 194 vpermission_abkPB, vfull_abkPC) 195 -> makeAssetRevision 196 (Asset 197 (Databrary.Model.Asset.SQL.makeAssetRow 198 vid_abkPn 199 vformat_abkPo 200 vrelease_abkPp 201 vduration_abkPq 202 vname_abkPr 203 vc_abkPs 204 vsize_abkPt) 205 (Databrary.Model.Volume.SQL.makeVolume 206 (Databrary.Model.Volume.SQL.setCreation 207 (Databrary.Model.Volume.Types.VolumeRow 208 vid_abkPu vname_abkPv vbody_abkPw valias_abkPx vdoi_abkPy) 209 vc_abkPz) 210 vowners_abkPA 211 (Databrary.Model.Volume.SQL.makePermInfo 212 vpermission_abkPB vfull_abkPC))) 213 a) 214 mRow) 215 216 lookupAssetTranscode :: (MonadHasIdentity c m, MonadDB c m) => Asset -> m (Maybe AssetRevision) 217 lookupAssetTranscode a = do 218 let _tenv_abkVg = unknownPGTypeEnv 219 ident <- peek 220 -- dbQuery1 $ ($ a) <$> $(selectQuery (selectAssetRevision "transcode" 'ident) "$WHERE transcode.asset = ${assetId $ assetRow a}") 221 mRow <- mapRunPrepQuery1 222 ((\ _p_abkVh _p_abkVi _p_abkVj _p_abkVk _p_abkVl -> 223 (Data.String.fromString 224 "SELECT asset.id,asset.format,asset.release,asset.duration,asset.name,asset.sha1,asset.size,volume.id,volume.name,volume.body,volume.alias,volume.doi,volume_creation(volume.id),volume_owners.owners,volume_permission.permission,volume_permission.share_full FROM transcode JOIN asset JOIN volume LEFT JOIN volume_owners ON volume.id = volume_owners.volume JOIN LATERAL (VALUES ( CASE WHEN $1 THEN enum_last(NULL::permission) ELSE volume_access_check(volume.id, $2) END , CASE WHEN $3 THEN null ELSE (select share_full from volume_access_view where volume = volume.id and party = $4 limit 1) END ) ) AS volume_permission (permission, share_full) ON volume_permission.permission >= 'PUBLIC'::permission ON asset.volume = volume.id ON transcode.orig = asset.id WHERE transcode.asset = $5", 225 [pgEncodeParameter 226 _tenv_abkVg (PGTypeProxy :: PGTypeName "boolean") _p_abkVh, 227 pgEncodeParameter 228 _tenv_abkVg (PGTypeProxy :: PGTypeName "integer") _p_abkVi, 229 pgEncodeParameter 230 _tenv_abkVg (PGTypeProxy :: PGTypeName "boolean") _p_abkVj, 231 pgEncodeParameter 232 _tenv_abkVg (PGTypeProxy :: PGTypeName "integer") _p_abkVk, 233 pgEncodeParameter 234 _tenv_abkVg (PGTypeProxy :: PGTypeName "integer") _p_abkVl], 235 [pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "integer"), 236 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "smallint"), 237 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "release"), 238 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "interval"), 239 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "text"), 240 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "bytea"), 241 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "bigint"), 242 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "integer"), 243 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "text"), 244 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "text"), 245 pgBinaryColumn 246 _tenv_abkVg (PGTypeProxy :: PGTypeName "character varying"), 247 pgBinaryColumn 248 _tenv_abkVg (PGTypeProxy :: PGTypeName "character varying"), 249 pgBinaryColumn 250 _tenv_abkVg (PGTypeProxy :: PGTypeName "timestamp with time zone"), 251 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "text[]"), 252 pgBinaryColumn 253 _tenv_abkVg (PGTypeProxy :: PGTypeName "permission"), 254 pgBinaryColumn _tenv_abkVg (PGTypeProxy :: PGTypeName "boolean")])) 255 (identitySuperuser ident) 256 (view ident :: Id Party) 257 (identitySuperuser ident) 258 (view ident :: Id Party) 259 (assetId $ assetRow a)) 260 (\ 261 [_cid_abkVm, 262 _cformat_abkVn, 263 _crelease_abkVo, 264 _cduration_abkVp, 265 _cname_abkVq, 266 _csha1_abkVr, 267 _csize_abkVs, 268 _cid_abkVt, 269 _cname_abkVu, 270 _cbody_abkVv, 271 _calias_abkVw, 272 _cdoi_abkVx, 273 _cvolume_creation_abkVy, 274 _cowners_abkVz, 275 _cpermission_abkVA, 276 _cshare_full_abkVB] 277 -> (pgDecodeColumnNotNull 278 _tenv_abkVg (PGTypeProxy :: PGTypeName "integer") _cid_abkVm, 279 pgDecodeColumnNotNull 280 _tenv_abkVg (PGTypeProxy :: PGTypeName "smallint") _cformat_abkVn, 281 pgDecodeColumn 282 _tenv_abkVg (PGTypeProxy :: PGTypeName "release") _crelease_abkVo, 283 pgDecodeColumn 284 _tenv_abkVg 285 (PGTypeProxy :: PGTypeName "interval") 286 _cduration_abkVp, 287 pgDecodeColumn 288 _tenv_abkVg (PGTypeProxy :: PGTypeName "text") _cname_abkVq, 289 pgDecodeColumn 290 _tenv_abkVg (PGTypeProxy :: PGTypeName "bytea") _csha1_abkVr, 291 pgDecodeColumn 292 _tenv_abkVg (PGTypeProxy :: PGTypeName "bigint") _csize_abkVs, 293 pgDecodeColumnNotNull 294 _tenv_abkVg (PGTypeProxy :: PGTypeName "integer") _cid_abkVt, 295 pgDecodeColumnNotNull 296 _tenv_abkVg (PGTypeProxy :: PGTypeName "text") _cname_abkVu, 297 pgDecodeColumn 298 _tenv_abkVg (PGTypeProxy :: PGTypeName "text") _cbody_abkVv, 299 pgDecodeColumn 300 _tenv_abkVg 301 (PGTypeProxy :: PGTypeName "character varying") 302 _calias_abkVw, 303 pgDecodeColumn 304 _tenv_abkVg 305 (PGTypeProxy :: PGTypeName "character varying") 306 _cdoi_abkVx, 307 pgDecodeColumn 308 _tenv_abkVg 309 (PGTypeProxy :: PGTypeName "timestamp with time zone") 310 _cvolume_creation_abkVy, 311 pgDecodeColumnNotNull 312 _tenv_abkVg (PGTypeProxy :: PGTypeName "text[]") _cowners_abkVz, 313 pgDecodeColumn 314 _tenv_abkVg 315 (PGTypeProxy :: PGTypeName "permission") 316 _cpermission_abkVA, 317 pgDecodeColumn 318 _tenv_abkVg 319 (PGTypeProxy :: PGTypeName "boolean") 320 _cshare_full_abkVB)) 321 pure 322 (fmap 323 (\ (vid_abkSc, vformat_abkSd, vrelease_abkSe, vduration_abkSf, 324 vname_abkSg, vc_abkSh, vsize_abkSi, vid_abkSj, vname_abkSk, 325 vbody_abkSl, valias_abkSm, vdoi_abkSn, vc_abkSo, vowners_abkSp, 326 vpermission_abkSq, vfull_abkSr) 327 -> makeAssetRevision 328 (Asset 329 (Databrary.Model.Asset.SQL.makeAssetRow 330 vid_abkSc 331 vformat_abkSd 332 vrelease_abkSe 333 vduration_abkSf 334 vname_abkSg 335 vc_abkSh 336 vsize_abkSi) 337 (Databrary.Model.Volume.SQL.makeVolume 338 (Databrary.Model.Volume.SQL.setCreation 339 (Databrary.Model.Volume.Types.VolumeRow 340 vid_abkSj vname_abkSk vbody_abkSl valias_abkSm vdoi_abkSn) 341 vc_abkSo) 342 vowners_abkSp 343 (Databrary.Model.Volume.SQL.makePermInfo 344 vpermission_abkSq vfull_abkSr))) 345 a) 346 mRow) 347