mirror of
				https://gitlab.com/comunic/comunicapiv2
				synced 2025-11-04 11:34:04 +00:00 
			
		
		
		
	Can get the list of conversations
This commit is contained in:
		
							
								
								
									
										39
									
								
								src/controllers/ConversationsController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/controllers/ConversationsController.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					import { RequestHandler } from "../entities/RequestHandler";
 | 
				
			||||||
 | 
					import { ConversationsHelper } from "../helpers/ConversationsHelper";
 | 
				
			||||||
 | 
					import { Conversation } from "../entities/Conversation";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Conversations controller
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author Pierre HUBERT
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class ConversationsController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Get the list of conversations of the user
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param handler 
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static async GetList(handler: RequestHandler) {
 | 
				
			||||||
 | 
							const list = await ConversationsHelper.GetListUser(handler.getUserId());
 | 
				
			||||||
 | 
							handler.send(list.map(c => this.ConversationToAPI(c)));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Turn a conversation object into an API entry
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param c 
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private static ConversationToAPI(c : Conversation) : any {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								ID: c.id,
 | 
				
			||||||
 | 
								ID_owner: c.ownerID,
 | 
				
			||||||
 | 
								last_active: c.lastActive,
 | 
				
			||||||
 | 
								name: c.name.length > 0 ? c.name : false,
 | 
				
			||||||
 | 
								following: c.following ? 1 : 0,
 | 
				
			||||||
 | 
								saw_last_message: c.sawLastMessage ? 1 : 0,
 | 
				
			||||||
 | 
								members: c.members
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@ import { WelcomeController } from "./WelcomeController";
 | 
				
			|||||||
import { RequestHandler } from "../entities/RequestHandler";
 | 
					import { RequestHandler } from "../entities/RequestHandler";
 | 
				
			||||||
import { AccountController } from "./AccountController";
 | 
					import { AccountController } from "./AccountController";
 | 
				
			||||||
import { UserController } from "./UserController";
 | 
					import { UserController } from "./UserController";
 | 
				
			||||||
 | 
					import { ConversationsController } from "./ConversationsController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Controllers routes
 | 
					 * Controllers routes
 | 
				
			||||||
@@ -43,4 +44,8 @@ export const Routes : Route[] = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	{path: "/user/getInfoMultiple", cb: (h) => UserController.GetMultiple(h), needLogin: false},
 | 
						{path: "/user/getInfoMultiple", cb: (h) => UserController.GetMultiple(h), needLogin: false},
 | 
				
			||||||
	{path: "/user/getInfosMultiple", cb: (h) => UserController.GetMultiple(h), needLogin: false}, // Legacy
 | 
						{path: "/user/getInfosMultiple", cb: (h) => UserController.GetMultiple(h), needLogin: false}, // Legacy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Conversations controller
 | 
				
			||||||
 | 
						{path: "/conversations/getList", cb: (h) => ConversationsController.GetList(h)},
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/entities/Conversation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/entities/Conversation.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Single conversation information
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author Pierre HUBERT
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface Conversation {
 | 
				
			||||||
 | 
						id: number,
 | 
				
			||||||
 | 
						ownerID: number,
 | 
				
			||||||
 | 
						name: string,
 | 
				
			||||||
 | 
						lastActive: number,
 | 
				
			||||||
 | 
						timeCreate: number,
 | 
				
			||||||
 | 
						following: boolean,
 | 
				
			||||||
 | 
						sawLastMessage: boolean,
 | 
				
			||||||
 | 
						members: Array<number>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										88
									
								
								src/helpers/ConversationsHelper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/helpers/ConversationsHelper.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					import { Conversation } from "../entities/Conversation";
 | 
				
			||||||
 | 
					import { DatabaseHelper } from "./DatabaseHelper";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Conversations helper
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author Pierre HUBERT
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const LIST_TABLE = "comunic_conversations_list";
 | 
				
			||||||
 | 
					const USERS_TABLE = "comunic_conversations_users";
 | 
				
			||||||
 | 
					const MESSAGES_TABLE = "comunic_conversations_messages";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class ConversationsHelper {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Get the list of conversations of the user
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param userID Target user ID
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public static async GetListUser(userID: number) : Promise<Array<Conversation>> {
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							// Fetch the list of conversations
 | 
				
			||||||
 | 
							const result = await DatabaseHelper.Query({
 | 
				
			||||||
 | 
								fields: [
 | 
				
			||||||
 | 
									"*",
 | 
				
			||||||
 | 
									"l.id as id",
 | 
				
			||||||
 | 
									"l.user_id as owner_id" // The field conflits with user.user_id
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								table: LIST_TABLE + " l",
 | 
				
			||||||
 | 
								joins: [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Joins with conversation members table
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										table: USERS_TABLE + " u",
 | 
				
			||||||
 | 
										condition: "l.id = u.conv_id"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								where: {
 | 
				
			||||||
 | 
									"u.user_id": userID
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								order: "l.last_active DESC"
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const list = [];
 | 
				
			||||||
 | 
							for (const el of result) {
 | 
				
			||||||
 | 
								list.push(await this.DBToConversationInfo(el));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return list;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Get the list of members of a conversation
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param convID The ID of the target conversation
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private static async GetConversationMembers(convID : number): Promise<Array<number>> {
 | 
				
			||||||
 | 
							const result = await DatabaseHelper.Query({
 | 
				
			||||||
 | 
								table: USERS_TABLE,
 | 
				
			||||||
 | 
								where: {
 | 
				
			||||||
 | 
									"conv_id": convID
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								fields: ["user_id"]
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return result.map((e) => e.user_id);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Turn a database entry into a conversation object
 | 
				
			||||||
 | 
						 * 
 | 
				
			||||||
 | 
						 * @param row 
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private static async DBToConversationInfo(row: any) : Promise<Conversation> {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								id: row.id,
 | 
				
			||||||
 | 
								ownerID: row.owner_id,
 | 
				
			||||||
 | 
								name: row.name,
 | 
				
			||||||
 | 
								lastActive: row.last_active,
 | 
				
			||||||
 | 
								timeCreate: row.time_add,
 | 
				
			||||||
 | 
								following: row.following,
 | 
				
			||||||
 | 
								sawLastMessage: row.saw_last_message,
 | 
				
			||||||
 | 
								members: await this.GetConversationMembers(row.id)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user