xref: /webtrees/app/Schema/Migration42.php (revision 56a34df1984fbc88561415294f7408501262a1ab)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16declare(strict_types=1);
17
18namespace Fisharebest\Webtrees\Schema;
19
20use Fisharebest\Webtrees\Module\ModuleBlockInterface;
21use Fisharebest\Webtrees\Module\ModuleChartInterface;
22use Fisharebest\Webtrees\Module\ModuleListInterface;
23use Fisharebest\Webtrees\Module\ModuleMenuInterface;
24use Fisharebest\Webtrees\Module\ModuleReportInterface;
25use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
26use Fisharebest\Webtrees\Module\ModuleTabInterface;
27use Fisharebest\Webtrees\Module\ModuleThemeInterface;
28use Illuminate\Database\Capsule\Manager as DB;
29use Illuminate\Database\Schema\Blueprint;
30
31/**
32 * Upgrade the database schema from version 42 to version 43.
33 */
34class Migration42 implements MigrationInterface
35{
36    private const COMPONENT_TO_INTERFACE = [
37        'block'   => ModuleBlockInterface::class,
38        'chart'   => ModuleChartInterface::class,
39        'list'    => ModuleListInterface::class,
40        'menu'    => ModuleMenuInterface::class,
41        'report'  => ModuleReportInterface::class,
42        'sidebar' => ModuleSidebarInterface::class,
43        'tab'     => ModuleTabInterface::class,
44        'theme'   => ModuleThemeInterface::class,
45    ];
46
47    /**
48     * Upgrade to to the next version
49     *
50     * @return void
51     */
52    public function upgrade(): void
53    {
54        // doctrine/dbal cannot modify tables containing ENUM fields
55        $data = DB::table('module_privacy')->get();
56
57        DB::schema()->drop('module_privacy');
58
59        DB::schema()->create('module_privacy', static function (Blueprint $table): void {
60            $table->increments('id');
61            $table->string('module_name', 32);
62            $table->integer('gedcom_id');
63            $table->string('interface');
64            $table->tinyInteger('access_level');
65
66            // Default constraint names are too long for MySQL.
67            $key1 = DB::connection()->getTablePrefix() . $table->getTable() . '_ix1';
68            $key2 = DB::connection()->getTablePrefix() . $table->getTable() . '_ix2';
69
70            $table->unique(['gedcom_id', 'module_name', 'interface'], $key1);
71            $table->unique(['module_name', 'gedcom_id', 'interface'], $key2);
72
73            $table->foreign('module_name')->references('module_name')->on('module')->onDelete('cascade');
74            $table->foreign('gedcom_id')->references('gedcom_id')->on('gedcom')->onDelete('cascade');
75        });
76
77        foreach ($data as $datum) {
78            DB::table('module_privacy')->insert([
79                'module_name'  => $datum->module_name,
80                'gedcom_id'    => $datum->gedcom_id,
81                'interface'    => self::COMPONENT_TO_INTERFACE[$datum->component],
82                'access_level' => $datum->access_level,
83            ]);
84        }
85    }
86}
87