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 |