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