Skip to content
Snippets Groups Projects
Commit da23daa7 authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

[ci skip] :pencil: Update comments in reqQueryFields

parent 34f49cf8
No related branches found
No related tags found
1 merge request!116Release v1.0.0
Pipeline #
...@@ -6,13 +6,38 @@ const _ = require('lodash'); ...@@ -6,13 +6,38 @@ const _ = require('lodash');
class ReqQueryFields { class ReqQueryFields {
constructor(fields = {}, fieldValues = {}) { constructor(fields = {}, fieldValues = {}) {
// Exemplo de requisição: `/api/v1/enrollments?dims=state,region,location`
// Parâmetros no campo query da requisição. // Parâmetros no campo query da requisição.
// Exemplo de field: // Exemplo de field:
// ```js
// { // {
// name: 'dims', // name: 'dims',
// field: true, // field: true,
// where: false // where: false
// } // }
// ```
// Array de valores aceitos pelo campo.
// Exemplo de valor:
// ```
// {
// name: 'location',
// table: 'localizacao',
// tableField: 'descricao'
// resultField: 'location_name',
// where: {
// relation: '=',
// type: 'integer',
// field: 'id_localizacao',
// table: 'turma'
// },
// join: {
// primary: 'pk_localizacao_id',
// foreign: 'id_localizacao',
// foreignTable: 'turma'
// }
// }
// ```
this.fields = fields; this.fields = fields;
this.fieldValues = fieldValues; this.fieldValues = fieldValues;
} }
...@@ -20,12 +45,14 @@ class ReqQueryFields { ...@@ -20,12 +45,14 @@ class ReqQueryFields {
addField(field) { addField(field) {
// Parâmetro no campo query da requisição. // Parâmetro no campo query da requisição.
// Exemplo de field: // Exemplo de field:
// ```
// { // {
// name: 'dims', // name: 'dims',
// field: true, // field: true,
// where: false, // where: false,
// fieldValues: {} // fieldValues: {}
// } // }
// ```
if(typeof this.fields[field.name] === 'undefined') { if(typeof this.fields[field.name] === 'undefined') {
log.debug("added field "+field.name); log.debug("added field "+field.name);
this.fields[field.name] = field; this.fields[field.name] = field;
...@@ -34,8 +61,9 @@ class ReqQueryFields { ...@@ -34,8 +61,9 @@ class ReqQueryFields {
} }
addValue(fieldValue) { addValue(fieldValue) {
// Array de valores aceitos pelo campo // Valor aceito por **todos** os campos.
// Exemplo de valor: // Exemplo de valor:
// ```
// { // {
// name: 'location', // name: 'location',
// table: 'localizacao', // table: 'localizacao',
...@@ -53,7 +81,7 @@ class ReqQueryFields { ...@@ -53,7 +81,7 @@ class ReqQueryFields {
// foreignTable: 'turma' // foreignTable: 'turma'
// } // }
// } // }
// ```
if(typeof this.fieldValues[fieldValue.name] === 'undefined') { if(typeof this.fieldValues[fieldValue.name] === 'undefined') {
this.fieldValues[fieldValue.name] = fieldValue; this.fieldValues[fieldValue.name] = fieldValue;
log.debug("added value "+fieldValue.name); log.debug("added value "+fieldValue.name);
...@@ -62,7 +90,9 @@ class ReqQueryFields { ...@@ -62,7 +90,9 @@ class ReqQueryFields {
} }
addValueToField(fieldValue, field) { addValueToField(fieldValue, field) {
// Valor aceito **apenas** pelo campo `field`.
if(typeof this.fields[field] === 'undefined') { if(typeof this.fields[field] === 'undefined') {
// Se o campo não existe, lança uma exception
throw 'No field with name ' +field+ ' defined'; throw 'No field with name ' +field+ ' defined';
} }
if(typeof this.fields[field].values === 'undefined') { if(typeof this.fields[field].values === 'undefined') {
...@@ -76,47 +106,56 @@ class ReqQueryFields { ...@@ -76,47 +106,56 @@ class ReqQueryFields {
} }
parse() { parse() {
// Faz o parse dos valores que vem na requisição para objetos.
return (req, res, next) => { return (req, res, next) => {
// "Foreach" nos campos aceitos
Object.keys(this.fields).map((key, index) => { Object.keys(this.fields).map((key, index) => {
let params = []; let params = [];
// f é o campo
let f = this.fields[key]; let f = this.fields[key];
log.debug('f'); log.debug('f');
log.debug(f); log.debug(f);
// Unimos os valores aceitos globalmente com os aceitos apenas pelo parâmetro // Unimos os valores parametros globalmente com os aceitos apenas pelo campo
let values = _.merge(this.fieldValues, f.values); let values = _.merge(this.fieldValues, f.values);
// Fazemos um foreach nos parametros aceitos
Object.keys(values).map((k, i) => { Object.keys(values).map((k, i) => {
let value = values[k]; let value = values[k];
log.debug('value'); log.debug('value');
log.debug(value); log.debug(value);
// Pushamos o parametro
params.push(value.name); params.push(value.name);
}); });
let queryField = f.name; let queryField = f.name;
let arrayOfParams = params; let arrayOfParams = params;
// Criamos o atributo com o nome do **campo** no objeto `req` (nome do campo é 'filter', 'dims', 'search', etc)
req[queryField] = {}; req[queryField] = {};
if (req.query[queryField]) { if (req.query[queryField]) {
// Se há mais de um parametro no campo, eles estão separados por vírgula.
// Fazemos o split então para separar os valores
const params = req.query[queryField].split(','); const params = req.query[queryField].split(',');
// Temporary object to hold the params and it's values // Objeto temporário para guardar os parametros e seus valores.
const obj = {}; const obj = {};
for (const param of params) { for (const param of params) {
// Get the key and the value - state:41 is key 'state' whith value 41. // O parametro *pode* ter um valor (por exemplo: `state:41`).
// kv is then an array [key, value] or [key] if there is no value // Fazemos o split e temos um array `['state', 41]`
const kv = param.split(':'); const kv = param.split(':');
// Check if there is a value. If there isn't, assign true // Checa se há um valor. Se não tem, definimos como true.
obj[kv[0]] = (typeof kv[1] === 'undefined') ? true : kv[1]; obj[kv[0]] = (typeof kv[1] === 'undefined') ? true : kv[1];
// obj is now an object {kv[0]: kv[1]} ou {kv[0]: true} // `obj` é agora `{kv[0]: kv[1]}` ou `{kv[0]: true}`.
// No exemplo `{'state': 41}`
} }
// If the array exists and is not empty we intersect // Se o array existe e não está vazio fazemos a interseção
if (typeof arrayOfParams !== 'undefined' && arrayOfParams.length > 0) { if (typeof arrayOfParams !== 'undefined' && arrayOfParams.length > 0) {
// Intersect the keys of the obj with the array arrayOfParams // Fazemos a interseção das chaves de `obj` com o array `arrayOfParams`.
// The intersection array is assigned with the keys // O array resultante são as chaves aceitas pelo campo.
const intersection = _.intersection(arrayOfParams, Object.keys(obj)); const intersection = _.intersection(arrayOfParams, Object.keys(obj));
// This is a bit tricky... // Isso é um pouco complicado...
// For each key in the intersection array we get it's value in the obj // Para cada chave na interseção pegamos seu valor em `obj`
// and assign it to the custom attribute in the req obj. // e atribuímos para o atributo que definimos no objeto `req`.
// For example: instersection => ["state"] so // Por exemplo: intersection = `['state']` então
// obj[intersection[i]] (with i=0) is obj["state"], that is 41 // `obj[intersection[i]]` (com i=0) é `obj['state']`, cujo valor é 41.
// and req[queryField]["state"] = 41 // Então fazemos `req[queryField]['state'] = 41`
for (let i = 0; i < intersection.length; ++i) { for (let i = 0; i < intersection.length; ++i) {
req[queryField][intersection[i]] = obj[intersection[i]]; req[queryField][intersection[i]] = obj[intersection[i]];
} }
...@@ -132,13 +171,18 @@ class ReqQueryFields { ...@@ -132,13 +171,18 @@ class ReqQueryFields {
} }
build() { build() {
// "Constrói" o SQL
return (req, res, next) => { return (req, res, next) => {
// Foreach no campos
Object.keys(this.fields).map((key, index) => { Object.keys(this.fields).map((key, index) => {
// Campo
let field = this.fields[key]; let field = this.fields[key];
log.debug(field); log.debug(field);
// `param` aqui é o atributo no objeto `req` (dims, filter, search, ...)
let param = req[field.name]; let param = req[field.name];
log.debug('param'); log.debug('param');
log.debug(param); log.debug(param);
// Fazemos um foreach nos parametros dentro do atributo
Object.keys(param).map((k, i) => { Object.keys(param).map((k, i) => {
let values = _.merge(this.fieldValues, field.values); let values = _.merge(this.fieldValues, field.values);
log.debug('ValueS'); log.debug('ValueS');
...@@ -146,7 +190,7 @@ class ReqQueryFields { ...@@ -146,7 +190,7 @@ class ReqQueryFields {
log.debug('k'); log.debug('k');
log.debug(k); log.debug(k);
if(typeof values[k] !== 'undefined') { if(typeof values[k] !== 'undefined') {
// Clonamos para não alterar // Clonamos para não alterar o original
let value = _.clone(values[k]); let value = _.clone(values[k]);
log.debug(value); log.debug(value);
// Checa se não fizemos o join para este valor e se é necessário fazer // Checa se não fizemos o join para este valor e se é necessário fazer
......
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