Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Problème 4: Référentiel utilisateur

Les instructions suivantes indiquent les modifications à apporter au Prototype de niveau 1 pour atteindre le Prototype de niveau 2.

Etape 1 : Installation

$ npm install --save mongoose

Etape 2 : Connexion à la base de données

Insérer le code suivant dès le début de votre fichier “app.js” pour établir la connexion à la base de données :

const MyMongoose = require('mongoose');

MyMongoose.connect(process.env.MONGOURI,{ useNewUrlParser: true })
.then(() => {
    console.log("Successfully connected to MongoDB.");    
  }).catch(err => {
    console.log('Could not connect to MongoDB.');
    process.exit();
  });

Etape 3: Modèle de données

Le modèle de données permet de formaliser l’objet qui sera manipulé. Insérez le code suivant dans le fichier models/user.js :

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// Première partie
var UserSchema = new Schema({
  username: {
        type: String,
        unique: true,
        required: true
    },
  GitHubId: {
        type: String,
        unique: true,
        required: true
    }
}); 

// Seconde partie
UserSchema.statics.findOrCreate = function findOrCreate(profile, callback){
    var userObj = new this();
    this.findOne({ GitHubId : profile.id},function(err,result){ 
        if(!result){
            // Create a new user if this user is not in the database
            userObj.username = profile.username;
            userObj.GitHubId = profile.id;
            userObj.save(callback);
        }else{
            // Return the user
            callback(err,result);
        }
    });
};

module.exports = mongoose.model('User', UserSchema); 

La première partie permet de définir la structure des données relative à un utilisateur. Pour notre prototype, nous ne conserverons que le pseudo de l’utilisateur et l’identifiant Github. La seconde partie décrit une nouvelle méthode findOrCreate() qui permet de créer automatiquement l’utilisateur s’il n’est pas présent en base données.

Etape 4 : Enregistrement des utilisateurs

Pour cela, il faut modifier la fonction de vérification dans le fichier config/MyPassport.js pour faire appel au modèle de données “Utilisateur”:

// Import User model
const MyUser = require('../models/user.js');

	...
	
// Configure the new GitHub Strategy for Passport
MyPassport.use(new MyGitHubStrategy(

	...

/* Verification function */
  function(accessToken, refreshToken, profile, done) {
    
    MyUser.findOrCreate(profile, function (err, user) {
      
      // If technical error occurs (such as loss of connection with database)
      if (err) {
        return done(err);
      }
      
      // If user doesn't exist (this case should never happen with this Strategy because 
      // a new user will be automatically created)
      if (!user) {
        return done(null, false);
      }
      
      // If everything all right, the user will be authenticated
      return done(null, user);
        
    });
               
  }

La fonction de vérification renvoie désormais l’objet user contenant les données provenant de la base de données. Auparavant, la fonction de vérification renvoyait directement l’objet profile contenant les données provenant de GitHub.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment