212 lines
9.9 KiB
PHP
212 lines
9.9 KiB
PHP
|
<?php
|
||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||
|
|
||
|
require_once 'notifications/NotificationGroup.php';
|
||
|
require_once 'notifications/NewFollowerNotification.php';
|
||
|
require_once 'notifications/PostLikeNotification.php';
|
||
|
require_once 'notifications/UserRegisteredNotification.php';
|
||
|
require_once 'notifications/PostMentionNotification.php';
|
||
|
require_once 'notifications/PostReplyNotification.php';
|
||
|
require_once 'notifications/PostReportNotification.php';
|
||
|
require_once 'notifications/NotificationUser.php';
|
||
|
require_once 'notifications/NewFeedbackNotification.php';
|
||
|
|
||
|
class NotificationModel extends CI_Model
|
||
|
{
|
||
|
public function __construct()
|
||
|
{
|
||
|
parent::__construct();
|
||
|
$lang = isset($_SESSION['site_lang']) ? $_SESSION['site_lang'] : 'de';
|
||
|
$_SESSION['site_lang'] = $lang;
|
||
|
$this->lang->load('notification', 'de');
|
||
|
$this->lang->load('notification', $_SESSION['site_lang']);
|
||
|
}
|
||
|
|
||
|
public function getUserNotificationsRaw($userID, $limit = 20, $offset = 0)
|
||
|
{
|
||
|
$this->db->cache_off();
|
||
|
$rawData = $this->db->query('SELECT n.*, count(*) count, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? GROUP BY type, referenceID ORDER BY createdAt DESC, unread DESC LIMIT ? OFFSET ?', [$userID, $limit, $offset])->result_array();
|
||
|
|
||
|
$notifications = [];
|
||
|
foreach ($rawData as $notification) {
|
||
|
$notificationGroup = ['count' => $notification['count']];
|
||
|
|
||
|
if ($notificationGroup['count'] == 1) {
|
||
|
$notificationGroup['items'] = [$notification];
|
||
|
} else {
|
||
|
$notificationGroup['items'] = $this->db->query('SELECT n.*, s.username senderName, s.displayname senderDisplayname, s.profile_picture senderPicture, r.username recipientName, r.displayName recipientDisplayname FROM notifications n LEFT JOIN users s ON n.senderID = s.ID LEFT JOIN users r ON n.recipientID = r.ID WHERE recipientID = ? AND type = ? AND referenceID = ? LIMIT 5', [$userID, $notification['type'], $notification['referenceID']])->result_array();
|
||
|
}
|
||
|
|
||
|
$notifications[] = $notificationGroup;
|
||
|
}
|
||
|
|
||
|
$this->db->cache_on();
|
||
|
|
||
|
return $notifications;
|
||
|
}
|
||
|
|
||
|
public function getUserNotifications($userID, $limit = 20, $offset = 0)
|
||
|
{
|
||
|
$result = [];
|
||
|
foreach ($notifications = $this->get($userID, $limit, $offset) as $group) {
|
||
|
$date = strtotime($group->createdAt);
|
||
|
$messageData = $group->message();
|
||
|
$result[] = [
|
||
|
'sender' => $group->sender->getName(),
|
||
|
'unread' => $group->unread,
|
||
|
'message' => sprintf(lang($messageData['line']), ...$messageData['attributes']),
|
||
|
'link' => base_url($group->getNotificationLink()),
|
||
|
'image' => base_url($group->getNotificationImage()),
|
||
|
'time' => \Coduo\PHPHumanizer\DateTimeHumanizer::difference(new \DateTime(), new \DateTime("@$date"), $_SESSION['site_lang'])
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
// Mark as read
|
||
|
}
|
||
|
|
||
|
private function add(Notification $notification) {
|
||
|
$results = $this->db->query('SELECT * FROM notifications WHERE referenceID = ? AND recipientID = ? AND senderID = ? AND type = ? AND parameters = ?', [$notification->referenceID, $notification->recipient->getID(), $notification->sender->getID(), $notification->type, $notification->parameters])->result_array();
|
||
|
if(empty($results)) {
|
||
|
$this->db->insert('notifications', [
|
||
|
'recipientID' => $notification->recipient->getID(),
|
||
|
'senderID' => $notification->sender->getID(),
|
||
|
'unread' => 1,
|
||
|
'type' => $notification->type,
|
||
|
'parameters' => $notification->parameters,
|
||
|
'referenceID' => $notification->referenceID,
|
||
|
'createdAt' => date('Y-m-d H:i:s', time())
|
||
|
]);
|
||
|
}
|
||
|
$this->db->cache_delete('Main', 'getNotifications');
|
||
|
}
|
||
|
|
||
|
public function markAsRead(array $notifications) {
|
||
|
|
||
|
}
|
||
|
|
||
|
public function markUserNotificationsAsRead($userID) {
|
||
|
$this->db->query('UPDATE notifications SET unread = FALSE WHERE recipientID = ?', [$userID]);
|
||
|
}
|
||
|
|
||
|
public function get($userID, $limit = 20, $offset = 0) {
|
||
|
$groups = [];
|
||
|
|
||
|
$results = $this->getUserNotificationsRaw($userID, $limit, $offset);
|
||
|
foreach ($results as $group) {
|
||
|
$items = [];
|
||
|
foreach ($group['items'] as $item) {
|
||
|
switch ($item['type']) {
|
||
|
case 'users.newFollower':
|
||
|
$items[] = new \Notification\Users\NewFollowerNotification($item);
|
||
|
break;
|
||
|
case 'users.likedPost':
|
||
|
$items[] = new \Notification\Users\PostLikeNotification($item);
|
||
|
break;
|
||
|
case 'users.mentionedPost':
|
||
|
$items[] = new \Notification\Users\PostMentionNotification($item);
|
||
|
break;
|
||
|
case 'users.repliedPost':
|
||
|
$items[] = new \Notification\Users\PostReplyNotification($item);
|
||
|
break;
|
||
|
case 'admin.newUserRegistered':
|
||
|
$items[] = new \Notification\Admin\UserRegisteredNotification($item);
|
||
|
break;
|
||
|
case 'admin.feedback':
|
||
|
$items[] = new \Notification\Admin\NewFeedbackNotification($item);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
$groups[] = new NotificationGroup($items, $group['count']);
|
||
|
}
|
||
|
|
||
|
return $groups;
|
||
|
}
|
||
|
|
||
|
public function removeNotification($senderID, $recipientID, $referenceID, $type)
|
||
|
{
|
||
|
$this->db->query('DELETE FROM notifications WHERE senderID = ? AND recipientID = ? AND referenceID = ? AND type = ?', [$senderID, $recipientID, $referenceID, $type]);
|
||
|
$this->db->cache_delete('Main', 'getNotifications');
|
||
|
}
|
||
|
|
||
|
public function userNotificationNewFollower($senderID, $recipientID) {
|
||
|
$notification = new \Notification\Users\NewFollowerNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $recipientID,
|
||
|
'referenceID' => $recipientID
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
|
||
|
public function userNotificationPostLike($senderID, $recipientID, $postID, $postUuid) {
|
||
|
$notification = new \Notification\Users\PostLikeNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $recipientID,
|
||
|
'referenceID' => $postID,
|
||
|
'parameters' => $postUuid
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
|
||
|
public function userNotificationPostMentioned($senderID, $recipientID, $postID, $postUuid) {
|
||
|
$notification = new \Notification\Users\PostMentionNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $recipientID,
|
||
|
'referenceID' => $postID,
|
||
|
'parameters' => $postUuid
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
|
||
|
public function userNotificationPostReply($senderID, $recipientID, $postID, $postUuid) {
|
||
|
$notification = new \Notification\Users\PostReplyNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $recipientID,
|
||
|
'referenceID' => $postID,
|
||
|
'parameters' => $postUuid
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
|
||
|
public function rankNotificationNewUserRegistered($senderID, $rankRecipientID) {
|
||
|
$rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array();
|
||
|
foreach ($rankUsers as $user) {
|
||
|
$notification = new \Notification\Admin\UserRegisteredNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $user['ID'],
|
||
|
'referenceID' => $senderID,
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function rankNotificationNewFeedback($senderID, $rankRecipientID, $pageName) {
|
||
|
$rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array();
|
||
|
foreach ($rankUsers as $user) {
|
||
|
$notification = new \Notification\Admin\NewFeedbackNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $user['ID'],
|
||
|
'referenceID' => base_convert(md5($pageName), 16, 10) % 9999
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function rankNotificationPostReport($senderID, $rankRecipientID, $postID, $postUUID) {
|
||
|
$rankUsers = $this->db->query('SELECT ID FROM users WHERE rank >= ?', [$rankRecipientID])->result_array();
|
||
|
foreach ($rankUsers as $user) {
|
||
|
$notification = new \Notification\Users\PostReportNotification([
|
||
|
'senderID' => $senderID,
|
||
|
'recipientID' => $user['ID'],
|
||
|
'referenceID' => $postID,
|
||
|
'parameters' => $postUUID
|
||
|
]);
|
||
|
$this->add($notification);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|