Completed
Push — master ( 1b03a0...553f9e )
by Joschi
05:26
created

DirectoryService::getDataDirectory()   C

Complexity

Conditions 8
Paths 6

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 0
cts 18
cp 0
rs 6.1403
c 0
b 0
f 0
cc 8
eloc 13
nc 6
nop 2
crap 72
1
<?php
2
3
/**
4
 * admin
5
 *
6
 * @category    Tollwerk
7
 * @package     Tollwerk\Admin
8
 * @subpackage  Tollwerk\Admin\Infrastructure\Service
9
 * @author      Joschi Kuphal <[email protected]> / @jkphl
10
 * @copyright   Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
11
 * @license     http://opensource.org/licenses/MIT The MIT License (MIT)
12
 */
13
14
/***********************************************************************************
15
 *  The MIT License (MIT)
16
 *
17
 *  Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
18
 *
19
 *  Permission is hereby granted, free of charge, to any person obtaining a copy of
20
 *  this software and associated documentation files (the "Software"), to deal in
21
 *  the Software without restriction, including without limitation the rights to
22
 *  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
23
 *  the Software, and to permit persons to whom the Software is furnished to do so,
24
 *  subject to the following conditions:
25
 *
26
 *  The above copyright notice and this permission notice shall be included in all
27
 *  copies or substantial portions of the Software.
28
 *
29
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
31
 *  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
32
 *  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
33
 *  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34
 *  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
 ***********************************************************************************/
36
37
namespace Tollwerk\Admin\Infrastructure\Service;
38
39
use Tollwerk\Admin\Domain\Account\AccountInterface;
40
use Tollwerk\Admin\Infrastructure\App;
41
42
/**
43
 * Account directory service
44
 *
45
 * @package Tollwerk\Admin
46
 * @subpackage Tollwerk\Admin\Infrastructure
47
 */
48
class DirectoryService
49
{
50
    /**
51
     * Account
52
     *
53
     * @var AccountInterface
54
     */
55
    protected $account;
56
    /**
57
     * Account base directory
58
     *
59
     * @var string
60
     */
61
    protected $basedir;
62
63
    /**
64
     * Constructor
65
     *
66
     * @param AccountInterface $account Account
67
     */
68
    public function __construct(AccountInterface $account)
69
    {
70
        $this->account = $account;
71
        $this->basedir = rtrim(App::getConfig('general.basedir'), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.
72
            $this->account->getName().DIRECTORY_SEPARATOR;
73
    }
74
75
    /**
76
     * Return the data directory (or a sub directory)
77
     *
78
     * @param string|null $path Optional: Subdirectory
79
     * @param boolean $absolute Return the absolute path
80
     * @return string Data directory
81
     * @throws \RuntimeException If the directory doesn't exist or is invalid
82
     */
83
    public function getDataDirectory($path = null, $absolute = true)
84
    {
85
        $dataDirectory = $dataBaseDirectory = $this->basedir.'data';
86
        if (strlen($path)) {
87
            $dataDirectory .= DIRECTORY_SEPARATOR.trim($path, DIRECTORY_SEPARATOR);
88
        }
89
90
        // Resolve all symbolic links etc.
91
        $absDataDirectory = realpath($dataDirectory);
92
93
        // If the directory doesn't exist or is otherwise invalid
94
        if (!$absDataDirectory
95
            || (!is_dir($absDataDirectory) && (!is_link($absDataDirectory) || !is_dir(readlink($absDataDirectory))))
96
            || strncmp($dataBaseDirectory, $absDataDirectory, strlen($dataBaseDirectory))
97
        ) {
98
            throw new \RuntimeException(sprintf('Path "%s" doesn\'t exist or is not a valid data directory',
99
                $dataDirectory), 1475929558);
100
        }
101
102
        return $absolute ?
103
            $absDataDirectory :
104
            trim(substr($absDataDirectory, strlen($dataBaseDirectory)), DIRECTORY_SEPARATOR);
105
    }
106
}
107