| Conditions | 12 |
| Paths | 5 |
| Total Lines | 157 |
| Code Lines | 103 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 89 | public function handle(ServerRequestInterface $request): ResponseInterface |
||
| 90 | { |
||
| 91 | $data_filesystem = Registry::filesystem()->data(); |
||
| 92 | |||
| 93 | $files = $request->getQueryParams()['files']; // local|external|unused |
||
| 94 | |||
| 95 | // Files within this folder |
||
| 96 | $media_folder = $request->getQueryParams()['media_folder']; |
||
| 97 | |||
| 98 | // Show sub-folders within $media_folder |
||
| 99 | $subfolders = $request->getQueryParams()['subfolders']; // include|exclude |
||
| 100 | |||
| 101 | $search_columns = ['multimedia_file_refn', 'descriptive_title']; |
||
| 102 | |||
| 103 | $sort_columns = [ |
||
| 104 | 0 => 'multimedia_file_refn', |
||
| 105 | 2 => (string) new Expression('descriptive_title || multimedia_file_refn'), |
||
| 106 | ]; |
||
| 107 | |||
| 108 | // Convert a row from the database into a row for datatables |
||
| 109 | $callback = function (stdClass $row): array { |
||
| 110 | $tree = $this->tree_service->find((int) $row->m_file); |
||
| 111 | $media = Registry::mediaFactory()->make($row->m_id, $tree, $row->m_gedcom); |
||
| 112 | assert($media instanceof Media); |
||
| 113 | |||
| 114 | $path = $row->media_folder . $row->multimedia_file_refn; |
||
| 115 | |||
| 116 | try { |
||
| 117 | $mime_type = Registry::filesystem()->data()->getMimeType($path) ?: Mime::DEFAULT_TYPE; |
||
| 118 | |||
| 119 | if (str_starts_with($mime_type, 'image/')) { |
||
| 120 | $url = route(AdminMediaFileThumbnail::class, ['path' => $path]); |
||
| 121 | $img = '<img src="' . e($url) . '">'; |
||
| 122 | } else { |
||
| 123 | $img = view('icons/mime', ['type' => $mime_type]); |
||
| 124 | } |
||
| 125 | |||
| 126 | $url = route(AdminMediaFileDownload::class, ['path' => $path]); |
||
| 127 | $img = '<a href="' . e($url) . '" type="' . $mime_type . '" class="gallery">' . $img . '</a>'; |
||
| 128 | } catch (FileNotFoundException $ex) { |
||
| 129 | $url = route(AdminMediaFileThumbnail::class, ['path' => $path]); |
||
| 130 | $img = '<img src="' . e($url) . '">'; |
||
| 131 | } |
||
| 132 | |||
| 133 | return [ |
||
| 134 | $row->multimedia_file_refn, |
||
| 135 | $img, |
||
| 136 | $this->mediaObjectInfo($media), |
||
| 137 | ]; |
||
| 138 | }; |
||
| 139 | |||
| 140 | switch ($files) { |
||
| 141 | case 'local': |
||
| 142 | $query = DB::table('media_file') |
||
| 143 | ->join('media', static function (JoinClause $join): void { |
||
| 144 | $join |
||
| 145 | ->on('media.m_file', '=', 'media_file.m_file') |
||
| 146 | ->on('media.m_id', '=', 'media_file.m_id'); |
||
| 147 | }) |
||
| 148 | ->join('gedcom_setting', 'gedcom_id', '=', 'media.m_file') |
||
| 149 | ->where('setting_name', '=', 'MEDIA_DIRECTORY') |
||
| 150 | ->where('multimedia_file_refn', 'NOT LIKE', 'http://%') |
||
| 151 | ->where('multimedia_file_refn', 'NOT LIKE', 'https://%') |
||
| 152 | ->select([ |
||
| 153 | 'media.*', |
||
| 154 | 'multimedia_file_refn', |
||
| 155 | 'descriptive_title', |
||
| 156 | 'setting_value AS media_folder', |
||
| 157 | ]); |
||
| 158 | |||
| 159 | $query->where(new Expression('setting_value || multimedia_file_refn'), 'LIKE', $media_folder . '%'); |
||
| 160 | |||
| 161 | if ($subfolders === 'exclude') { |
||
| 162 | $query->where(new Expression('setting_value || multimedia_file_refn'), 'NOT LIKE', $media_folder . '%/%'); |
||
| 163 | } |
||
| 164 | |||
| 165 | return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback); |
||
| 166 | |||
| 167 | case 'external': |
||
| 168 | $query = DB::table('media_file') |
||
| 169 | ->join('media', static function (JoinClause $join): void { |
||
| 170 | $join |
||
| 171 | ->on('media.m_file', '=', 'media_file.m_file') |
||
| 172 | ->on('media.m_id', '=', 'media_file.m_id'); |
||
| 173 | }) |
||
| 174 | ->where(static function (Builder $query): void { |
||
| 175 | $query |
||
| 176 | ->where('multimedia_file_refn', 'LIKE', 'http://%') |
||
| 177 | ->orWhere('multimedia_file_refn', 'LIKE', 'https://%'); |
||
| 178 | }) |
||
| 179 | ->select([ |
||
| 180 | 'media.*', |
||
| 181 | 'multimedia_file_refn', |
||
| 182 | 'descriptive_title', |
||
| 183 | (string) new Expression("'' AS media_folder"), |
||
| 184 | ]); |
||
| 185 | |||
| 186 | return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback); |
||
| 187 | |||
| 188 | case 'unused': |
||
| 189 | // Which trees use which media folder? |
||
| 190 | $media_trees = DB::table('gedcom') |
||
| 191 | ->join('gedcom_setting', 'gedcom_setting.gedcom_id', '=', 'gedcom.gedcom_id') |
||
| 192 | ->where('setting_name', '=', 'MEDIA_DIRECTORY') |
||
| 193 | ->where('gedcom.gedcom_id', '>', 0) |
||
| 194 | ->pluck('setting_value', 'gedcom_name'); |
||
| 195 | |||
| 196 | $disk_files = $this->media_file_service->allFilesOnDisk($data_filesystem, $media_folder, $subfolders === 'include'); |
||
| 197 | $db_files = $this->media_file_service->allFilesInDatabase($media_folder, $subfolders === 'include'); |
||
| 198 | |||
| 199 | // All unused files |
||
| 200 | $unused_files = $disk_files->diff($db_files) |
||
| 201 | ->map(static function (string $file): array { |
||
| 202 | return (array) $file; |
||
| 203 | }); |
||
| 204 | |||
| 205 | $search_columns = [0]; |
||
| 206 | $sort_columns = [0 => 0]; |
||
| 207 | |||
| 208 | $callback = function (array $row) use ($data_filesystem, $media_trees): array { |
||
| 209 | $mime_type = $data_filesystem->getMimeType($row[0]) ?: Mime::DEFAULT_TYPE; |
||
| 210 | |||
| 211 | if (str_starts_with($mime_type, 'image/')) { |
||
| 212 | $url = route(AdminMediaFileThumbnail::class, ['path' => $row[0]]); |
||
| 213 | $img = '<img src="' . e($url) . '">'; |
||
| 214 | } else { |
||
| 215 | $img = view('icons/mime', ['type' => $mime_type]); |
||
| 216 | } |
||
| 217 | |||
| 218 | $url = route(AdminMediaFileDownload::class, ['path' => $row[0]]); |
||
| 219 | $img = '<a href="' . e($url) . '">' . $img . '</a>'; |
||
| 220 | |||
| 221 | // Form to create new media object in each tree |
||
| 222 | $create_form = ''; |
||
| 223 | foreach ($media_trees as $media_tree => $media_directory) { |
||
| 224 | if (str_starts_with($row[0], $media_directory)) { |
||
| 225 | $tmp = substr($row[0], strlen($media_directory)); |
||
| 226 | $create_form .= |
||
| 227 | '<p><a href="#" data-toggle="modal" data-backdrop="static" data-target="#modal-create-media-from-file" data-file="' . e($tmp) . '" data-url="' . e(route('create-media-from-file', ['tree' => $media_tree])) . '" onclick="document.getElementById(\'modal-create-media-from-file-form\').action=this.dataset.url; document.getElementById(\'file\').value=this.dataset.file;">' . I18N::translate('Create') . '</a> — ' . e($media_tree) . '<p>'; |
||
| 228 | } |
||
| 229 | } |
||
| 230 | |||
| 231 | $delete_link = '<p><a data-confirm="' . I18N::translate('Are you sure you want to delete “%s”?', e($row[0])) . '" data-post-url="' . e(route(DeletePath::class, [ |
||
| 232 | 'path' => $row[0], |
||
| 233 | ])) . '" href="#">' . I18N::translate('Delete') . '</a></p>'; |
||
| 234 | |||
| 235 | return [ |
||
| 236 | $this->mediaFileInfo($data_filesystem, $row[0]) . $delete_link, |
||
| 237 | $img, |
||
| 238 | $create_form, |
||
| 239 | ]; |
||
| 240 | }; |
||
| 241 | |||
| 242 | return $this->datatables_service->handleCollection($request, $unused_files, $search_columns, $sort_columns, $callback); |
||
| 243 | |||
| 244 | default: |
||
| 245 | throw new HttpNotFoundException(); |
||
| 246 | } |
||
| 333 |