diff --git a/db/knex_router.ts b/db/knex_router.ts
index 999fb9b3c8cb778e8b9191329bf07fff8d2b6a39..abdcb4783f8f1fac9d11d4c2d5360d8313a22e7f 100644
--- a/db/knex_router.ts
+++ b/db/knex_router.ts
@@ -8,4 +8,4 @@ const config = require('./knexfile')[environment];
 
 console.log("Running Knex configuration '%s'", environment);
 
-module.exports = require('knex')(config);
+export default require('knex')(config);
diff --git a/src/adminview/admin_router.ts b/src/adminview/admin_router.ts
index 388e943ffa79d1093b996470503debe5d87b8191..931c4fbb6fceb377030d68e777dfe707078bfbfb 100644
--- a/src/adminview/admin_router.ts
+++ b/src/adminview/admin_router.ts
@@ -33,6 +33,8 @@ import flash from 'connect-flash';
 import knex from '../../db/knex_router';
 import { express as graphqlVoyager } from 'graphql-voyager/middleware';
 
+let port = process.env.PORT || 3000;
+
 const whitelist = [
     "magi.karp",
     "mew.two",
@@ -49,7 +51,7 @@ function ensureIsAdmin(returnTo) {
         // ensure that the request was authenticated by passport
         ensureLoggedIn(returnTo);
         // lookup req.user against whitelist of admin users
-        if (req.user.uid in whitelist) {
+        if (req.user && req.user.uid in whitelist) {
             console.log("is an admin");
         } else {
             console.log("is NOT an admin");
@@ -77,8 +79,6 @@ const router = Router();
 //"The flash is a special area of the session used for storing messages. Messages are written to the flash and cleared after being displayed to the user."
 router.use(flash());
 
-let port = process.env.PORT || 3000;
-
 /**
  * @desc Paths pour l'authentification : login, logout, page d'accueil
  * ===================================================================
@@ -131,20 +131,13 @@ router.post('/avlogin',
         failureFlash: true
     }), 
     (req, res) => {
-    // If this function gets called, authentication was successful.
-    // `req.user` contains the authenticated user.
+        // If this function gets called, authentication was successful.
+        // `req.user` contains the authenticated user.
         console.log("POST request to /adminview/avlogin: OK, authenticated by LDAP. req.user: ");
         console.log(req.user);
-        // lookup req.user against whitelist of admin users
-        if (req.user.uid in whitelist) {
-            console.log("is an admin");
-            res.redirect("/adminview/admin");
-        } else {
-            console.log("is NOT an admin");
-            req.flash('error: not an admin');
-            req.logout();
-            res.redirect('/adminview/admin');
-        }
+        // redirect to /admin
+        // in /admin, user will be looked up against whitelist anyway
+        res.redirect('adminview/admin');
     }
 );
 
diff --git a/src/app.ts b/src/app.ts
index 16810e7e0dd7d884f52c9492efee6a5784e11974..c1dcb15d0d162d7d92d056f501a5a3c7d78a04db 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -19,8 +19,8 @@ import schema from './graphql/schema'; // definition du schéma et des resolvers
 import router from './adminview/admin_router';
 // packages pour l'authentification
 import passport from 'passport';
+import './config_passport'; // configure passport, pour l'authentification ldap et pour comment gérer les sessions (serializeUser/deserializeUser)
 import expressSession from 'express-session';
-import cookieParser from 'cookie-parser';
 import cors from 'cors';
 // HTTP request logger
 import morgan from 'morgan';
@@ -29,8 +29,6 @@ import path from 'path';
 // config des paramètres de connexion au LDAP
 import { ldapConfig, credentialsLdapConfig } from './ldap/internal/config';
 
-// configure passport, pour l'authentification ldap et pour comment gérer les sessions (serializeUser/deserializeUser)
-import './config_passport';
 
 /**
  * @desc Création de l'application Express et setup de middlewares basiques
@@ -42,8 +40,6 @@ app.use(bodyParser.json()); //parses bodies of media type "application/json"
 app.use(bodyParser.urlencoded({ //parses bodies of media type "application/x-www-form-urlencoded"
     extended: true //use qs library (see https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions)
 }));
-// parse Cookie header and populate req.cookies with an object keyed by the cookie names
-//app.use(cookieParser()); <-- req.cookies n'est pas utilisé.
 // ne *pas* inclure de header HTTP publicisant que l'application tourne sous Express
 app.disable('x-powered-by');
 // use morgan (HTTP request logger middleware)
@@ -93,9 +89,7 @@ app.use(favicon(path.resolve(__dirname, 'assets', 'favicon.ico')));
 // load data from the session identified by the cookie (if one exists), into req.session
 // on ne manipulera pas req.session directement, on laisser toujours passport le faire pour nous
 app.use(expressSession({
-    //secret: ldapConfig.sessionSecret, <-- wtf? nothing to do with ldap!
     secret: "asdfjklkjfdsasdfjklkljfdsa",
-
 }));
 app.use(passport.initialize());
 //passport.session(): load the user object onto req.user if a serialised user object was found in the req.session
diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql
index dd8a612901ae94ff6eda43612979b5fd961d5fa0..83a91ae2ba31db78c27999b0ce17da43d9a87a0b 100644
--- a/src/graphql/typeDefs/objects.graphql
+++ b/src/graphql/typeDefs/objects.graphql
@@ -16,10 +16,10 @@ Conseils généraux pour toute tentative d'amélioration du schéma :
     - choisir des noms clairs, précis, concis.
     - commenter lorsque c'est pertinent, également en étant clair, précis, concis.
 
-@author akka vodol, kadabra
-"""
+@author akka vodol, kadabra, ofacklam
+
+
 
-"""
 Un utilisateur
 """
 type User {
@@ -69,6 +69,22 @@ interface Group {
 
     # Administrateurs, à contacter directement en cas de problème
     admins: [User]
+
+    # Activité publique du groupe
+    frontPage: String # page d'accueil du groupe, en markdown
+    questions: [Question]
+    answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse
+    
+    # Activité interne
+    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    announcementsToGroup: [Announcement] # annonces adressées au groupe
+    eventsFromGroup: [Event]
+    eventsToGroup: [Event]
+    privatePosts: [PrivatePost]
+    postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
+
+    # Graphe organique
+    visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
 }
 
 # Le groupe de base, dont les membres sont des utilisateurs : binets, Kès...
@@ -86,14 +102,6 @@ type SimpleGroup implements Group {
     speakers: [User]
     admins: [User]
     likers: [User]
-    
-    # Graphe organique des groupes
-    parent: SimpleGroup # Groupe parent
-    children: [SimpleGroup] # Groupes enfants
-    memberOfMeta: [MetaGroup]
-    visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
-
-    school: String # École d'origine du groupe (pour information)
 
     # Activité publique du groupe
     frontPage: String # page d'accueil du groupe, en markdown
@@ -107,6 +115,14 @@ type SimpleGroup implements Group {
     eventsToGroup: [Event]
     privatePosts: [PrivatePost]
     postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
+    
+    # Graphe organique des groupes
+    parent: SimpleGroup # Groupe parent
+    children: [SimpleGroup] # Groupes enfants
+    memberOfMeta: [MetaGroup]
+    visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
+
+    school: String # École d'origine du groupe (pour information)
 }
 
 # Un groupe dont les membre sont d'autres groupes
@@ -123,10 +139,25 @@ type MetaGroup implements Group {
     admins: [User]
     members: [SimpleGroup] # Par choix de paradigme, on veut éviter d'avoir des méta-méta-groupes.
 
+    # Activité publique du groupe
+    frontPage: String # page d'accueil du groupe, en markdown
+    questions: [Question]
+    answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse
+    
+    # Activité interne
+    announcementsFromGroup: [Announcement] # annonces écrites par le groupe
+    announcementsToGroup: [Announcement] # annonces adressées au groupe
+    eventsFromGroup: [Event]
+    eventsToGroup: [Event]
+    privatePosts: [PrivatePost]
+    postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown
+
+    # Graphe organique
     visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique
 }
 
-union AuthorUnion = Group | [Group] | User
+# union AuthorUnion = Group | [Group] | User
+# il n'est pas possible de faire des unions avec des listes d'objets...
 
 """
 L'interface Message représente toute information que veut communiquer un groupe ou un user.
@@ -142,7 +173,7 @@ interface Message {
     title: String!
     content: String!
 
-    authors: AuthorUnion
+    #authors: AuthorUnion
     recipient: Group
 }
 
diff --git a/src/graphql/typeDefs/queries.d.ts b/src/graphql/typeDefs/queries.d.ts
index a66b57b88e349e0500ba9668821fe37f5e19d849..eb4096b19cb8ca7ab1bd83d439c4fdadcab9dadc 100644
--- a/src/graphql/typeDefs/queries.d.ts
+++ b/src/graphql/typeDefs/queries.d.ts
@@ -10,6 +10,6 @@ interface searchTOLArgs {
     sport: string,
     phone: string,
     mail: string,
-    address: string,
-    ip: string[]
+    addresses: string[],
+    ips: string[]
 }
\ No newline at end of file