Bienvenidos sean a este post, hoy veremos la primera parte de la nueva aplicacion.
En el post anterior explicamos basicamente que es un microservicio asi como la metodologia que usaremos para administrar la informacion de los usuarios de la aplicacion notas y que por el momento solo sera una aplicacion aparte de notas, en el post anterior establecimos la base y los modulos que iremos utilizando para las distintas tareas, en caso de no tenerlo les dejo un link donde podran descargarlo:
Una vez descargado simplemente extraigan el directorio en el PC y ya tenemos la aplicacion lista para ser usada, como dijimos en el titulo crearemos el modelo para la informacion de los usuarios, es decir el encargado de manejar los datos del usuario en las bases, y dado que Sequelize nos brinda una gran flexibilidad para esto, como vimos en este post, lo volveremos a usar en conjunto con yaml para pasar las configuraciones de conexion, para esta ocasion no vamos a hacer algo tan complejo como vimos en este post porque no necesitamos manejar tantos temas sino que tendremos una administracion mas simple, con esto comentado podemos a crear el archivo que sera el modelo y para ello haran un nuevo archivo con el nombre de users-sequelizar.mjs y le agregaremos el siguiente codigo:
users-sequelizar.mjs
import Sequelize from 'sequelize';
import { default as jsyaml } from 'js-yaml';
import { promises as fs } from 'fs';
import * as util from 'util';
import DBG from 'debug';
const log = DBG('users:model-users');
const error = DBG('users:error');
var sequelz;
export class SQUser extends Sequelize.Model {}
export async function conectarDB() {
if (sequelz) return sequelz;
const textoyaml = await fs.readFile(process.env.SEQUELIZE_CONNECT,
'utf8');
const params = await jsyaml.safeLoad(textoyaml, 'utf8');
if (typeof process.env.SEQUELIZE_BASE !== 'undefined'
&& process.env.SEQUELIZE_BASE !== '') {
params.dbname = process.env.SEQUELIZE_BASE;
}
if (typeof process.env.SEQUELIZE_USUARIO !== 'undefined'
&& process.env.SEQUELIZE_USUARIO !== '') {
params.username = process.env.SEQUELIZE_USUARIO;
}
if (typeof process.env.SEQUELIZE_CLAVE !== 'undefined'
&& process.env.SEQUELIZE_CLAVE !== '') {
params.password = process.env.SEQUELIZE_CLAVE;
}
if (typeof process.env.SEQUELIZE_HOST !== 'undefined'
&& process.env.SEQUELIZE_HOST !== '') {
params.host = process.env.SEQUELIZE_HOST;
}
if (typeof process.env.SEQUELIZE_PORT !== 'undefined'
&& process.env.SEQUELIZE_PORT !== '') {
params.port = process.env.SEQUELIZE_PORT;
}
if (typeof process.env.SEQUELIZE_DIALECT !== 'undefined'
&& process.env.SEQUELIZE_DIALECT !== '') {
params.dialect = process.env.SEQUELIZE_DIALECT;
}
log('Parametros Sequelize ' + util.inspect(params));
sequelz = new Sequelize(params.dbname,
params.username,
params.password, {
dialect: params.dialect,
storage: params.storage,
port: params.port,
host: params.host
});
SQUser.init({
usuario: { type: Sequelize.STRING, unique: true },
clave: Sequelize.STRING,
proveedor: Sequelize.STRING,
apellido: Sequelize.STRING,
nombre: Sequelize.STRING,
email: Sequelize.STRING(2048),
foto: Sequelize.STRING(2048)
}, {
sequelize: sequelz,
modelName: 'SQUser'
});
await SQUser.sync();
}
Este es un codigo muy parecido a lo que vimos en este post pero con algunas diferencias, al principio importaremos todos los modulos que necesitaremos entre ellos a Sequelize que se encargara de la conexion de la base de datos, a yaml para poder manipular los archivos de tipo yaml, el modulo util para utilizar el metodo inspect, las promesas para manejarlos y todo lo necesario para la depuracion, despues declaramos una variable y una nueva clase con la posibilidad de exportarla que sera heredera de la clase Model de Sequelize, esto nos sera util para ciertas tareas que veremos en un momento, despues tenemos la funcion que se encarga de conectar las bases.
Esta funcion que tambien podremos exportar primero chequearemos si la variable que declaramos anteriormente contiene algun objeto o dato, en caso de ser verdadero significa que ya estamos conectados y saldremos de la funcion devolviendo el objeto, el siguiente objeto se encargara de establecer el archivo yaml, el posterior a este tomara al anterior y lo usara para examinar el contenido de este y asi obtener todos los parametros, despues tenemos una serie de condicionales donde verificaremos si ciertas variables de entorno tienen algun valor y lo usaremos para establecer la variable correspondiente a la cargada en params, despues mediante log, funcion que definimos al comienzo desde debug, mostraremos los valores almacenados en params.
Lo siguiente sera tomar la variable que declaramos, sequelz, y en este almacenaremos el objeto de tipo Sequelize donde le pasaremos todos los parametros obtenidos, observen que en los tres primeros casos pasamos la base, usuario y password y luego pasaremos los distintos parametros para el tipo de conexion, host, port, etc, con el objeto creado solo nos resta iniciar nuestra base, para ello usaremos a init mediante la clase SQUser y observen los campos que creamos donde usuario sera unico, el resto son simplemente datos para identificarlo de mejor forma, tambien le pasamos un parametro llamado sequelize y le pasamos el objeto anterior con todos los datos de conexion y la clase para que sea el modelo, y por ultimo usamos a sync para conectarnos finalmente a la base de datos, a continuacion agreguemos el siguiente codigo:
export function paramsUser(req) {
return {
usuario: req.params.usuario,
clave: req.params.clave,
proveedor: req.params.proveedor,
apellido: req.params.apellido,
nombre: req.params.nombre,
email: JSON.stringify(req.params.email),
foto: JSON.stringify(req.params.foto)
};
}
Esta funcion nos permitira tomar todos los datos que le pasemos como argumento en la estructura que se necesita para poder cargar correctamente los datos en la base, puede parecer poco util pero en el proximo post veremos para que sirve, pasemos a agregar la siguiente funcion despues de esta:
export function clarificaUser(user) {
var ret = {
id: user.usuario,
usuario: user.usuario,
proveedor: user.proveedor,
apellido: user.apellido,
nombre: user.nombre,
};
try {
ret.email = JSON.parse(user.email);
} catch(e) { ret.email = []; }
try {
ret.foto = JSON.parse(user.foto);
} catch(e) { ret.foto = []; }
return ret;
}
Esta funcion se encarga de «limpiar» los datos obtenidos de un usuario, porque puede suceder que nos envie mas informacion de la debida, observen tambien que los datos basicos los pasamos a un objeto con distintas propiedades del mismo nombre, pero despues usamos un par de try/catch donde verificaremos los datos de tipo JSON donde si ocurre un error los deja como array vacio, ahora veremos donde lo utilizaremos, agreguemos la siguiente funcion:
export async function encuentraUser(usuario) {
let user = await SQUser.findOne({ where: { usuario: usuario }});
user = user ? clarificaUser(user) : undefined;
return user;
}
Esta funcion nos servira para buscar un solo usuario, el valor recibido lo pasaremos para la propiedad where ya que el metodo findOne equivale a ejecutar un SELECT, luego tenemos el objero creado donde mediante un operador condicional verificamos si devolvio los valores, en caso de ser verdad le pasamos la funcion anterior a este objeto y en caso contrario sera undefined para finalmente devolver el objeto, agreguemos la ultima funcion:
export async function crearUser(req) {
let creador = paramsUser(req);
await SQUser.create(creador);
const resultado = await encuentraUser(req.params.usuario);
return resultado;
}
Esta funcion nos permite crear un usuario, primero definiremos un objeto donde pasaremos todos los parametros del objeto que le informemos, lo siguiente sera usar a la clase heredera y mediante create y el objeto anterior agregara el nuevo usuario, despues definiremos un nuevo objeto donde buscaremos los datos del usuario que creamos mediante la funcion encuentraUser y lo devolveremos, con esto terminariamos con nuestro archivo de modelo y como comentamos al comienzo ya tenemos todo lo necesario, para finalizar debemos crear un nuevo archivo con el nombre de sequelizar-sqlite.yaml y le agregaremos el siguiente codigo:
sequelizar-sqlite.yaml
dbname: users
username:
password:
params:
dialect: sqlite
storage: users-sequelizar.sqlite3
Como pueden ver es muy parecido a lo que hicimos en este post donde pasamos los parametros necesarios para nuestra base en sqlite3, con esto ya tenemos nuestro model y conexion preparada pero todavia nos falta un tema mas como es el servidor, antes de finalizar les dejo un link con todos los archivos del proyecto y los creado en este post:
En resumen, hoy hemos creado el modelo de nuestro microservicio de administracion de usuarios, este se encargara de conectarnos a la base de datos, asi como tambien crear la tabla en caso de no existir, tambien hemos creado unas funciones basicas para poder encontrar algun usuario en la tabla, crearlo en la tabla, obtener solamente sus paramentros y poder limpiar la informacion obtenida del servidor, pero esto es el comienzo ya se va a poner divertido, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
