Completed
Push — master ( 6dfed4...d83bff )
by Tom
02:38
created

Database   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 0
dl 0
loc 119
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A name() 0 4 1
A host() 0 4 1
A username() 0 4 1
A password() 0 4 1
A exists() 0 6 1
A create() 0 4 1
A drop() 0 4 1
A connect() 0 5 1
A purgeConnection() 0 5 1
A setDbConfig() 0 7 1
1
<?php
2
3
namespace TomSchlick\Townhouse\Tenant;
4
5
use Illuminate\Support\Facades\DB;
6
use TomSchlick\Townhouse\Tenant;
7
8
class Database
9
{
10
    /**
11
     * @var \TomSchlick\Townhouse\Tenant
12
     */
13
    protected $tenant;
14
15
    /**
16
     * @var array
17
     */
18
    protected $config;
19
20
    /**
21
     * Database constructor.
22
     *
23
     * @param \TomSchlick\Townhouse\Tenant $tenant
24
     * @param array                        $config
25
     */
26
    public function __construct(Tenant $tenant, array $config)
27
    {
28
        $this->tenant = $tenant;
29
        $this->config = $config;
30
    }
31
32
    /**
33
     * Figure out the database name for the tenant.
34
     *
35
     * @return string
36
     */
37
    public function name() : string
38
    {
39
        return "tenant_{$this->tenant->id}";
40
    }
41
42
    /**
43
     * @return string
44
     */
45
    public function host() : string
46
    {
47
        return $this->tenant->host;
48
    }
49
50
    /**
51
     * @return string
52
     */
53
    public function username() : string
54
    {
55
        return $this->tenant->username;
56
    }
57
58
    /**
59
     * @return string
60
     */
61
    public function password() : string
62
    {
63
        return decryptString($this->tenant->password);
64
    }
65
66
    /**
67
     * Check if database currently exists in MySQL
68
     *
69
     * @return bool
70
     */
71
    public function exists() : bool
72
    {
73
        $result = DB::select("SHOW DATABASES LIKE '{$this->name()}'");
74
75
        return ! empty($result);
76
    }
77
78
    /**
79
     * Create the tenant database.
80
     *
81
     * @return mixed
82
     */
83
    public function create()
84
    {
85
        return DB::statement("CREATE DATABASE {$this->name()};");
86
    }
87
88
    /**
89
     * Drop the tenant database.
90
     *
91
     * @return mixed
92
     */
93
    public function drop()
94
    {
95
        return DB::statement("DROP DATABASE {$this->name()};");
96
    }
97
98
    /**
99
     * Connect this db as the "tenant" db.
100
     */
101
    public function connect()
102
    {
103
        $this->purgeConnection();
104
        $this->setDbConfig();
105
    }
106
107
    /**
108
     * Purge the tenant db connection.
109
     */
110
    public function purgeConnection()
111
    {
112
        DB::disconnect('tenant');
113
        DB::purge('tenant');
114
    }
115
116
    /**
117
     * Set this DB's connection info to the config.
118
     */
119
    protected function setDbConfig()
120
    {
121
        config()->set('database.connections.tenant.database', $this->name());
122
        config()->set('database.connections.tenant.host', $this->name());
123
        config()->set('database.connections.tenant.username', $this->name());
124
        config()->set('database.connections.tenant.password', $this->name());
125
    }
126
}
127