X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FAttach.php;h=b81c38762eb556c75b3bb119d5f0a12406431e29;hb=93380b8471164a8ed5d1d46e94d53bf37fe87cee;hp=13b0adb6f2217caf6d4b4addbc311c7d0fc395d9;hpb=fc2b804cccadcd2e9f90953f02b5977b2eb46439;p=friendica.git diff --git a/src/Model/Attach.php b/src/Model/Attach.php index 13b0adb6f2..b81c38762e 100644 --- a/src/Model/Attach.php +++ b/src/Model/Attach.php @@ -1,68 +1,87 @@ . + * */ + namespace Friendica\Model; -use Friendica\BaseObject; -use Friendica\Core\StorageManager; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Database\DBStructure; -use Friendica\Util\Security; - +use Friendica\DI; +use Friendica\Object\Image; +use Friendica\Util\DateTimeFormat; +use Friendica\Util\Mimetype; +use Friendica\Security\Security; /** * Class to handle attach dabatase table */ -class Attach extends BaseObject +class Attach { /** - * @brief Return a list of fields that are associated with the attach table + * Return a list of fields that are associated with the attach table * * @return array field list + * @throws \Exception */ private static function getFields() { - $allfields = DBStructure::definition(false); + $allfields = DBStructure::definition(DI::app()->getBasePath(), false); $fields = array_keys($allfields['attach']['fields']); array_splice($fields, array_search('data', $fields), 1); return $fields; } /** - * @brief Select rows from the attach table + * Select rows from the attach table and return them as array * - * @param array $fields Array of selected fields, empty for all - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param array $fields Array of selected fields, empty for all + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * - * @return boolean|array + * @return array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::selectToArray */ - public static function select(array $fields = [], array $conditions = [], array $params = []) + public static function selectToArray(array $fields = [], array $conditions = [], array $params = []) { if (empty($fields)) { - $selected = self::getFields(); + $fields = self::getFields(); } - $r = DBA::select('attach', $fields, $conditions, $params); - return DBA::toArray($r); + return DBA::selectToArray('attach', $fields, $conditions, $params); } /** - * @brief Retrieve a single record from the attach table + * Retrieve a single record from the attach table * - * @param array $fields Array of selected fields, empty for all - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param array $fields Array of selected fields, empty for all + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function selectFirst(array $fields = [], array $conditions = [], array $params = []) { @@ -74,11 +93,12 @@ class Attach extends BaseObject } /** - * @brief Check if attachment with given conditions exists + * Check if attachment with given conditions exists * - * @param array $conditions Array of extra conditions + * @param array $conditions Array of extra conditions * * @return boolean + * @throws \Exception */ public static function exists(array $conditions) { @@ -86,13 +106,14 @@ class Attach extends BaseObject } /** - * @brief Retrive a single record given the ID - * - * @param int $id Row id of the record - * + * Retrive a single record given the ID + * + * @param int $id Row id of the record + * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function getById($id) { @@ -100,13 +121,14 @@ class Attach extends BaseObject } /** - * @brief Retrive a single record given the ID - * - * @param int $id Row id of the record - * + * Retrive a single record given the ID + * + * @param int $id Row id of the record + * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function getByIdWithPermission($id) { @@ -128,15 +150,17 @@ class Attach extends BaseObject } /** - * @brief Get file data for given row id. null if row id does not exist - * - * @param array $item Attachment data. Needs at least 'id', 'backend-class', 'backend-ref' - * + * Get file data for given row id. null if row id does not exist + * + * @param array $item Attachment data. Needs at least 'id', 'backend-class', 'backend-ref' + * * @return string file data + * @throws \Exception */ public static function getData($item) { - if ($item['backend-class'] == '') { + $backendClass = DI::storageManager()->getByName($item['backend-class'] ?? ''); + if ($backendClass === null) { // legacy data storage in 'data' column $i = self::selectFirst(['data'], ['id' => $item['id']]); if ($i === false) { @@ -144,9 +168,150 @@ class Attach extends BaseObject } return $i['data']; } else { - $backendClass = $item['backend-class']; $backendRef = $item['backend-ref']; - return $backendClass::get($backendRef); + return $backendClass->get($backendRef); + } + } + + /** + * Store new file metadata in db and binary in default backend + * + * @param string $data Binary data + * @param integer $uid User ID + * @param string $filename Filename + * @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 = '' + * + * @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 = '') + { + if ($filetype === '') { + $filetype = Mimetype::getContentType($filename); + } + + if (is_null($filesize)) { + $filesize = strlen($data); + } + + $backend_ref = DI::storage()->put($data); + $data = ''; + + $hash = System::createGUID(64); + $created = DateTimeFormat::utcNow(); + + $fields = [ + 'uid' => $uid, + 'hash' => $hash, + 'filename' => $filename, + 'filetype' => $filetype, + 'filesize' => $filesize, + 'data' => $data, + 'created' => $created, + 'edited' => $created, + 'allow_cid' => $allow_cid, + 'allow_gid' => $allow_gid, + 'deny_cid' => $deny_cid, + 'deny_gid' => $deny_gid, + 'backend-class' => (string)DI::storage(), + 'backend-ref' => $backend_ref + ]; + + $r = DBA::insert('attach', $fields); + if ($r === true) { + return DBA::lastInsertId(); } + return $r; + } + + /** + * Store new file metadata in db and binary in default backend from existing file + * + * @param $src + * @param $uid + * @param string $filename + * @param string $allow_cid + * @param string $allow_gid + * @param string $deny_cid + * @param string $deny_gid + * @return boolean True on success + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function storeFile($src, $uid, $filename = '', $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') + { + if ($filename === '') { + $filename = basename($src); + } + + $data = @file_get_contents($src); + + return self::store($data, $uid, $filename, '', null, $allow_cid, $allow_gid, $deny_cid, $deny_gid); + } + + + /** + * Update an attached file + * + * @param array $fields Contains the fields that are updated + * @param array $conditions Condition array with the key values + * @param Image $img Image data to update. Optional, default null. + * @param array|boolean $old_fields Array with the old field values that are about to be replaced (true = update on duplicate) + * + * @return boolean Was the update successful? + * + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @see \Friendica\Database\DBA::update + */ + public static function update($fields, $conditions, Image $img = null, array $old_fields = []) + { + 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) { + $fields['backend-ref'] = $backend_class->put($img->asString(), $item['backend-ref'] ?? ''); + } else { + $fields['data'] = $img->asString(); + } + } + } + + $fields['edited'] = DateTimeFormat::utcNow(); + + return DBA::update('attach', $fields, $conditions, $old_fields); + } + + + /** + * Delete info from table and data from storage + * + * @param array $conditions Field condition(s) + * @param array $options Options array, Optional + * + * @return boolean + * + * @throws \Exception + * @see \Friendica\Database\DBA::delete + */ + public static function delete(array $conditions, array $options = []) + { + // 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) { + $backend_class->delete($item['backend-ref'] ?? ''); + } + } + + return DBA::delete('attach', $conditions, $options); } -} \ No newline at end of file +}