mono/packages/osrl/lib/net/sheets.js
2025-12-30 16:33:03 +01:00

182 lines
12 KiB
JavaScript

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.download = exports.read = void 0;
const index_1 = require("../../index");
const mime_1 = require("./mime");
const strings_1 = require("@plastichub/core/strings");
const osr_commons_1 = require("@plastichub/osr-commons");
const fs = require("fs");
const path = require("path");
const read_1 = require("@plastichub/fs/read");
const write_1 = require("@plastichub/fs/write");
const exists_1 = require("@plastichub/fs/exists");
const { authenticate } = require('@google-cloud/local-auth');
const { google } = require('googleapis');
// https://developers.google.com/sheets/api/quickstart/nodejs
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly',
'https://www.googleapis.com/auth/drive.readonly'];
/**
* Reads previously authorized credentials from the save file.
*
* @return {Promise<OAuth2Client|null>}
*/
function loadSavedCredentialsIfExist() {
return __awaiter(this, void 0, void 0, function* () {
try {
const tokenPath = path.resolve((0, strings_1.substitute)('${OSR_ROOT}/token.json', osr_commons_1.DEFAULT_ROOTS));
const credentials = (0, read_1.sync)(tokenPath, 'json');
return google.auth.fromJSON(credentials);
}
catch (err) {
return null;
}
});
}
/**
* Serializes credentials to a file compatible with GoogleAUth.fromJSON.
*
* @param {OAuth2Client} client
* @return {Promise<void>}
*/
function saveCredentials(client, credentialsFile = '${OSR_ROOT}/credentials.json') {
return __awaiter(this, void 0, void 0, function* () {
credentialsFile = path.resolve((0, strings_1.substitute)(credentialsFile, osr_commons_1.DEFAULT_ROOTS));
const keys = (0, read_1.sync)(credentialsFile, 'json');
const key = keys.installed || keys.web;
const payload = JSON.stringify({
type: 'authorized_user',
client_id: key.client_id,
client_secret: key.client_secret,
refresh_token: client.credentials.refresh_token,
});
const tokenPath = path.resolve((0, strings_1.substitute)('${OSR_ROOT}/token.json', osr_commons_1.DEFAULT_ROOTS));
(0, write_1.sync)(tokenPath, payload);
});
}
function authorize(credentialsFile = '${OSR_ROOT}/credentials.json') {
return __awaiter(this, void 0, void 0, function* () {
let client = yield loadSavedCredentialsIfExist();
if (client) {
return client;
}
credentialsFile = path.resolve((0, strings_1.substitute)(credentialsFile, osr_commons_1.DEFAULT_ROOTS));
client = yield authenticate({
scopes: SCOPES,
keyfilePath: credentialsFile
});
if (client.credentials) {
yield saveCredentials(client);
}
return client;
});
}
const readSheet = (auth, sheet, range) => __awaiter(void 0, void 0, void 0, function* () {
const sheets = google.sheets({ version: 'v4', auth });
const res = yield sheets.spreadsheets.values.get({
spreadsheetId: sheet,
range: range,
});
return res.data.values;
});
const read = (sheet, range, credentialsFile = '${OSR_ROOT}/credentials.json') => __awaiter(void 0, void 0, void 0, function* () {
credentialsFile = path.resolve((0, strings_1.substitute)(credentialsFile, osr_commons_1.DEFAULT_ROOTS));
if (!(0, exists_1.sync)(path.resolve(credentialsFile))) {
index_1.logger.error('Cant find credentials.json ', credentialsFile);
return Promise.reject();
}
const client = yield authorize(credentialsFile);
const ret = yield readSheet(client, sheet, range);
return ret;
});
exports.read = read;
const download = (sheet, dst, credentialsFile = '${OSR_ROOT}/credentials.json') => __awaiter(void 0, void 0, void 0, function* () {
credentialsFile = path.resolve((0, strings_1.substitute)(credentialsFile, osr_commons_1.DEFAULT_ROOTS));
if (!(0, exists_1.sync)(path.resolve(credentialsFile))) {
index_1.logger.error('Cant find credentials.json ' + credentialsFile);
return;
}
const auth = yield authorize(credentialsFile);
google.options({ auth: auth });
const dest = fs.createWriteStream(dst);
const drive = google.drive('v3');
const res = yield drive.files.export({
fileId: sheet,
mimeType: mime_1.mimes[path.parse(dst).ext]
}, {
responseType: 'stream'
});
yield new Promise((resolve, reject) => {
res.data
.on('error', reject)
.pipe(dest)
.on('error', reject)
.on('finish', resolve);
});
});
exports.download = download;
/**
* 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.
*/
/*
const authorize = async (credentials: any) => {
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
const tokenPath = substitute('${OSR_ROOT}/token.json', DEFAULT_ROOTS);
const token = readFile(tokenPath, 'string') as string;
if (!token) {
return getNewToken(oAuth2Client);
}
oAuth2Client.setCredentials(JSON.parse(token));
return 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.
*/
/*
const getNewToken = async (oAuth2Client: any) => {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});
logger.warn('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: any, token: any) => {
if (err) return console.error('Error while trying to retrieve access token', err);
oAuth2Client.setCredentials(token);
const tokenPath = substitute('${OSR_ROOT}/token.json', DEFAULT_ROOTS);
writeFile(tokenPath, JSON.stringify(token, null, 2));
return oAuth2Client;
});
});
}
*/
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9uZXQvc2hlZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLHVDQUFvQztBQUNwQyxpQ0FBK0I7QUFFL0Isc0RBQXFEO0FBQ3JELHlEQUF1RDtBQUd2RCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBRTdCLDhDQUF1RDtBQUN2RCxnREFBeUQ7QUFDekQsa0RBQXVEO0FBRXZELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUM3RCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBR3pDLDZEQUE2RDtBQUM3RCxnREFBZ0Q7QUFFaEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyx1REFBdUQ7SUFDbkUsZ0RBQWdELENBQUMsQ0FBQztBQUV0RDs7OztHQUlHO0FBQ0gsU0FBZSwyQkFBMkI7O1FBRXRDLElBQUk7WUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsb0JBQVUsRUFBQyx3QkFBd0IsRUFBRSwyQkFBYSxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLFdBQVcsR0FBRyxJQUFBLFdBQVEsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFXLENBQUM7WUFDMUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM1QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7Q0FBQTtBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZSxlQUFlLENBQUMsTUFBTSxFQUFFLGtCQUEwQiw4QkFBOEI7O1FBRTNGLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsb0JBQVUsRUFBQyxlQUFlLEVBQUUsMkJBQWEsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxJQUFJLEdBQUcsSUFBQSxXQUFRLEVBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBUSxDQUFDO1FBRXRELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzNCLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3hCLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtZQUNoQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1NBQ2xELENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBQSxvQkFBVSxFQUFDLHdCQUF3QixFQUFFLDJCQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUEsWUFBUyxFQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQUE7QUFFRCxTQUFlLFNBQVMsQ0FBQyxrQkFBMEIsOEJBQThCOztRQUM3RSxJQUFJLE1BQU0sR0FBRyxNQUFNLDJCQUEyQixFQUFFLENBQUM7UUFDakQsSUFBSSxNQUFNLEVBQUU7WUFDUixPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVELGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsb0JBQVUsRUFBQyxlQUFlLEVBQUUsMkJBQWEsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsV0FBVyxFQUFFLGVBQWU7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUFBO0FBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBTyxJQUFTLEVBQUUsS0FBYSxFQUFFLEtBQVUsRUFBRSxFQUFFO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDN0MsYUFBYSxFQUFFLEtBQUs7UUFDcEIsS0FBSyxFQUFFLEtBQUs7S0FDZixDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzNCLENBQUMsQ0FBQSxDQUFBO0FBRU0sTUFBTSxJQUFJLEdBQUcsQ0FBTyxLQUFhLEVBQUUsS0FBYSxFQUFFLGtCQUEwQiw4QkFBOEIsRUFBRSxFQUFFO0lBRWpILGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsb0JBQVUsRUFBQyxlQUFlLEVBQUUsMkJBQWEsQ0FBQyxDQUFDLENBQUE7SUFDMUUsSUFBSSxDQUFDLElBQUEsYUFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRTtRQUN4QyxjQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQzNCO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUMsQ0FBQSxDQUFBO0FBVlksUUFBQSxJQUFJLFFBVWhCO0FBR00sTUFBTSxRQUFRLEdBQUcsQ0FBTyxLQUFhLEVBQUUsR0FBVyxFQUFFLGtCQUEwQiw4QkFBOEIsRUFBRSxFQUFFO0lBQ25ILGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEsb0JBQVUsRUFBQyxlQUFlLEVBQUMsMkJBQWEsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBRyxDQUFDLElBQUEsYUFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBQztRQUN0QyxjQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQzlELE9BQU87S0FDVjtJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBVyxFQUFFLENBQUMsQ0FBQztJQUV0QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNoQztRQUNJLE1BQU0sRUFBRSxLQUFLO1FBQ2IsUUFBUSxFQUFFLFlBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztLQUN2QyxFQUNEO1FBQ0ksWUFBWSxFQUFFLFFBQVE7S0FDekIsQ0FDSixDQUFDO0lBRUYsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNsQyxHQUFHLENBQUMsSUFBSTthQUNILEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO2FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDVixFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQzthQUNuQixFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFBLENBQUE7QUE1QlksUUFBQSxRQUFRLFlBNEJwQjtBQUlEOzs7OztHQUtHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztFQWVFO0FBR0Y7Ozs7O0dBS0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQkUifQ==