Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 0 additions & 119 deletions components/csvbox/actions/submit-spreadsheet/submit-spreadsheet.mjs

This file was deleted.

5 changes: 5 additions & 0 deletions components/csvbox/common/constants.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const BASE_URL = "https://api.csvbox.io/1.1/pipedream";

export default {
BASE_URL
};
149 changes: 149 additions & 0 deletions components/csvbox/csvbox-new-row/csvbox-new-row.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import app from "../csvbox.app.mjs";

export default {
key: "csvbox-new-row",
name: "New Import",
description: "Emit new events when a new row is added to a CSVBox sheet",
version: "0.0.1",
type: "source",
dedupe: "unique",
props: {
db: "$.service.db",
app,
sheetId: {
propDefinition: [app, "sheetId"],
description: "Select the sheet to receive data from",
},
http: "$.interface.http",
},
hooks: {
async activate() {
if (!this.sheetId) {
throw new Error("Sheet selection is required before activation.");
}

try {
const { data } = await this.app.createHook({
data: {
sheet_slug: this.sheetId,
webhook_url: this.http.endpoint,
},
});

const { webhookId, sample_response } = data;
this._setHookID(webhookId);

if (!Array.isArray(sample_response) || sample_response.length === 0) {
throw new Error("Unable to fetch sample data from selected sheet.");
}

const first = sample_response[0];
this.$emit({
import_id: `sample_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
sheet_id: this.sheetId,
sheet_name: first.sheet_name || "Sample Data",
row_number: first.row_number || 1,
row_data: first.row_data || first,
total_rows: first.total_rows || 10,
env_name: first.env_name || "default",
custom_fields: first.custom_fields || { user_id: "default123" },
import_description: first.import_description || "This is a sample test import",
original_filename: first.original_filename || "product_details.csv",
}, {
id: `sample_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
summary: `Sample data loaded from sheet - ${first.sheet_name} `,
ts: Date.now(),
});


this._setSampleRow(first);
} catch (err) {
console.error("Error during source activation:", err);
throw new Error(err?.message || "Failed to register webhook or fetch sample data.");
}
},
async deactivate() {
try {
const hookId = this._getHookID();
if (hookId) {
await this.app.deleteHook({
data: {
webhook_id: hookId,
sheet_slug: this.sheetId,
},
});
this._setHookID(null);
this._setSampleRow(null);
}
} catch (err) {
console.error("Deactivation Error:", err);
}
},
async deploy() {
const sampleRow = this._getSampleRow();
if (sampleRow) {
this.$emit(sampleRow, {
id: `sample_${Date.now()}`,
summary: "Sample row event",
ts: Date.now(),
});
}
else {
console.log("No sample row data found to emit during deploy.");
return;
}
},
},
methods: {
_getHookID() {
return this.db.get("hookId");
},
_setHookID(hookID) {
this.db.set("hookId", hookID);
},
_getSampleRow() {
return this.db.get("sampleRow");
},
_setSampleRow(rowData) {
this.db.set("sampleRow", rowData);
},
},
async run(event) {
const { body } = event;

if (!Array.isArray(body) || body.length === 0) {
console.error("Received webhook payload without row data");
return;
}

for (const row of body) {
this.$emit(row, {
id: row.import_id || `${row.sheet_id}_${row.row_number}_${Date.now()}`,
summary: `New data imported to sheet ${row.sheet_name}`,
ts: Date.now(),
});
}
},
sampleEvents: [
{
import_id: 79418895,
sheet_id: 55,
sheet_name: "Products",
row_number: 1,
row_data: {
"col1": "",
"col2": "",
"col3": "",
"col4": "",
"col5": "",
},
total_rows: 10,
env_name: "default",
custom_fields: {
user_id: "default123"
},
import_description: "This is a sample test import",
original_filename: "product_details.csv",
}
],
};
85 changes: 55 additions & 30 deletions components/csvbox/csvbox.app.mjs
Original file line number Diff line number Diff line change
@@ -1,55 +1,80 @@
import { axios } from "@pipedream/platform";
import constants from "./common/constants.mjs";

export default {
type: "app",
app: "csvbox",
propDefinitions: {
sheetLicenseKey: {
sheetId: {
type: "string",
label: "Sheet License Key",
description: "The unique identifier for your CSVBox sheet. You can find it in **Sheets - Edit - Code Snippet - Sheet License Key**.",
},
userId: {
type: "string",
label: "User ID",
description: "The unique identifier for the user. You can find it in the **Dashboard - Edit - Code Snippet**.",
optional: true,
},
hasHeaders: {
type: "boolean",
label: "Has Headers",
description: "Whether the spreadsheet has headers.",
label: "Sheet",
description: "Select the sheet you want to receive data from",
optional: true,
async options() {
const { data } = await this.listSheets();
return data.map((sheet) => ({
label: sheet.name,
value: sheet.value,
}));
},
},
},

methods: {
getUrl(path) {
return `https://api.csvbox.io/1.1${path}`;
_getAuthKeys() {
return this.$auth.api_key;
},
_getSecretAuthKeys() {
return this.$auth.secret_api_key;
},
getHeaders(headers) {
_getUrl(path) {
return `${constants.BASE_URL}${path}`;
},
_getHeaders(headers) {
return {
"Content-Type": "application/json",
"x-csvbox-api-key": `${this.$auth.api_key}`,
"x-csvbox-secret-api-key": `${this.$auth.secret_api_key}`,
...headers,
accept: "application/json",
"Content-Type": "application/json",
"x-csvbox-api-key": this._getAuthKeys(),
"x-csvbox-secret-api-key": this._getSecretAuthKeys(),
};
},
_makeRequest({
$ = this, path, headers, ...args
} = {}) {
return axios($, {
debug: true,
url: this.getUrl(path),
headers: this.getHeaders(headers),

async _makeRequest({ $ = this, path, headers, ...otherConfig } = {}) {
const config = {
url: this._getUrl(path),
headers: this._getHeaders(headers),
returnFullResponse: true,
...otherConfig,
};
return axios($, config);
},

async createHook({ data, ...args } = {}) {
return this._makeRequest({
method: "POST",
path: "/register-webhook",
data,
...args,
});
},
submitFile(args = {}) {

async deleteHook({ data, ...args } = {}) {
return this._makeRequest({
method: "POST",
path: "/file",
method: "DELETE",
path: `/delete-webhook`,
data,
...args,
});
},

async listSheets(args = {}) {
const res = await this._makeRequest({
method: "GET",
path: "/list-sheets",
...args,
});
return res;
},
},
};
3 changes: 1 addition & 2 deletions components/csvbox/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
"access": "public"
},
"dependencies": {
"@pipedream/platform": "^3.1.0",
"form-data": "^4.0.4"
"@pipedream/platform": "^3.1.0"
}
}
Loading