FileFinderBootstrapper::getDbDriver()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 15
c 1
b 0
f 0
dl 0
loc 24
rs 9.4555
cc 5
nc 4
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Admin\Bootstrappers\Filesystem;
6
7
use AbterPhp\Framework\Constant\Env;
8
use AbterPhp\Framework\Filesystem\FileFinder;
9
use AbterPhp\Framework\Filesystem\IFileFinder;
10
use League\Flysystem\Local\LocalFilesystemAdapter;
11
use League\Flysystem\Filesystem;
12
use Opulence\Databases\Adapters\Pdo\MySql\Driver as MySqlDriver;
13
use Opulence\Databases\Adapters\Pdo\PostgreSql\Driver as PostgreSqlDriver;
14
use Opulence\Environments\Environment;
15
use Opulence\Ioc\Bootstrappers\Bootstrapper;
16
use Opulence\Ioc\Bootstrappers\ILazyBootstrapper;
17
use Opulence\Ioc\IContainer;
18
19
class FileFinderBootstrapper extends Bootstrapper implements ILazyBootstrapper
20
{
21
    public const MIGRATION_FILE_FINDER = 'MigrationFileFinder';
22
23
    public const MIGRATIONS_PATH_SEGMENT = 'migrations';
24
25
    protected ?string $dbDriverName = null;
26
27
    /**
28
     * @return string[]
29
     */
30
    public function getBindings(): array
31
    {
32
        return [
33
            IFileFinder::class,
34
            static::MIGRATION_FILE_FINDER,
35
        ];
36
    }
37
38
    /**
39
     * @param IContainer $container
40
     */
41
    public function registerBindings(IContainer $container)
42
    {
43
        $this->registerDefaultFileFinder($container);
44
        $this->registerMigrationFileFinder($container);
45
    }
46
47
    /**
48
     * @param IContainer $container
49
     */
50
    protected function registerDefaultFileFinder(IContainer $container)
51
    {
52
        /** @var IFileFinder $fileFinder */
53
        $fileFinder = new FileFinder();
54
55
        $container->bindInstance(IFileFinder::class, $fileFinder);
56
    }
57
58
    /**
59
     * @param IContainer $container
60
     */
61
    protected function registerMigrationFileFinder(IContainer $container)
62
    {
63
        global $abterModuleManager;
64
65
        $dbDriver   = $this->getDbDriver();
66
        $fileFinder = new FileFinder();
67
        foreach ($abterModuleManager->getResourcePaths() as $resourcePath) {
68
            $path    = $this->getMigrationsPath($resourcePath, $dbDriver);
69
            $adapter = new LocalFilesystemAdapter($path);
70
            $fs      = new Filesystem($adapter);
71
72
            $fileFinder->registerFilesystem($fs);
73
        }
74
75
        $container->bindInstance(static::MIGRATION_FILE_FINDER, $fileFinder);
76
    }
77
78
    /**
79
     * @param string $resourcePath
80
     * @param string $dbDriver
81
     *
82
     * @return string
83
     */
84
    protected function getMigrationsPath(string $resourcePath, string $dbDriver): string
85
    {
86
        return sprintf(
87
            '%s%s%s%s%s',
88
            $resourcePath,
89
            DIRECTORY_SEPARATOR,
90
            static::MIGRATIONS_PATH_SEGMENT,
91
            DIRECTORY_SEPARATOR,
92
            $dbDriver
93
        );
94
    }
95
96
    /**
97
     * @return string
98
     */
99
    protected function getDbDriver(): string
100
    {
101
        if ($this->dbDriverName !== null) {
102
            return $this->dbDriverName;
103
        }
104
105
        $driverClass = Environment::getVar(Env::DB_DRIVER) ?: PostgreSqlDriver::class;
106
107
        switch ($driverClass) {
108
            case MySqlDriver::class:
109
                $dbDriverName = 'mysql';
110
                break;
111
            case PostgreSqlDriver::class:
112
                $dbDriverName = 'pgsql';
113
                break;
114
            default:
115
                throw new \RuntimeException(
116
                    "Invalid database driver type specified in environment var \"DB_DRIVER\": $driverClass"
117
                );
118
        }
119
120
        $this->dbDriverName = $dbDriverName;
121
122
        return $dbDriverName;
123
    }
124
}
125