Modelo User 🚶🏼‍♂️🚶🏻‍♀️

Puesto que vamos a guardar los detalles de usuario en Mongo, vamos a crear un modelo de usuario en Mongoose vamos a guardar este modelo dentro de la carpeta /api/user puesto que también estos registros serán expuestos atraves de una API.

Primero vamos a instalar las dependencias que vamos a necesitar para esta parte.

# Install dependecies
npm i -S crypto 

Schema

Luego de esto vamos crear nuestro modelo

api/user/user.model.js
/**
 * user model
 */
const crypto = require('crypto');
const mongoose = require('mongoose');

const { Schema } = mongoose;

const authTypes = ['github', 'twitter', 'facebook', 'google'];

const AdditionalDataSchema = new Schema({
  address: { type: String, uppercase: true },
  phoneNumber: { type: String },
  country: { type: String, default: 'COLOMBIA', uppercase: true },
  city: { type: String, default: 'MEDELLIN', uppercase: true },
  language: { type: String, default: 'ES', uppercase: true },
  timeZone: { type: String, default: 'America/Bogota' },
  picture: { type: String, lowercase: true, trim: true },
}, { _id: false });

const UserSchema = new Schema({
  name: String,
  email: {
    type: String,
    lowercase: true,
    unique: true,
    trim: true,
    required() {
      if (authTypes.indexOf(this.provider) === -1) {
        return true;
      }
      return false;
    },
  },
  role: { type: String, default: 'user' },
  password: {
    type: String,
    required() {
      if (authTypes.indexOf(this.provider) === -1) {
        return true;
      }
      return false;
    },
  },
  additionalData: AdditionalDataSchema,
  provider: String,
  salt: String,
  google: {},
  github: {},
  passwordResetToken: String,
  passwordResetExpires: Date,
}, { timestamps: true });

UserSchema
  .path('role')
  .validate(value => /admin|manager|user/i.test(value), 'role, assigned role is invalid');

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

Schema Virtual

Los esquemas virtuales son campos adicionales para un modelo dado. Sus valores se pueden configurar de forma manual o automática con la funcionalidad definida. Una propiedad virtual común es el nombre completo de una persona, compuesto por el nombre y apellido del usuario.

Ejemplo: UserSchema.virtual('fullname').get(() => (${this.first} ${this.last}));

Vamos agregar a nuestro archivo api/user/user.model.js el siguiente código:

Schema Validation

La validación de esquema de JSON extiende la validación de documentos de muchas maneras diferentes, incluida la capacidad de imponer esquemas dentro de arrays y evitar que se agreguen atributos no aprobados.

Para nuestro caso de uso vamos adicionar validaciones para el campo email y password con el siguiente código:

Schema Hook

Schema Methods

Recuerda que debes agregar todo a tu archivo.

Last updated

Was this helpful?