Files
thetempusproject/app/plugins/fileshare/models/upload.php
2024-08-09 01:05:20 -04:00

182 lines
5.5 KiB
PHP

<?php
/**
* app/plugins/fileshare/models/upload.php
*
* This class is used for the manipulation of the uploads database table.
*
* @package TP FileShare
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Models;
use TheTempusProject\Bedrock\Classes\Config;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Bedrock\Classes\CustomException;
class Upload extends DatabaseModel {
public $tableName = 'uploads';
public $databaseMatrix = [
[ 'name', 'varchar', '256' ],
[ 'location', 'text', '64' ],
[ 'size', 'int', '20' ],
[ 'file_type', 'varchar', '64' ],
[ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ],
];
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
}
public function create( $name, $location ) {
$info = $this->getFileInfo( $location );
$size = $info['size'];
$file_type = $info['file_type'];
$fields = [
'name' => $name,
'location' => '/' . $location,
'size' => $size,
'file_type' => $file_type,
'createdAt' => time(),
'createdBy' => App::$activeUser->ID,
];
if ( ! self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Uploads::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
public function update( $id, $name, $location = '' ) {
$fields = [
'name' => $name,
];
if ( ! empty( $location ) ) {
$info = $this->getFileInfo( $location );
$fields['location'] = $location;
$fields['size'] = $info['size'];
$fields['file_type'] = $info['file_type'];
}
if ( ! self::$db->update( $this->tableName, $id, $fields ) ) {
new CustomException( 'UploadsUpdate' );
Debug::error( "Uploads: $id not updated: $fields" );
return false;
}
return true;
}
public function simple() {
$uploads = self::$db->get( $this->tableName, '*' );
if ( !$uploads->count() ) {
Debug::warn( 'Could not find any uploads' );
return false;
}
$uploads = $uploads->results();
$out = [];
foreach ( $uploads as $upload ) {
$out[ $upload->name ] = $upload->location;
}
return $out;
}
// public function processFileUpload() {
// }
public function getByUser( $limit = 0 ) {
$whereClause = [
'createdBy', '=', App::$activeUser->ID,
];
if ( empty( $limit ) ) {
$uploads = self::$db->get( $this->tableName, $whereClause );
} else {
$uploads = self::$db->get( $this->tableName, $whereClause, 'ID', 'DESC', [0, $limit] );
}
if ( ! $uploads->count() ) {
Debug::info( 'No Uploads found.' );
return false;
}
return $this->filter( $uploads->results() );
}
public function delete( $idArray ) {
if ( !is_array( $idArray ) ) {
$idArray = [ $idArray ];
}
foreach ( $idArray as $id ) {
$upload = self::findById( $id );
if ( $upload ) {
$fileLocation = APP_ROOT_DIRECTORY . ltrim( $upload->location, '/' );
if (file_exists($fileLocation)) {
if (!unlink($fileLocation)) {
Debug::error("Failed to delete file: $fileLocation");
return false;
}
} else {
Debug::warn("File does not exist: $fileLocation");
}
}
}
return parent::delete( $idArray );
}
private function getFileInfo( $imagePath )
{
$data = [];
$fileLocation = APP_ROOT_DIRECTORY . ltrim( $imagePath, '/' );
if ( file_exists( $fileLocation ) ) {
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($fileInfo, $fileLocation);
finfo_close($fileInfo);
$fileSize = filesize($fileLocation);
$data['file_type'] = $mimeType;
$data['size'] = $fileSize;
$data['path'] = $fileLocation;
} else {
Debug::warn("File does not exist: $fileLocation");
}
return $data;
}
public function filter( $data, $params = [] ) {
foreach ( $data as $instance ) {
if ( !is_object( $instance ) ) {
$instance = $data;
$end = true;
}
if (isset($instance->size)) {
$instance->readableSize = $this->formatSize($instance->size);
}
$out[] = $instance;
if ( !empty( $end ) ) {
$out = $out[0];
break;
}
}
return $out;
}
public function formatSize($size) {
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$i = 0;
while ($size >= 1024 && $i < count($units) - 1) {
$size /= 1024;
$i++;
}
return round($size, 2) . ' ' . $units[$i];
}
}