xref: /plugin/structpublish/helper/notify.php (revision 9ab8cbae39a6ffa37705f745bc76916ea212a92b)
1a42bec4dSAnna Dabrowska<?php
2a42bec4dSAnna Dabrowska
3*9ab8cbaeSanndause dokuwiki\Extension\Plugin;
4a42bec4dSAnna Dabrowskause dokuwiki\Extension\AuthPlugin;
5a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Assignments;
6a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Constants;
7a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
8a42bec4dSAnna Dabrowska
9a42bec4dSAnna Dabrowska/**
10a42bec4dSAnna Dabrowska * Notification helper
11a42bec4dSAnna Dabrowska */
12*9ab8cbaeSanndaclass helper_plugin_structpublish_notify extends Plugin
13a42bec4dSAnna Dabrowska{
14a42bec4dSAnna Dabrowska    /** @var helper_plugin_structpublish_db  */
15a42bec4dSAnna Dabrowska    protected $dbHelper;
16a42bec4dSAnna Dabrowska
17a42bec4dSAnna Dabrowska    public function __construct()
18a42bec4dSAnna Dabrowska    {
19a42bec4dSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
20a42bec4dSAnna Dabrowska    }
21a42bec4dSAnna Dabrowska
22a42bec4dSAnna Dabrowska    /**
23a42bec4dSAnna Dabrowska     * If activated, send emails on configured status changes.
24a42bec4dSAnna Dabrowska     *
25a42bec4dSAnna Dabrowska     * @param string $action
26a42bec4dSAnna Dabrowska     * @param Revision $newRevision
27a42bec4dSAnna Dabrowska     * @return void
28a42bec4dSAnna Dabrowska     * @throws Exception
29a42bec4dSAnna Dabrowska     */
30a42bec4dSAnna Dabrowska    public function sendEmails($action, $newRevision)
31a42bec4dSAnna Dabrowska    {
32a42bec4dSAnna Dabrowska
3331e730e1SAnna Dabrowska        if (!$this->triggerNotification($action)) {
3431e730e1SAnna Dabrowska            return;
3531e730e1SAnna Dabrowska        }
36a42bec4dSAnna Dabrowska
37a42bec4dSAnna Dabrowska        // get assignees from DB
38a42bec4dSAnna Dabrowska        $assignments = Assignments::getInstance();
39a42bec4dSAnna Dabrowska        $assignees = $assignments->getPageAssignments($newRevision->getId(), false);
40a42bec4dSAnna Dabrowska
41a42bec4dSAnna Dabrowska        // get recipients for the next workflow step
42a42bec4dSAnna Dabrowska        $nextAction = Constants::workflowSteps($action)['nextAction'];
4331e730e1SAnna Dabrowska        if (is_null($nextAction)) {
4431e730e1SAnna Dabrowska            return;
4531e730e1SAnna Dabrowska        }
46a42bec4dSAnna Dabrowska
47a42bec4dSAnna Dabrowska        if (empty($assignees[$nextAction])) {
48a42bec4dSAnna Dabrowska            msg($this->getLang('email_error_norecipients'), -1);
49a42bec4dSAnna Dabrowska            return;
50a42bec4dSAnna Dabrowska        }
51a42bec4dSAnna Dabrowska
52a42bec4dSAnna Dabrowska        // flatten the array and split into single user or group items
53a42bec4dSAnna Dabrowska        $assignees = implode(',', array_values($assignees[$nextAction]));
54a42bec4dSAnna Dabrowska        $assignees = explode(',', $assignees);
55a42bec4dSAnna Dabrowska
56a42bec4dSAnna Dabrowska        // get recipient emails
57a42bec4dSAnna Dabrowska        $recipients = $this->resolveRecipients($assignees);
58a42bec4dSAnna Dabrowska
59a42bec4dSAnna Dabrowska        // prepare mail text
60a42bec4dSAnna Dabrowska        $mailText = $this->prepareMailText($newRevision->getStatus());
61a42bec4dSAnna Dabrowska
62a42bec4dSAnna Dabrowska        $this->sendMail(implode(',', $recipients), $mailText);
63a42bec4dSAnna Dabrowska    }
64a42bec4dSAnna Dabrowska
65a42bec4dSAnna Dabrowska    /**
66a42bec4dSAnna Dabrowska     * @param string $recipients Comma separated list of emails
67a42bec4dSAnna Dabrowska     * @param string $mailText
68a42bec4dSAnna Dabrowska     * @return void
69a42bec4dSAnna Dabrowska     */
70a42bec4dSAnna Dabrowska    public function sendMail($recipients, $mailText)
71a42bec4dSAnna Dabrowska    {
72a42bec4dSAnna Dabrowska        $mailer = new Mailer();
73a42bec4dSAnna Dabrowska        $mailer->bcc($recipients);
74a42bec4dSAnna Dabrowska
75a42bec4dSAnna Dabrowska        $subject = $this->getLang('email_subject');
76a42bec4dSAnna Dabrowska        $mailer->subject($subject);
77a42bec4dSAnna Dabrowska
78a42bec4dSAnna Dabrowska        $mailer->setBody($mailText);
79a42bec4dSAnna Dabrowska        $mailer->send();
80a42bec4dSAnna Dabrowska    }
81a42bec4dSAnna Dabrowska
82a42bec4dSAnna Dabrowska    /**
83a42bec4dSAnna Dabrowska     * Processes an array of (comma separated) recipients
84a42bec4dSAnna Dabrowska     * and returns an array of emails
85a42bec4dSAnna Dabrowska     * with user groups resolved to individual users
86a42bec4dSAnna Dabrowska     *
87a42bec4dSAnna Dabrowska     * @param array $recipients
88a42bec4dSAnna Dabrowska     * @return array
89a42bec4dSAnna Dabrowska     * @throws Exception
90a42bec4dSAnna Dabrowska     */
91a42bec4dSAnna Dabrowska    public function resolveRecipients($recipients)
92a42bec4dSAnna Dabrowska    {
93a42bec4dSAnna Dabrowska        $resolved = [];
94a42bec4dSAnna Dabrowska
95a42bec4dSAnna Dabrowska        $recipients = array_unique($recipients);
96a42bec4dSAnna Dabrowska
97a42bec4dSAnna Dabrowska        foreach ($recipients as $recipient) {
98a42bec4dSAnna Dabrowska            $recipient = trim($recipient);
99a42bec4dSAnna Dabrowska
100a42bec4dSAnna Dabrowska            if ($recipient[0] === '@') {
101a42bec4dSAnna Dabrowska                $this->resolveGroup($resolved, $recipient);
102a42bec4dSAnna Dabrowska            } elseif (strpos($recipient, '@') === false) {
103a42bec4dSAnna Dabrowska                $this->resolveUser($resolved, $recipient);
104a42bec4dSAnna Dabrowska            } else {
105a42bec4dSAnna Dabrowska                $resolved[] = $recipient;
106a42bec4dSAnna Dabrowska            }
107a42bec4dSAnna Dabrowska        }
108a42bec4dSAnna Dabrowska        return $resolved;
109a42bec4dSAnna Dabrowska    }
110a42bec4dSAnna Dabrowska
111a42bec4dSAnna Dabrowska    /**
112a42bec4dSAnna Dabrowska     * @param array $resolved
113a42bec4dSAnna Dabrowska     * @param string $recipient
114a42bec4dSAnna Dabrowska     * @return void
115a42bec4dSAnna Dabrowska     * @throws Exception
116a42bec4dSAnna Dabrowska     */
117a42bec4dSAnna Dabrowska    protected function resolveGroup(&$resolved, $recipient)
118a42bec4dSAnna Dabrowska    {
119a42bec4dSAnna Dabrowska        /** @var AuthPlugin $auth */
120a42bec4dSAnna Dabrowska        global $auth;
121a42bec4dSAnna Dabrowska        if (!$auth->canDo('getUsers')) {
122a42bec4dSAnna Dabrowska            throw new \Exception('Auth cannot fetch users by group.');
123a42bec4dSAnna Dabrowska        }
124a42bec4dSAnna Dabrowska
1254f0ebffaSAnna Dabrowska        // set arbitrary limit because not all backends interpret limit 0 as "no limit"
1264f0ebffaSAnna Dabrowska        $users = $auth->retrieveUsers(0, 5000, ['grps' => substr($recipient, 1)]);
127a42bec4dSAnna Dabrowska        foreach ($users as $user) {
128a42bec4dSAnna Dabrowska            $resolved[] = $user['mail'];
129a42bec4dSAnna Dabrowska        }
130a42bec4dSAnna Dabrowska    }
131a42bec4dSAnna Dabrowska
132a42bec4dSAnna Dabrowska    /**
133a42bec4dSAnna Dabrowska     * @param array $resolved
134a42bec4dSAnna Dabrowska     * @param string $recipient
135a42bec4dSAnna Dabrowska     * @return void
136a42bec4dSAnna Dabrowska     */
137a42bec4dSAnna Dabrowska    protected function resolveUser(&$resolved, $recipient)
138a42bec4dSAnna Dabrowska    {
139a42bec4dSAnna Dabrowska        /** @var AuthPlugin $auth */
140a42bec4dSAnna Dabrowska        global $auth;
141a42bec4dSAnna Dabrowska        $user = $auth->getUserData($recipient);
14231e730e1SAnna Dabrowska        if ($user) {
14331e730e1SAnna Dabrowska            $resolved[] = $user['mail'];
14431e730e1SAnna Dabrowska        }
145a42bec4dSAnna Dabrowska    }
146a42bec4dSAnna Dabrowska
147a42bec4dSAnna Dabrowska    /**
148a42bec4dSAnna Dabrowska     * Check configuration to see if a notification should be triggered.
149a42bec4dSAnna Dabrowska     *
150a42bec4dSAnna Dabrowska     * @return bool
151a42bec4dSAnna Dabrowska     */
152a42bec4dSAnna Dabrowska    private function triggerNotification($action)
153a42bec4dSAnna Dabrowska    {
15431e730e1SAnna Dabrowska        if (!$this->getConf('email_enable')) {
15531e730e1SAnna Dabrowska            return false;
15631e730e1SAnna Dabrowska        }
157a42bec4dSAnna Dabrowska
158a42bec4dSAnna Dabrowska        $actions = array_map('trim', explode(',', $this->getConf('email_status')));
159a42bec4dSAnna Dabrowska        return in_array($action, $actions);
160a42bec4dSAnna Dabrowska    }
161a42bec4dSAnna Dabrowska
162a42bec4dSAnna Dabrowska    /**
163a42bec4dSAnna Dabrowska     * @return string
164a42bec4dSAnna Dabrowska     */
165a42bec4dSAnna Dabrowska    protected function prepareMailText($status)
166a42bec4dSAnna Dabrowska    {
167a42bec4dSAnna Dabrowska        global $ID;
168a42bec4dSAnna Dabrowska
169a42bec4dSAnna Dabrowska        $mailtext = file_get_contents($this->localFN('mail'));
170a42bec4dSAnna Dabrowska
171a42bec4dSAnna Dabrowska        $vars = [
172a42bec4dSAnna Dabrowska            'PAGE' => $ID,
173a42bec4dSAnna Dabrowska            'URL' => wl($ID, '', true),
174a42bec4dSAnna Dabrowska            'STATUS_CURRENT' => $status,
175a42bec4dSAnna Dabrowska        ];
176a42bec4dSAnna Dabrowska
177a42bec4dSAnna Dabrowska        foreach ($vars as $var => $val) {
178a42bec4dSAnna Dabrowska            $mailtext = str_replace('@' . $var . '@', $val, $mailtext);
179a42bec4dSAnna Dabrowska        }
180a42bec4dSAnna Dabrowska
181a42bec4dSAnna Dabrowska        return $mailtext;
182a42bec4dSAnna Dabrowska    }
183a42bec4dSAnna Dabrowska}
184