Passed
Push — master ( b587ed...4a4054 )
by Jan
03:55
created

convertWindowsDirectorySeparator()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
/*
3
 * Copyright (C) 2020  Jan Böhmer
4
 *
5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU Affero General Public License as published
7
 * by the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU Affero General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Affero General Public License
16
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17
 */
18
19
namespace App\Services\Upload;
20
21
use App\Entity\PaymentOrder;
22
use Symfony\Component\HttpFoundation\File\File;
23
use Symfony\Component\HttpFoundation\File\UploadedFile;
24
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
25
use Vich\UploaderBundle\Mapping\PropertyMapping;
26
use Vich\UploaderBundle\Mapping\PropertyMappingFactory;
27
use Vich\UploaderBundle\Storage\AbstractStorage;
28
use Vich\UploaderBundle\Storage\FileSystemStorage;
29
30
/**
31
 * We need to extend the original filesystemstorage as we have stored our payment_order files privately and want to use
32
 * the normal interface to access them via URI...
33
 * Based on Vich FileSystemStorage class
34
 */
35
class ExtendedFileSystemStorage extends AbstractStorage
36
{
37
    private $router;
38
39
    public function __construct(PropertyMappingFactory $factory, UrlGeneratorInterface $router)
40
    {
41
        parent::__construct($factory);
42
        $this->router = $router;
43
    }
44
45
    public function resolveUri($obj, ?string $fieldName = null, ?string $className = null): ?string
46
    {
47
48
        [$mapping, $name] = $this->getFilename($obj, $fieldName, $className);
49
50
        if (empty($name)) {
51
            return null;
52
        }
53
54
        $uploadDir = $this->convertWindowsDirectorySeparator($mapping->getUploadDir($obj));
55
        $uploadDir = empty($uploadDir) ? '' : $uploadDir.'/';
56
57
        $tmp = \sprintf('%s/%s', $mapping->getUriPrefix(), $uploadDir.$name);
58
59
        if (null !== $tmp && $obj instanceof PaymentOrder) {
60
            if ('printed_form' === $fieldName || 'printed_form_file' === $fieldName) {
61
                return $this->router->generate('file_payment_order_form', [
62
                    'id' => $obj->getId(),
63
                ]);
64
            }
65
66
            if ('references' === $fieldName || 'references_file' === $fieldName) {
67
                return $this->router->generate('file_payment_order_references', [
68
                    'id' => $obj->getId(),
69
                ]);
70
            }
71
        }
72
73
        return $tmp;
74
    }
75
76
    protected function doUpload(PropertyMapping $mapping, UploadedFile $file, ?string $dir, string $name): ?File
77
    {
78
        $uploadDir = $mapping->getUploadDestination().\DIRECTORY_SEPARATOR.$dir;
79
80
        return $file->move($uploadDir, $name);
81
    }
82
83
    protected function doRemove(PropertyMapping $mapping, ?string $dir, string $name): ?bool
84
    {
85
        $file = $this->doResolvePath($mapping, $dir, $name);
86
87
        return \file_exists($file) && \unlink($file);
88
    }
89
90
    protected function doResolvePath(PropertyMapping $mapping, ?string $dir, string $name, ?bool $relative = false): string
91
    {
92
        $path = !empty($dir) ? $dir.\DIRECTORY_SEPARATOR.$name : $name;
93
94
        if ($relative) {
95
            return $path;
96
        }
97
98
        return $mapping->getUploadDestination().\DIRECTORY_SEPARATOR.$path;
99
    }
100
101
    private function convertWindowsDirectorySeparator(string $string): string
102
    {
103
        return \str_replace('\\', '/', $string);
104
    }
105
}
106