diff --git a/lib/classes/ModulesNotification.class.php b/lib/classes/ModulesNotification.class.php index 888052ab865defae94e971b2683c90fb4042def0..7a8b0ef269a0b79faf23600603a9d37a42fbc8d2 100644 --- a/lib/classes/ModulesNotification.class.php +++ b/lib/classes/ModulesNotification.class.php @@ -79,19 +79,24 @@ class ModulesNotification - function getAllNotifications ($user_id = NULL) + public function getAllNotifications ($user_id = null) { - - if (is_null($user_id)) { + if ($user_id === null) { $user_id = $GLOBALS['user']->id; } $my_sem = []; - $query = "SELECT s.Seminar_id, s.Name, s.chdate, s.start_time, IFNULL(visitdate, :threshold) AS visitdate " - . "FROM seminar_user_notifications su " - . "LEFT JOIN seminare s USING (Seminar_id) " - . "LEFT JOIN object_user_visits ouv ON (ouv.object_id = su.Seminar_id AND ouv.user_id = :user_id AND ouv.plugin_id = 0) " - . "WHERE su.user_id = :user_id"; + $query = "SELECT s.Seminar_id, s.Name, s.chdate, s.start_time, IFNULL(visitdate, :threshold) AS visitdate + FROM seminar_user_notifications su + JOIN seminar_user USING (user_id, seminar_id) + JOIN seminare s USING (Seminar_id) + LEFT JOIN object_user_visits ouv + ON ( + ouv.object_id = su.Seminar_id + AND ouv.user_id = :user_id + AND ouv.plugin_id = 0 + ) + WHERE su.user_id = :user_id"; $statement = DBManager::get()->prepare($query); $statement->bindValue(':user_id', $user_id); @@ -101,21 +106,23 @@ class ModulesNotification $seminar_id = $row['Seminar_id']; $tools = ToolActivation::findbyRange_id($seminar_id); $notification = CourseMemberNotification::find([$user_id, $seminar_id]); + + if (!$notification || count($notification->notification_data) === 0) { + continue; + } + $my_sem[$seminar_id] = [ - 'name' => $row['Name'], - 'chdate' => $row['chdate'], - 'start_time' => $row['start_time'], - 'tools' => new SimpleCollection($tools), - 'visitdate' => $row['visitdate'], - 'notification'=> $notification ? $notification->notification_data->getArrayCopy() : [] + 'name' => $row['Name'], + 'chdate' => $row['chdate'], + 'start_time' => $row['start_time'], + 'tools' => new SimpleCollection($tools), + 'visitdate' => $row['visitdate'], + 'notification' => $notification->notification_data->getArrayCopy(), ]; } $visit_data = get_objects_visits(array_keys($my_sem), 'sem', null, $user_id, array_keys($this->registered_notification_modules)); $news = []; foreach ($my_sem as $seminar_id => $s_data) { - if (!count($s_data['notification'])) { - continue; - } $navigation = MyRealmModel::getAdditionalNavigations($seminar_id, $s_data, null, $user_id, $visit_data[$seminar_id]); $n_data = []; foreach ($this->registered_notification_modules as $id => $m_data) { @@ -124,11 +131,11 @@ class ModulesNotification && $navigation[$id]->getImage() && $navigation[$id]->getImage()->getRole() === Icon::ROLE_ATTENTION ) { - $data = $this->getPluginText($navigation[$id], $seminar_id, $id); - if ($data) { - $n_data[] = $data; - } + $data = $this->getPluginText($navigation[$id], $seminar_id, $id); + if ($data) { + $n_data[] = $data; } + } } if (count($n_data)) { $news[$s_data['name']] = $n_data; @@ -149,6 +156,8 @@ class ModulesNotification $template_text->set_attribute('sso', $auth_plugin); return ['text' => $template_text->render(), 'html' => $template->render()]; } + + return null; } function getPluginText($nav, $seminar_id, $id) diff --git a/lib/cronjobs/send_mail_notifications.class.php b/lib/cronjobs/send_mail_notifications.class.php index b21d0febc47992e4f8070eea912a2775b7dbb11f..9529d0bc8d988495173f1aaa790eef42c0c1a31d 100644 --- a/lib/cronjobs/send_mail_notifications.class.php +++ b/lib/cronjobs/send_mail_notifications.class.php @@ -94,40 +94,46 @@ class SendMailNotificationsJob extends CronJob */ public function execute($last_result, $parameters = []) { - global $user; + $notification = new ModulesNotification(); - $cli_user = $user; + $query = "SELECT DISTINCT user_id + FROM seminar_user_notifications + JOIN seminar_user USING (user_id, seminar_id)"; + DBManager::get()->fetchFirst( + $query, + [], + function ($user_id) use ($parameters, $notification) { + $user = User::find($user_id); + if ( + !$user + || $user->locked + || ($user->config->EXPIRATION_DATE > 0 && $user->config->EXPIRATION_DATE < time()) + ) { + return; + } - $notification = new ModulesNotification(); + $ok = false; + $mailmessage = $notification->getAllNotifications($user->id); - $query = "SELECT DISTINCT user_id FROM seminar_user_notifications"; + if ($mailmessage) { + setTempLanguage('', $user->preferred_language); - $rs = DBManager::get()->query($query); - while($r = $rs->fetch()){ - $user = new Seminar_User($r["user_id"]); - if ($user->locked || ($user->cfg->EXPIRATION_DATE > 0 && $user->cfg->EXPIRATION_DATE < time())) { - continue; - } - setTempLanguage('', $user->preferred_language); - $to = $user->email; - $title = "[" . Config::get()->UNI_NAME_CLEAN . "] " . _("Tägliche Benachrichtigung"); - $mailmessage = $notification->getAllNotifications($user->id); - $ok = false; - if ($mailmessage) { - if ($user->cfg->getValue('MAIL_AS_HTML')) { - $smail = new StudipMail(); - $ok = $smail->setSubject($title) - ->addRecipient($to) - ->setBodyHtml($mailmessage['html']) - ->setBodyText($mailmessage['text']) - ->send(); - } else { - $ok = StudipMail::sendMessage($to, $title, $mailmessage['text']); + $ok = StudipMail::sendMessage( + $user->email, + "[" . Config::get()->UNI_NAME_CLEAN . "] " . _('Tägliche Benachrichtigung'), + $mailmessage['text'], + $user->config->MAIL_AS_HTML ? $mailmessage['html'] : null + ); + } + + // Unset user configuration cache to preserve memory + UserConfig::set($user->id, null); + + // Log results + if ($ok !== false && $parameters['verbose']) { + echo $user->username . ':' . $ok . "\n"; } } - UserConfig::set($user->id, null); - if ($ok !== false && $parameters['verbose']) echo $user->username . ':' . $ok . "\n"; - } - $user = $cli_user; + ); } } diff --git a/lib/models/CourseMemberNotification.php b/lib/models/CourseMemberNotification.php index 8436f7d38d66f626fc174cb5af8e078f50300e05..3a1f072f13f83d7962b69b42a6d6b6b76418bc51 100644 --- a/lib/models/CourseMemberNotification.php +++ b/lib/models/CourseMemberNotification.php @@ -20,6 +20,8 @@ * @property string chdate database column * @property User user belongs_to User * @property Course course belongs_to Course + * + * @property JSONArrayObject notification_data */ class CourseMemberNotification extends SimpleORMap implements PrivacyObject { diff --git a/lib/models/User.class.php b/lib/models/User.class.php index 9c6430f7c7b02282db5f457b2ca22e1ed16a8706..14d3c9cd9c0987deff60ef032608429db07bfad1 100644 --- a/lib/models/User.class.php +++ b/lib/models/User.class.php @@ -68,6 +68,8 @@ * @property UserInfo info has_one UserInfo * @property UserOnline online has_one UserOnline * @property Kategorie[]|SimpleORMapCollection $profile_categories has_many Kategorie + * + * @property UserConfig config */ class User extends AuthUserMd5 implements Range, PrivacyObject {