@upstart.gg/sdk
Version:
You can test the CLI without recompiling by running:
114 lines (112 loc) • 4.7 kB
JavaScript
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