Migrator::setDefaultSeed()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Jumilla\Versionia\Laravel;
4
5
use Illuminate\Database\DatabaseManager;
6
use Illuminate\Contracts\Config\Repository as Config;
7
use Illuminate\Database\Schema\Blueprint;
8
use Illuminate\Support\Facades\Schema;
9
10
class Migrator
11
{
12
    const VERSION_NULL = null;
13
14
    /**
15
     * @var \Illuminate\Database\DatabaseManager
16
     */
17
    protected $db;
18
19
    /**
20
     * @var string
21
     */
22
    protected $table = 'migrations';
23
24
    /**
25
     * @var array
26
     */
27
    protected $migrations = [];
28
29
    /**
30
     * @var array
31
     */
32
    protected $seeds = [];
33
34
    /**
35
     * @var string
36
     */
37
    protected $default_seed;
38
39
    /**
40
     * @param \Illuminate\Contracts\Database\DatabaseManager $db
41
     * @param \Illuminate\Contracts\Config\Repository $config
42
     */
43 17
    public function __construct(DatabaseManager $db, Config $config = null)
44
    {
45 17
        $this->db = $db;
46 17
        if ($config) {
47 2
            $this->table = $config->get('database.migrations', $this->table);
48
        }
49 17
    }
50
51
    /**
52
     * @return string
53
     */
54 2
    public function getTable()
55
    {
56 2
        return $this->table;
57
    }
58
59
    /**
60
     * @param string $a
61
     * @param string $b
62
     *
63
     * @return int
64
     */
65 6
    public function compareMigrationVersion($a, $b)
66
    {
67 6
        return version_compare($a, $b);
68
    }
69
70
    /**
71
     * @param string $group
72
     * @param string $version
73
     * @param string $class
74
     */
75 3
    public function registerMigration($group, $version, $class)
76
    {
77 3
        $this->registerMigrations($group, [
78 3
            $version => $class,
79
        ]);
80 3
    }
81
82
    /**
83
     * @param string $group
84
     * @param array  $versions
85
     */
86 7
    public function registerMigrations($group, array $versions)
87
    {
88 7
        foreach ($versions as $version => $class) {
89 6
            $this->migrations[$group][$version] = $class;
90
        }
91 7
    }
92
93
    /**
94
     * @return array
95
     */
96 5
    public function migrationGroups()
97
    {
98 5
        $groups = array_keys($this->migrations);
99
100 5
        sort($groups);
101
102 5
        return $groups;
103
    }
104
105
    /**
106
     * @param string $group
107
     * @param bool   $descending
108
     *
109
     * @return array
110
     */
111 3
    public function migrationVersions($group, $descending = false)
112
    {
113 3
        $versions = array_get($this->migrations, $group, []);
114
115 3
        uksort($versions, [$this, 'compareMigrationVersion']);
116
117 3
        return $descending ? array_reverse($versions, true) : $versions;
118
    }
119
120
    /**
121
     * @param string $group
122
     *
123
     * @return array
124
     */
125 2
    public function migrationVersionsByDesc($group)
126
    {
127 2
        return $this->migrationVersions($group, true);
128
    }
129
130
    /**
131
     * @param string $group
132
     *
133
     * @return string
134
     */
135 1
    public function migrationLatestVersion($group)
136
    {
137 1
        foreach ($this->migrationVersionsByDesc($group) as $version => $class) {
138 1
            return $version;
139
        }
140
141 1
        return self::VERSION_NULL;
142
    }
143
144
    /**
145
     * @param string $group
146
     * @param string $version
147
     *
148
     * @return string
149
     */
150 1
    public function migrationClass($group, $version)
151
    {
152 1
        $versions = array_get($this->migrations, $group, []);
153
154 1
        return array_get($versions, $version, null);
155
    }
156
157
    /**
158
     * @param string $name
159
     * @param string $class
160
     */
161 2
    public function registerSeed($name, $class)
162
    {
163 2
        $this->registerSeeds([
164 2
            $name => $class,
165
        ]);
166 2
    }
167
168
    /**
169
     * @param array $seeds
170
     */
171 2
    public function registerSeeds(array $seeds)
172
    {
173 2
        $this->seeds = array_merge($this->seeds, $seeds);
174 2
    }
175
176
    /**
177
     * @return string
178
     */
179 2
    public function defaultSeed()
180
    {
181 2
        return $this->default_seed;
182
    }
183
184
    /**
185
     * @param string $seed
186
     */
187 2
    public function setDefaultSeed($seed)
188
    {
189 2
        $this->default_seed = $seed;
190 2
    }
191
192
    /**
193
     * @return array
194
     */
195 2
    public function seedNames()
196
    {
197 2
        return array_keys($this->seeds);
198
    }
199
200
    /**
201
     * @param string $name
202
     *
203
     * @return string
204
     */
205 2
    public function seedClass($name)
206
    {
207 2
        return array_get($this->seeds, $name);
208
    }
209
210
    /**
211
     */
212 1
    public function makeLogTable()
213
    {
214 1
        if (!Schema::hasTable($this->table)) {
215 1
            Schema::create($this->table, function (Blueprint $table) {
216 1
                $table->string('group');
217 1
                $table->string('version');
218 1
                $table->string('class');
219
220 1
                $table->unique(['group', 'version']);
221 1
            });
222
        }
223 1
    }
224
225
    /**
226
     * @param bool $descending
227
     *
228
     * @return \Illuminate\Support\Collection
229
     */
230
    public function installedMigrations($descending = false)
231
    {
232 1
        return collect($this->db->table($this->table)->get())->sort(function ($a, $b) use ($descending) {
233 1
            return $this->compareMigrationVersion($a->version, $b->version) * ($descending ? -1 : 1);
234 1
        })->groupBy('group');
235
    }
236
    /**
237
     * @return \Illuminate\Support\Collection
238
     */
239 1
    public function installedMigrationsByDesc()
240
    {
241 1
        return $this->installedMigrations(true);
242
    }
243
244
    /**
245
     * @return \Illuminate\Support\Collection
246
     */
247
    public function installedLatestMigrations()
248
    {
249 1
        return collect($this->db->table($this->table)->get())->reduce(function ($result, $item) {
250 1
            if (isset($result[$item->group])) {
251 1
                if ($this->compareMigrationVersion($item->version, $result[$item->group]->version) > 0) {
252 1
                    $result[$item->group] = $item;
253
                }
254
            } else {
255 1
                $result[$item->group] = $item;
256
            }
257
258 1
            return $result;
259 1
        }, collect());
260
    }
261
262
    /**
263
     * @param string $group
264
     * @param string $version
265
     * @param string $class
266
     */
267 1
    public function addMigrationLog($group, $version, $class)
268
    {
269 1
        $this->db->table($this->table)->insert([
270 1
            'group' => $group,
271 1
            'version' => $version,
272 1
            'class' => $class,
273
        ]);
274 1
    }
275
276
    /**
277
     * @param string $group
278
     * @param string $version
279
     */
280
    public function removeMigrationLog($group, $version)
281
    {
282
        $this->db->table($this->table)->where('group', $group)->where('version', $version)->delete();
283
    }
284
285
    /**
286
     * @param string $group
287
     * @param string $version
288
     * @param string $class
289
     */
290
    public function doUpgrade($group, $version, $class)
291
    {
292
        $migration = new $class();
293
294
        $migration->up();
295
296
        $this->addMigrationLog($group, $version, $class);
297
    }
298
299
    /**
300
     * @param string $group
301
     * @param string $version
302
     * @param string $class
303
     */
304
    public function doDowngrade($group, $version, $class = null)
305
    {
306
        if ($class === null) {
307
            $class = $this->migrationClass($group, $version);
308
        }
309
310
        $migration = new $class();
311
312
        $migration->down();
313
314
        $this->removeMigrationLog($group, $version);
315
    }
316
}
317