Completed
Push — 5.0 ( 5d9832...217db4 )
by Kristof
96:00 queued 83:47
created

MediaBundle/Controller/MediaController.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Kunstmaan\MediaBundle\Controller;
4
5
use Exception;
6
use Kunstmaan\AdminBundle\FlashMessages\FlashTypes;
7
use Kunstmaan\MediaBundle\Entity\Folder;
8
use Kunstmaan\MediaBundle\Entity\Media;
9
use Kunstmaan\MediaBundle\Helper\MediaManager;
10
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
11
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
12
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
13
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
14
use Symfony\Component\HttpFoundation\File\File;
15
use Symfony\Component\HttpFoundation\JsonResponse;
16
use Symfony\Component\HttpFoundation\RedirectResponse;
17
use Symfony\Component\HttpFoundation\Request;
18
use Symfony\Component\HttpFoundation\Response;
19
20
/**
21
 * MediaController
22
 */
23
class MediaController extends Controller
24
{
25
    /**
26
     * @param Request $request
27
     * @param int     $mediaId
28
     *
29
     * @Route("/{mediaId}", requirements={"mediaId" = "\d+"}, name="KunstmaanMediaBundle_media_show")
30
     *
31
     * @return Response
32
     */
33
    public function showAction(Request $request, $mediaId)
34
    {
35
        $em = $this->getDoctrine()->getManager();
36
37
        /* @var Media $media */
38
        $media = $em->getRepository('KunstmaanMediaBundle:Media')->getMedia($mediaId);
39
        $folder = $media->getFolder();
40
41
        /* @var MediaManager $mediaManager */
42
        $mediaManager = $this->get('kunstmaan_media.media_manager');
43
        $handler = $mediaManager->getHandler($media);
44
        $helper = $handler->getFormHelper($media);
45
46
        $form = $this->createForm($handler->getFormType(), $helper, $handler->getFormTypeOptions());
47
48
        if ($request->isMethod('POST')) {
49
            $form->handleRequest($request);
50
            if ($form->isSubmitted() && $form->isValid()) {
51
                $media = $helper->getMedia();
52
                $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
53
54
                return new RedirectResponse($this->generateUrl(
55
                    'KunstmaanMediaBundle_media_show',
56
                    ['mediaId' => $media->getId()]
57
                ));
58
            }
59
        }
60
        $showTemplate = $mediaManager->getHandler($media)->getShowTemplate($media);
61
62
        return $this->render(
63
            $showTemplate, [
64
                'handler' => $handler,
65
                'foldermanager' => $this->get('kunstmaan_media.folder_manager'),
66
                'mediamanager' => $this->get('kunstmaan_media.media_manager'),
67
                'editform' => $form->createView(),
68
                'media' => $media,
69
                'helper' => $helper,
70
                'folder' => $folder,
71
            ]
72
        );
73
    }
74
75
    /**
76
     * @param Request $request
77
     * @param int     $mediaId
78
     *
79
     * @Route("/delete/{mediaId}", requirements={"mediaId" = "\d+"}, name="KunstmaanMediaBundle_media_delete")
80
     *
81
     * @return RedirectResponse
82
     */
83
    public function deleteAction(Request $request, $mediaId)
84
    {
85
        $em = $this->getDoctrine()->getManager();
86
87
        /* @var Media $media */
88
        $media = $em->getRepository('KunstmaanMediaBundle:Media')->getMedia($mediaId);
89
        $medianame = $media->getName();
90
        $folder = $media->getFolder();
91
92
        $em->getRepository('KunstmaanMediaBundle:Media')->delete($media);
93
94
        $this->addFlash(
95
            FlashTypes::SUCCESS,
96
            $this->get('translator')->trans('kuma_admin.media.flash.deleted_success.%medianame%', [
97
                '%medianame%' => $medianame,
98
            ])
99
        );
100
101
        // If the redirect url is passed via the url we use it
102
        $redirectUrl = $request->query->get('redirectUrl');
103
        if (empty($redirectUrl) || (\strpos($redirectUrl, $request->getSchemeAndHttpHost()) !== 0 && \strpos($redirectUrl, '/') !== 0)) {
104
            $redirectUrl = $this->generateUrl(
105
                'KunstmaanMediaBundle_folder_show',
106
                ['folderId' => $folder->getId()]
107
            );
108
        }
109
110
        return new RedirectResponse($redirectUrl);
111
    }
112
113
    /**
114
     * @param int $folderId
115
     *
116
     * @Route("bulkupload/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_bulk_upload")
117
     * @Template()
118
     *
119
     * @return array|RedirectResponse
120
     */
121
    public function bulkUploadAction($folderId)
122
    {
123
        $em = $this->getDoctrine()->getManager();
124
125
        /* @var Folder $folder */
126
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
127
128
        return ['folder' => $folder];
129
    }
130
131
    /**
132
     * @param Request $request
133
     * @param int     $folderId
134
     *
135
     * @Route("bulkuploadsubmit/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_bulk_upload_submit")
136
     * @Template()
137
     *
138
     * @return JsonResponse
139
     */
140
    public function bulkUploadSubmitAction(Request $request, $folderId)
141
    {
142
        // Settings
143
        if (\ini_get('upload_tmp_dir')) {
144
            $tempDir = \ini_get('upload_tmp_dir');
145
        } else {
146
            $tempDir = \sys_get_temp_dir();
147
        }
148
        $targetDir = \rtrim($tempDir, '/') . DIRECTORY_SEPARATOR . 'plupload';
149
        $cleanupTargetDir = true; // Remove old files
150
        $maxFileAge = 5 * 60 * 60; // Temp file age in seconds
151
152
        // Create target dir
153
        if (!\file_exists($targetDir)) {
154
            @\mkdir($targetDir);
155
        }
156
157
        // Get a file name
158
        if ($request->request->has('name')) {
159
            $fileName = $request->request->get('name');
160
        } elseif (0 !== $request->files->count()) {
161
            $fileName = $request->files->get('file')['name'];
162
        } else {
163
            $fileName = \uniqid('file_', false);
164
        }
165
        $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;
166
167
        $chunk = 0;
168
        $chunks = 0;
169
        // Chunking might be enabled
170
        if ($request->request->has('chunk')) {
171
            $chunk = $request->request->getInt('chunk');
172
        }
173
        if ($request->request->has('chunks')) {
174
            $chunks = $request->request->getInt('chunks');
175
        }
176
177
        // Remove old temp files
178
        if ($cleanupTargetDir) {
179
            if (!\is_dir($targetDir) || !$dir = \opendir($targetDir)) {
180
                return $this->returnJsonError('100', 'Failed to open temp directory.');
181
            }
182
183
            while (($file = \readdir($dir)) !== false) {
184
                $tmpFilePath = $targetDir . DIRECTORY_SEPARATOR . $file;
185
186
                // If temp file is current file proceed to the next
187
                if ($tmpFilePath === "{$filePath}.part") {
188
                    continue;
189
                }
190
191
                // Remove temp file if it is older than the max age and is not the current file
192
                if (\preg_match('/\.part$/', $file) && (\filemtime($tmpFilePath) < \time() - $maxFileAge)) {
193
                    $success = @\unlink($tmpFilePath);
194
                    if ($success !== true) {
195
                        return $this->returnJsonError('106', 'Could not remove temp file: '.$filePath);
196
                    }
197
                }
198
            }
199
            \closedir($dir);
200
        }
201
202
        // Open temp file
203
        if (!$out = @\fopen("{$filePath}.part", $chunks ? 'ab' : 'wb')) {
204
            return $this->returnJsonError('102', 'Failed to open output stream.');
205
        }
206
207
        if (0 !== $request->files->count()) {
208
            $_file = $request->files->get('file');
209
            if ($_file->getError() > 0 || !\is_uploaded_file($_file->getRealPath())) {
210
                return $this->returnJsonError('103', 'Failed to move uploaded file.');
211
            }
212
213
            // Read binary input stream and append it to temp file
214
            if (!$input = @\fopen($_file->getRealPath(), 'rb')) {
215
                return $this->returnJsonError('101', 'Failed to open input stream.');
216
            }
217
        } else {
218
            if (!$input = @\fopen('php://input', 'rb')) {
219
                return $this->returnJsonError('101', 'Failed to open input stream.');
220
            }
221
        }
222
223
        while ($buff = \fread($input, 4096)) {
224
            \fwrite($out, $buff);
225
        }
226
227
        @\fclose($out);
228
        @\fclose($input);
229
230
        // Check if file has been uploaded
231
        if (!$chunks || $chunk === $chunks - 1) {
232
            // Strip the temp .part suffix off
233
            \rename("{$filePath}.part", $filePath);
234
        }
235
236
        $em = $this->getDoctrine()->getManager();
237
        /* @var Folder $folder */
238
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
239
        $file = new File($filePath);
240
241
        try {
242
            /* @var Media $media */
243
            $media = $this->get('kunstmaan_media.media_manager')->getHandler($file)->createNew($file);
244
            $media->setFolder($folder);
245
            $em->getRepository(Media::class)->save($media);
246
        } catch (Exception $e) {
247
            return $this->returnJsonError('104', 'Failed performing save on media-manager');
248
        }
249
250
        $success = \unlink($filePath);
251
        if ($success !== true) {
252
            return $this->returnJsonError('105', 'Could not remove temp file: '.$filePath);
253
        }
254
255
        // Send headers making sure that the file is not cached (as it happens for example on iOS devices)
256
        $response = new JsonResponse([
257
            'jsonrpc' => '2.0',
258
            'result' => '',
259
            'id' => 'id',
260
        ], JsonResponse::HTTP_OK, [
261
            'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
262
            'Last-Modified' => \gmdate('D, d M Y H:i:s') . ' GMT',
263
            'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
264
            'Pragma' => 'no-cache',
265
        ]);
266
267
        return $response;
268
    }
269
270
    private function returnJsonError($code, $message)
271
    {
272
        return new JsonResponse([
273
            'jsonrpc' => '2.0',
274
            'error ' => [
275
                'code' => $code,
276
                'message' => $message,
277
            ],
278
            'id' => 'id',
279
        ]);
280
    }
281
282
    /**
283
     * @param Request $request
284
     * @param int     $folderId
285
     *
286
     * @Route("drop/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_drop_upload")
287
     * @Method({"GET", "POST"})
288
     *
289
     * @return JsonResponse
290
     */
291
    public function dropAction(Request $request, $folderId)
292
    {
293
        $em = $this->getDoctrine()->getManager();
294
295
        /* @var Folder $folder */
296
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
297
298
        $drop = null;
299
300
        if ($request->files->has('files') && $request->files->get('files')['error'] === 0) {
301
            $drop = $request->files->get('files');
302
        } elseif ($request->files->get('file')) {
303
            $drop = $request->files->get('file');
304
        } else {
305
            $drop = $request->get('text');
306
        }
307
        $media = $this->get('kunstmaan_media.media_manager')->createNew($drop);
308
        if ($media) {
309
            $media->setFolder($folder);
310
            $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
311
312
            return new JsonResponse(['status' => $this->get('translator')->trans('kuma_admin.media.flash.drop_success')]);
313
        }
314
315
        $request->getSession()->getFlashBag()->add(
316
            FlashTypes::DANGER,
317
            $this->get('translator')->trans('kuma_admin.media.flash.drop_unrecognized')
318
        );
319
320
        return new JsonResponse(['status' => $this->get('translator')->trans('kuma_admin.media.flash.drop_unrecognized')]);
321
    }
322
323
    /**
324
     * @param Request $request
325
     * @param int     $folderId The folder id
326
     * @param string  $type     The type
327
     *
328
     * @Route("create/{folderId}/{type}", requirements={"folderId" = "\d+", "type" = ".+"}, name="KunstmaanMediaBundle_media_create")
329
     * @Method({"GET", "POST"})
330
     * @Template()
331
     *
332
     * @return array|RedirectResponse
333
     */
334
    public function createAction(Request $request, $folderId, $type)
335
    {
336
        return $this->createAndRedirect($request, $folderId, $type, 'KunstmaanMediaBundle_folder_show');
337
    }
338
339
    /**
340
     * @param Request $request
341
     * @param int     $folderId    The folder Id
342
     * @param string  $type        The type
343
     * @param string  $redirectUrl The url where we want to redirect to on success
344
     * @param array   $extraParams The extra parameters that will be passed wen redirecting
345
     *
346
     * @return array|RedirectResponse
347
     */
348
    private function createAndRedirect(Request $request, $folderId, $type, $redirectUrl, $extraParams = [], $isInModal = false)
349
    {
350
        $em = $this->getDoctrine()->getManager();
351
352
        /* @var Folder $folder */
353
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
354
355
        /* @var MediaManager $mediaManager */
356
        $mediaManager = $this->get('kunstmaan_media.media_manager');
357
        $handler = $mediaManager->getHandlerForType($type);
358
        $media = new Media();
359
        $helper = $handler->getFormHelper($media);
360
361
        $form = $this->createForm($handler->getFormType(), $helper, $handler->getFormTypeOptions());
362
363
        if ($request->isMethod('POST')) {
364
            $params = ['folderId' => $folder->getId()];
365
            $params = \array_merge($params, $extraParams);
366
367
            $form->handleRequest($request);
368
369
            if ($form->isSubmitted() && $form->isValid()) {
370
                $media = $helper->getMedia();
371
                $media->setFolder($folder);
372
                $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
373
374
                $this->addFlash(
375
                    FlashTypes::SUCCESS,
376
                    $this->get('translator')->trans('media.flash.created', [
377
                        '%medianame%' => $media->getName(),
378
                    ])
379
                );
380
381
                return new RedirectResponse($this->generateUrl($redirectUrl, $params));
382
            }
383
384
            if ($isInModal) {
385
                $this->addFlash(
386
                    FlashTypes::ERROR,
387
                    $this->get('translator')->trans('media.flash.not_created', array(
388
                        '%mediaerrors%' => $form->getErrors(true, true),
389
                    ))
390
                );
391
392
                return new RedirectResponse($this->generateUrl($redirectUrl, $params));
393
            }
394
        }
395
396
        return [
397
            'type' => $type,
398
            'form' => $form->createView(),
399
            'folder' => $folder,
400
        ];
401
    }
402
403
    /**
404
     * @param Request $request
405
     * @param int     $folderId The folder id
406
     * @param string  $type     The type
407
     *
408
     * @Route("create/modal/{folderId}/{type}", requirements={"folderId" = "\d+", "type" = ".+"}, name="KunstmaanMediaBundle_media_modal_create")
409
     * @Method({"GET", "POST"})
410
     * @Template()
411
     *
412
     * @return array|RedirectResponse
413
     */
414
    public function createModalAction(Request $request, $folderId, $type)
415
    {
416
        $cKEditorFuncNum = $request->get('CKEditorFuncNum');
417
        $linkChooser = $request->get('linkChooser');
418
419
        $extraParams = [];
420
        if (!empty($cKEditorFuncNum)) {
421
            $extraParams['CKEditorFuncNum'] = $cKEditorFuncNum;
422
        }
423
        if (!empty($linkChooser)) {
424
            $extraParams['linkChooser'] = $linkChooser;
425
        }
426
427
        return $this->createAndRedirect(
428
            $request,
429
            $folderId,
430
            $type,
431
            'KunstmaanMediaBundle_chooser_show_folder',
432
            $extraParams,
433
            true
434
        );
435
    }
436
437
    /**
438
     * @param Request $request
439
     *
440
     * @Route("move/", name="KunstmaanMediaBundle_media_move")
441
     * @Method({"POST"})
442
     *
443
     * @return string
0 ignored issues
show
Should the return type not be JsonResponse?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
444
     */
445
    public function moveMedia(Request $request)
446
    {
447
        $mediaId = $request->request->get('mediaId');
448
        $folderId = $request->request->get('folderId');
449
450
        if (empty($mediaId) || empty($folderId)) {
451
            return new JsonResponse(['error' => ['title' => 'Missing media id or folder id']], 400);
452
        }
453
454
        $em = $this->getDoctrine()->getManager();
455
        $mediaRepo = $em->getRepository('KunstmaanMediaBundle:Media');
456
457
        $media = $mediaRepo->getMedia($mediaId);
458
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
459
460
        $media->setFolder($folder);
461
        $mediaRepo->save($media);
462
463
        return new JsonResponse();
464
    }
465
}
466