UNPKG

@upstart.gg/sdk

Version:

You can test the CLI without recompiling by running:

114 lines (112 loc) 4.7 kB
import getClient from "./client.js"; //#region src/shared/datarecords/external/google/sheets/handler.ts async function downloadGoogleSheetsData(spreadsheetId, accessToken) { try { const response = await getClient(accessToken).callDriveApi(`https://www.googleapis.com/drive/v3/files/${spreadsheetId}/export?mimeType=text/csv`, "GET"); if (!response.success) throw new Error(`Failed to download spreadsheet: ${response.status}`); return response.data; } catch (error) { console.error("Error downloading Google Sheets data:", error); throw error; } } async function uploadGoogleSheetsData(spreadsheetId, csvLines, accessToken) { try { const initResponse = await getClient(accessToken).callDriveApi(`https://www.googleapis.com/upload/drive/v3/files/${spreadsheetId}?uploadType=resumable`, "PATCH", { mimeType: "application/vnd.google-apps.spreadsheet" }); if (!initResponse.success) { const errorText = initResponse.data; throw new Error(`Failed to initiate upload: ${initResponse.status} - ${errorText}`); } const uploadUrl = initResponse.headers.get("Location"); if (!uploadUrl) throw new Error("No upload URL returned from Google Drive"); return (await fetch(uploadUrl, { method: "PUT", headers: { "Content-Type": "text/csv" }, body: csvLines.map((line) => line.replace("\r", "")).join("\n") })).ok; } catch (error) { console.error("Error uploading Google Sheets data:", error); throw error; } } async function saveRecord({ formData, options, properties, accessToken }) { try { if (!accessToken) throw new Error("Access token is required"); if (!options.spreadsheetId) throw new Error("Spreadsheet ID is required"); const csvLines = (await downloadGoogleSheetsData(options.spreadsheetId, accessToken)).trim().split("\n"); const record = {}; for (const [key, value] of formData.entries()) record[key] = value; const newCsvRow = buildGoogleSheetHeaders(properties).map((header) => { const value = record[header]?.toString() || ""; if (value.includes(",") || value.includes("\"") || value.includes("\n")) return `"${value.replace(/"/g, "\"\"")}"`; return value; }).join(","); csvLines.push(newCsvRow); return uploadGoogleSheetsData(options.spreadsheetId, csvLines, accessToken); } catch (error) { console.error("Error pushing data to Google Sheets:", error); return false; } } /** * Create a spreadsheet in Google Sheets * @param title * @param schema * @param accessToken * @returns */ async function createTable({ name, schema, accessToken }) { try { const createResponse = await getClient(accessToken).callDriveApi("https://www.googleapis.com/drive/v3/files", "POST", { name, mimeType: "application/vnd.google-apps.spreadsheet" }); if (!createResponse.success) throw new Error(`Failed to create spreadsheet: ${createResponse.status}`); const spreadsheetId = createResponse.data.id; const spreadsheetUrl = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/edit`; const headerLine = buildGoogleSheetHeaders(schema.properties).join(","); await uploadGoogleSheetsData(spreadsheetId, [headerLine], accessToken); return { spreadsheetId, spreadsheetUrl }; } catch (error) { console.error("Error creating Google Sheets spreadsheet:", error); throw error; } } function buildGoogleSheetHeaders(properties) { return Object.entries(properties).sort(([, fieldA], [, fieldB]) => { const orderA = fieldA.metadata?.order; const orderB = fieldB.metadata?.order; if (orderA !== void 0 && orderB !== void 0) return orderA - orderB; if (orderA !== void 0 && orderB === void 0) return -1; if (orderA === void 0 && orderB !== void 0) return 1; return 0; }).map(([fieldName, field]) => { return fieldName; }); } async function updateTable({ spreadsheetId, newName, newProperties, accessToken }) { try { if (newName) await getClient(accessToken).callDriveApi(`https://www.googleapis.com/drive/v3/files/${spreadsheetId}`, "PATCH", { name: newName }); if (newProperties) { const newHeaders = buildGoogleSheetHeaders(newProperties); const csvLines = (await downloadGoogleSheetsData(spreadsheetId, accessToken)).split("\n").map((line, index) => { if (index === 0) return [...line.split(","), ...newHeaders].join(","); else { const currentValues = line.split(","); const newValues = newHeaders.map(() => ""); return [...currentValues, ...newValues].join(","); } }); await uploadGoogleSheetsData(spreadsheetId, csvLines, accessToken); } } catch (error) { console.error("Error updating Google Sheets spreadsheet:", error); throw error; } } //#endregion export { createTable, saveRecord, updateTable }; //# sourceMappingURL=handler.js.map