diff --git a/sigma-back-dev.service b/sigma-back-dev.service
new file mode 100644
index 0000000000000000000000000000000000000000..367b9e9b2ac64aaed5288df496abfbf336d87944
--- /dev/null
+++ b/sigma-back-dev.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Sigma-back-dev
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+Environment=NODE_ENV=development
+WorkingDirectory=/opt/sigma-back-dev
+ExecStart=/usr/bin/node build/bundle.js
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/src/graphql/typeDefs/actions_wish_list.gql b/src/graphql/typeDefs/actions_wish_list.gql
index 952a3739f07c9f3f72f8a0c4378dd00f1d04ed22..30e560e5a8edc55abbcdeb5c0c9300f0c3909e87 100644
--- a/src/graphql/typeDefs/actions_wish_list.gql
+++ b/src/graphql/typeDefs/actions_wish_list.gql
@@ -1,144 +1,159 @@
+// ce fichier en .gql sert juste a forcer VSCode a colorier correctement le langage graphQL.
+// son contenu sera copie dans actions.js tout simplement
+
+/** 
+ * @file définit les types query et mutation, points d'entree du schéma graphQL. ce fichier est la wish list de kadabra (qui veut avoir un schema clair pour travailler sereinement sur le front)
+ * @author akka vodol, kadabra
+*/
+
+// hawkspar->akka ; pas clair
+
+const RootQuery = `
+    # Requêtes
+
+    type Query {
+        # User queries de base
+        user(uid:ID!): User
 
-# Query root type.
-type Query {
-    # User queries de base
-    user(uid:ID!): User
-
-    # Group queries de base
-    group(uid:ID!): Group
-    simpleGroup(uid:ID!): SimpleGroup
-    metaGroup(uid:ID!): MetaGroup
-
-    # Message queries de base
-    message(id:ID!): Message
-    announcement(id:ID!): Announcement
-    event(id:ID!): Event
-    privatePost(id:ID!): PrivatePost
-    question(id:ID!): Question
-    answer(id:ID!): Answer
-
-    # Request queries de base
-    request(id:ID!): Request
-    userJoinGroupRequest(id:ID!): UserJoinGroup
-    groupCoauthorEventRequest(id:ID!): GroupCoauthorEvent
-
-
-
-    # Messages créés par un AuthorUnion=Group|[Group]|User
-    messagesFromGroup(uid:ID!): [Message]
-    announcementsFromGroup(uid:ID!): [Announcement]
-    eventsFromGroup(uid:ID!): [Event]
-    privatepostsFromUser(uid:ID!): [Post]
-    questionsFromUser(uid:ID!): [Question]
-    answersFromGroup(uid:ID!): [Answer]
-
-    # Messages adressés à un Group
-    messagesToGroup(uid:ID!): [Message]
-    announcementsToGroup(uid:ID!): [Announcement]
-    eventsToGroup(uid:ID!): [Event]
-    privatepostsToGroup(uid:ID!): [Post]
-    questionsToGroup(uid:ID!): [Question]
-    answersToGroup(uid:ID!): [Answer]
-
-
-
-    # Toutes les Requests auxquelles un groupe doit répondre
-    requestsToGroup(uid:ID!): [Request]
-    userJoinGroupRequestsToGroup(id:ID!): UserJoinGroup
-    groupCoauthorEventRequestsToGroup(id:ID!): GroupCoauthorEvent
-
-
-
-    # Tous les xxx visibles par un utilisateur
-    allGroups(uid:ID!): [Group]
-    allSimpleGroups(uid:ID!): [SimpleGroup]
-    allMetaGroups(uid:ID!): [MetaGroup]
-    
-    allMessages(uid:ID!): [Message]
-    allAnnouncements(uid:ID!): [Announcement]
-    allEvents(uid:ID!): [Event]
-    
-
-
-    # TOL
-    searchTOL(
-        givenName: String,
-        lastName: String,
-        nickname: String,
-        nationality: String,
-        school: String,
-        promotion: String,
-        groups: String,
-        studies: String,
-        sport: String,
-        phone: String,
-        mail: String,
-        address: String,
-        ip: String
-    ): [User!]
-
-}
-
-# Mutations
-type Mutation {
-    # Par rapport à un groupe donné, un user peut avoir différents niveaux de droits :
-    # none : aucun droit (typiquement, une connection ou l'utilisateur ne s'est pas authentifie)
-    # viewer : le user sait que le groupe existe et a accès aux infos de base, mais rien de plus
-    # member : le user est membre du groupe et a acces aux Message dont le groupe est auteur ou destinataire
-    # speaker : le user peut parler au nom du groupe. Il a le droit de publier des annonces et d'organiser des évènements
-    # admin : le user a tous les droits sur le groupe
-
-    # Viewer mutations
-    requestJoin(userid: ID!, groupuid: ID!): Boolean
-
-
-    # Member mutations
-    leave(userid: ID!, groupuid: ID!): Boolean
-    postInGroup(userid: ID!, groupuid: ID!, postContent: String)
-
-
-
-    # Speaker mutations
-
-    writeAnnouncement(
-        from: uid!,
-        to: [uid!],
-        title: String,
-        date: String,
-        content: String
-    )
-    writeEvent(
-        from: ID!,
-        to: [uid!],
-        title: String,
-        date: String,
-        content:String
-    )
-
-
-
-    # Admin mutations
-
-    createSubgroup(
-        from: ID!,
-        newUid: ID,
-        name: String!,
-        website: String,
-        description: String,
-        school: String
-    ): Group
-
-    addUser(userid: ID!, groupuid: ID!): User
-    removeUser(userid: String!, groupuid: ID!): User
-    addAdmin(userid: String!, groupuid: ID!): User
-    removeAdmin(userid: String!, groupuid: ID!): User
-
-    editGroup(
-        from: String!,
-        name: String,
-        website: String,
-        description: String,
-        school: String
-    ): Group
-
-}
+        # Group queries de base
+        group(uid:ID!): Group
+        simpleGroup(uid:ID!): SimpleGroup
+        metaGroup(uid:ID!): MetaGroup
+
+        # Message queries de base
+        message(id:ID!): Message
+        announcement(id:ID!): Announcement
+        event(id:ID!): Event
+        privatePost(id:ID!): PrivatePost
+        question(id:ID!): Question
+        answer(id:ID!): Answer
+
+        # Request queries de base
+        request(id:ID!): Request
+        userJoinGroupRequest(id:ID!): UserJoinGroup
+        groupCoauthorEventRequest(id:ID!): GroupCoauthorEvent
+
+
+
+        # Messages créés par un AuthorUnion=Group|[Group]|User
+        messagesFromGroup(uid:ID!): [Message]
+        announcementsFromGroup(uid:ID!): [Announcement]
+        eventsFromGroup(uid:ID!): [Event]
+        privatepostsFromUser(uid:ID!): [Post]
+        questionsFromUser(uid:ID!): [Question]
+        answersFromGroup(uid:ID!): [Answer]
+
+        # Messages adressés à un Group
+        messagesToGroup(uid:ID!): [Message]
+        announcementsToGroup(uid:ID!): [Announcement]
+        eventsToGroup(uid:ID!): [Event]
+        privatepostsToGroup(uid:ID!): [Post]
+        questionsToGroup(uid:ID!): [Question]
+        answersToGroup(uid:ID!): [Answer]
+
+
+
+        # Toutes les Requests auxquelles un groupe doit répondre
+        requestsToGroup(uid:ID!): [Request]
+        userJoinGroupRequestsToGroup(id:ID!): UserJoinGroup
+        groupCoauthorEventRequestsToGroup(id:ID!): GroupCoauthorEvent
+
+
+
+        # Tous les xxx visibles par un utilisateur
+        allGroups(uid:ID!): [Group]
+        allSimpleGroups(uid:ID!): [SimpleGroup]
+        allMetaGroups(uid:ID!): [MetaGroup]
+        
+        allMessages(uid:ID!): [Message]
+        allAnnouncements(uid:ID!): [Announcement]
+        allEvents(uid:ID!): [Event]
+        
+
+
+        # TOL
+        searchTOL(
+            givenName: String,
+            lastName: String,
+            nickname: String,
+            nationality: String,
+            school: String,
+            promotion: String,
+            groups: String,
+            studies: String,
+            sport: String,
+            phone: String,
+            mail: String,
+            address: String,
+            ip: String
+        ): [User!]
+
+    }
+`;
+
+const RootMutation = `
+    # Mutations
+
+    type Mutation {
+        # Par rapport à un groupe donné, un user peut avoir différents niveaux de droits :
+        # none : aucun droit (typiquement, une connection ou l'utilisateur ne s'est pas authentifie)
+        # viewer : le user sait que le groupe existe et a accès aux infos de base, mais rien de plus
+        # member : le user est membre du groupe et a acces aux Message dont le groupe est auteur ou destinataire
+        # speaker : le user peut parler au nom du groupe. Il a le droit de publier des annonces et d'organiser des évènements
+        # admin : le user a tous les droits sur le groupe
+
+        # Viewer mutations
+        requestJoin(userid: ID!, groupuid: ID!): Boolean
+
+
+        # Member mutations
+        leave(userid: ID!, groupuid: ID!): Boolean
+        postInGroup(userid: ID!, groupuid: ID!, postContent: String)
+
+
+
+        # Speaker mutations
+
+        writeAnnouncement(
+            from: uid!,
+            to: [uid!],
+            title: String,
+            date: String,
+            content: String
+        )
+        writeEvent(
+            from: ID!,
+            to: [uid!],
+            title: String,
+            date: String,
+            content:String
+        )
+
+
+
+        # Admin mutations
+
+        createSubgroup(
+            from: ID!,
+            newUid: ID,
+            name: String!,
+            website: String,
+            description: String,
+            school: String
+        ): Group
+
+        addUser(userid: ID!, groupuid: ID!): User
+        removeUser(userid: String!, groupuid: ID!): User
+        addAdmin(userid: String!, groupuid: ID!): User
+        removeAdmin(userid: String!, groupuid: ID!): User
+
+        editGroup(
+            from: String!,
+            name: String,
+            website: String,
+            description: String,
+            school: String
+        ): Group
+
+    }
+`;
\ No newline at end of file
diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql
index abe7ba890957a49f400cd4b5d49203091a60e43d..80641023dc6a3a2107322f6a72f0f62ded36e8ca 100644
--- a/src/graphql/typeDefs/objects.graphql
+++ b/src/graphql/typeDefs/objects.graphql
@@ -1,3 +1,5 @@
+// hawkspar->all ; doc ?
+
 # Utilisateurs
 type User {
     # Prénom de l'utilisateur
diff --git a/src/ldap/users.ts b/src/ldap/users.ts
index 779336fa8ad32e83266f5d0c1c23c548b80e2c51..2cc7461e7b6567cc4596dd6e97a94e339b291905 100644
--- a/src/ldap/users.ts
+++ b/src/ldap/users.ts
@@ -386,7 +386,8 @@ export class User extends Open {
             // Surcharge des champs à modifier selon data
             Object.keys(data).forEach(key => {
                 // Some fields the user cannot change (groups and groupsIsAdmin must be changed through addGroupMember and addGroupAdmin in Admin)
-                if (!['readPerm','writePerm','forlifes','ips','groups','groupsIsAdmin'].includes(key)) { profil[key]=data[key]; }
+                var unchangeables = ['readPerm','writePerm','forlifes','ips','groups','groupsIsAdmin'];
+                if (!unchangeables.includes(key)) { profil[key]=data[key]; }
             });
             // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             // TBM : rajouter god passwd. Moche mais bonne façon de faire