Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
requests.ts 13.50 KiB
/**
 * @file Resolvers pour tous les types de messages
 * @author akka, ofacklam
 */

import { Group, SimpleGroup, MetaGroup } from "./groups";
import { User } from './users';
import { Event } from "./messages";
import knex from '../../../db/knex_router';
import { Context } from "../typeDefs/queries";
import { ApolloError } from "apollo-server-core";

export abstract class Request {

    /**
     * @memberof GraphQL
     * @class Request
     * @summary Resolvers des requetes
     * @classdesc Une classe abstraite représentant l'interface Request du schéma.
     * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
     * @arg {number} rid - Identifiant de la requete, supposé valide.
     * @rights dépend du type de requete
     * @abstract
     */
    constructor(rid: number) {
        this.rid = rid;
        this.m_dataLoaded = false;
    }

    /**
     * @memberof GraphQL.Request#
     * @function fetchData
     * @summary Fonction qui va chercher toutes les données sur cette requete dans la BDD, si ce n'est pas déja fait.
     * @returns {Promise(boolean)} Renvoie true si le chargement est réussi.
     * @async
     * @protected
     * @abstract
     */
    protected abstract async fetchData(): Promise<boolean>

    /**
     * Protected properties.
     * Ce sont tous les champs triviaux, ie qui peuvent etre récupérés en une seule requete a la BDD,
     * ce qui permet d'etre plus efficace.
     * La variable dataLoaded témoigne de si on est déja allés chercher les données.
     * ATTENTION. Ce ne sont PAS directement les resolvers, il FAUT donc qu'ils aient un nom DIFFÉRENT du nom des champs dans le schéma.
     */
    protected m_dataLoaded: boolean

    protected m_comment: string
    protected m_from: string
    protected m_to: string

    /**
     * Ci-dessous les resolvers a proprement parler.
     */

    /**
     * @memberof GraphQL.Request#
     * @function __resolveType
     * @summary Renvoie quel type de Request c'est
     * @return {string}
     * @rights same as request object
     */
    __resolveType(): string {
        if (this instanceof UserJoinGroup) {
            return "UserJoinGroup";
        }
        else if (this instanceof GroupJoinMetagroup) {
            return "GroupJoinMetagroup";
        }
        else if (this instanceof GroupCoauthorEvent) {
            return "GroupCoauthorEvent";
        }
        else {
            throw new ApolloError("Bad request type");
        }
    }

    /** @rights same as request object */
    rid: number;

    /**
     * @memberof GraphQL.Request#
     * @function comment
     * @summary Renvoie le commentaire associé
     * @return {Promise(string)}
     * @rights same as request object
     * @async
     */
    async comment(args, context: Context, info): Promise<string> {
        await this.fetchData();
        return this.m_comment;
    }

    /**
     * @memberof GraphQL.Request#
     * @function from
     * @summary Renvoie l'émetteur de demande
     * @return {Promise(Group | User)}
     * @rights same as request object
     * @async
     * @abstract
     */
    abstract async from(args, context: Context, info);

    /**
     * @memberof GraphQL.Request#
     * @function to
     * @summary Renvoie le destinataire de la demande
     * @return {Promise(Group)}
     * @rights same as request object
     * @async
     * @abstract
     */
    abstract async to(args, context: Context, info): Promise<Group>;
}

export class UserJoinGroup extends Request {

    /**
     * @memberof GraphQL
     * @class UserJoinGroup
     * @extends GraphQL.Request
     * @summary Resolvers des requetes UserJoinGroup
     * @classdesc Une classe représentant le type UserJoinGroup du schéma.
     * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
     * @arg {number} rid - Identifiant de la requete, supposé valide.
     * @rights admin du groupe recipient ou le user émetteur
     */
    constructor(rid: number) {
        super(rid);
    }

    /**
     * @memberof GraphQL.UserJoinGroup#
     * @function tryCreate
     * @summary Fonction qui va essayer de créer la requete correspondante
     * @arg {number} rid - Identifiant de la requete, sans hypothese sur la validité.
     * @returns {Promise(UserJoinGroup)} - Renvoie le UserJoinGroup créé, ou null en cas d'erreur.
     * @rights admin du groupe recipient ou le user émetteur
     * @async
     * @static
     */
    static async tryCreate(rid: number): Promise<UserJoinGroup> {
        let r = new UserJoinGroup(rid);
        if(await r.fetchData()) {
            return r;
        }
        return null;
    }

    /**
     * @memberof GraphQL.UserJoinGroup#
     * @function fetchData
     * @summary Fonction qui va chercher toutes les données sur cette requete dans la BDD, si ce n'est pas déja fait.
     * @returns {Promise(boolean)} Renvoie true si le chargement est réussi.
     * @async
     * @protected
     */
    protected async fetchData(): Promise<boolean> {
        if (!this.m_dataLoaded) {
            let data = await knex.select('request_comment',
                'request_from',
                'request_to').from('requests_user_join_group').where('rid', this.rid);

            if (data.length > 0) {
                let r = data[0];

                this.m_comment = r.request_comment;
                this.m_from = r.request_from;
                this.m_to = r.request_to;

                this.m_dataLoaded = true;
                return true;
            }
            else {
                return false;
            }
        }
        return true;
    }

    /**
     * Ci-dessous les resolvers a proprement parler.
     */

    /**
     * @memberof GraphQL.UserJoinGroup#
     * @function from
     * @summary Renvoie le user émetteur
     * @return {Promise(User)}
     * @rights admin du groupe recipient ou le user émetteur
     * @async
     */
    async from(args, context: Context, info): Promise<User> {
        await this.fetchData();
        return new User(this.m_from);
    }

    /**
     * @memberof GraphQL.UserJoinGroup#
     * @function to
     * @summary Renvoie le groupe destinataire
     * @return {Promise(SimpleGroup)}
     * @rights admin du groupe recipient ou le user émetteur
     * @async
     */
    async to(args, context: Context, info): Promise<SimpleGroup> {
        await this.fetchData();
        return new SimpleGroup(this.m_to);
    }
}

export class GroupJoinMetagroup extends Request {

    /**
     * @memberof GraphQL
     * @class GroupJoinMetagroup
     * @extends GraphQL.Request
     * @summary Resolvers des requetes GroupJoinMetagroup
     * @classdesc Une classe représentant le type GroupJoinMetagroup du schéma.
     * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
     * @arg {number} rid - Identifiant de la requete, supposé valide.
     * @rights admin du groupe émetteur ou destinataire
     */
    constructor(rid: number) {
        super(rid);
    }

    /**
     * @memberof GraphQL.GroupJoinMetagroup#
     * @function tryCreate
     * @summary Fonction qui va essayer de créer la requete correspondante
     * @arg {number} rid - Identifiant de la requete, sans hypothese sur la validité.
     * @returns {Promise(GroupJoinMetagroup)} - Renvoie le GroupJoinMetagroup créé, ou null en cas d'erreur.
     * @rights admin du groupe émetteur ou destinataire
     * @async
     * @static
     */
    static async tryCreate(rid: number): Promise<GroupJoinMetagroup> {
        let r = new GroupJoinMetagroup(rid);
        if(await r.fetchData()) {
            return r;
        }
        return null;
    }

    /**
     * @memberof GraphQL.GroupJoinMetagroup#
     * @function fetchData
     * @summary Fonction qui va chercher toutes les données sur cette requete dans la BDD, si ce n'est pas déja fait.
     * @returns {Promise(boolean)} Renvoie true si le chargement est réussi.
     * @async
     * @protected
     */
    protected async fetchData(): Promise<boolean> {
        if (!this.m_dataLoaded) {
            let data = await knex.select('request_comment',
                'request_from',
                'request_to').from('requests_group_join_metagroup').where('rid', this.rid);

            if (data.length > 0) {
                let r = data[0];

                this.m_comment = r.request_comment;
                this.m_from = r.request_from;
                this.m_to = r.request_to;

                this.m_dataLoaded = true;
                return true;
            }
            else {
                return false;
            }
        }
        return true;
    }

    /**
     * Ci-dessous les resolvers a proprement parler.
     */

    /**
     * @memberof GraphQL.GroupJoinMetagroup#
     * @function from
     * @summary Renvoie le groupe émetteur
     * @return {Promise(SimpleGroup)}
     * @rights admin du groupe émetteur ou destinataire
     * @async
     */
    async from(args, context: Context, info): Promise<SimpleGroup> {
        await this.fetchData();
        return new SimpleGroup(this.m_from);
    }

    /**
     * @memberof GraphQL.GroupJoinMetagroup#
     * @function to
     * @summary Renvoie le groupe destinataire
     * @return {Promise(MetaGroup)}
     * @rights admin du groupe émetteur ou destinataire
     * @async
     */
    async to(args, context: Context, info): Promise<MetaGroup> {
        await this.fetchData();
        return new MetaGroup(this.m_to);
    }
}

export class GroupCoauthorEvent extends Request {

    /**
     * @memberof GraphQL
     * @class GroupCoauthorEvent
     * @extends GraphQL.Request
     * @summary Resolvers des requetes GroupCoauthorEvent
     * @classdesc Une classe représentant le type GroupCoauthorEvent du schéma.
     * Comme Apollo Server, par défaut, appelle la propriété / fonction avec le nom a résoudre, il n'y a pas besoin d'écrire les resolvers explicitement.
     * @arg {number} rid - Identifiant de la requete, supposé valide.
     * @rights admin du groupe émetteur ou destinataire
     */
    constructor(rid: number) {
        super(rid);
    }

    /**
     * @memberof GraphQL.GroupCoauthorEvent#
     * @function tryCreate
     * @summary Fonction qui va essayer de créer la requete correspondante
     * @arg {number} rid - Identifiant de la requete, sans hypothese sur la validité.
     * @returns {Promise(GroupCoauthorEvent)} - Renvoie le GroupCoauthorEvent créé, ou null en cas d'erreur.
     * @rights admin du groupe émetteur ou destinataire
     * @async
     * @static
     */
    static async tryCreate(rid: number): Promise<GroupCoauthorEvent> {
        let r = new GroupCoauthorEvent(rid);
        if(await r.fetchData()) {
            return r;
        }
        return null;
    }

    /**
     * @memberof GraphQL.GroupCoauthorEvent#
     * @function fetchData
     * @summary Fonction qui va chercher toutes les données sur cette requete dans la BDD, si ce n'est pas déja fait.
     * @returns {Promise(boolean)} Renvoie true si le chargement est réussi.
     * @async
     * @protected
     */
    protected async fetchData(): Promise<boolean> {
        if (!this.m_dataLoaded) {
            let data = await knex.select('request_comment',
                'request_from',
                'request_to',
                'for_event').from('requests_group_coauthor_event').where('rid', this.rid);

            if (data.length > 0) {
                let r = data[0];

                this.m_comment = r.request_comment;
                this.m_from = r.request_from;
                this.m_to = r.request_to;
                this.m_forEvent = r.for_event;

                this.m_dataLoaded = true;
                return true;
            }
            else {
                return false;
            }
        }
        return true;
    }

    /**
     * Protected properties.
     * Ce sont tous les champs triviaux, ie qui peuvent etre récupérés en une seule requete a la BDD,
     * ce qui permet d'etre plus efficace.
     * La variable dataLoaded témoigne de si on est déja allés chercher les données.
     * ATTENTION. Ce ne sont PAS directement les resolvers, il FAUT donc qu'ils aient un nom DIFFÉRENT du nom des champs dans le schéma.
     */
    protected m_forEvent: number;

    /**
     * Ci-dessous les resolvers a proprement parler.
     */

    /**
     * @memberof GraphQL.GroupCoauthorEvent#
     * @function from
     * @summary Renvoie le groupe émetteur
     * @return {Promise(Group)}
     * @rights admin du groupe émetteur ou destinataire
     * @async
     */
    async from(args, context: Context, info): Promise<Group> {
        await this.fetchData();
        throw "Not implemented";
    }

    /**
     * @memberof GraphQL.GroupCoauthorEvent#
     * @function to
     * @summary Renvoie le groupe destinataire
     * @return {Promise(Group)}
     * @rights admin du groupe émetteur ou destinataire
     * @async
     */
    async to(args, context: Context, info): Promise<Group> {
        await this.fetchData();
        throw "Not implemented";
    }

    /**
     * @memberof GraphQL.GroupCoauthorEvent#
     * @function forEvent
     * @summary Renvoie l'evenement a co-organiser
     * @return {Promise(Event)}
     * @rights admin du groupe émetteur ou destinataire
     * @async
     */
    async forEvent(args, context: Context, info): Promise<Event> {
        await this.fetchData();
        throw "Not implemented";
        //a-t-il le droit de voir ???
        return new Event(this.m_forEvent);
    }
}