Last active
August 10, 2022 05:17
-
-
Save mhshakouri/fdf7fdebbf3288e67152322153f31d76 to your computer and use it in GitHub Desktop.
fetch a list of api endpoints and save results as json, with versions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fetch = require('node-fetch'), | |
fs = require('fs'), | |
VERSIOINS_FILE_PATH = './static/data/versions.json', | |
endpoints = [ | |
{ | |
name: 'example1', | |
type: 'exampleType1', | |
url: 'https://example.com/api/url/1', | |
filePath: './static/data/exampleResult1.json', | |
updateFrequency: 7 // days | |
}, | |
{ | |
name: 'example2', | |
type: 'exampleType1', | |
url: 'https://example.com/api/url/2', | |
filePath: './static/data/exampleResult2.json', | |
updateFrequency: 7 | |
}, | |
{ | |
name: 'example3', | |
type: 'exampleType2', | |
url: 'https://example.com/api/url/3', | |
filePath: './static/data/exampleResult3.json', | |
updateFrequency: 30 | |
}, | |
{ | |
name: 'example4', | |
type: 'exampleType2', | |
url: 'https://example.com/api/url/4', | |
filePath: './static/data/exampleResult4.json', | |
updateFrequency: 30 | |
}, | |
], | |
checkOrCreateFolder = () => { | |
var dir = './static/data/'; | |
if (!fs.existsSync(dir)) { | |
fs.mkdirSync(dir); | |
} | |
}, | |
syncStaticData = () => { | |
checkOrCreateFolder(); | |
let fetchList = [], | |
versions = []; | |
endpoints.forEach(endpoint => { | |
if (requiresUpdate(endpoint)) { | |
console.log(`Updating ${endpoint.name} data... : `, endpoint.filePath); | |
fetchList.push(endpoint) | |
} else { | |
console.log(`Using cached ${endpoint.name} data... : `, endpoint.filePath); | |
let endpointVersion = JSON.parse(fs.readFileSync(endpoint.filePath, 'utf8')).lastUpdate; | |
versions.push({ | |
name: endpoint.name + "Data", | |
version: endpointVersion | |
}); | |
} | |
}) | |
if (fetchList.length > 0) { | |
Promise.all(fetchList.map(endpoint => fetch(endpoint.url, { "method": "GET" }))) | |
.then(responses => Promise.all(responses.map(response => response.json()))) | |
.then(results => { | |
results.forEach((endpointData, index) => { | |
let endpoint = fetchList[index] | |
let processedData = processData(endpoint.type, endpointData.data) | |
let fileData = { | |
data: processedData, | |
lastUpdate: Date.now() // unix timestamp | |
} | |
versions.push({ | |
name: endpoint.name + "Data", | |
version: fileData.lastUpdate | |
}) | |
fs.writeFileSync(endpoint.filePath, JSON.stringify(fileData)); | |
console.log('updated data: ', endpoint.filePath); | |
}) | |
}) | |
.catch(err => console.log(err)); | |
} | |
fs.writeFileSync(VERSIOINS_FILE_PATH, JSON.stringify(versions)); | |
console.log('updated versions: ', VERSIOINS_FILE_PATH); | |
}, | |
recursiveRemoveKey = (object, keyname) => { | |
object.forEach((item) => { | |
if (item.items) { //items is the nesting key, if it exists, recurse , change as required | |
recursiveRemoveKey(item.items, keyname) | |
} | |
delete item[keyname]; | |
}) | |
}, | |
processData = (type, data) => { | |
//any thing you want to do with the data before it is written to the file | |
let processedData = type === 'vehicle' ? processType1Data(data) : processType2Data(data); | |
return processedData; | |
}, | |
processType1Data = data => { | |
let fetchedData = [...data] | |
recursiveRemoveKey(fetchedData, 'count') | |
return fetchedData | |
}, | |
processType2Data = data => { | |
let fetchedData = [...data] | |
recursiveRemoveKey(fetchedData, 'keywords') | |
return fetchedData | |
}, | |
requiresUpdate = endpoint => { | |
if (fs.existsSync(endpoint.filePath)) { | |
let fileData = JSON.parse(fs.readFileSync(endpoint.filePath)); | |
let lastUpdate = fileData.lastUpdate; | |
let now = new Date(); | |
let diff = now - lastUpdate; | |
let diffDays = Math.ceil(diff / (1000 * 60 * 60 * 24)); | |
if (diffDays >= endpoint.updateFrequency) { | |
return true; | |
} else { | |
return false; | |
} | |
} | |
return true | |
}; | |
syncStaticData(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment