1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2024-11-25 06:49:23 +00:00

Can be automatically be notified of comments creation

This commit is contained in:
Pierre HUBERT 2020-04-01 17:51:33 +02:00
parent 21ba8eff25
commit 53d121708d
7 changed files with 89 additions and 8 deletions

View File

@ -6,6 +6,7 @@ import { time } from "../utils/DateUtils";
import { CommentsHelper } from "../helpers/CommentsHelper"; import { CommentsHelper } from "../helpers/CommentsHelper";
import { NotifEventType } from "../entities/Notification"; import { NotifEventType } from "../entities/Notification";
import { NotificationsHelper } from "../helpers/NotificationsHelper"; import { NotificationsHelper } from "../helpers/NotificationsHelper";
import { AbstractUserConnectionContainer } from "../entities/UserConnectionContainer";
/** /**
* Comments controller * Comments controller
@ -145,7 +146,7 @@ export class CommentsController {
* @param h Request handler * @param h Request handler
* @param c Comment * @param c Comment
*/ */
public static async CommentToAPI(h: RequestHandler, c: Comment) : Promise<any> { public static async CommentToAPI(h: AbstractUserConnectionContainer, c: Comment) : Promise<any> {
return { return {
ID: c.id, ID: c.id,
userID: c.userID, userID: c.userID,

View File

@ -13,6 +13,9 @@ import { EventsHelper } from "../helpers/EventsHelper";
import { ConversationMessage } from "../entities/ConversationMessage"; import { ConversationMessage } from "../entities/ConversationMessage";
import { ConversationsController } from "./ConversationsController"; import { ConversationsController } from "./ConversationsController";
import { PostAccessLevel } from "../entities/Post"; import { PostAccessLevel } from "../entities/Post";
import { Comment } from "../entities/Comment";
import { CommentsController } from "./CommentsController";
import { AbritraryUserConnection } from "../entities/UserConnectionContainer";
export class UserWebSocketActions { export class UserWebSocketActions {
@ -122,7 +125,7 @@ export class UserWebSocketActions {
for(const client of UserWebSocketController.active_clients.filter( for(const client of UserWebSocketController.active_clients.filter(
(e) => e.registeredConversations.has(msg.convID))) { (e) => e.registeredConversations.has(msg.convID))) {
UserWebSocketController.Send(client.userID, client.socketID, new WsMessage({ UserWebSocketController.SendToClient(client, new WsMessage({
id: "", id: "",
title: "new_conv_message", title: "new_conv_message",
data: ConversationsController.ConversationMessageToAPI(msg) data: ConversationsController.ConversationMessageToAPI(msg)
@ -132,6 +135,24 @@ export class UserWebSocketActions {
} }
} }
/**
* Propagate the creation of a new comment
*
* @param c New comment
*/
public static async CreatedNewComment(c: Comment) {
for(const client of UserWebSocketController.active_clients.filter((e) => e.registeredPosts.has(c.postID))) {
UserWebSocketController.SendToClient(client, new WsMessage({
id: "",
title: "new_comment",
data: await CommentsController.CommentToAPI(new AbritraryUserConnection(client.userID), c)
}))
}
}
} }
@ -142,4 +163,7 @@ EventsHelper.Listen("updated_number_notifications", async (e) => await UserWebSo
EventsHelper.Listen("updated_number_unread_conversations", async (e) => await UserWebSocketActions.SendNewUnreadConversationsCount(e.usersID)); EventsHelper.Listen("updated_number_unread_conversations", async (e) => await UserWebSocketActions.SendNewUnreadConversationsCount(e.usersID));
// When a new message is sent // When a new message is sent
EventsHelper.Listen("sent_conversation_message", async (e) => await UserWebSocketActions.SentNewConversationMessage(e.msg)); EventsHelper.Listen("sent_conversation_message", async (e) => await UserWebSocketActions.SentNewConversationMessage(e.msg));
// When a comment is created
EventsHelper.Listen("comment_created", async (e) => await UserWebSocketActions.CreatedNewComment(e.comment))

View File

@ -221,11 +221,21 @@ export class UserWebSocketController {
(e) => e.userID == userID (e) => e.userID == userID
&& (socketID.length == 0 || e.socketID == socketID))) && (socketID.length == 0 || e.socketID == socketID)))
{ {
if(entry.ws.readyState == ws.OPEN) this.SendToClient(entry, message);
entry.ws.send(JSON.stringify(message));
} }
} }
/**
* Send a message to a specific client
*
* @param client Target client
* @param message The message to send
*/
public static SendToClient(client: ActiveClient, message: WsMessage) {
if(client.ws.readyState == ws.OPEN)
client.ws.send(JSON.stringify(message));
}
/** /**
* Check out whether a user has an active websocket or not * Check out whether a user has an active websocket or not
* *

View File

@ -15,8 +15,9 @@ import { PostAccessLevel } from "./Post";
import { CommentsHelper } from "../helpers/CommentsHelper"; import { CommentsHelper } from "../helpers/CommentsHelper";
import { checkVirtualDirectory } from "../utils/VirtualDirsUtils"; import { checkVirtualDirectory } from "../utils/VirtualDirsUtils";
import { ConversationsHelper } from "../helpers/ConversationsHelper"; import { ConversationsHelper } from "../helpers/ConversationsHelper";
import { AbstractUserConnectionContainer } from "./UserConnectionContainer";
export abstract class BaseRequestsHandler { export abstract class BaseRequestsHandler implements AbstractUserConnectionContainer {
protected abstract get userID() : number; protected abstract get userID() : number;

View File

@ -0,0 +1,29 @@
/**
* Simple user connection container
*
* @author Pierre Hubert
*/
export abstract class AbstractUserConnectionContainer {
public abstract getUserId() : number;
public abstract get signedIn() : boolean;
}
/**
* Fake user connnection checker used for notifications in WebSockets
*/
export class AbritraryUserConnection implements AbstractUserConnectionContainer {
constructor(private userID: number) {}
public getUserId(): number {
if(!this.signedIn)
throw new Error("User is not signed in!");
return this.userID;
}
public get signedIn(): boolean {
return this.userID > 0;
}
}

View File

@ -3,6 +3,7 @@ import { DatabaseHelper } from "./DatabaseHelper";
import { unlinkSync, existsSync } from "fs"; import { unlinkSync, existsSync } from "fs";
import { LikesHelper, LikesType } from "./LikesHelper"; import { LikesHelper, LikesType } from "./LikesHelper";
import { mysql_date, time } from "../utils/DateUtils"; import { mysql_date, time } from "../utils/DateUtils";
import { EventsHelper } from "./EventsHelper";
/** /**
* Comments helper * Comments helper
@ -20,7 +21,7 @@ export class CommentsHelper {
* @param comment Information about the comment to create * @param comment Information about the comment to create
*/ */
public static async Create(comment: Comment) : Promise<number> { public static async Create(comment: Comment) : Promise<number> {
return await DatabaseHelper.InsertRow(COMMENTS_TABLE, { const commentID = await DatabaseHelper.InsertRow(COMMENTS_TABLE, {
ID_texte: comment.postID, ID_texte: comment.postID,
ID_personne: comment.userID, ID_personne: comment.userID,
date_envoi: mysql_date(), date_envoi: mysql_date(),
@ -28,6 +29,14 @@ export class CommentsHelper {
commentaire: comment.content, commentaire: comment.content,
image_commentaire: comment.hasImage ? comment.imagePath : "" image_commentaire: comment.hasImage ? comment.imagePath : ""
}); });
// Propagate event
comment.id = commentID;
await EventsHelper.Emit("comment_created", {
comment: comment
});
return commentID
} }
/** /**

View File

@ -1,5 +1,6 @@
import { APIClient } from "../entities/APIClient"; import { APIClient } from "../entities/APIClient";
import { ConversationMessage } from "../entities/ConversationMessage"; import { ConversationMessage } from "../entities/ConversationMessage";
import { Comment } from "../entities/Comment";
/** /**
* Events manager * Events manager
@ -28,6 +29,11 @@ export interface SentNewConversationMessageEvent {
msg: ConversationMessage msg: ConversationMessage
} }
// When a comment is created
export interface CommentCreatedEvent {
comment: Comment
}
/** /**
* Global map of all possible events * Global map of all possible events
*/ */
@ -35,7 +41,8 @@ export interface EventsMap {
"destroyed_login_tokens": DestroyedLoginTokensEvent, "destroyed_login_tokens": DestroyedLoginTokensEvent,
"updated_number_notifications": UpdatedNotificationsNumberEvent, "updated_number_notifications": UpdatedNotificationsNumberEvent,
"updated_number_unread_conversations": UpdateNumberUnreadConversationsEvent, "updated_number_unread_conversations": UpdateNumberUnreadConversationsEvent,
"sent_conversation_message": SentNewConversationMessageEvent "sent_conversation_message": SentNewConversationMessageEvent,
"comment_created": CommentCreatedEvent
} }
export class EventsHelper { export class EventsHelper {