Skip to content

Instantly share code, notes, and snippets.

@abernardobr
Last active December 22, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abernardobr/b8af09ed7b66b12f315e to your computer and use it in GitHub Desktop.
Save abernardobr/b8af09ed7b66b12f315e to your computer and use it in GitHub Desktop.
Importar tabela FIPE mongodb
var Args = require('commander');
Args
.version('0.0.1')
.option('-s, --servertype [type]', 'Type of the server location: dev, test, accept or prod')
.option('-r, --routes [routes]', 'A comma separeated routes: admin,server')
.option('-e, --environment [environment]', 'If we are running on windows, mac or linux. Default is mac.')
.parse(process.argv);
process.env["servertype"] = Args.servertype ? Args.servertype : "dev";
process.env["environment"] = Args.environment ? Args.environment : "mac";
// load modules
var _ = require('lodash');
var HD = require('hd').utils;
var Domains = require('hd').domains;
var config = require('../config/config');
var Mongoose = require('mongoose');
var Request = require('request');
var Async = require('async');
var serverConfig = config.server;
var tipos = {
'carros': 1,
'motos': 2
};
var DELETE_BEFORE = false;
var internals = {
url: 'https://fipe-parallelum.rhcloud.com/api/v1/',
orderMarca: {
"23": 0,
"21": 1,
"22": 2,
"25": 3,
"26": 4,
"41": 5,
"44": 6,
"48": 7,
"56": 8,
"59": 9
},
reqTries: 5
};
// bootstratp mongoose
internals.initDB = function() {
try {
Mongoose.connect(config.db.host);
} catch(ex) {
}
}
internals.doRequest = function(url, tryNum, cb) {
var json = {};
Request.get(url, {timeout: 45000, json: true}, function (req, resp) {
if (!_.isUndefined(resp) && resp.statusCode === 200) {
var json = resp.body;
cb(json);
} else {
if(tryNum === internals.reqTries) {
console.log('ERROR: ' + url);
cb({});
} else {
tryNum += 1;
internals.doRequest(url, tryNum, cb);
}
}
});
}
internals.request = function(url, cb) {
internals.doRequest(url, 1, cb);
}
internals.addVeiculo = function(tipoMarca, marca, modelo, ano, veiculo, cb) {
var obj = {
tipo: tipos[tipoMarca],
codigoMarca: marca.codigo,
codigoModelo: modelo.codigo,
codigoAno: ano.codigo,
SiglaCombustivel: veiculo.SiglaCombustivel.trim(),
MesReferencia: veiculo.MesReferencia.trim(),
CodigoFipe: veiculo.CodigoFipe.trim(),
Combustivel: veiculo.Combustivel.trim(),
AnoModelo: veiculo.AnoModelo,
Modelo: veiculo.Modelo.trim(),
Marca: veiculo.Marca.trim(),
Valor: veiculo.Valor.trim()
};
Domains.fipe_veiculos().dcrud.update({ CodigoFipe: veiculo.CodigoFipe }, obj, { upsert: true }, function(err, retVeiculo) {
if(err) console.dir(err);
cb();
});
}
internals.getVeiculos = function(tipoMarca, marca, modelo, anos, cb) {
var funcs = [];
_.each(anos, function(ano) {
funcs.push(function(next) {
ano.tipo = tipos[tipoMarca];
ano.codigoMarca = marca.codigo;
ano.codigoModelo = modelo.codigo;
Domains.fipe_anos().dcrud.update({ tipo: tipos[tipoMarca], codigoMarca: marca.codigo, codigoModelo: modelo.codigo, codigo: ano.codigo }, ano, { upsert: true }, function(err, retAno) {
if(err) console.dir(err);
var url = internals.url + tipoMarca + '/marcas/' + marca.codigo + '/modelos/' + modelo.codigo + "/anos/" + ano.codigo;
internals.request(url, function(veiculo) {
if(!_.isEmpty(veiculo)) {
internals.addVeiculo(tipoMarca, marca, modelo, ano, veiculo, function () {
console.log(url);
next();
});
} else {
next();
}
});
});
});
});
Async.series(funcs, function() {
cb();
});
}
internals.getAnos = function(tipoMarca, marca, modelos, cb) {
var funcs = [];
_.each(modelos, function(modelo) {
funcs.push(function(next) {
modelo.tipo = tipos[tipoMarca];
modelo.codigoMarca = marca.codigo;
Domains.fipe_modelos().dcrud.update({ tipo: tipos[tipoMarca], codigoMarca: marca.codigo, codigo: modelo.codigo }, modelo, { upsert: true }, function(err, retModelo) {
var url = internals.url + tipoMarca + '/marcas/' + marca.codigo + '/modelos/' + modelo.codigo + "/anos";
internals.request(url, function(anos) {
internals.getVeiculos(tipoMarca, marca, modelo, anos, function () {
next();
});
});
});
});
});
Async.series(funcs, function() {
cb();
});
}
internals.getModelos = function(tipoMarca, marcas, cb) {
var funcs = [];
_.each(marcas, function(marca) {
funcs.push(function(next) {
var obj = {};
var oderMarca = internals.orderMarca[marca.codigo.toString()];
if(oderMarca) {
obj = {
codigo: marca.codigo,
nome: marca.nome,
order1: 0,
order2: oderMarca
};
} else {
obj = {
codigo: marca.codigo,
nome: marca.nome,
order1: 1,
$inc: { order2: 1 }
};
}
obj.tipo = tipos[tipoMarca];
Domains.fipe_marcas().dcrud.update({ tipo: tipos[tipoMarca], codigo: marca.codigo }, obj, { upsert: true }, function(err, retMarca) {
internals.request(internals.url + tipoMarca + '/marcas/' + marca.codigo + '/modelos', function(json) {
internals.getAnos(tipoMarca, marca, json.modelos, function() {
next();
});
});
});
});
});
Async.series(funcs, function() {
cb();
});
}
internals.getMarcas = function(tipoMarca, cb) {
var funcs = [];
// get marcas
funcs.push(function(next) {
internals.request(internals.url + tipoMarca + '/marcas', function(marcas) {
internals.getModelos(tipoMarca, marcas, function() {
next();
});
});
});
Async.series(funcs, function() {
cb();
});
}
internals.init = function() {
var funcs = [];
funcs.push(function(next) {
internals.initDB();
next();
});
if(DELETE_BEFORE) {
funcs.push(function (next) {
Domains.fipe_anos().dcrud.remove({}, function () {
next();
});
});
funcs.push(function (next) {
Domains.fipe_marcas().dcrud.remove({}, function () {
next();
});
});
funcs.push(function (next) {
Domains.fipe_modelos().dcrud.remove({}, function () {
next();
});
});
funcs.push(function (next) {
Domains.fipe_veiculos().dcrud.remove({}, function () {
next();
});
});
}
// get autos
//funcs.push(function(next) {
// internals.getMarcas('carros', function() {
// next();
// });
//});
// get autos
funcs.push(function(next) {
internals.getMarcas('motos', function() {
next();
});
});
Async.series(funcs, function() {
console.log('ADDED');
});
}
internals.init();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment