From 373ff1eefc1424520c9346eb55ec4e7c14f7f086 Mon Sep 17 00:00:00 2001 From: Chinmay Jain Date: Fri, 3 Sep 2021 20:56:21 +0530 Subject: [PATCH] Fix: data fetching from google sheets --- package.json | 3 ++- src/fetch-sheet.js | 54 +++++++++++++++++++--------------------------- src/gatsby-node.js | 5 +++-- 3 files changed, 27 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 9b28466..005aba8 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,9 @@ "testEnvironment": "node" }, "dependencies": { + "flatted": "^3.2.2", "flow-bin": "^0.56.0", - "google-spreadsheet": "2.0.3", + "google-spreadsheet": "^3.1.15", "lodash": "^4.17.4", "uuid": "^3.1.0" }, diff --git a/src/fetch-sheet.js b/src/fetch-sheet.js index 4a4e6d4..8fcc5fb 100644 --- a/src/fetch-sheet.js +++ b/src/fetch-sheet.js @@ -1,44 +1,32 @@ // @flow -const GoogleSpreadsheet = require("google-spreadsheet"); +const { GoogleSpreadsheet } = require("google-spreadsheet"); const _ = require("lodash"); -const getSpreadsheet = (spreadsheetId, credentials) => - new Promise((resolve, reject) => { +const getSpreadsheet = async (spreadsheetId, credentials) => + new Promise(async (resolve, reject) => { const doc = new GoogleSpreadsheet(spreadsheetId); - doc.useServiceAccountAuth(credentials, function(err) { - if (err) reject(err); - else resolve(doc); - }); + await doc.useServiceAccountAuth(credentials); + await doc.loadInfo(); + resolve(doc); }); const getWorksheetByTitle = (spreadsheet, worksheetTitle) => - new Promise((resolve, reject) => - spreadsheet.getInfo((e, s) => { - if (e) reject(e); - const targetSheet = s.worksheets.find(sheet => sheet.title === worksheetTitle); - if (!targetSheet) { - reject(`Found no worksheet with the title ${worksheetTitle}`); - } - resolve(targetSheet); - }) - ); + new Promise(async (resolve, reject) => { + const workSheet = await spreadsheet.sheetsByTitle[worksheetTitle]; + resolve(workSheet); + }); const getRows = (worksheet, options = {}) => - new Promise((resolve, reject) => - worksheet.getRows(options, (err, rows) => { - if (err) reject(err); - else { - resolve(rows); - } - }) - ); + new Promise((resolve, reject) => { + resolve(worksheet.getRows(options)); + }); const cleanRows = rows => { const columnTypes = guessColumnsDataTypes(rows); return rows.map(r => _.chain(r) - .omit(["_xml", "app:edited", "save", "del", "_links"]) - .mapKeys((v, k) => _.camelCase(k)) + .omit(["_xml", "app:edited", "save", "del", "_links", "_rowNumber", "_rawData", "_sheet"]) + .mapKeys((v, k) => _.toLower(_.camelCase(k))) .mapValues((val, key) => { switch (columnTypes[key]) { case "number": @@ -57,8 +45,8 @@ const cleanRows = rows => { const guessColumnsDataTypes = rows => _.flatMap(rows, r => _.chain(r) - .omit(["_xml", "app:edited", "save", "del", "_links"]) - .mapKeys((v, k) => _.camelCase(k)) + .omit(["_xml", "app:edited", "save", "del", "_links", "_rowNumber", "_rawData", "_sheet"]) + .mapKeys((v, k) => _.toLower(_.camelCase(k))) .mapValues(val => { // try to determine type based on the cell value if (!val) { @@ -76,8 +64,10 @@ const guessColumnsDataTypes = rows => ).reduce((columnTypes, row) => { _.forEach(row, (type, columnName) => { // skip nulls, they should have no effect - if (type === 'null') { return; } - + if (type === "null") { + return; + } + const currentTypeCandidate = columnTypes[columnName]; if (!currentTypeCandidate) { // no discovered type yet -> use the one from current item @@ -88,7 +78,7 @@ const guessColumnsDataTypes = rows => } }); return columnTypes; - }, {}) + }, {}); const fetchData = async (spreadsheetId, worksheetTitle, credentials) => { const spreadsheet = await getSpreadsheet(spreadsheetId, credentials); diff --git a/src/gatsby-node.js b/src/gatsby-node.js index bbbe170..078a2c0 100644 --- a/src/gatsby-node.js +++ b/src/gatsby-node.js @@ -1,7 +1,8 @@ const fetchSheet = require(`./fetch-sheet.js`).default; -const uuidv5 = require("uuid/v5"); +const uuidv5 = require("uuid"); const _ = require("lodash"); const crypto = require("crypto"); +const { stringify } = require("flatted"); const seedConstant = "2972963f-2fcf-4567-9237-c09a2b436541"; exports.sourceNodes = async ( @@ -22,7 +23,7 @@ exports.sourceNodes = async ( type: _.camelCase(`googleSheet ${worksheetTitle} row`), contentDigest: crypto .createHash("md5") - .update(JSON.stringify(r)) + .update(stringify(r)) .digest("hex") } })