summaryrefslogtreecommitdiffstats
path: root/application/controllers/AnnouncementsController.php
blob: ee7fd4c744dbe468eac03bfc661600001d526b5b (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
/* Icinga Web 2 | (c) 2016 Icinga Development Team | GPLv2+ */

namespace Icinga\Controllers;

use Icinga\Exception\NotFoundError;
use Icinga\Forms\Announcement\AcknowledgeAnnouncementForm;
use Icinga\Forms\Announcement\AnnouncementForm;
use Icinga\Web\Announcement\AnnouncementIniRepository;
use Icinga\Web\Controller;
use Icinga\Web\Url;

class AnnouncementsController extends Controller
{
    public function init()
    {
        $this->view->title = $this->translate('Announcements');

        parent::init();
    }

    /**
     * List all announcements
     */
    public function indexAction()
    {
        $this->getTabs()->add(
            'announcements',
            array(
                'active'    => true,
                'label'     => $this->translate('Announcements'),
                'title'     => $this->translate('List All Announcements'),
                'url'       => Url::fromPath('announcements')
            )
        );

        $announcements = (new AnnouncementIniRepository())
            ->select([
                'id',
                'author',
                'message',
                'start',
                'end'
            ]);

        $sortAndFilterColumns = [
            'author'    => $this->translate('Author'),
            'message'   => $this->translate('Message'),
            'start'     => $this->translate('Start'),
            'end'       => $this->translate('End')
        ];

        $this->setupSortControl($sortAndFilterColumns, $announcements, ['start' => 'desc']);
        $this->setupFilterControl($announcements, $sortAndFilterColumns, ['message']);

        $this->view->announcements = $announcements->fetchAll();
    }

    /**
     * Create an announcement
     */
    public function newAction()
    {
        $this->assertPermission('application/announcements');

        $form = $this->prepareForm()->add();
        $form->handleRequest();
        $this->renderForm($form, $this->translate('New Announcement'));
    }

    /**
     * Update an announcement
     */
    public function updateAction()
    {
        $this->assertPermission('application/announcements');

        $form = $this->prepareForm()->edit($this->params->getRequired('id'));
        try {
            $form->handleRequest();
        } catch (NotFoundError $_) {
            $this->httpNotFound($this->translate('Announcement not found'));
        }
        $this->renderForm($form, $this->translate('Update Announcement'));
    }

    /**
     * Remove an announcement
     */
    public function removeAction()
    {
        $this->assertPermission('application/announcements');

        $form = $this->prepareForm()->remove($this->params->getRequired('id'));
        try {
            $form->handleRequest();
        } catch (NotFoundError $_) {
            $this->httpNotFound($this->translate('Announcement not found'));
        }
        $this->renderForm($form, $this->translate('Remove Announcement'));
    }

    public function acknowledgeAction()
    {
        $this->assertHttpMethod('POST');
        $this->getResponse()->setHeader('X-Icinga-Container', 'ignore', true);
        $form = new AcknowledgeAnnouncementForm();
        $form->handleRequest();
    }

    /**
     * Assert permission admin and return a prepared RepositoryForm
     *
     * @return AnnouncementForm
     */
    protected function prepareForm()
    {
        $form = new AnnouncementForm();
        return $form
            ->setRepository(new AnnouncementIniRepository())
            ->setRedirectUrl(Url::fromPath('announcements'));
    }
}