mirror of
				https://gitlab.com/comunic/comunicapiv2
				synced 2025-11-04 03:24:04 +00:00 
			
		
		
		
	Can be automatically be notified of comments creation
This commit is contained in:
		@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
								}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -143,3 +164,6 @@ EventsHelper.Listen("updated_number_unread_conversations", async (e) => await Us
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// 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))
 | 
				
			||||||
@@ -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
 | 
				
			||||||
	 * 
 | 
						 * 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										29
									
								
								src/entities/UserConnectionContainer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/entities/UserConnectionContainer.ts
									
									
									
									
									
										Normal 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;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -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
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user