Skip to content
Snippets Groups Projects
Commit 1f2e9caf authored by Olivér FACKLAM's avatar Olivér FACKLAM
Browse files

objects.graphql + amélioration admin_view

parent beabc9ac
No related branches found
No related tags found
No related merge requests found
...@@ -8,4 +8,4 @@ const config = require('./knexfile')[environment]; ...@@ -8,4 +8,4 @@ const config = require('./knexfile')[environment];
console.log("Running Knex configuration '%s'", environment); console.log("Running Knex configuration '%s'", environment);
module.exports = require('knex')(config); export default require('knex')(config);
...@@ -33,6 +33,8 @@ import flash from 'connect-flash'; ...@@ -33,6 +33,8 @@ import flash from 'connect-flash';
import knex from '../../db/knex_router'; import knex from '../../db/knex_router';
import { express as graphqlVoyager } from 'graphql-voyager/middleware'; import { express as graphqlVoyager } from 'graphql-voyager/middleware';
let port = process.env.PORT || 3000;
const whitelist = [ const whitelist = [
"magi.karp", "magi.karp",
"mew.two", "mew.two",
...@@ -49,7 +51,7 @@ function ensureIsAdmin(returnTo) { ...@@ -49,7 +51,7 @@ function ensureIsAdmin(returnTo) {
// ensure that the request was authenticated by passport // ensure that the request was authenticated by passport
ensureLoggedIn(returnTo); ensureLoggedIn(returnTo);
// lookup req.user against whitelist of admin users // 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"); console.log("is an admin");
} else { } else {
console.log("is NOT an admin"); console.log("is NOT an admin");
...@@ -77,8 +79,6 @@ const router = Router(); ...@@ -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." //"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()); router.use(flash());
let port = process.env.PORT || 3000;
/** /**
* @desc Paths pour l'authentification : login, logout, page d'accueil * @desc Paths pour l'authentification : login, logout, page d'accueil
* =================================================================== * ===================================================================
...@@ -131,20 +131,13 @@ router.post('/avlogin', ...@@ -131,20 +131,13 @@ router.post('/avlogin',
failureFlash: true failureFlash: true
}), }),
(req, res) => { (req, res) => {
// If this function gets called, authentication was successful. // If this function gets called, authentication was successful.
// `req.user` contains the authenticated user. // `req.user` contains the authenticated user.
console.log("POST request to /adminview/avlogin: OK, authenticated by LDAP. req.user: "); console.log("POST request to /adminview/avlogin: OK, authenticated by LDAP. req.user: ");
console.log(req.user); console.log(req.user);
// lookup req.user against whitelist of admin users // redirect to /admin
if (req.user.uid in whitelist) { // in /admin, user will be looked up against whitelist anyway
console.log("is an admin"); res.redirect('adminview/admin');
res.redirect("/adminview/admin");
} else {
console.log("is NOT an admin");
req.flash('error: not an admin');
req.logout();
res.redirect('/adminview/admin');
}
} }
); );
......
...@@ -19,8 +19,8 @@ import schema from './graphql/schema'; // definition du schéma et des resolvers ...@@ -19,8 +19,8 @@ import schema from './graphql/schema'; // definition du schéma et des resolvers
import router from './adminview/admin_router'; import router from './adminview/admin_router';
// packages pour l'authentification // packages pour l'authentification
import passport from 'passport'; 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 expressSession from 'express-session';
import cookieParser from 'cookie-parser';
import cors from 'cors'; import cors from 'cors';
// HTTP request logger // HTTP request logger
import morgan from 'morgan'; import morgan from 'morgan';
...@@ -29,8 +29,6 @@ import path from 'path'; ...@@ -29,8 +29,6 @@ import path from 'path';
// config des paramètres de connexion au LDAP // config des paramètres de connexion au LDAP
import { ldapConfig, credentialsLdapConfig } from './ldap/internal/config'; 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 * @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" ...@@ -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" 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) 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 // ne *pas* inclure de header HTTP publicisant que l'application tourne sous Express
app.disable('x-powered-by'); app.disable('x-powered-by');
// use morgan (HTTP request logger middleware) // use morgan (HTTP request logger middleware)
...@@ -93,9 +89,7 @@ app.use(favicon(path.resolve(__dirname, 'assets', 'favicon.ico'))); ...@@ -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 // 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 // on ne manipulera pas req.session directement, on laisser toujours passport le faire pour nous
app.use(expressSession({ app.use(expressSession({
//secret: ldapConfig.sessionSecret, <-- wtf? nothing to do with ldap!
secret: "asdfjklkjfdsasdfjklkljfdsa", secret: "asdfjklkjfdsasdfjklkljfdsa",
})); }));
app.use(passport.initialize()); app.use(passport.initialize());
//passport.session(): load the user object onto req.user if a serialised user object was found in the req.session //passport.session(): load the user object onto req.user if a serialised user object was found in the req.session
......
...@@ -16,10 +16,10 @@ Conseils généraux pour toute tentative d'amélioration du schéma : ...@@ -16,10 +16,10 @@ Conseils généraux pour toute tentative d'amélioration du schéma :
- choisir des noms clairs, précis, concis. - choisir des noms clairs, précis, concis.
- commenter lorsque c'est pertinent, également en étant clair, 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 Un utilisateur
""" """
type User { type User {
...@@ -69,6 +69,22 @@ interface Group { ...@@ -69,6 +69,22 @@ interface Group {
# Administrateurs, à contacter directement en cas de problème # Administrateurs, à contacter directement en cas de problème
admins: [User] 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... # Le groupe de base, dont les membres sont des utilisateurs : binets, Kès...
...@@ -86,14 +102,6 @@ type SimpleGroup implements Group { ...@@ -86,14 +102,6 @@ type SimpleGroup implements Group {
speakers: [User] speakers: [User]
admins: [User] admins: [User]
likers: [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 # Activité publique du groupe
frontPage: String # page d'accueil du groupe, en markdown frontPage: String # page d'accueil du groupe, en markdown
...@@ -107,6 +115,14 @@ type SimpleGroup implements Group { ...@@ -107,6 +115,14 @@ type SimpleGroup implements Group {
eventsToGroup: [Event] eventsToGroup: [Event]
privatePosts: [PrivatePost] privatePosts: [PrivatePost]
postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown 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 # Un groupe dont les membre sont d'autres groupes
...@@ -123,10 +139,25 @@ type MetaGroup implements Group { ...@@ -123,10 +139,25 @@ type MetaGroup implements Group {
admins: [User] admins: [User]
members: [SimpleGroup] # Par choix de paradigme, on veut éviter d'avoir des méta-méta-groupes. 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 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. L'interface Message représente toute information que veut communiquer un groupe ou un user.
...@@ -142,7 +173,7 @@ interface Message { ...@@ -142,7 +173,7 @@ interface Message {
title: String! title: String!
content: String! content: String!
authors: AuthorUnion #authors: AuthorUnion
recipient: Group recipient: Group
} }
......
...@@ -10,6 +10,6 @@ interface searchTOLArgs { ...@@ -10,6 +10,6 @@ interface searchTOLArgs {
sport: string, sport: string,
phone: string, phone: string,
mail: string, mail: string,
address: string, addresses: string[],
ip: string[] ips: string[]
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment