From 6518d6433c54e1fc62b9d798291f2c523787ef3e Mon Sep 17 00:00:00 2001
From: Oliver Facklam <oliver.facklam.lfgeb@gmail.com>
Date: Mon, 31 Dec 2018 16:26:12 +0100
Subject: [PATCH] requestModel.ts

---
 src/app.ts                             |   6 +-
 src/graphql/connectors/groupModel.ts   |  14 --
 src/graphql/connectors/messageModel.ts |   2 +-
 src/graphql/connectors/requestModel.ts | 255 +++++++++++++++++++++++++
 src/graphql/typeDefs/actions.graphql   |   8 +-
 src/graphql/typeDefs/queries.d.ts      |   6 +-
 6 files changed, 270 insertions(+), 21 deletions(-)
 create mode 100644 src/graphql/connectors/requestModel.ts

diff --git a/src/app.ts b/src/app.ts
index 8a5a743..750632f 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -183,6 +183,8 @@ import { Context } from './graphql/typeDefs/queries';
 import { AuthorisationModel } from './graphql/connectors/authorisationModel';
 import { UserModel } from './graphql/connectors/userModel';
 import { GroupModel } from './graphql/connectors/groupModel';
+import { MessageModel } from './graphql/connectors/messageModel';
+import { RequestModel } from './graphql/connectors/requestModel';
 const context = async ({ req }): Promise<Context> => {
     // set a special uid for non-authenticated requests
     // /!\ FOR DEVELOPMENT ONLY: use the one in the ldap config .json file
@@ -211,7 +213,9 @@ const context = async ({ req }): Promise<Context> => {
         models: {
             auth: await AuthorisationModel.create(uid),
             user: new UserModel(uid),
-            group: new GroupModel(uid)
+            group: new GroupModel(uid),
+            message: new MessageModel(uid),
+            request: new RequestModel(uid)
         }
     };
 };
diff --git a/src/graphql/connectors/groupModel.ts b/src/graphql/connectors/groupModel.ts
index 3ace9ed..91b4f49 100644
--- a/src/graphql/connectors/groupModel.ts
+++ b/src/graphql/connectors/groupModel.ts
@@ -162,20 +162,6 @@ export class GroupModel {
         throw "Not implemented";
     }
 
-    /**
-     * @memberof GraphQL.GroupModel#
-     * @function userRequestJoinGroup
-     * @summary Fonction pour demander a devenir membre
-     * @arg {string} gid - Identifiant du groupe.
-     * @arg {string} comment - Commentaire supplémentaire
-     * @return {Promise(Request)} Renvoie la requete créée.
-     * @async
-     * @rights viewer du groupe
-     */
-    async userRequestJoinGroup(gid: string, comment: string): Promise<Request> {
-        throw "Not implemented";
-    }
-
     /**
      * @memberof GraphQL.GroupModel#
      * @function userLeaveGroup
diff --git a/src/graphql/connectors/messageModel.ts b/src/graphql/connectors/messageModel.ts
index 843a192..6fdbbf1 100644
--- a/src/graphql/connectors/messageModel.ts
+++ b/src/graphql/connectors/messageModel.ts
@@ -8,7 +8,7 @@ import { Announcement, Event, PrivatePost, Question, Answer, Message } from "../
 import knex from "../../../db/knex_router"
 import { GroupCollection, GroupSet } from "./tools";
 
-export class GroupModel {
+export class MessageModel {
 
     /**
      * @memberof GraphQL
diff --git a/src/graphql/connectors/requestModel.ts b/src/graphql/connectors/requestModel.ts
new file mode 100644
index 0000000..1015130
--- /dev/null
+++ b/src/graphql/connectors/requestModel.ts
@@ -0,0 +1,255 @@
+/**
+ * @file Fonctions qui implémentent les requetes relatives aux requetes
+ * @author ofacklam
+ * @memberof GraphQL
+ */
+
+import { Group, SimpleGroup, MetaGroup } from "../resolvers/groups";
+import { Request, UserJoinGroup, GroupJoinMetagroup, GroupCoauthorEvent } from "../resolvers/requests";
+import { User } from "../resolvers/users";
+import knex from "../../../db/knex_router"
+import { GroupCollection, GroupSet } from "./tools";
+import { createSubgroupArgs, editGroupArgs } from "../typeDefs/queries";
+
+export class RequestModel {
+
+    /**
+     * @memberof GraphQL
+     * @class RequestModel
+     * @summary Requetes relatives aux requetes.
+     * @classdesc Cette classe contient les méthodes implémentant les requetes relatives aux requetes.
+     * @arg {string} contextUser - L'identifiant de l'utilisateur du 'context'
+     */
+    constructor(contextUser: string) {
+        this.contextUser = contextUser;
+    }
+
+    protected contextUser: string;
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getUserJoinGroupRequest
+     * @summary Fonction qui renvoie une requete UserJoinGroup donnée.
+     * @arg {number} rid - Identifiant demandé.
+     * @return {Promise(UserJoinGroup)} Renvoie la requete dont l'identifiant est 'rid'
+     * @async
+     * @rights admin du groupe destinaire ou le user émetteur
+     */
+    async getUserJoinGroupRequest(rid: number): Promise<UserJoinGroup> {
+        return UserJoinGroup.tryCreate(rid);
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getGroupJoinMetagroupRequest
+     * @summary Fonction qui renvoie une requete GroupJoinMetagroup donnée.
+     * @arg {number} rid - Identifiant demandé.
+     * @return {Promise(GroupJoinMetagroup)} Renvoie la requete dont l'identifiant est 'rid'
+     * @async
+     * @rights admin du groupe émetteur ou destinataire
+     */
+    async getGroupJoinMetagroupRequest(rid: number): Promise<GroupJoinMetagroup> {
+        return GroupJoinMetagroup.tryCreate(rid);
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getGroupCoauthorEventRequest
+     * @summary Fonction qui renvoie une requete GroupCoauthorEvent donnée.
+     * @arg {number} rid - Identifiant demandé.
+     * @return {Promise(GroupCoauthorEvent)} Renvoie la requete dont l'identifiant est 'rid'
+     * @async
+     * @rights admin du groupe émetteur ou destinataire
+     */
+    async getGroupCoauthorEventRequest(rid: number): Promise<GroupCoauthorEvent> {
+        return GroupCoauthorEvent.tryCreate(rid);
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getRequestsToGroup
+     * @summary Fonction qui renvoie toutes les requetes destinées a ce groupe.
+     * @arg {string} gid - Identifiant du groupe.
+     * @return {Promise(Request[])} Renvoie la liste des requetes destinées a ce groupe.
+     * @async
+     * @rights admin du groupe
+     */
+    async getRequestsToGroup(gid: string): Promise<Request[]> {
+        let r1 = await this.getUserJoinGroupRequestsToGroup(gid);
+        let r2 = await this.getGroupJoinMetagroupRequestsToGroup(gid);
+        let r3 = await this.getGroupCoauthorEventRequestsToGroup(gid);
+
+        let r: Request[];
+        return r.concat(r1, r2, r3);
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getUserJoinGroupRequestsToGroup
+     * @summary Fonction qui renvoie toutes les requetes UserJoinGroup destinées a ce groupe.
+     * @arg {string} gid - Identifiant du groupe.
+     * @return {Promise(UserJoinGroup[])} Renvoie la liste des requetes destinées a ce groupe.
+     * @async
+     * @rights admin du groupe
+     */
+    async getUserJoinGroupRequestsToGroup(gid: string): Promise<UserJoinGroup[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getGroupJoinMetagroupRequestsToGroup
+     * @summary Fonction qui renvoie toutes les requetes GroupJoinMetagroup destinées a ce groupe.
+     * @arg {string} gid - Identifiant du groupe.
+     * @return {Promise(GroupJoinMetagroup[])} Renvoie la liste des requetes destinées a ce groupe.
+     * @async
+     * @rights admin du groupe
+     */
+    async getGroupJoinMetagroupRequestsToGroup(gid: string): Promise<GroupJoinMetagroup[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function getGroupCoauthorEventRequestsToGroup
+     * @summary Fonction qui renvoie toutes les requetes GroupCoauthorEvent destinées a ce groupe.
+     * @arg {string} gid - Identifiant du groupe.
+     * @return {Promise(GroupCoauthorEvent[])} Renvoie la liste des requetes destinées a ce groupe.
+     * @async
+     * @rights admin du groupe
+     */
+    async getGroupCoauthorEventRequestsToGroup(gid: string): Promise<GroupCoauthorEvent[]> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function userRequestJoinGroup
+     * @summary Fonction pour demander a devenir membre
+     * @arg {string} gid - Identifiant du groupe.
+     * @arg {string} comment - Commentaire supplémentaire
+     * @return {Promise(UserJoinGroup)} Renvoie la requete créée.
+     * @async
+     * @rights viewer du groupe
+     */
+    async userRequestJoinGroup(gid: string, comment: string): Promise<UserJoinGroup> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function groupRequestCoauthorEvent
+     * @summary Fonction pour demander a co-organiser un évenement
+     * @arg {string} from_gid - Identifiant du groupe émetteur.
+     * @arg {string} to_gid - Identifiant du groupe destinataire.
+     * @arg {number} event_mid - Identifiant de l'évenement considéré.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(GroupCoauthorEvent)} Renvoie la requete créée.
+     * @async
+     * @rights speaker du groupe émetteur
+     */
+    async groupRequestCoauthorEvent(from_gid: string, to_gid: string, event_mid: number, comment: string): Promise<GroupCoauthorEvent> {
+        //TODO : Vérifier que l'évenement est bien organisé par le groupe destinataire (to_gid) !!! => sinon erreur
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function groupRequestJoinMetagroup
+     * @summary Fonction pour demander a rejoindre un méta-groupe
+     * @arg {string} from_gid - Identifiant du groupe émetteur.
+     * @arg {string} to_gid - Identifiant du méta-groupe destinataire.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(GroupJoinMetagroup)} Renvoie la requete créée.
+     * @async
+     * @rights admin du groupe émetteur
+     */
+    async groupRequestJoinMetagroup(from_gid: string, to_gid: string, comment: string): Promise<GroupJoinMetagroup> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function acceptUserJoinRequest
+     * @summary Fonction pour accepter une UserJoinGroup
+     * @arg {UserJoinGroup} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async acceptUserJoinRequest(req: UserJoinGroup, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function refuseUserJoinRequest
+     * @summary Fonction pour refuser une UserJoinGroup
+     * @arg {UserJoinGroup} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async refuseUserJoinRequest(req: UserJoinGroup, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function acceptGroupJoinRequest
+     * @summary Fonction pour accepter une GroupJoinMetagroup
+     * @arg {GroupJoinMetagroup} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async acceptGroupJoinRequest(req: GroupJoinMetagroup, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function refuseGroupJoinRequest
+     * @summary Fonction pour refuser une GroupJoinMetagroup
+     * @arg {GroupJoinMetagroup} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async refuseGroupJoinRequest(req: GroupJoinMetagroup, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function acceptGroupCoauthorEventRequest
+     * @summary Fonction pour accepter une GroupCoauthorEvent
+     * @arg {GroupCoauthorEvent} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async acceptGroupCoauthorEventRequest(req: GroupCoauthorEvent, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+    /**
+     * @memberof GraphQL.RequestModel#
+     * @function refuseGroupCoauthorEventRequest
+     * @summary Fonction pour refuser une GroupCoauthorEvent
+     * @arg {GroupCoauthorEvent} req - L'objet requete.
+     * @arg {string} comment - Commentaire supplémentaire.
+     * @return {Promise(boolean)} Renvoie true si modification réussie.
+     * @async
+     * @rights admin du groupe destinataire
+     */
+    async refuseGroupCoauthorEventRequest(req: GroupCoauthorEvent, comment: string): Promise<boolean> {
+        throw "Not implemented";
+    }
+
+}
\ No newline at end of file
diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql
index 08e4029..1a7fa65 100644
--- a/src/graphql/typeDefs/actions.graphql
+++ b/src/graphql/typeDefs/actions.graphql
@@ -21,7 +21,7 @@ type Query {
     answer(mid:ID!): Answer
 
     # Request queries de base
-    request(rid:ID!): Request
+    #request(rid:ID!): Request
     userJoinGroupRequest(rid:ID!): UserJoinGroup
     groupJoinMetagroupRequest(rid:ID!): GroupJoinMetagroup
     groupCoauthorEventRequest(rid:ID!): GroupCoauthorEvent
@@ -131,7 +131,7 @@ type Mutation {
         forEvent: ID!
     ): Boolean
 
-    userRequestJoinGroup(toGroup: ID!, comment: String): Request
+    userRequestJoinGroup(toGroup: ID!, comment: String): UserJoinGroup
 
     createQuestion(
         toGroup: ID!,
@@ -172,7 +172,7 @@ type Mutation {
         toGroup: ID!, 
         forEvent: ID!, 
         comment: String
-    ): Request
+    ): GroupCoauthorEvent
 
     createAnnouncement(
         fromGroup: ID!,
@@ -253,7 +253,7 @@ type Mutation {
         school: String
     ): Group
 
-    groupRequestJoinMetagroup(fromGroup: ID!, toMetagroup: ID!, comment: String): Request
+    groupRequestJoinMetagroup(fromGroup: ID!, toMetagroup: ID!, comment: String): GroupJoinMetagroup
 
     acceptUserJoinRequest(request: ID!, comment: String): Boolean
     acceptGroupJoinRequest(request: ID!, comment: String): Boolean
diff --git a/src/graphql/typeDefs/queries.d.ts b/src/graphql/typeDefs/queries.d.ts
index 2c49578..96cbc87 100644
--- a/src/graphql/typeDefs/queries.d.ts
+++ b/src/graphql/typeDefs/queries.d.ts
@@ -1,6 +1,8 @@
 import { AuthorisationModel } from "../connectors/authorisationModel";
 import { UserModel } from "../connectors/userModel";
 import { GroupModel } from "../connectors/groupModel";
+import { MessageModel } from "../connectors/messageModel";
+import { RequestModel } from "../connectors/requestModel";
 
 interface Context {
     request,
@@ -8,7 +10,9 @@ interface Context {
     models: {
         auth: AuthorisationModel,
         user: UserModel,
-        group: GroupModel
+        group: GroupModel,
+        message: MessageModel,
+        request: RequestModel
     }
 }
 
-- 
GitLab