1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2024-11-22 05:19:22 +00:00

Refactor Notifications structure

This commit is contained in:
Pierre HUBERT 2020-03-28 14:18:37 +01:00
parent bef85d2d91
commit 0882ac76b3
6 changed files with 131 additions and 143 deletions

View File

@ -4,8 +4,8 @@ import { LikesHelper, LikesType } from "../helpers/LikesHelper";
import { check_string_before_insert, removeHTMLNodes } from "../utils/StringUtils"; import { check_string_before_insert, removeHTMLNodes } from "../utils/StringUtils";
import { time } from "../utils/DateUtils"; import { time } from "../utils/DateUtils";
import { CommentsHelper } from "../helpers/CommentsHelper"; import { CommentsHelper } from "../helpers/CommentsHelper";
import { NotificationsUtils } from "../utils/NotificationsUtils";
import { NotifEventType } from "../entities/Notification"; import { NotifEventType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
/** /**
* Comments controller * Comments controller
@ -46,7 +46,7 @@ export class CommentsController {
const commentID = await CommentsHelper.Create(newComment); const commentID = await CommentsHelper.Create(newComment);
// Create notifications // Create notifications
await NotificationsUtils.CreatePostNotification(h.getUserId(), postID, NotifEventType.COMMENT_CREATED); await NotificationsHelper.CreatePostNotification(h.getUserId(), postID, NotifEventType.COMMENT_CREATED);
// TODO : Delete any notifications targetting this user about the post // TODO : Delete any notifications targetting this user about the post

View File

@ -2,8 +2,8 @@ import { Friend } from "../entities/Friend";
import { RequestHandler } from "../entities/RequestHandler"; import { RequestHandler } from "../entities/RequestHandler";
import { FriendsHelper } from "../helpers/FriendsHelper"; import { FriendsHelper } from "../helpers/FriendsHelper";
import { UserHelper } from "../helpers/UserHelper"; import { UserHelper } from "../helpers/UserHelper";
import { NotificationsUtils } from "../utils/NotificationsUtils";
import { NotifEventType } from "../entities/Notification"; import { NotifEventType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
/** /**
* Friends controller * Friends controller
@ -113,7 +113,7 @@ export class FriendsController {
await FriendsHelper.SendRequest(h.getUserId(), friendID); await FriendsHelper.SendRequest(h.getUserId(), friendID);
// Create the notification // Create the notification
await NotificationsUtils.CreateFriendsNotifications( await NotificationsHelper.CreateFriendsNotifications(
h.getUserId(), friendID, NotifEventType.SENT_FRIEND_REQUEST) h.getUserId(), friendID, NotifEventType.SENT_FRIEND_REQUEST)
h.success("Send (create) the friendship request"); h.success("Send (create) the friendship request");
@ -133,7 +133,7 @@ export class FriendsController {
await FriendsHelper.RemoveRequest(h.getUserId(), friendID); await FriendsHelper.RemoveRequest(h.getUserId(), friendID);
// Delete any related notification // Delete any related notification
await NotificationsUtils.DeleteNotificationsFrienshipRequest(h.getUserId(), friendID); await NotificationsHelper.DeleteNotificationsFrienshipRequest(h.getUserId(), friendID);
h.success("Friendship request removed!"); h.success("Friendship request removed!");
} }
@ -153,7 +153,7 @@ export class FriendsController {
await FriendsHelper.RespondRequest(h.getUserId(), friendID, accept); await FriendsHelper.RespondRequest(h.getUserId(), friendID, accept);
// Create notification // Create notification
await NotificationsUtils.CreateFriendsNotifications(h.getUserId(), friendID, await NotificationsHelper.CreateFriendsNotifications(h.getUserId(), friendID,
accept ? NotifEventType.ACCEPTED_FRIEND_REQUEST : NotifEventType.REJECTED_FRIEND_REQUEST); accept ? NotifEventType.ACCEPTED_FRIEND_REQUEST : NotifEventType.REJECTED_FRIEND_REQUEST);
h.success("Response to the friendship request successfully saved!"); h.success("Response to the friendship request successfully saved!");
@ -170,7 +170,7 @@ export class FriendsController {
await FriendsHelper.RemoveFriendship(h.getUserId(), friendID); await FriendsHelper.RemoveFriendship(h.getUserId(), friendID);
// Delete any related notification // Delete any related notification
await NotificationsUtils.DeleteNotificationsFrienshipRequest( await NotificationsHelper.DeleteNotificationsFrienshipRequest(
h.getUserId(), friendID); h.getUserId(), friendID);
h.success("The friend was removed from the list!"); h.success("The friend was removed from the list!");

View File

@ -8,8 +8,8 @@ import { GroupSettings } from "../entities/GroupSettings";
import { removeHTMLNodes, checkURL } from "../utils/StringUtils"; import { removeHTMLNodes, checkURL } from "../utils/StringUtils";
import { findKey } from "../utils/ArrayUtils"; import { findKey } from "../utils/ArrayUtils";
import { checkVirtualDirectoryAvailability, VirtualDirType } from "../utils/VirtualDirsUtils"; import { checkVirtualDirectoryAvailability, VirtualDirType } from "../utils/VirtualDirsUtils";
import { NotificationsUtils } from "../utils/NotificationsUtils";
import { NotifEventType } from "../entities/Notification"; import { NotifEventType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
/** /**
* Groups API controller * Groups API controller
@ -306,7 +306,7 @@ export class GroupsController {
await GroupsHelper.SendInvitation(groupID, userID); await GroupsHelper.SendInvitation(groupID, userID);
// Create a notification // Create a notification
await NotificationsUtils.CreateGroupMembershipNotification( await NotificationsHelper.CreateGroupMembershipNotification(
userID, h.getUserId(), groupID, NotifEventType.SENT_GROUP_MEMBERSHIP_INVITATION) userID, h.getUserId(), groupID, NotifEventType.SENT_GROUP_MEMBERSHIP_INVITATION)
h.success("The user has been successfully invited to join the group!"); h.success("The user has been successfully invited to join the group!");
@ -329,7 +329,7 @@ export class GroupsController {
await GroupsHelper.RespondInvitation(groupID, h.getUserId(), accept); await GroupsHelper.RespondInvitation(groupID, h.getUserId(), accept);
// Create a notification // Create a notification
await NotificationsUtils.CreateGroupMembershipNotification( await NotificationsHelper.CreateGroupMembershipNotification(
h.getUserId(), 0, groupID, h.getUserId(), 0, groupID,
accept ? NotifEventType.ACCEPTED_GROUP_MEMBERSHIP_INVITATION : NotifEventType.REJECTED_GROUP_MEMBERSHIP_INVITATION accept ? NotifEventType.ACCEPTED_GROUP_MEMBERSHIP_INVITATION : NotifEventType.REJECTED_GROUP_MEMBERSHIP_INVITATION
) )

View File

@ -19,8 +19,8 @@ import { statSync } from "fs";
import { lookup } from "mime-types"; import { lookup } from "mime-types";
import { NewSurvey } from "../entities/NewSurvey"; import { NewSurvey } from "../entities/NewSurvey";
import { FriendsHelper } from "../helpers/FriendsHelper"; import { FriendsHelper } from "../helpers/FriendsHelper";
import { NotificationsUtils } from "../utils/NotificationsUtils";
import { NotifEventType } from "../entities/Notification"; import { NotifEventType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
/** /**
* Posts controller * Posts controller
@ -294,7 +294,7 @@ export class PostsController {
// Create a notification // Create a notification
await NotificationsUtils.CreatePostNotification( await NotificationsHelper.CreatePostNotification(
h.getUserId(), postID, NotifEventType.ELEM_CREATED); h.getUserId(), postID, NotifEventType.ELEM_CREATED);
h.send({ h.send({

View File

@ -1,5 +1,5 @@
import { DatabaseHelper } from "./DatabaseHelper"; import { DatabaseHelper } from "./DatabaseHelper";
import { Notif, NotifElemType, NotifEventVisibility } from "../entities/Notification"; import { Notif, NotifElemType, NotifEventVisibility, NotifEventType } from "../entities/Notification";
import { time } from "../utils/DateUtils"; import { time } from "../utils/DateUtils";
import { PostsHelper } from "./PostsHelper"; import { PostsHelper } from "./PostsHelper";
import { PostPageKind, PostVisibilityLevel } from "../entities/Post"; import { PostPageKind, PostVisibilityLevel } from "../entities/Post";
@ -17,6 +17,79 @@ const NOTIFICATIONS_TABLE = "comunic_notifications";
export class NotificationsHelper { export class NotificationsHelper {
/**
* Create a notification about a post
*
* @param fromUser Source user ID
* @param postID Target post ID
* @param action Action to notify
*/
public static async CreatePostNotification(fromUser: number, postID: number, action: NotifEventType) {
await this.Push(new Notif({
timeCreate: time(),
fromUserID: fromUser,
onElemID: postID,
onElemType: NotifElemType.POST,
type: action
}));
}
/**
* Create & push friendship request notification
*
* @param fromUser Source user ID
* @param destUser Destination user ID
* @param action The kind of action
*/
public static async CreateFriendsNotifications(fromUser: number, destUser: number, action: NotifEventType) {
await this.DeleteNotificationsFrienshipRequest(fromUser, destUser);
// Push the notification
await this.Push(new Notif({
fromUserID: fromUser,
destUserID: destUser,
onElemID: fromUser, // Same as fromUser
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
type: action
}));
}
/**
* Create & push a group membership notification
*
* @param userID The ID of the target user for the membership
* @param moderatorID The ID of the moderator creating the notification (0 if it is the user)
* @param groupID The ID of the target group
* @param kind The kind of notification to create
*/
public static async CreateGroupMembershipNotification(userID: number, moderatorID: number, groupID: number, kind: NotifEventType) {
await this.DeleteNotificationsGroupsMembership(userID, groupID);
const n = new Notif({
onElemID: groupID,
onElemType: NotifElemType.GROUP_MEMBERSHIP,
type: kind
});
// The notification must be sent to all the moderators of the group
if(moderatorID < 1) {
n.fromUserID = userID;
n.destUserID = -1;
}
// We specify both the source and the destination of the notification
// not to broadcast the notification to all the group members
else {
n.fromUserID = moderatorID;
n.destUserID = userID;
}
await this.Push(n);
}
/** /**
* Push a new notification * Push a new notification
* *
@ -309,6 +382,51 @@ export class NotificationsHelper {
})); }));
} }
/**
* Delete all the notifications related to a friendship request between two users
*
* @param userOne First user
* @param userTwo Second user
*/
public static async DeleteNotificationsFrienshipRequest(userOne: number, userTwo: number) {
// Delete notifications in two ways
await this.Delete(new Notif({
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
destUserID: userOne,
fromUserID: userTwo,
}));
await this.Delete(new Notif({
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
destUserID: userTwo,
fromUserID: userOne,
}));
}
/**
* Delete all the notifications related to a specific group membership
*
* @param userID Target user
* @param groupID The ID of the target group
*/
public static async DeleteNotificationsGroupsMembership(userID: number, groupID: number) {
const n = new Notif({
onElemType: NotifElemType.GROUP_MEMBERSHIP,
onElemID: groupID
});
n.destUserID = userID;
n.fromUserID = -1;
await this.Delete(n);
n.destUserID = -1;
n.fromUserID = userID;
await this.Delete(n);
}
/** /**
* Count the number of unread notifications of a user * Count the number of unread notifications of a user
* *

View File

@ -1,130 +0,0 @@
/**
* Notifications utilities
*
* @author Pierre Hubert
*/
import { NotifEventType, Notif, NotifElemType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
import { time } from "./DateUtils";
export class NotificationsUtils {
/**
* Create a notification about a post
*
* @param fromUser Source user ID
* @param postID Target post ID
* @param action Action to notify
*/
public static async CreatePostNotification(fromUser: number, postID: number, action: NotifEventType) {
await NotificationsHelper.Push(new Notif({
timeCreate: time(),
fromUserID: fromUser,
onElemID: postID,
onElemType: NotifElemType.POST,
type: action
}));
}
/**
* Create & push friendship request notification
*
* @param fromUser Source user ID
* @param destUser Destination user ID
* @param action The kind of action
*/
public static async CreateFriendsNotifications(fromUser: number, destUser: number, action: NotifEventType) {
await this.DeleteNotificationsFrienshipRequest(fromUser, destUser);
// Push the notification
await NotificationsHelper.Push(new Notif({
fromUserID: fromUser,
destUserID: destUser,
onElemID: fromUser, // Same as fromUser
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
type: action
}));
}
/**
* Delete all the notifications related to a friendship request between two users
*
* @param userOne First user
* @param userTwo Second user
*/
public static async DeleteNotificationsFrienshipRequest(userOne: number, userTwo: number) {
// Delete notifications in two ways
await NotificationsHelper.Delete(new Notif({
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
destUserID: userOne,
fromUserID: userTwo,
}));
await NotificationsHelper.Delete(new Notif({
onElemType: NotifElemType.FRIENDSHIP_REQUEST,
destUserID: userTwo,
fromUserID: userOne,
}));
}
/**
* Create & push a group membership notification
*
* @param userID The ID of the target user for the membership
* @param moderatorID The ID of the moderator creating the notification (0 if it is the user)
* @param groupID The ID of the target group
* @param kind The kind of notification to create
*/
public static async CreateGroupMembershipNotification(userID: number, moderatorID: number, groupID: number, kind: NotifEventType) {
await this.DeleteNotificationsGroupsMembership(userID, groupID);
const n = new Notif({
onElemID: groupID,
onElemType: NotifElemType.GROUP_MEMBERSHIP,
type: kind
});
// The notification must be sent to all the moderators of the group
if(moderatorID < 1) {
n.fromUserID = userID;
n.destUserID = -1;
}
// We specify both the source and the destination of the notification
// not to broadcast the notification to all the group members
else {
n.fromUserID = moderatorID;
n.destUserID = userID;
}
await NotificationsHelper.Push(n);
}
/**
* Delete all the notifications related to a specific group membership
*
* @param userID Target user
* @param groupID The ID of the target group
*/
public static async DeleteNotificationsGroupsMembership(userID: number, groupID: number) {
const n = new Notif({
onElemType: NotifElemType.GROUP_MEMBERSHIP,
onElemID: groupID
});
n.destUserID = userID;
n.fromUserID = -1;
await NotificationsHelper.Delete(n);
n.destUserID = -1;
n.fromUserID = userID;
await NotificationsHelper.Delete(n);
}
}