1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2024-11-27 07:49:22 +00:00
comunicapiv2/src/controllers/UserWebSocketActions.ts

205 lines
6.4 KiB
TypeScript
Raw Normal View History

2020-04-01 08:44:49 +00:00
/**
* User websocket actions
*
* @author Pierre HUBERT
*/
import { UserWebSocketRequestsHandler } from "../entities/WebSocketRequestHandler";
import { UserWebSocketController } from "./UserWebSocketController";
import { WsMessage } from "../entities/WsMessage";
import { NotificationsHelper } from "../helpers/NotificationsHelper";
import { ConversationsHelper } from "../helpers/ConversationsHelper";
import { EventsHelper } from "../helpers/EventsHelper";
import { ConversationMessage } from "../entities/ConversationMessage";
import { ConversationsController } from "./ConversationsController";
2020-04-01 15:26:56 +00:00
import { PostAccessLevel } from "../entities/Post";
import { Comment } from "../entities/Comment";
import { CommentsController } from "./CommentsController";
import { AbritraryUserConnection } from "../entities/UserConnectionContainer";
2020-04-02 08:54:03 +00:00
import { CommentsHelper } from "../helpers/CommentsHelper";
2020-04-01 08:44:49 +00:00
export class UserWebSocketActions {
/**
* Update incognito status of a user
*
* @param h Request handler
*/
public static async SetIncognito(h: UserWebSocketRequestsHandler) {
h.wsClient.incognito = h.postBool("enable", false);
h.success();
}
/**
* Register to a conversation
*
* @param h Request handler
*/
public static async RegisterConv(h: UserWebSocketRequestsHandler) {
const convID = await h.postConversationId("convID");
h.wsClient.registeredConversations.add(convID);
h.success();
}
/**
* Unregister a conversation
*
* @param h Request handler
*/
public static async UnregisterConv(h: UserWebSocketRequestsHandler) {
const convID = await h.postConversationId("convID");
h.wsClient.registeredConversations.delete(convID);
h.success();
2020-04-01 08:44:49 +00:00
}
2020-04-01 15:26:56 +00:00
/**
* Request to be notified of post changes
*
* @param h Request handler
*/
public static async RegisterPost(h: UserWebSocketRequestsHandler) {
const postID = await h.postPostIDWithAccess("postID", PostAccessLevel.BASIC_ACCESS);
h.wsClient.registeredPosts.add(postID);
h.success();
}
/**
* Unregister a post
*
* @param h Request handler
*/
public static async UnregisterPost(h: UserWebSocketRequestsHandler) {
const postID = h.postInt("postID"); // Warning ! we do not check post access level here because it is not required!
h.wsClient.registeredPosts.delete(postID);
h.success();
}
2020-04-01 08:44:49 +00:00
/**
* Send updated notifications number to some users
*
* @param usersID Target users ID
*/
public static async SendNewNotificationsNumber(usersID: number[]) {
// Process each user
for(const userID of usersID) {
if(!UserWebSocketController.IsConnected(userID))
continue;
// Notify user
2020-04-01 15:55:44 +00:00
UserWebSocketController.Send(userID, new WsMessage({
2020-04-01 08:44:49 +00:00
title: "number_notifs",
id: "",
data: await NotificationsHelper.CountUnread(userID)
}));
}
}
/**
* Send upated number of unread conversations count
*
* @param usersID Target users ID
*/
public static async SendNewUnreadConversationsCount(usersID: number[]) {
for(const userID of usersID) {
if(!UserWebSocketController.IsConnected(userID))
continue;
// Notify user
2020-04-01 15:55:44 +00:00
UserWebSocketController.Send(userID, new WsMessage({
2020-04-01 08:44:49 +00:00
title: "number_unread_conversations",
id: "",
data: await ConversationsHelper.CountUnreadForUser(userID)
}));
}
}
/**
* Propagate a new conversation message
*
* @param msg New message
*/
public static async SentNewConversationMessage(msg: ConversationMessage) {
2020-04-02 16:56:42 +00:00
await UserWebSocketController.SendToSpecifcClients(
(e) => e.registeredConversations.has(msg.convID),
() => WsMessage.NoIDMessage("new_conv_message", ConversationsController.ConversationMessageToAPI(msg)),
async (c) => await ConversationsHelper.MarkUserSeen(msg.convID, c.userID)
)
}
/**
* Propagate the update of a conversation message
*
* @param msgID Message ID
*/
public static async UpdatedConversationMessage(msgID: number) {
const msg = await ConversationsHelper.GetSingleMessage(msgID);
2020-04-02 16:58:25 +00:00
await UserWebSocketController.SendToSpecifcClients(
(e) => e.registeredConversations.has(msg.convID),
() => WsMessage.NoIDMessage("updated_conv_message", ConversationsController.ConversationMessageToAPI(msg))
)
}
/**
* Propagate the creation of a new comment
*
* @param c New comment
*/
public static async CreatedNewComment(c: Comment) {
2020-04-02 17:00:56 +00:00
await UserWebSocketController.SendToSpecifcClients(
(e) => e.registeredPosts.has(c.postID),
async (client) => WsMessage.NoIDMessage("new_comment",
await CommentsController.CommentToAPI(new AbritraryUserConnection(client.userID), c, true))
)
}
2020-04-02 08:54:03 +00:00
/**
* Propagate comment update
*
2020-04-02 16:25:23 +00:00
* @param c Updated comment
2020-04-02 08:54:03 +00:00
*/
public static async UpdatedComment(commentID: number) {
const comment = await CommentsHelper.GetSingle(commentID);
2020-04-02 17:03:31 +00:00
await UserWebSocketController.SendToSpecifcClients(
(e) => e.registeredPosts.has(comment.postID),
async (client) => WsMessage.NoIDMessage("comment_updated",
await CommentsController.CommentToAPI(new AbritraryUserConnection(client.userID), comment))
)
2020-04-02 08:54:03 +00:00
}
2020-04-02 16:25:23 +00:00
/**
* Propagage the deletion of a comment
*
* @param comment Deleted comment
*/
public static async DeletedComment(comment: Comment) {
for(const client of UserWebSocketController.active_clients.filter((e) => e.registeredPosts.has(comment.postID))) {
UserWebSocketController.SendToClient(client, new WsMessage({
id: "",
title: "comment_deleted",
data: comment.id
}))
}
2020-04-02 16:25:23 +00:00
}
2020-04-01 08:44:49 +00:00
}
// When we get a new number of notifications
EventsHelper.Listen("updated_number_notifications", async (e) => await UserWebSocketActions.SendNewNotificationsNumber(e.usersID));
// When we get a new number of unread conversations
EventsHelper.Listen("updated_number_unread_conversations", async (e) => await UserWebSocketActions.SendNewUnreadConversationsCount(e.usersID));
// When a new message is sent / updated
EventsHelper.Listen("sent_conversation_message", async (e) => await UserWebSocketActions.SentNewConversationMessage(e.msg));
EventsHelper.Listen("conv_message_updated", async (e) => await UserWebSocketActions.UpdatedConversationMessage(e.msgId));
2020-04-02 16:25:23 +00:00
// When a comment is created / updated / deleted
2020-04-02 08:54:03 +00:00
EventsHelper.Listen("comment_created", async (e) => await UserWebSocketActions.CreatedNewComment(e.comment))
2020-04-02 16:25:23 +00:00
EventsHelper.Listen("comment_updated", async (e) => await UserWebSocketActions.UpdatedComment(e.commentID));
EventsHelper.Listen("comment_deleted", async (e) => await UserWebSocketActions.DeletedComment(e.comment));