aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/web_migrate.php
blob: bf24e32a75ea9551c01e84f97dafe7215913eb69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
class WebMigrateController extends StudipController
{
    public function __construct($dispatcher)
    {
        if (basename($dispatcher->trails_uri, '.php') !== 'web_migrate') {
            throw new Exception('Web Migrator cannot be invoked via standard dispatcher.');
        }

        parent::__construct($dispatcher);
    }

    public function before_filter(&$action, &$args)
    {
        $GLOBALS['perm']->check('root');

        parent::before_filter($action, $args);

        $this->target   = Request::int('target');
        $this->branch   = Request::get('branch', '0');
        $this->version  = new DBSchemaVersion('studip', $this->branch);
        $this->migrator = new Migrator(
            "{$GLOBALS['STUDIP_BASE_PATH']}/db/migrations",
            $this->version,
            true
        );

        $this->setupSidebar($action);

        PageLayout::setTitle(_('Stud.IP Web-Migrator'));
    }

    public function index_action()
    {
        $this->migrations = $this->migrator->relevantMigrations($this->target);
    }

    public function migrate_action()
    {
        $lock = new FileLock('web-migrate');
        $lock_data = ['timestamp' => time(), 'user_id' => $GLOBALS['user']->id];

        if ($lock->tryLock($lock_data)) {
            ob_start();
            set_time_limit(0);

            $this->migrator->migrateTo($this->target);

            $lock->release();

            $announcements = ob_get_clean();
            PageLayout::postSuccess(
                _('Die Datenbank wurde erfolgreich migriert.'),
                array_filter(explode("\n", $announcements))
            );

            $_SESSION['migration-check'] = [
                'timestamp' => time(),
                'count'     => 0,
            ];
        } else {
            $user = User::find($lock_data['user_id']);
            PageLayout::postError(sprintf(
                _('Die Migration wurde %s von %s bereits angestossen und läuft noch.'),
                reltime($lock_data['timestamp']),
                htmlReady($user ? $user->getFullName() : _('unbekannt'))
            ));
        }

        $this->redirect('index');
    }

    public function history_action()
    {
        $this->migrations = $this->migrator->relevantMigrations(0);
        $this->offset = -1;
        $this->target = 0;
        $this->render_action('index');
    }

    public function setupSidebar($action)
    {
        $views = Sidebar::get()->addWidget(new ViewsWidget());
        $views->addLink(
            _('Migrationen ausführen'),
            $this->url_for('index', ['branch' => $this->branch])
        )->setActive($action === 'index');
        $views->addLink(
            _('Migrationen zurücknehmen'),
            $this->url_for('history', ['branch' => $this->branch])
        )->setActive($action === 'history');

        $widget = new SelectWidget(_('Branch'), $this->url_for($action), 'branch');
        Sidebar::get()->addWidget($widget);

        foreach ($this->version->getAllBranches() as $branch) {
            $element = new SelectElement($branch, $branch ?: 'default', $branch == $this->branch);
            $widget->addElement($element);
        }

        $widget = Sidebar::get()->addWidget(new SidebarWidget());
        $widget->setTitle(_('Aktueller Versionsstand'));
        $widget->addElement(new WidgetElement($this->version->get($this->branch)));
    }
}