Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
257 changes: 227 additions & 30 deletions app/Plugins/Manage/UploadfileManage/UploadfileManage.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use App\Models\Common\Uploads;
use App\Models\Core\Configs;
use App\Models\Core\Plugins;
use App\Utilities\Storage\StorageUsageCalculator;

use App\Plugins\Manage\ManagePluginBase;
Expand Down Expand Up @@ -36,6 +37,51 @@ class UploadfileManage extends ManagePluginBase
*/
private $allowed_per_page = [10, 50, 100];

/**
* 検索条件として扱う項目
*/
private $search_condition_keys = [
'client_original_name',
'id',
'size_from',
'size_to',
'size_unit',
'page_name',
'created_at_from',
'created_at_to',
'plugin_names',
'sort',
];

/**
* 並べ替えの許可された値
*/
private $allowed_sorts = [
'id_asc',
'id_desc',
'client_original_name_asc',
'client_original_name_desc',
'size_asc',
'size_desc',
'created_at_asc',
'created_at_desc',
'plugin_name_asc',
'plugin_name_desc',
'page_name_asc',
'page_name_desc',
'download_count_desc',
'play_count_desc',
];

/**
* ファイルサイズ検索で許可する単位
*/
private $allowed_size_units = [
'byte',
'KB',
'MB',
];

/**
* 権限定義
*/
Expand Down Expand Up @@ -83,34 +129,11 @@ public function index($request)
->leftJoin('plugins', 'plugins.plugin_name', '=', 'uploads.plugin_name')
->leftJoin('pages', 'pages.id', '=', 'uploads.page_id');

if ($request->session()->has('search_condition.client_original_name')) {
$uploads_query->where('client_original_name', 'like', '%' . $request->session()->get('search_condition.client_original_name') . '%');
}
$search_condition = $request->session()->get('search_condition', []);
$this->applySearchConditions($uploads_query, $search_condition);

// 表示順
$sort = 'id_desc';
if ($request->session()->has('search_condition.sort')) {
$sort = session('search_condition.sort');
}
if ($sort == 'id_asc') {
$uploads_query->orderBy('id', 'asc');
} elseif ($sort == 'id_desc') {
$uploads_query->orderBy('id', 'desc');
} elseif ($sort == 'client_original_name_asc') {
$uploads_query->orderBy('client_original_name', 'asc');
} elseif ($sort == 'client_original_name_desc') {
$uploads_query->orderBy('client_original_name', 'desc');
} elseif ($sort == 'size_asc') {
$uploads_query->orderBy('size', 'asc');
} elseif ($sort == 'size_desc') {
$uploads_query->orderBy('size', 'desc');
} elseif ($sort == 'created_at_asc') {
$uploads_query->orderBy('created_at', 'asc');
} elseif ($sort == 'created_at_desc') {
$uploads_query->orderBy('created_at', 'desc');
} elseif ($sort == 'download_count_desc') {
$uploads_query->orderBy('download_count', 'desc');
}
$this->applySort($uploads_query, $this->getSort($search_condition));

// 表示件数の取得 ※デフォルトは10件
$per_page = $this->allowed_per_page[0];
Expand All @@ -128,6 +151,11 @@ public function index($request)
// データ使用量の計算
$storage_usage = StorageUsageCalculator::getDataUsage();

// プラグイン絞り込み用の一覧
$uploadfile_plugins = Plugins::orderBy('display_sequence')
->orderBy('plugin_name')
->get();

// 入力値をsessionへ保存(検索用)
$request->flash();

Expand All @@ -138,6 +166,9 @@ public function index($request)
"uploads" => $uploads,
"allowed_per_page" => $this->allowed_per_page,
"storage_usage" => $storage_usage,
"search_condition_keys" => $this->search_condition_keys,
"is_search_condition_set" => $this->isSearchConditionSet($search_condition),
"uploadfile_plugins" => $uploadfile_plugins,
]);
}

Expand All @@ -147,10 +178,7 @@ public function index($request)
public function search($request)
{
// 検索ボタンが押されたときはここが実行される。検索条件を設定してindex を呼ぶ。
$search_condition = [
"client_original_name" => $request->input('search_condition.client_original_name'),
"sort" => $request->input('search_condition.sort'),
];
$search_condition = $this->getSearchConditionFromRequest($request);

session(["search_condition" => $search_condition]);

Expand All @@ -162,6 +190,175 @@ public function search($request)
return redirect("/manage/uploadfile");
}

/**
* リクエストから検索条件を取得する
*/
private function getSearchConditionFromRequest($request)
{
$search_condition = [];
foreach ($this->search_condition_keys as $key) {
$value = $request->input('search_condition.' . $key);
$search_condition[$key] = is_string($value) ? trim($value) : $value;
}

if (!in_array($search_condition['sort'], $this->allowed_sorts)) {
$search_condition['sort'] = 'id_desc';
}
if (!in_array($search_condition['size_unit'], $this->allowed_size_units)) {
$search_condition['size_unit'] = 'MB';
}

return $search_condition;
}

/**
* 検索条件をクエリに適用する
*/
private function applySearchConditions($uploads_query, array $search_condition)
{
if (!empty($search_condition['client_original_name'])) {
$uploads_query->where('uploads.client_original_name', 'like', '%' . $search_condition['client_original_name'] . '%');
}

if (!empty($search_condition['id']) && is_numeric($search_condition['id'])) {
$uploads_query->where('uploads.id', intval($search_condition['id']));
}

if (isset($search_condition['size_from']) && is_numeric($search_condition['size_from'])) {
$uploads_query->where('uploads.size', '>=', $this->convertSizeToBytes($search_condition['size_from'], $search_condition['size_unit'] ?? 'MB'));
}

if (isset($search_condition['size_to']) && is_numeric($search_condition['size_to'])) {
$uploads_query->where('uploads.size', '<=', $this->convertSizeToBytes($search_condition['size_to'], $search_condition['size_unit'] ?? 'MB'));
}

if (!empty($search_condition['page_name'])) {
$uploads_query->where('pages.page_name', 'like', '%' . $search_condition['page_name'] . '%');
}

if (!empty($search_condition['created_at_from'])) {
$uploads_query->whereDate('uploads.created_at', '>=', $search_condition['created_at_from']);
}

if (!empty($search_condition['created_at_to'])) {
$uploads_query->whereDate('uploads.created_at', '<=', $search_condition['created_at_to']);
}

$plugin_names = $this->getSelectedPluginNames($search_condition);
if (!empty($plugin_names)) {
$uploads_query->whereIn('uploads.plugin_name', $plugin_names);
}
}

/**
* 入力されたファイルサイズをbyteに変換する
*/
private function convertSizeToBytes($size, $unit)
{
if ($unit == 'MB') {
return intval($size * 1024 * 1024);
} elseif ($unit == 'KB') {
return intval($size * 1024);
}

return intval($size);
}

/**
* 選択されたプラグイン名を配列で取得する
*/
private function getSelectedPluginNames(array $search_condition)
{
if (empty($search_condition['plugin_names'])) {
return [];
}

$plugin_names = is_array($search_condition['plugin_names'])
? $search_condition['plugin_names']
: [$search_condition['plugin_names']];

return array_values(array_filter($plugin_names, function ($plugin_name) {
return $plugin_name !== '';
}));
}

/**
* 並べ替え条件を取得する
*/
private function getSort(array $search_condition)
{
if (!empty($search_condition['sort']) && in_array($search_condition['sort'], $this->allowed_sorts)) {
return $search_condition['sort'];
}

return 'id_desc';
}

/**
* 並べ替え条件をクエリに適用する
*/
private function applySort($uploads_query, $sort)
{
if ($sort == 'id_asc') {
$uploads_query->orderBy('uploads.id', 'asc');
} elseif ($sort == 'id_desc') {
$uploads_query->orderBy('uploads.id', 'desc');
} elseif ($sort == 'client_original_name_asc') {
$uploads_query->orderBy('uploads.client_original_name', 'asc')->orderBy('uploads.id', 'asc');
} elseif ($sort == 'client_original_name_desc') {
$uploads_query->orderBy('uploads.client_original_name', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'size_asc') {
$uploads_query->orderBy('uploads.size', 'asc')->orderBy('uploads.id', 'asc');
} elseif ($sort == 'size_desc') {
$uploads_query->orderBy('uploads.size', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'created_at_asc') {
$uploads_query->orderBy('uploads.created_at', 'asc')->orderBy('uploads.id', 'asc');
} elseif ($sort == 'created_at_desc') {
$uploads_query->orderBy('uploads.created_at', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'plugin_name_asc') {
$uploads_query->orderBy('plugins.display_sequence', 'asc')->orderBy('uploads.plugin_name', 'asc')->orderBy('uploads.id', 'asc');
} elseif ($sort == 'plugin_name_desc') {
$uploads_query->orderBy('plugins.display_sequence', 'desc')->orderBy('uploads.plugin_name', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'page_name_asc') {
$uploads_query->orderBy('pages.page_name', 'asc')->orderBy('uploads.id', 'asc');
} elseif ($sort == 'page_name_desc') {
$uploads_query->orderBy('pages.page_name', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'download_count_desc') {
$uploads_query->orderBy('uploads.download_count', 'desc')->orderBy('uploads.id', 'desc');
} elseif ($sort == 'play_count_desc') {
$uploads_query->orderBy('uploads.play_count', 'desc')->orderBy('uploads.id', 'desc');
}
}

/**
* 検索条件が指定されているか判定する
*/
private function isSearchConditionSet(array $search_condition)
{
foreach ($this->search_condition_keys as $key) {
if ($key == 'sort' || $key == 'size_unit') {
continue;
}
if (!isset($search_condition[$key])) {
continue;
}
if (is_array($search_condition[$key])) {
$search_condition_values = array_filter($search_condition[$key], function ($value) {
return $value !== null && $value !== '';
});
if (!empty($search_condition_values)) {
return true;
}
continue;
}
if ($search_condition[$key] !== '') {
return true;
}
}

return !empty($search_condition['sort']) && $search_condition['sort'] != 'id_desc';
}

/**
* 検索条件クリア処理
*/
Expand Down
Loading
Loading