/** * @file Fonctions qui implémentent les requetes relatives aux messages * @author ofacklam * @memberof GraphQL */ import { User } from '../object_resolvers/users'; import { Group } from '../object_resolvers/groups/groups'; import { Message } from "../object_resolvers/messages/messages"; import { Announcement } from '../object_resolvers/messages/announcements'; import { Event } from '../object_resolvers/messages/events'; import { PrivatePost } from '../object_resolvers/messages/privatePosts'; import { Question } from '../object_resolvers/messages/questions'; import { Answer } from '../object_resolvers/messages/answers'; import knex from "../../../db/knex_router" import { Tools, GroupCollection, GroupSet } from "../../utils/tools"; export class MessageModel { /** * @memberof GraphQL * @class MessageModel * @summary Requetes relatives aux messages. * @classdesc Cette classe contient les méthodes implémentant les requetes relatives aux messages. * @arg {string} contextUser - L'identifiant de l'utilisateur du 'context' */ constructor(contextUser: string) { this.contextUser = contextUser; } protected contextUser: string; /** * @memberof GraphQL.MessageModel# * @function getAnnouncement * @summary Fonction qui renvoie une annonce donnée. * @arg {number} mid - Identifiant demandé. * @return {Promise(Announcement)} Renvoie l'annonce dont l'identifiant est 'mid' * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getAnnouncement(mid: number): Promise<Announcement> { return Announcement.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function getEvent * @summary Fonction qui renvoie un evenement donné. * @arg {number} mid - Identifiant demandé. * @return {Promise(Event)} Renvoie l'évenement dont l'identifiant est 'mid' * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getEvent(mid: number): Promise<Event> { return Event.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function getPrivatePost * @summary Fonction qui renvoie un post privé donné. * @arg {number} mid - Identifiant demandé. * @return {Promise(PrivatePost)} Renvoie le post privé dont l'identifiant est 'mid' * @async * @rights membre du groupe recipient */ async getPrivatePost(mid: number): Promise<PrivatePost> { return PrivatePost.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function getQuestion * @summary Fonction qui renvoie une question donnée. * @arg {number} mid - Identifiant demandé. * @return {Promise(Question)} Renvoie la question dont l'identifiant est 'mid' * @async * @rights viewer du groupe recipient */ async getQuestion(mid: number): Promise<Question> { return Question.tryCreate(mid); } /** * @memberof GraphQL.Group# * @function questions * @summary Renvoie les questions adressées a ce groupe * @arg {string} gid * @return {Promise(Question[])} * @rights viewer * @async */ async getAllQuestionsReceived(gid: string): Promise<Question[]> { let result:Question[] = await knex('messages_questions').select().where('recipient', gid ); return result; } /** * @memberof GraphQL.MessageModel# * @function getAnswer * @summary Fonction qui renvoie une réponse donnée. * @arg {number} mid - Identifiant demandé. * @return {Promise(Answer)} Renvoie la réponse dont l'identifiant est 'mid' * @async * @rights viewer du groupe author */ async getAnswer(mid: number): Promise<Answer> { return Answer.tryCreate(mid); } /** * @memberof GraphQL.Group# * @function answers * @summary Renvoie les réponses de ce groupe * @arg {string} gid * @return {Promise(Answer[])} * @rights viewer * @async */ async getAllAnswersSent(gid: string): Promise<Answer[]> { // let received_messages = await selectors.recievedMessages(user, groupUID); let result:Answer[] = await knex('messages_answers').select().where('recipient', gid); return result; } /** * @memberof GraphQL.MessageModel# * @function getAllMessages * @summary Fonction qui renvoie tous les messages visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Message[])} Renvoie tous les messages émis ou reçus par ces groupes * @async * @rights member of groups */ async getAllMessages(groups: GroupSet): Promise<Message[]> { let r1 = await this.getAllAnnouncements(groups); let r2 = await this.getAllEvents(groups); let r3 = await this.getAllPrivatePosts(groups); let r = new Array<Message>(); return r.concat(r1, r2, r3); } /** * @memberof GraphQL.MessageModel# * @function getAllAnnouncements * @summary Fonction qui renvoie toutes les annonces visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Announcement[])} Renvoie toutes les annonces émises ou reçues par ces groupes * @async * @rights member of groups */ async getAllAnnouncements(groups: GroupSet): Promise<Announcement[]> { let sent = await this.getAllAnnouncementsSent(groups); let received = await this.getAllAnnouncementsReceived(groups); return sent.concat(received); } /** * @memberof GraphQL.MessageModel# * @function getAllAnnouncementsSent * @summary Fonction qui renvoie toutes les annonces émises visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Announcement[])} Renvoie toutes les annonces émises par ces groupes * @async * @rights member of groups */ async getAllAnnouncementsSent(groups: GroupSet): Promise<Announcement[]> { let result = await knex.select('mid').from('announcements_authors').whereIn('gid', Array.from(groups)); return result.map(async obj => await this.getAnnouncement(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getAllAnnouncementsReceived * @summary Fonction qui renvoie toutes les annonces reçues visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Announcement[])} Renvoie toutes les annonces reçues par ces groupes * @async * @rights member of groups */ async getAllAnnouncementsReceived(groups: GroupSet): Promise<Announcement[]> { let result = await knex.select('mid').from('announcements_recipients').whereIn('gid', Array.from(groups)); return result.map(async obj => await this.getAnnouncement(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getAnnouncementAuthors * @summary Fonction qui renvoie les auteurs d'une annonce. * @arg {number} mid - L'identifiant de l'annonce. * @return {Promise(GroupSet)} Renvoie les groupes auteurs. * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getAnnouncementAuthors(mid: number): Promise<GroupSet> { let data = await knex.select('gid').from('announcements_authors').where('mid', mid); return new GroupSet(data.map(obj => obj.gid)); } /** * @memberof GraphQL.MessageModel# * @function getAnnouncementRecipients * @summary Fonction qui renvoie les recipients d'une annonce. * @arg {number} mid - L'identifiant de l'annonce. * @return {Promise(GroupSet)} Renvoie les groupes recipients. * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getAnnouncementRecipients(mid: number): Promise<GroupSet> { let data = await knex.select('gid').from('announcements_recipients').where('mid', mid); return new GroupSet(data.map(obj => obj.gid)); } /** * @memberof GraphQL.MessageModel# * @function getAllEvents * @summary Fonction qui renvoie tous les évenements visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Event[])} Renvoie tous les évenements émis ou reçus par ces groupes * @async * @rights member of groups */ async getAllEvents(groups: GroupSet): Promise<Event[]> { let from = await this.getAllEventsFrom(groups); let to = await this.getAllEventsTo(groups); return from.concat(to); } /** * @memberof GraphQL.MessageModel# * @function getAllEventsFrom * @summary Fonction qui renvoie tous les évenements visibles émis par le groupe. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Event[])} Renvoie tous les évenements émis par ces groupes * @async * @rights member of groups */ async getAllEventsFrom(groups: GroupSet): Promise<Event[]> { let result = await knex.select('mid').from('events_authors').whereIn('gid', Array.from(groups)); return result.map(async obj => await this.getEvent(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getAllEventsTo * @summary Fonction qui renvoie tous les évenements visibles addressés au groupe. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Event[])} Renvoie tous les évenements reçus par ces groupes * @async * @rights member of groups */ async getAllEventsTo(groups: GroupSet): Promise<Event[]> { let result = await knex.select('mid').from('events_recipients').whereIn('gid', Array.from(groups)); return result.map(async obj => await this.getEvent(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getEventAuthors * @summary Fonction qui renvoie les auteurs d'un event. * @arg {number} mid - L'identifiant de l'event. * @return {Promise(GroupSet)} Renvoie les groupes auteurs. * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getEventAuthors(mid: number): Promise<GroupSet> { let data = await knex.select('gid').from('events_authors').where('mid', mid); return new GroupSet(data.map(obj => obj.gid)); } /** * @memberof GraphQL.MessageModel# * @function getEventRecipients * @summary Fonction qui renvoie les recipients d'un event. * @arg {number} mid - L'identifiant de l'event. * @return {Promise(GroupSet)} Renvoie les groupes recipients. * @async * @rights membre d'un groupe author ou d'un groupe recipient */ async getEventRecipients(mid: number): Promise<GroupSet> { let data = await knex.select('gid').from('events_recipients').where('mid', mid); return new GroupSet(data.map(obj => obj.gid)); } /** * @memberof GraphQL.MessageModel# * @function getParticipatingGroups * @summary Renvoie les groupes qui participent a l'event * @arg {number} mid - L'identifiant de l'event * @return {Promise(GroupSet)} * @rights membre d'un groupe author ou d'un groupe recipient * @async */ async getParticipatingGroups(mid: number): Promise<GroupSet> { let data = await knex.select('gid').from('events_participating_groups').where('mid', mid); return new GroupSet(data.map(obj => obj.gid)); } /** * @memberof GraphQL.MessageModel# * @function getParticipatingUsers * @summary Renvoie les users qui participent a l'event * @arg {number} mid - L'identifiant de l'event * @return {Promise(User[])} * @rights membre d'un groupe author ou d'un groupe recipient * @async */ async getParticipatingUsers(mid: number): Promise<User[]> { let data = await knex.select('uid').from('events_participating_users').where('mid', mid); return data.map(obj => new User(obj.uid)); } /** * @memberof GraphQL.MessageModel# * @function getAllPrivatePosts * @summary Fonction qui renvoie tous les posts privés visibles. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(PrivatePost[])} Renvoie tous les posts privés de ces groupes * @async * @rights member of groups */ async getAllPrivatePosts(groups: GroupSet): Promise<PrivatePost[]> { let result = await knex.select('mid').from('messages_privateposts').whereIn('recipient', Array.from(groups)); return result.map(async obj => await this.getPrivatePost(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getAllQuestions * @summary Fonction qui renvoie toutes les questions posées aux groupes. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Announcement[])} Renvoie toutes les annonces émises par ces groupes * @async * @rights member of groups */ async getAllQuestions(groups: GroupSet): Promise<Announcement[]> { let result = await knex.select('mid').from('messages_questions').whereIn('recipient', Array.from(groups)); return result.map(async obj => await this.getQuestion(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function getAllAnswers * @summary Fonction qui renvoie toutes les réponses données par le groupe. * @arg {GroupSet} groups - Un ensemble d'identifiants, supposés valides. * @return {Promise(Announcement[])} Renvoie toutes les annonces émises par ces groupes * @async * @rights member of groups */ async getAllAnswers(groups: GroupSet): Promise<Announcement[]> { // L'auteur de la réponse n'est pas dans la table messages_answers car c'est forcément le recipient de la // question à laquelle il répond. let result = await knex.select('messages_answers.mid').from('messages_answers') .innerJoin('messages_questions', 'messages_answers.for_question', 'messages_questions.mid') .whereIn('messages_questions.recipient', groups); return result.map(async obj => await this.getAnswer(obj.mid)); } /** * @memberof GraphQL.MessageModel# * @function userParticipate * @summary Fonction pour participer a un evenement. * @arg {string} uid - Identifiant de l'utilisateur. * @arg {number} mid - Identifiant de l'évenement. * @return {Promise(boolean)} Renvoie true si modification réussie * @async * @rights member d'un groupe author ou recipient */ async userParticipate(uid: string, mid: number): Promise<boolean> { try{ let res = await knex("events_participating_users").insert({mid : mid, uid : uid}, ['id']); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function userUnparticipate * @summary Fonction pour ne plus participer a un evenement. * @arg {string} uid - Identifiant de l'utilisateur. * @arg {number} mid - Identifiant de l'évenement. * @return {Promise(boolean)} Renvoie true si modification réussie * @async * @rights member d'un groupe author ou recipient */ async userUnparticipate(uid: string, mid: number): Promise<boolean> { try{ let res = await knex("events_participating_users").where('mid' , mid).andWhere('uid',uid ).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function groupParticipate * @summary Fonction pour participer a un evenement. * @arg {string} gid - Identifiant du groupe. * @arg {number} mid - Identifiant de l'évenement. * @return {Promise(boolean)} Renvoie true si modification réussie * @async * @rights member d'un groupe author ou recipient */ async groupParticipate(gid: string, mid: number): Promise<boolean> { try{ let res = await knex("events_participating_groups").insert({gid : gid, mid : mid}, ['id']); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function groupUnparticipate * @summary Fonction pour ne plus participer a un evenement. * @arg {string} gid - Identifiant du groupe. * @arg {number} mid - Identifiant de l'évenement. * @return {Promise(boolean)} Renvoie true si modification réussie * @async * @rights member d'un groupe author ou recipient */ async groupUnparticipate(gid: string, mid: number): Promise<boolean> { try{ let res = await knex("events_participating_groups").where('mid' , mid).andWhere('gid',gid ).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function createQuestion * @summary Fonction pour créer une question. * @arg {string} gid - Identifiant du groupe. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {string} uid - Identifiant de l'auteur. * @return {Promise(Question)} Renvoie la question créée. * @async * @rights viewer du groupe */ async createQuestion(gid: string, title: string, content: string, uid : string): Promise<Question> { let res= await knex("messages_questions").insert({recipient : gid, author : uid, title : title, content:content}, ['mid']); return Question.tryCreate(res); } /** * @memberof GraphQL.MessageModel# * @function editQuestion * @summary Fonction pour modifier une question. * @arg {number} mid - Identifiant de la question. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @return {Promise(Question)} Renvoie la question modifiée. * @async * @rights viewer du groupe et author de la question */ async editQuestion(mid: number, title: string, content: string): Promise<Question> { let res= await knex("messages_questions").where('mid' , mid).update({title:title, content:content}); return Question.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function removeQuestion * @summary Fonction pour supprimer une question. * @arg {number} mid - Identifiant de la question. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights viewer du groupe et author de la question */ async removeQuestion(mid: number): Promise<boolean> { try{ let res = await knex("messages_questions").where('mid' , mid).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function createPrivatePost * @summary Fonction pour créer un post privé. * @arg {string} gid - Identifiant du groupe. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {string} uid - Identifiant de l'auteur. * @return {Promise(PrivatePost)} Renvoie le post créé. * @async * @rights member du groupe */ async createPrivatePost(gid: string, title: string, content: string, uid : string): Promise<PrivatePost> { let res= await knex("messages_private_posts").insert({recipient : gid, author : uid, title : title, content:content}, ['mid']); return PrivatePost.tryCreate(res); } /** * @memberof GraphQL.MessageModel# * @function editPrivatePost * @summary Fonction pour modifier un post privé. * @arg {number} mid - Identifiant du post. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @return {Promise(PrivatePost)} Renvoie le post modifié. * @async * @rights member du groupe et author du post */ async editPrivatePost(mid: number, title: string, content: string): Promise<PrivatePost> { let res= await knex("messages_private_posts").where('mid' , mid).update({title:title, content:content}); return PrivatePost.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function removePrivatePost * @summary Fonction pour supprimer un post privé. * @arg {number} mid - Identifiant du post. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights member du groupe et author du post */ async removePrivatePost(mid: number): Promise<boolean> { try{ let res = await knex("messages_private_posts").where('mid' , mid).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function createAnnouncement * @summary Fonction pour créer une annonce. * @arg {string} from_gid - Identifiant du groupe émetteur. * @arg {GroupSet} to_groups - Les groupes destinataires. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {number} event_mid - Identifiant de l'évenement. * @return {Promise(Announcement)} Renvoie l'annonce créée. * @async * @rights speaker du groupe émetteur */ async createAnnouncement(from_gid: string, to_groups: GroupSet, title: string, content: string, event_mid: number): Promise<Announcement> { throw "Not implemented"; } /** * @memberof GraphQL.MessageModel# * @function editAnnouncement * @summary Fonction pour modifier une annonce. * @arg {number} mid - Identifiant de l'annonce. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {number} event_mid - Identifiant de l'évenement. * @return {Promise(Announcement)} Renvoie l'annonce modifiée. * @async * @rights speaker du groupe émetteur */ async editAnnouncement(mid: number, title: string, content: string, event_mid: number): Promise<Announcement> { throw "Not implemented"; } /** * @memberof GraphQL.MessageModel# * @function removeAnnouncement * @summary Fonction pour supprimer une annonce. * @arg {number} mid - Identifiant de l'annonce. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights speaker du groupe */ async removeAnnouncement(mid: number): Promise<boolean> { try{ let res = await knex("messages_announcements").where('mid' , mid).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function createEvent * @summary Fonction pour créer un évenement. * @arg {string} from_gid - Identifiant du groupe émetteur. * @arg {GroupSet} to_groups - Les groupes destinataires. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {string} location - Lieu. * @arg {string} startTime - Date de début. * @arg {string} endTime - Date de fin. * @arg {number} announcement_mid - Identifiant de l'annonce. * @return {Promise(Event)} Renvoie l'évenement créé. * @async * @rights speaker du groupe émetteur */ async createEvent(from_gid: string, to_groups: GroupSet, title: string, content: string, location: string, startTime: string, endTime: string, announcement_mid: number): Promise<Event> { throw "Not implemented"; } /** * @memberof GraphQL.MessageModel# * @function editEvent * @summary Fonction pour modifier un evenement. * @arg {number} mid - Identifiant de l'évenement. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @arg {string} location - Lieu. * @arg {string} startTime - Date de début. * @arg {string} endTime - Date de fin. * @arg {number} announcement_mid - Identifiant de l'annonce. * @return {Promise(Event)} Renvoie l'evenement modifié. * @async * @rights speaker du groupe émetteur */ async editEvent(mid: number, title: string, content: string, location: string, startTime: string, endTime: string, announcement_mid: number): Promise<Event> { throw "Not implemented"; } /** * @memberof GraphQL.MessageModel# * @function removeEvent * @summary Fonction pour supprimer un évenement. * @arg {number} mid - Identifiant de l'évenement. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights speaker du groupe */ async removeEvent(mid: number): Promise<boolean> { try{ let res = await knex("messages_events").where('mid' , mid).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function createAnswer * @summary Fonction pour créer une réponse. * @arg {number} mid - Identifiant de la question. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @return {Promise(Answer)} Renvoie la réponse créée. * @async * @rights speaker du groupe */ async createAnswer(mid: number, title: string, content: string): Promise<Answer> { let gid:string=await knex("messages_questions").where('mid',mid).select('recipient'); let res= await knex("messages_answers").insert({recipient : gid, title : title, content:content}, ['mid']); return Answer.tryCreate(res); } /** * @memberof GraphQL.MessageModel# * @function editAnswer * @summary Fonction pour modifier une réponse. * @arg {number} mid - Identifiant de la réponse. * @arg {string} title - Titre. * @arg {string} content - Contenu. * @return {Promise(Answer)} Renvoie la réponse modifiée. * @async * @rights speaker du groupe */ async editAnswer(mid: number, title: string, content: string): Promise<Answer> { let res= await knex("messages_answers").where('mid' , mid).update({title:title, content:content}); return Answer.tryCreate(mid); } /** * @memberof GraphQL.MessageModel# * @function removeAnswer * @summary Fonction pour supprimer une réponse. * @arg {number} mid - Identifiant de la réponse. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights speaker du groupe */ async removeAnswer(mid: number): Promise<boolean> { try{ let res = await knex("messages_answers").where('mid' , mid).del(); return true; }catch(e){ return false; } } /** * @memberof GraphQL.MessageModel# * @function censorQuestion * @summary Fonction pour censurer une question. * @arg {number} mid - Identifiant du message. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights admin du groupe */ async censorQuestion(mid: number): Promise<boolean> { return this.removeQuestion(mid); } /** * @memberof GraphQL.MessageModel# * @function censorAnswer * @summary Fonction pour censurer une réponse. * @arg {number} mid - Identifiant du message. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights admin du groupe */ async censorAnswer(mid: number): Promise<boolean> { return this.removeAnswer(mid); } /** * @memberof GraphQL.MessageModel# * @function censorPrivatePost * @summary Fonction pour censurer un post privé. * @arg {number} mid - Identifiant du message. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights admin du groupe */ async censorPrivatePost(mid: number): Promise<boolean> { return this.removePrivatePost(mid); } /** * @memberof GraphQL.MessageModel# * @function censorAnnouncement * @summary Fonction pour censurer une annonce. * @arg {number} mid - Identifiant du message. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights admin du groupe ???? (lequel ??? -> le groupe author?) */ async censorAnnouncement(mid: number): Promise<boolean> { return this.removeAnnouncement(mid); } /** * @memberof GraphQL.MessageModel# * @function censorEvent * @summary Fonction pour censurer un évenement. * @arg {number} mid - Identifiant du message. * @return {Promise(boolean)} Renvoie true si suppression réussie. * @async * @rights admin du groupe ???? (lequel ??? -> le groupe author?) */ async censorEvent(mid: number): Promise<boolean> { return this.removeEvent(mid); } }