Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
messageModel.ts 22.89 KiB
/**
 * @file Fonctions qui implémentent les requetes relatives aux messages
 * @author ofacklam
 * @memberof GraphQL
 */

import { Announcement, Event, PrivatePost, Question, Answer, Message } from "../object_resolvers/messages";
import knex from "../../../db/knex_router"
import { Tools, GroupCollection, GroupSet } from "./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[]> {
        throw "Not implemented"
        // let result = await knex('questions').select().whereIn('id', received_messages);
        // for(let entry of result){
        //     entry.type = "Question";
        // }
        // 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[]> {
        throw "Not implemented"
        // let received_messages = await selectors.recievedMessages(user, groupUID);
        // let result = await knex('answers').select().whereIn('id', received_messages);
        // for(let entry of result){
        //     entry.type = "Answer";
        // }
        // return result;
    }

    /**
     * @memberof GraphQL.MessageModel#
     * @function getAllMessages
     * @summary Fonction qui renvoie tous les messages visibles.
     * @arg {GroupCollection} 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: 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 getAllEvents
     * @summary Fonction qui renvoie tous les évenements visibles.
     * @arg {GroupCollection} 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 {GroupCollection} 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 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 {GroupCollection} 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 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 getAllPrivatePosts
     * @summary Fonction qui renvoie tous les posts privés visibles.
     * @arg {GroupCollection} 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_private_posts').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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @memberof GraphQL.MessageModel#
     * @function groupParticipate
     * @summary Fonction pour participer a un evenement.
     * @arg {string} gid - Identifiant du groupe.
     * @arg {number} forEvent - 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, forEvent: number): Promise<boolean> {
        throw "Not implemented";
    }

    /**
     * @memberof GraphQL.MessageModel#
     * @function groupUnparticipate
     * @summary Fonction pour ne plus participer a un evenement.
     * @arg {string} gid - Identifiant du groupe.
     * @arg {number} forEvent - 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, forEvent: number): Promise<boolean> {
        throw "Not implemented";
    }

    /**
     * @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.
     * @return {Promise(Question)} Renvoie la question créée.
     * @async
     * @rights viewer du groupe
     */
    async createQuestion(gid: string, title: string, content: string): Promise<Question> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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.
     * @return {Promise(PrivatePost)} Renvoie le post créé.
     * @async
     * @rights member du groupe
     */
    async createPrivatePost(gid: string, title: string, content: string): Promise<PrivatePost> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    } 

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

    /**
     * @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> {
        throw "Not implemented";
    }

}