From 4e9a33fa403988d64cbd2fa723566bab42eaf6fc Mon Sep 17 00:00:00 2001
From: Oliver Facklam <oliver.facklam.lfgeb@gmail.com>
Date: Sat, 29 Dec 2018 00:31:10 +0100
Subject: [PATCH] userModel.ts

---
 src/app.ts                                   |   6 +-
 src/graphql/connectors/authorisationModel.ts |  19 +++
 src/graphql/connectors/userModel.ts          | 121 +++++++++++++++++++
 src/graphql/typeDefs/actions.graphql         |   6 -
 src/graphql/typeDefs/queries.d.ts            |  22 ++--
 5 files changed, 160 insertions(+), 14 deletions(-)
 create mode 100644 src/graphql/connectors/userModel.ts

diff --git a/src/app.ts b/src/app.ts
index 7694423..ee42104 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -181,6 +181,7 @@ app.post('/login', (req, res, next) => {
 // See: https://www.apollographql.com/docs/apollo-server/features/authentication.html
 import { Context } from './graphql/typeDefs/queries';
 import { AuthorisationModel } from './graphql/connectors/authorisationModel';
+import { UserModel } from './graphql/connectors/userModel';
 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
@@ -202,12 +203,15 @@ const context = async ({ req }): Promise<Context> => {
             console.log(err);
         }
     }
+
+    let authModule = await AuthorisationModel.create(uid);
     
     return {
         request: req,
         user: { uid: uid },
         models: {
-            auth: await AuthorisationModel.create(uid)
+            auth: authModule,
+            user: new UserModel(authModule)
         }
     };
 };
diff --git a/src/graphql/connectors/authorisationModel.ts b/src/graphql/connectors/authorisationModel.ts
index 8064b9a..47ab2c5 100644
--- a/src/graphql/connectors/authorisationModel.ts
+++ b/src/graphql/connectors/authorisationModel.ts
@@ -61,6 +61,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function fetchData
      * @summary Fonction qui recupere toutes les données pour populer les champs a partir de l'uid.
      * @async
      */
@@ -76,6 +77,17 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function getUid
+     * @summary Fonction qui renvoit l'identifiant de l'utilisateur
+     * @return {string} Renvoie l'uid de l'utilisateur du 'context'
+     */
+    getUid(): string {
+        return this.uid;
+    }
+
+    /**
+     * @memberof GraphQL.AuthorisationModel#
+     * @function isConnectedOrOnplatal
      * @summary Fonction qui renvoit si l'utilisateur est connecté ou on-platal
      * @return {boolean} Renvoie true si l'utilisateur est connecté ou on-platal
      */
@@ -85,6 +97,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isAuthenticated
      * @summary Fonction qui renvoit si l'utilisateur est authentifié
      * @return {boolean} Renvoie true si l'utilisateur est authentifié
      */
@@ -94,6 +107,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isViewer
      * @summary Fonction qui renvoit si l'utilisateur est viewer du groupe.
      * @arg {string} gid - Identifiant du groupe.
      * @return {boolean} Renvoie true si l'utilisateur est viewer du groupe.
@@ -109,6 +123,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isMember
      * @summary Fonction qui renvoit si l'utilisateur est membre du groupe.
      * @arg {string} gid - Identifiant du groupe.
      * @return {boolean} Renvoie true si l'utilisateur est membre du groupe.
@@ -124,6 +139,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isMemberOr
      * @summary Fonction qui renvoit si l'utilisateur est membre d'au moins un de ces groupes.
      * @arg {GroupSet} groups - Ensemble de groupes.
      * @return {boolean} Renvoie true si l'utilisateur est membre d'un des groupes
@@ -144,6 +160,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isSpeaker
      * @summary Fonction qui renvoit si l'utilisateur est speaker du groupe.
      * @arg {string} gid - Identifiant du groupe.
      * @return {boolean} Renvoie true si l'utilisateur est speaker du groupe.
@@ -159,6 +176,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isAdmin
      * @summary Fonction qui renvoit si l'utilisateur est admin du groupe.
      * @arg {string} gid - Identifiant du groupe.
      * @return {boolean} Renvoie true si l'utilisateur est admin du groupe.
@@ -174,6 +192,7 @@ export class AuthorisationModel {
 
     /**
      * @memberof GraphQL.AuthorisationModel#
+     * @function isSupervisor
      * @summary Fonction qui renvoit si l'utilisateur est supervisor du groupe.
      * @arg {string} gid - Identifiant du groupe.
      * @return {boolean} Renvoie true si l'utilisateur est supervisor du groupe.
diff --git a/src/graphql/connectors/userModel.ts b/src/graphql/connectors/userModel.ts
new file mode 100644
index 0000000..b819166
--- /dev/null
+++ b/src/graphql/connectors/userModel.ts
@@ -0,0 +1,121 @@
+/**
+ * @file Fonctions qui implémentent les requetes relatives aux utilisateurs
+ * @author ofacklam
+ * @memberof GraphQL
+ */
+
+import { AuthorisationModel } from "./authorisationModel";
+import { User } from "../resolvers/users";
+import { User as UT, userData } from "../../ldap/export/user"
+import { searchTOLArgs, editProfileArgs } from "../typeDefs/queries";
+
+export class UserModel {
+
+    /**
+     * @memberof GraphQL
+     * @class UserModel
+     * @summary Requetes relatives aux utilisateurs.
+     * @classdesc Cette classe contient les méthodes implémentant les requetes relatives aux utilisateurs.
+     * @arg {AuthorisationModel} auth - Le module d'auth
+     */
+    constructor(auth: AuthorisationModel) {
+        this.auth = auth;
+    }
+
+    protected auth: AuthorisationModel;
+
+    /**
+     * @memberof GraphQL.UserModel#
+     * @function getUser
+     * @summary Fonction qui renvoit un utilisateur donné.
+     * @arg {string} uid - Identifiant demandé.
+     * @return {Promise<User>} Renvoie l'utilisateur dont l'identifiant est 'uid'
+     * @async
+     * @rights connectedOrOnplatal
+     */
+    async getUser(uid: string): Promise<User> {
+        if(this.auth.isConnectedOrOnplatal()) {
+            return User.tryCreate(uid);
+        }
+        return null;
+    }
+
+    /**
+     * @memberof GraphQL.UserModel#
+     * @function searchTOL
+     * @summary Fonction qui recherche dans le TOL
+     * @arg {searchTOLArgs} args - les données de recherche
+     * @return {Promise<User[]>} Renvoie une liste d'utilisateurs
+     * @async
+     * @rights connectedOrOnplatal
+     */
+    async searchTOL(args: searchTOLArgs): Promise<User[]> {
+        if(this.auth.isConnectedOrOnplatal()) {
+            const searchData: userData = {
+                givenName: args.givenName,
+                lastName: args.lastName,
+                nickname: args.nickname,
+                nationality: args.nationality,
+                promotion: args.promotion,
+                groups: args.groups,
+                sport: args.sport,
+                phone: args.phone,
+                mail: args.mail,
+                address: args.addresses[0],
+                ips: args.ips
+            }
+            const userList = await UT.search(searchData);
+            return userList.map((uid) => new User(uid));
+        }
+        return null;
+    }
+
+    /**
+     * @memberof GraphQL.UserModel#
+     * @function editProfile
+     * @summary Fonction qui modifie le profil et renvoie l'utilisateur
+     * @arg {editProfileArgs} args - les données a modifier 
+     * @return {Promise<User>} Renvoie l'utilisateur mis a jour
+     * @async
+     * @rights authentified
+     */
+    async editProfile(args: editProfileArgs): Promise<User> {
+        if (this.auth.isAuthenticated()) {
+            let data = await UT.peek(this.auth.getUid());
+
+            //Modify some fields, keep the others
+            let editArgs: userData = {
+                uid: data.uid,
+                groups: data.groups,
+                groupsIsAdmin: data.groupsIsAdmin,
+                password: data.password,
+                givenName: data.givenName,
+                lastName: data.lastName,
+                nickname: args.nickname, // <- this field is modified by user
+                promotion: data.promotion,
+                photo: data.photo,
+                birthdate: data.birthdate,
+                nationality: data.nationality,
+                phone: args.phone, // <- this field is modified
+                address: data.address, // WTF why can't this be changed ????
+                mail: args.mail, // <- this field is modified
+                ips: data.ips,
+                directory: data.directory,
+                login: data.login,
+                readPerm: data.readPerm,
+                writePerm: data.writePerm,
+                forlifes: data.forlifes,
+                sport: data.sport
+            };
+
+            if(await UT.edit(editArgs)) {
+                return new User(data.uid);
+            }
+            else {
+                throw "Modification échouée";
+            }
+        }
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/src/graphql/typeDefs/actions.graphql b/src/graphql/typeDefs/actions.graphql
index 79366fb..784e055 100644
--- a/src/graphql/typeDefs/actions.graphql
+++ b/src/graphql/typeDefs/actions.graphql
@@ -274,10 +274,4 @@ type Mutation {
     takeAdminRights(forGroup: ID!) : Boolean
     releaseAdminRights(forGroup: ID!) : Boolean
 
-    # Log user into the API, replies with a token.
-    login(username: String!, password: String!): String!
-    # Log user out of the API
-    logout(username: String!): Boolean
-    #leave(from : String!) : Boolean
-
 }
diff --git a/src/graphql/typeDefs/queries.d.ts b/src/graphql/typeDefs/queries.d.ts
index 97f96d7..1f6f330 100644
--- a/src/graphql/typeDefs/queries.d.ts
+++ b/src/graphql/typeDefs/queries.d.ts
@@ -1,4 +1,14 @@
 import { AuthorisationModel } from "../connectors/authorisationModel";
+import { UserModel } from "../connectors/userModel";
+
+interface Context {
+    request,
+    user: { uid: string },
+    models: {
+        auth: AuthorisationModel,
+        user: UserModel
+    }
+}
 
 interface searchTOLArgs {
     givenName: string,
@@ -16,10 +26,8 @@ interface searchTOLArgs {
     ips: string[]
 }
 
-interface Context {
-    request,
-    user: { uid: string },
-    models: {
-        auth: AuthorisationModel
-    }
-}
\ No newline at end of file
+interface editProfileArgs {
+    nickname: string,
+    mail: string,
+    phone: string
+}
-- 
GitLab