require('../config/config'); const fs = require('fs'); const { google } = require('googleapis'); const drive = google.drive('v3'); const credenciales = JSON.parse(fs.readFileSync('./cred.json', 'utf8')); const jwtClient = new google.auth.JWT( credenciales.client_email, null, credenciales.private_key, ['https://www.googleapis.com/auth/drive'] ); const list = (pageToken) => { return new Promise((resolve, reject) => { jwtClient.authorize((err, tokens) => { if (err) reject('Error de autorización: ' + err); drive.files.list( { auth: jwtClient, corpora: 'user', supportsTeamDrives: true, includeTeamDriveItems: true, spaces: 'drive', pageSize: 1000, pageToken, // fields: '*', orderBy: 'name', }, (err, resp) => { if (err) reject('Ha habido un error en la petición: ' + err); resolve(resp.data); } ); }); }); }; // Borrar archivo const deleteFile = (fileId) => { if (fileId === process.env.CARPETA) throw new Error('No se puede eliminar este archivo/carpeta.'); return new Promise((resolve, reject) => { jwtClient.authorize(async (err, tokens) => { if (err) reject(err); drive.files.delete( { fileId, auth: jwtClient, }, (err, resp) => { if (err) reject(err); resolve(resp); } ); }); }); }; // SUBIR ARCHIVO const uploadFile = (path, name, mimeType, parent) => { return new Promise((resolve, reject) => { const requestBody = { name, parents: [parent], }; const media = { mimeType, body: fs.createReadStream(`${path}`), }; jwtClient.authorize(function (err, tokens) { if (err) reject('Error de autorización: ' + err); drive.files.create( { media, requestBody, fields: 'id', auth: jwtClient, }, (err, file) => { if (err) reject(err); fs.unlinkSync(path); resolve(file.data.id); } ); }); }); }; // CREAR CARPETA const mkDir = (name) => { return new Promise((resolve, reject) => { const requestBody = { name, mimeType: 'application/vnd.google-apps.folder', parents: [process.env.CARPETA], }; jwtClient.authorize((err, tokens) => { if (err) reject('Error de autorización: ' + err); drive.files.create( { fields: 'id', auth: jwtClient, requestBody, }, (err, res) => { if (err) reject(err); resolve(res.data.id); } ); }); }); }; // Update File const update = (fileId, addParents, removeParents) => { return new Promise((resolve, reject) => { jwtClient.authorize((err, tokens) => { if (err) reject('Error de autorización: ' + err); drive.files.update( { auth: jwtClient, fileId, addParents, removeParents }, (err, resp) => { if (err) reject('Ha habido un error en la petición: ' + err); resolve(resp.data); } ); }); }); }; const folder = async (numeroCuenta) => { let pageToken = ''; do { let res = await list(pageToken); for (let i = 0; i < res.files.length; i++) if ( res.files[i].name === numeroCuenta && res.files[i].mimeType === 'application/vnd.google-apps.folder' ) return res.files[i].id; pageToken = res.nextPageToken ? res.nextPageToken : ''; } while (pageToken); return mkDir(numeroCuenta); }; // const borrarTodo = () => { // return list().then(async (res) => { // for (let i = 0; i < res.files.length; i++) // if (res.files[i].id !== process.env.CARPETA) // await deleteFile(res.files[i].id); // }); // }; const findAll = async () => { const folders = []; const pdfs = []; let pageToken = ''; do { await list(pageToken).then((res) => { for (let i = 0; i < res.files.length; i++) { if (res.files[i].id !== process.env.CARPETA) { if (res.files[i].mimeType === 'application/vnd.google-apps.folder') folders.push(res.files[i].id); if (res.files[i].mimeType === 'application/pdf') pdfs.push(res.files[i].id); } } pageToken = res.nextPageToken ? res.nextPageToken : ''; }); } while (pageToken); return { folders, pdfs }; }; module.exports = { folder, uploadFile, deleteFile, mkDir, };