import { RequestHandler } from "../entities/RequestHandler"; import { ConversationsHelper } from "../helpers/ConversationsHelper"; import { Conversation, BaseConversation } from "../entities/Conversation"; import { UserHelper } from "../helpers/UserHelper"; import { removeHTMLNodes } from "../utils/StringUtils"; /** * Conversations controller * * @author Pierre HUBERT */ export class ConversationsController { /** * Create a new conversation * * @param h Request handler */ public static async CreateConversation(h : RequestHandler) { const name = h.postString("name"); const members = [...new Set(h.postNumbersList("users"))]; // Check if the users exists for (const userID of members) { if(!await UserHelper.Exists(userID)) h.error(404, "User " + userID + " not found!"); } if(!members.includes(h.getUserId())) members.push(h.getUserId()); const conv : BaseConversation = { ownerID: h.getUserId(), name: name == "false" ? "" : removeHTMLNodes(name), following: h.postBool("follow"), members: members, } const convID = await ConversationsHelper.Create(conv); // Success h.send({ conversationID: convID, success: "The conversation was successfully created!" }) } /** * 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))); } /** * Get information about a single conversation * * @param handler */ public static async GetInfoSingle(handler: RequestHandler) { const conversationID = await this.GetPostConversationId("conversationID", handler); const conv = await ConversationsHelper.GetSingle(conversationID, handler.getUserId()); if(!conv) throw Error("Could not get information about the conversation (but it should have been found though) !!"); handler.send(this.ConversationToAPI(conv)); } /** * Update conversation settings * * @param handler Request handler */ public static async UpdateSettings(handler: RequestHandler) : Promise { const convID = await this.GetPostConversationId("conversationID", handler); // Update following state, if required if(handler.hasPostParameter("following")) { await ConversationsHelper.SetFollowing( handler.getUserId(), convID, handler.postBool("following") ); } // TODO : update moderation settings handler.success("Conversation information successfully updated!"); } /** * Get and return safely a conversation ID specified in a $_POST Request * * @param name The name of the POST field containing the ID of the conversation * @param handler */ private static async GetPostConversationId(name : string, handler: RequestHandler) : Promise { const convID = handler.postInt(name); // Check out whether the user belongs to the conversation or not if(!await ConversationsHelper.DoesUsersBelongsTo(handler.getUserId(), convID)) handler.error(401, "You are not allowed to perform queries on this conversation!"); return convID; } /** * 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 }; } }