Skip to content

Instantly share code, notes, and snippets.

@hwclass
Last active January 29, 2020 09:24
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 hwclass/d8f890e690b2b216b64f79a1cd737cfe to your computer and use it in GitHub Desktop.
Save hwclass/d8f890e690b2b216b64f79a1cd737cfe to your computer and use it in GitHub Desktop.
const fs = require('fs');
const { exec } = require('child_process');
const readline = require('readline');
const {google} = require('googleapis');
const envs = [
'testing',
'production'
]
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';
// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Google Sheets API.
// authorize(JSON.parse(content), runCommands);
authorize(JSON.parse(content), testUpdate);
});
/**
* Create an OAuth2 client with the given credentials, and then execute the
* given callback function.
* @param {Object} credentials The authorization client credentials.
* @param {function} callback The callback to call with the authorized client.
*/
function authorize(credentials, callback) {
const {client_secret, client_id, redirect_uris} = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getNewToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
});
}
/**
* Get and store new token after prompting for user authorization, and then
* execute the given callback with the authorized OAuth2 client.
* @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
* @param {getEventsCallback} callback The callback for the authorized client.
*/
function getNewToken(oAuth2Client, callback) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});
console.log('Authorize this app by visiting this url:', authUrl);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question('Enter the code from that page here: ', (code) => {
rl.close();
oAuth2Client.getToken(code, (err, token) => {
if (err) return console.error('Error while trying to retrieve access token', err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
if (err) return console.error(err);
console.log('Token stored to', TOKEN_PATH);
});
callback(oAuth2Client);
});
});
}
/**
* Prints the names and majors of students in a sample spreadsheet:
* @see https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
* @param {google.auth.OAuth2} auth The authenticated Google OAuth client.
*/
function runCommands(auth) {
const sheets = google.sheets({version: 'v4', auth});
sheets.spreadsheets.values.get({
spreadsheetId: '<ID-HERE>',
range: 'A2:H514',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const rows = res.data.values;
if (rows.length) {
rows.map((row, idx) => {
// Take data based on columns & generate aws s3api commands on the fly & execute
let chunkPageName = getChunkGroupName(new URL(row[0]).pathname, chunks).toLocaleString()
console.log(chunkPageName)
let cleanPathName = new URL(row[0]).pathname
.split('/')
.filter(strPart => strPart !== '')
.join('/')
// now eg. cleanPathName => en/cities-wuxi (not /en/cities-wuxi/)
console.log(`EN: ${row[0]} => `, cleanPathName);
// exec(`
// AWS_PROFILE=testing aws s3api put-object --bucket static-pages.int.blacklane.io &
// --key ${cleanPathName}/index.html &
// --website-redirect-location="https://www.int.blacklane.io/en/chauffeur-service"
// `)
// console.log(`ZH: ${row[1]}`);
// console.log(`FR: ${row[2]}`);
// console.log(`DE: ${row[3]}`);
// console.log(`JA: ${row[4]}`);
// console.log(`ES: ${row[4]}`);
});
} else {
console.log('No data found.');
}
console.log(rows.length)
});
}
let chunks = [
{
locale: 'en',
names: [
'airport-transfer',
'chauffeur-service',
'car-service',
'limousine-service',
'cities'
]
},
{
locale: 'de',
names: [
'flughafentransfer',
'chauffeurservice',
'car-service',
'limousinenservice',
'staedte'
]
},
{
locale: 'fr',
names: [
'transfert-aeroport',
'chauffeur-prive',
'car-service',
'service-vtc',
'villes'
]
},
{
locale: 'ja',
names: [
'airport-transfer',
'chauffeur-service',
'car-service',
'limousine-service',
'cities'
]
},
{
locale: 'zh',
names: [
'airport-transfer',
'chauffeur-service',
'car-service',
'limousine-service',
'cities'
]
},
{
locale: 'es',
names: [
'airport-transfer',
'chauffeur-service',
'car-service',
'limousine-service',
'cities'
]
}
]
function getChunkGroupName(urlPath, chunks, locale) {
let chunk = [];
const selectedChunk = chunks
.filter(chunk => chunk.locale === locale)
.filter(chunk => urlPath.split('/').some(urlSection => chunk.names
.filter(name => urlSection.split('-')
.filter(section => section === name))))
if (Array.isArray(selectedChunk) && selectedChunk.length > 0) {
chunk = selectedChunk[0].names.filter(chunkName => urlPath.includes(chunkName))
}
return chunk
}
function testUpdate(auth) {
// "testing" or "production"
const ENV = 'production';
// "en", "de", "fr", "ja", "zh", "es"
const locale = 'en'
const localeIndexes = {
'EN': 0,
'ZH': 1,
'FR': 2,
'DE': 3,
'JA': 4,
'ES': 5
}
const sheets = google.sheets({version: 'v4', auth});
sheets.spreadsheets.values.get({
spreadsheetId: '<ID-HERE>',
range: 'A2:H514',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const rows = res.data.values;
if (rows.length) {
rows.map((row, idx) => {
let chunkPageName = getChunkGroupName(new URL(row[localeIndexes.EN]).pathname, chunks, locale)
if (chunkPageName && chunkPageName.length > 0) {
chunkPageName = chunkPageName.toLocaleString()
let cleanPathName = new URL(row[localeIndexes.EN]).pathname
.split('/')
.filter(strPart => strPart !== '')
.join('/')
// now eg. cleanPathName => en/cities-wuxi (not /en/cities-wuxi/)
// console.log(`${locale}: ${row[0]} => `, cleanPathName);
console.log(`${cleanPathName}/index.html => https://www.blacklane.com/${locale}/${chunkPageName}`);
// console.log(`Redirect from: ${cleanPathName}/index.html => https://www.int.blacklane.io/${locale}/${chunkPageName}`)
// console.log(`
// AWS_PROFILE=${ENV} aws s3api put-object \
// --bucket static-pages.int.blacklane.io \
// --key ${cleanPathName}/index.html \
// --website-redirect-location="https://www.int.blacklane.io/${locale}/${chunkPageName}"
// `)
// AWS_PROFILE=testing aws s3api put-object \
// --bucket static-pages.int.blacklane.io \
// --key en/airport-transfer-ahmedabad/index.html \
// --website-redirect-location="https://www.int.blacklane.io/en/airport-transfer"
exec(`
AWS_PROFILE=${ENV} aws s3api put-object \
--bucket static-pages.blacklane.com \
--key ${cleanPathName}/index.html \
--website-redirect-location="https://www.blacklane.com/${locale}/${chunkPageName}" &
`, (err, stdout) => {
if (err) {
console.log(err)
return -1;
}
console.log(stdout);
console.log(`Redirect for ${cleanPathName}/index.html is successfully made to https://www.int.blacklane.io/${locale}/${chunkPageName}`)
})
}
});
} else {
console.log('No data found.');
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment