src/modules/datasource.js
import GoogleSpreadsheet from 'google-spreadsheet'
import async from 'async'
// TODO: melhorar trafego das mensagens de erro e acerto para fora da classe
class Datasource {
constructor () {
this.google_spreadsheet_key = process.env['GOOGLE_SPREADSHEET_KEY']
this.creds = null
this.validate = false
if (process.env['GOOGLE_CREDS']) {
this.creds = JSON.parse(process.env['GOOGLE_CREDS'])
}
}
isConfigEmpty () {
if (!this.google_spreadsheet_key) {
return false
}
return true
}
testConnection (callback) {
let doc = new GoogleSpreadsheet(this.google_spreadsheet_key)
async.series([
function(done){
doc.getInfo(function(err, results) {
if (err) {
done('As configurações fornecidas para fonte de dados não são válidos'+err, null)
} else {
done(null, results)
}
})
}
], callback)
}
readContent (callback) {
let doc = new GoogleSpreadsheet(this.google_spreadsheet_key)
let worksheet_id = '';
let that = this
async.waterfall([
// Tenta autenticar com credenciais do ambiente
function(done) {
if (that.creds) {
doc.useServiceAccountAuth(that.creds, done)
} else {
done(null)
}
},
// Testa conexão e retorna infos básicas da planilha
function(done) {
doc.getInfo(function(err, results) {
if (err) {
done('As configurações fornecidas para fonte de dados não são válidos'+err, null)
} else {
worksheet_id = results.worksheets[0].id
that.validate = true
done(null, results)
}
})
},
// Lê conteúdo e certifica-se que planilha não está vazia
function(sheetinfo, done) {
doc.getRows(worksheet_id, {}, function (err, results) {
if (err) {
done('Problema ao tentar ler detalhes da planilha' + err, null)
} else {
if (parseInt(results.length) <= 1) {
done('Datasource não pode ser vazio.')
} else {
that.content = results
done(null, results)
}
}
})
}
], callback)
}
}
export default Datasource