| Conditions | 15 |
| Paths | 5 |
| Total Lines | 177 |
| Code Lines | 116 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 2 | ||
| Bugs | 0 | Features | 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 |
||
| 91 | public function handle(ServerRequestInterface $request): ResponseInterface |
||
| 92 | { |
||
| 93 | $data_filesystem = Registry::filesystem()->data(); |
||
| 94 | |||
| 95 | $files = $request->getQueryParams()['files']; // local|external|unused |
||
| 96 | |||
| 97 | // Files within this folder |
||
| 98 | $media_folder = $request->getQueryParams()['media_folder']; |
||
| 99 | |||
| 100 | // Show sub-folders within $media_folder |
||
| 101 | $subfolders = $request->getQueryParams()['subfolders']; // include|exclude |
||
| 102 | |||
| 103 | $search_columns = ['multimedia_file_refn', 'descriptive_title']; |
||
| 104 | |||
| 105 | $sort_columns = [ |
||
| 106 | 0 => 'multimedia_file_refn', |
||
| 107 | 2 => new Expression('descriptive_title || multimedia_file_refn'), |
||
| 108 | ]; |
||
| 109 | |||
| 110 | // Convert a row from the database into a row for datatables |
||
| 111 | $callback = function (stdClass $row): array { |
||
| 112 | $tree = $this->tree_service->find((int) $row->m_file); |
||
| 113 | $media = Registry::mediaFactory()->make($row->m_id, $tree, $row->m_gedcom); |
||
| 114 | assert($media instanceof Media); |
||
| 115 | |||
| 116 | $is_http = str_starts_with($row->multimedia_file_refn, 'http://'); |
||
| 117 | $is_https = str_starts_with($row->multimedia_file_refn, 'https://'); |
||
| 118 | |||
| 119 | if ($is_http || $is_https) { |
||
| 120 | return [ |
||
| 121 | '<a href="' . e($row->multimedia_file_refn) . '">' . e($row->multimedia_file_refn) . '</a>', |
||
| 122 | view('icons/mime', ['type' => Mime::DEFAULT_TYPE]), |
||
| 123 | $this->mediaObjectInfo($media), |
||
| 124 | ]; |
||
| 125 | } |
||
| 126 | |||
| 127 | try { |
||
| 128 | $path = $row->media_folder . $row->multimedia_file_refn; |
||
| 129 | |||
| 130 | try { |
||
| 131 | $mime_type = Registry::filesystem()->data()->mimeType($path); |
||
| 132 | } catch (UnableToRetrieveMetadata $ex) { |
||
| 133 | $mime_type = Mime::DEFAULT_TYPE; |
||
| 134 | } |
||
| 135 | |||
| 136 | if (str_starts_with($mime_type, 'image/')) { |
||
| 137 | $url = route(AdminMediaFileThumbnail::class, ['path' => $path]); |
||
| 138 | $img = '<img src="' . e($url) . '">'; |
||
| 139 | } else { |
||
| 140 | $img = view('icons/mime', ['type' => $mime_type]); |
||
| 141 | } |
||
| 142 | |||
| 143 | $url = route(AdminMediaFileDownload::class, ['path' => $path]); |
||
| 144 | $img = '<a href="' . e($url) . '" type="' . $mime_type . '" class="gallery">' . $img . '</a>'; |
||
| 145 | } catch (UnableToReadFile $ex) { |
||
| 146 | $url = route(AdminMediaFileThumbnail::class, ['path' => $path]); |
||
| 147 | $img = '<img src="' . e($url) . '">'; |
||
| 148 | } |
||
| 149 | |||
| 150 | return [ |
||
| 151 | e($row->multimedia_file_refn), |
||
| 152 | $img, |
||
| 153 | $this->mediaObjectInfo($media), |
||
| 154 | ]; |
||
| 155 | }; |
||
| 156 | |||
| 157 | switch ($files) { |
||
| 158 | case 'local': |
||
| 159 | $query = DB::table('media_file') |
||
| 160 | ->join('media', static function (JoinClause $join): void { |
||
| 161 | $join |
||
| 162 | ->on('media.m_file', '=', 'media_file.m_file') |
||
| 163 | ->on('media.m_id', '=', 'media_file.m_id'); |
||
| 164 | }) |
||
| 165 | ->join('gedcom_setting', 'gedcom_id', '=', 'media.m_file') |
||
| 166 | ->where('setting_name', '=', 'MEDIA_DIRECTORY') |
||
| 167 | ->where('multimedia_file_refn', 'NOT LIKE', 'http://%') |
||
| 168 | ->where('multimedia_file_refn', 'NOT LIKE', 'https://%') |
||
| 169 | ->select([ |
||
| 170 | 'media.*', |
||
| 171 | 'multimedia_file_refn', |
||
| 172 | 'descriptive_title', |
||
| 173 | 'setting_value AS media_folder', |
||
| 174 | ]); |
||
| 175 | |||
| 176 | $query->where(new Expression('setting_value || multimedia_file_refn'), 'LIKE', $media_folder . '%'); |
||
| 177 | |||
| 178 | if ($subfolders === 'exclude') { |
||
| 179 | $query->where(new Expression('setting_value || multimedia_file_refn'), 'NOT LIKE', $media_folder . '%/%'); |
||
| 180 | } |
||
| 181 | |||
| 182 | return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback); |
||
| 183 | |||
| 184 | case 'external': |
||
| 185 | $query = DB::table('media_file') |
||
| 186 | ->join('media', static function (JoinClause $join): void { |
||
| 187 | $join |
||
| 188 | ->on('media.m_file', '=', 'media_file.m_file') |
||
| 189 | ->on('media.m_id', '=', 'media_file.m_id'); |
||
| 190 | }) |
||
| 191 | ->where(static function (Builder $query): void { |
||
| 192 | $query |
||
| 193 | ->where('multimedia_file_refn', 'LIKE', 'http://%') |
||
| 194 | ->orWhere('multimedia_file_refn', 'LIKE', 'https://%'); |
||
| 195 | }) |
||
| 196 | ->select([ |
||
| 197 | 'media.*', |
||
| 198 | 'multimedia_file_refn', |
||
| 199 | 'descriptive_title', |
||
| 200 | new Expression("'' AS media_folder"), |
||
| 201 | ]); |
||
| 202 | |||
| 203 | return $this->datatables_service->handleQuery($request, $query, $search_columns, $sort_columns, $callback); |
||
| 204 | |||
| 205 | case 'unused': |
||
| 206 | // Which trees use which media folder? |
||
| 207 | $media_trees = DB::table('gedcom') |
||
| 208 | ->join('gedcom_setting', 'gedcom_setting.gedcom_id', '=', 'gedcom.gedcom_id') |
||
| 209 | ->where('setting_name', '=', 'MEDIA_DIRECTORY') |
||
| 210 | ->where('gedcom.gedcom_id', '>', 0) |
||
| 211 | ->pluck('setting_value', 'gedcom_name'); |
||
| 212 | |||
| 213 | $disk_files = $this->media_file_service->allFilesOnDisk($data_filesystem, $media_folder, $subfolders === 'include'); |
||
| 214 | $db_files = $this->media_file_service->allFilesInDatabase($media_folder, $subfolders === 'include'); |
||
| 215 | |||
| 216 | // All unused files |
||
| 217 | $unused_files = $disk_files->diff($db_files) |
||
| 218 | ->map(static function (string $file): array { |
||
| 219 | return (array) $file; |
||
| 220 | }); |
||
| 221 | |||
| 222 | $search_columns = [0]; |
||
| 223 | $sort_columns = [0 => 0]; |
||
| 224 | |||
| 225 | $callback = function (array $row) use ($data_filesystem, $media_trees): array { |
||
| 226 | try { |
||
| 227 | $mime_type = $data_filesystem->mimeType($row[0]) ?: Mime::DEFAULT_TYPE; |
||
| 228 | } catch (FileSystemException | UnableToRetrieveMetadata $ex) { |
||
| 229 | $mime_type = Mime::DEFAULT_TYPE; |
||
| 230 | } |
||
| 231 | |||
| 232 | |||
| 233 | if (str_starts_with($mime_type, 'image/')) { |
||
| 234 | $url = route(AdminMediaFileThumbnail::class, ['path' => $row[0]]); |
||
| 235 | $img = '<img src="' . e($url) . '">'; |
||
| 236 | } else { |
||
| 237 | $img = view('icons/mime', ['type' => $mime_type]); |
||
| 238 | } |
||
| 239 | |||
| 240 | $url = route(AdminMediaFileDownload::class, ['path' => $row[0]]); |
||
| 241 | $img = '<a href="' . e($url) . '">' . $img . '</a>'; |
||
| 242 | |||
| 243 | // Form to create new media object in each tree |
||
| 244 | $create_form = ''; |
||
| 245 | foreach ($media_trees as $media_tree => $media_directory) { |
||
| 246 | if (str_starts_with($row[0], $media_directory)) { |
||
| 247 | $tmp = substr($row[0], strlen($media_directory)); |
||
| 248 | $create_form .= |
||
| 249 | '<p><a href="#" data-toggle="modal" data-backdrop="static" data-target="#modal-create-media-from-file" data-file="' . e($tmp) . '" data-url="' . e(route(CreateMediaObjectFromFile::class, ['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>'; |
||
| 250 | } |
||
| 251 | } |
||
| 252 | |||
| 253 | $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, [ |
||
| 254 | 'path' => $row[0], |
||
| 255 | ])) . '" href="#">' . I18N::translate('Delete') . '</a></p>'; |
||
| 256 | |||
| 257 | return [ |
||
| 258 | $this->mediaFileInfo($data_filesystem, $row[0]) . $delete_link, |
||
| 259 | $img, |
||
| 260 | $create_form, |
||
| 261 | ]; |
||
| 262 | }; |
||
| 263 | |||
| 264 | return $this->datatables_service->handleCollection($request, $unused_files, $search_columns, $sort_columns, $callback); |
||
| 265 | |||
| 266 | default: |
||
| 267 | throw new HttpNotFoundException(); |
||
| 268 | } |
||
| 365 |