Forked from an inaccessible project.
-
Guillaume WANG authoredGuillaume WANG authored
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);
}
}