]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Attach.php
Fix warnings because of missing field
[friendica.git] / src / Model / Attach.php
index b81c38762eb556c75b3bb119d5f0a12406431e29..a008b3a4d36eb9c9474d973d10388f0bfbe34aaf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -23,15 +23,16 @@ namespace Friendica\Model;
 
 use Friendica\Core\System;
 use Friendica\Database\DBA;
-use Friendica\Database\DBStructure;
 use Friendica\DI;
+use Friendica\Core\Storage\Exception\InvalidClassStorageException;
+use Friendica\Core\Storage\Exception\ReferenceStorageException;
 use Friendica\Object\Image;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Mimetype;
 use Friendica\Security\Security;
 
 /**
- * Class to handle attach dabatase table
+ * Class to handle attach database table
  */
 class Attach
 {
@@ -42,9 +43,9 @@ class Attach
         * @return array field list
         * @throws \Exception
         */
-       private static function getFields()
+       private static function getFields(): array
        {
-               $allfields = DBStructure::definition(DI::app()->getBasePath(), false);
+               $allfields = DI::dbaDefinition()->getAll();
                $fields = array_keys($allfields['attach']['fields']);
                array_splice($fields, array_search('data', $fields), 1);
                return $fields;
@@ -57,7 +58,7 @@ class Attach
         * @param array $conditions Array of fields for conditions
         * @param array $params     Array of several parameters
         *
-        * @return array
+        * @return array|bool
         *
         * @throws \Exception
         * @see   \Friendica\Database\DBA::selectToArray
@@ -100,13 +101,13 @@ class Attach
         * @return boolean
         * @throws \Exception
         */
-       public static function exists(array $conditions)
+       public static function exists(array $conditions): bool
        {
                return DBA::exists('attach', $conditions);
        }
 
        /**
-        * Retrive a single record given the ID
+        * Retrieve a single record given the ID
         *
         * @param int $id Row id of the record
         *
@@ -115,13 +116,13 @@ class Attach
         * @throws \Exception
         * @see   \Friendica\Database\DBA::select
         */
-       public static function getById($id)
+       public static function getById(int $id)
        {
                return self::selectFirst([], ['id' => $id]);
        }
 
        /**
-        * Retrive a single record given the ID
+        * Retrieve a single record given the ID
         *
         * @param int $id Row id of the record
         *
@@ -130,7 +131,7 @@ class Attach
         * @throws \Exception
         * @see   \Friendica\Database\DBA::select
         */
-       public static function getByIdWithPermission($id)
+       public static function getByIdWithPermission(int $id)
        {
                $r = self::selectFirst(['uid'], ['id' => $id]);
                if ($r === false) {
@@ -154,22 +155,29 @@ class Attach
         *
         * @param array $item Attachment data. Needs at least 'id', 'backend-class', 'backend-ref'
         *
-        * @return string  file data
+        * @return string|null file data or null on failure
         * @throws \Exception
         */
-       public static function getData($item)
+       public static function getData(array $item)
        {
-               $backendClass = DI::storageManager()->getByName($item['backend-class'] ?? '');
-               if ($backendClass === null) {
+               if (!empty($item['data'])) {
+                       return $item['data'];
+               }
+
+               try {
+                       $backendClass = DI::storageManager()->getByName($item['backend-class'] ?? '');
+                       $backendRef   = $item['backend-ref'];
+                       return $backendClass->get($backendRef);
+               } catch (InvalidClassStorageException $storageException) {
                        // legacy data storage in 'data' column
                        $i = self::selectFirst(['data'], ['id' => $item['id']]);
                        if ($i === false) {
                                return null;
                        }
                        return $i['data'];
-               } else {
-                       $backendRef = $item['backend-ref'];
-                       return $backendClass->get($backendRef);
+               } catch (ReferenceStorageException $referenceStorageException) {
+                       DI::logger()->debug('No data found for item', ['item' => $item, 'exception' => $referenceStorageException]);
+                       return '';
                }
        }
 
@@ -182,14 +190,14 @@ class Attach
         * @param string  $filetype  Mimetype. optional, default = ''
         * @param integer $filesize  File size in bytes. optional, default = null
         * @param string  $allow_cid Permissions, allowed contacts. optional, default = ''
-        * @param string  $allow_gid Permissions, allowed groups. optional, default = ''
-        * @param string  $deny_cid  Permissions, denied contacts.optional, default = ''
-        * @param string  $deny_gid  Permissions, denied greoup.optional, default = ''
+        * @param string  $allow_gid Permissions, allowed circles. optional, default = ''
+        * @param string  $deny_cid  Permissions, denied contacts. optional, default = ''
+        * @param string  $deny_gid  Permissions, denied circle. optional, default = ''
         *
-        * @return boolean/integer Row id on success, False on errors
+        * @return boolean|integer Row id on success, False on errors
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function store($data, $uid, $filename, $filetype = '' , $filesize = null, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '')
+       public static function store(string $data, int $uid, string $filename, string $filetype = '' , int $filesize = null, string $allow_cid = '', string $allow_gid = '', string $deny_cid = '', string $deny_gid = '')
        {
                if ($filetype === '') {
                        $filetype = Mimetype::getContentType($filename);
@@ -232,17 +240,17 @@ class Attach
        /**
         * Store new file metadata in db and binary in default backend from existing file
         *
-        * @param        $src
-        * @param        $uid
-        * @param string $filename
+        * @param string $src Source file name
+        * @param int    $uid User id
+        * @param string $filename Optional file name
         * @param string $allow_cid
         * @param string $allow_gid
         * @param string $deny_cid
         * @param string $deny_gid
-        * @return boolean True on success
+        * @return boolean|int Insert id or false on failure
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function storeFile($src, $uid, $filename = '', $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '')
+       public static function storeFile(string $src, int $uid, string $filename = '', string $allow_cid = '', string $allow_gid = '', string $deny_cid = '', string $deny_gid = '')
        {
                if ($filename === '') {
                        $filename = basename($src);
@@ -267,18 +275,20 @@ class Attach
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @see   \Friendica\Database\DBA::update
         */
-       public static function update($fields, $conditions, Image $img = null, array $old_fields = [])
+       public static function update(array $fields, array $conditions, Image $img = null, array $old_fields = []): bool
        {
                if (!is_null($img)) {
                        // get items to update
                        $items = self::selectToArray(['backend-class','backend-ref'], $conditions);
 
                        foreach($items as $item) {
-                               $backend_class = DI::storageManager()->getByName($item['backend-class'] ?? '');
-                               if ($backend_class !== null) {
+                               try {
+                                       $backend_class         = DI::storageManager()->getWritableStorageByName($item['backend-class'] ?? '');
                                        $fields['backend-ref'] = $backend_class->put($img->asString(), $item['backend-ref'] ?? '');
-                               } else {
-                                       $fields['data'] = $img->asString();
+                               } catch (InvalidClassStorageException $storageException) {
+                                       DI::logger()->debug('Storage class not found.', ['conditions' => $conditions, 'exception' => $storageException]);
+                               } catch (ReferenceStorageException $referenceStorageException) {
+                                       DI::logger()->debug('Item doesn\'t exist.', ['conditions' => $conditions, 'exception' => $referenceStorageException]);
                                }
                        }
                }
@@ -300,15 +310,19 @@ class Attach
         * @throws \Exception
         * @see   \Friendica\Database\DBA::delete
         */
-       public static function delete(array $conditions, array $options = [])
+       public static function delete(array $conditions, array $options = []): bool
        {
                // get items to delete data info
                $items = self::selectToArray(['backend-class','backend-ref'], $conditions);
 
                foreach($items as $item) {
-                       $backend_class = DI::storageManager()->getByName($item['backend-class'] ?? '');
-                       if ($backend_class !== null) {
+                       try {
+                               $backend_class = DI::storageManager()->getWritableStorageByName($item['backend-class'] ?? '');
                                $backend_class->delete($item['backend-ref'] ?? '');
+                       } catch (InvalidClassStorageException $storageException) {
+                               DI::logger()->debug('Storage class not found.', ['conditions' => $conditions, 'exception' => $storageException]);
+                       } catch (ReferenceStorageException $referenceStorageException) {
+                               DI::logger()->debug('Item doesn\'t exist.', ['conditions' => $conditions, 'exception' => $referenceStorageException]);
                        }
                }