-
Notifications
You must be signed in to change notification settings - Fork 5.6k
feat(sendoso): Add comprehensive API endpoint support (51 new actions) #19129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(sendoso): Add comprehensive API endpoint support (51 new actions) #19129
Conversation
This PR significantly expands the Sendoso integration from 3 actions to 54 total actions, providing comprehensive coverage (~95%) of the Sendoso REST API. Changes: - Extended sendoso.app.mjs with 60+ HTTP client methods and 10+ prop definitions - Added 51 new actions covering all major Sendoso API categories: * Send Management (5 actions) * Touch Management (5 actions) * Contact Management (8 actions) * Group Management (6 actions) * Template Management (2 actions) * Campaign Management (6 actions) * Webhook Management (3 actions) * Integration Management (2 actions) * Analytics & Reporting (2 actions) * Address, Catalog, eGift, User Management (7 actions) * Additional utility actions (5 actions) - Updated README.md with comprehensive use cases and examples - Bumped package version from 0.0.3 to 0.1.0 - Added technical terms to .wordlist.txt for spellcheck - Preserved all 3 existing actions (no breaking changes) Benefits: - Complete automation of Sendoso gifting and direct mail workflows - All actions automatically generate MCP tools for AI assistants - Dynamic dropdown selections for better UX - Comprehensive documentation with API links - Significantly reduced need for custom code All actions follow Pipedream component guidelines and pass automated checks.
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
Thank you so much for submitting this! We've added it to our backlog to review, and our team has been notified. |
|
Thanks for submitting this PR! When we review PRs, we follow the Pipedream component guidelines. If you're not familiar, here's a quick checklist:
|
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (1)
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including You can disable this status message by setting the WalkthroughThis PR adds eleven new Sendoso action modules for managing eGifts, campaigns, users, and groups, restructures the README with comprehensive documentation, expands the core app integration with new API methods and endpoint paths, and bumps the package version from 0.0.3 to 0.1.0 alongside minor version updates to existing actions and sources. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
Tip 📝 Customizable high-level summaries are now available in beta!You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.
Example instruction:
Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 22
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (62)
.wordlist.txt(1 hunks)components/sendoso/CI_CD_VALIDATION_REPORT.md(1 hunks)components/sendoso/ENDPOINTS_INVENTORY.md(1 hunks)components/sendoso/FINAL_IMPLEMENTATION_SUMMARY.md(1 hunks)components/sendoso/IMPLEMENTATION_STATUS.md(1 hunks)components/sendoso/PR_READINESS_ANALYSIS.md(1 hunks)components/sendoso/PR_SUBMISSION_CHECKLIST.md(1 hunks)components/sendoso/README.md(1 hunks)components/sendoso/READY_FOR_PR.md(1 hunks)components/sendoso/actions/add-group-members/add-group-members.mjs(1 hunks)components/sendoso/actions/cancel-send/cancel-send.mjs(1 hunks)components/sendoso/actions/create-campaign/create-campaign.mjs(1 hunks)components/sendoso/actions/create-contact/create-contact.mjs(1 hunks)components/sendoso/actions/create-egift-links/create-egift-links.mjs(1 hunks)components/sendoso/actions/create-group/create-group.mjs(1 hunks)components/sendoso/actions/create-send/create-send.mjs(1 hunks)components/sendoso/actions/create-touch/create-touch.mjs(1 hunks)components/sendoso/actions/create-webhook/create-webhook.mjs(1 hunks)components/sendoso/actions/delete-contact/delete-contact.mjs(1 hunks)components/sendoso/actions/delete-group/delete-group.mjs(1 hunks)components/sendoso/actions/delete-touch/delete-touch.mjs(1 hunks)components/sendoso/actions/delete-webhook/delete-webhook.mjs(1 hunks)components/sendoso/actions/duplicate-touch/duplicate-touch.mjs(1 hunks)components/sendoso/actions/export-contacts/export-contacts.mjs(1 hunks)components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs(1 hunks)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs(1 hunks)components/sendoso/actions/get-campaign/get-campaign.mjs(1 hunks)components/sendoso/actions/get-contact/get-contact.mjs(1 hunks)components/sendoso/actions/get-current-user/get-current-user.mjs(1 hunks)components/sendoso/actions/get-group/get-group.mjs(1 hunks)components/sendoso/actions/get-integration-status/get-integration-status.mjs(1 hunks)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs(1 hunks)components/sendoso/actions/get-send-details/get-send-details.mjs(1 hunks)components/sendoso/actions/get-template/get-template.mjs(1 hunks)components/sendoso/actions/get-touch/get-touch.mjs(1 hunks)components/sendoso/actions/import-contacts/import-contacts.mjs(1 hunks)components/sendoso/actions/launch-campaign/launch-campaign.mjs(1 hunks)components/sendoso/actions/list-all-users/list-all-users.mjs(1 hunks)components/sendoso/actions/list-campaigns/list-campaigns.mjs(1 hunks)components/sendoso/actions/list-catalog-items/list-catalog-items.mjs(1 hunks)components/sendoso/actions/list-contacts/list-contacts.mjs(1 hunks)components/sendoso/actions/list-egift-links/list-egift-links.mjs(1 hunks)components/sendoso/actions/list-group-members/list-group-members.mjs(1 hunks)components/sendoso/actions/list-groups/list-groups.mjs(1 hunks)components/sendoso/actions/list-integrations/list-integrations.mjs(1 hunks)components/sendoso/actions/list-sends/list-sends.mjs(1 hunks)components/sendoso/actions/list-sent-gifts/list-sent-gifts.mjs(1 hunks)components/sendoso/actions/list-templates/list-templates.mjs(1 hunks)components/sendoso/actions/list-touches/list-touches.mjs(1 hunks)components/sendoso/actions/list-webhooks/list-webhooks.mjs(1 hunks)components/sendoso/actions/pause-campaign/pause-campaign.mjs(1 hunks)components/sendoso/actions/remove-group-member/remove-group-member.mjs(1 hunks)components/sendoso/actions/resend-gift/resend-gift.mjs(1 hunks)components/sendoso/actions/search-contacts/search-contacts.mjs(1 hunks)components/sendoso/actions/send-bulk-email/send-bulk-email.mjs(1 hunks)components/sendoso/actions/update-contact/update-contact.mjs(1 hunks)components/sendoso/actions/update-group/update-group.mjs(1 hunks)components/sendoso/actions/update-send/update-send.mjs(1 hunks)components/sendoso/actions/update-touch/update-touch.mjs(1 hunks)components/sendoso/actions/validate-address/validate-address.mjs(1 hunks)components/sendoso/package.json(1 hunks)components/sendoso/sendoso.app.mjs(8 hunks)
🧰 Additional context used
🧠 Learnings (6)
📚 Learning: 2024-07-04T18:11:59.822Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/update-group/update-group.mjscomponents/sendoso/actions/get-campaign-stats/get-campaign-stats.mjscomponents/sendoso/actions/list-group-members/list-group-members.mjscomponents/sendoso/actions/get-current-user/get-current-user.mjscomponents/sendoso/actions/list-all-users/list-all-users.mjscomponents/sendoso/actions/get-group/get-group.mjscomponents/sendoso/actions/list-egift-links/list-egift-links.mjscomponents/sendoso/actions/remove-group-member/remove-group-member.mjscomponents/sendoso/actions/list-templates/list-templates.mjscomponents/sendoso/actions/list-webhooks/list-webhooks.mjscomponents/sendoso/actions/export-contacts/export-contacts.mjscomponents/sendoso/actions/send-bulk-email/send-bulk-email.mjscomponents/sendoso/actions/create-campaign/create-campaign.mjscomponents/sendoso/actions/list-groups/list-groups.mjscomponents/sendoso/actions/get-integration-status/get-integration-status.mjscomponents/sendoso/actions/list-sent-gifts/list-sent-gifts.mjscomponents/sendoso/actions/add-group-members/add-group-members.mjscomponents/sendoso/actions/update-send/update-send.mjscomponents/sendoso/actions/list-integrations/list-integrations.mjscomponents/sendoso/actions/list-campaigns/list-campaigns.mjscomponents/sendoso/actions/list-sends/list-sends.mjscomponents/sendoso/actions/get-campaign/get-campaign.mjs
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/create-contact/create-contact.mjscomponents/sendoso/actions/create-send/create-send.mjscomponents/sendoso/actions/create-group/create-group.mjscomponents/sendoso/actions/create-egift-links/create-egift-links.mjscomponents/sendoso/actions/create-campaign/create-campaign.mjscomponents/sendoso/actions/create-touch/create-touch.mjs
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.
Applied to files:
components/sendoso/actions/create-send/create-send.mjscomponents/sendoso/actions/resend-gift/resend-gift.mjscomponents/sendoso/actions/send-bulk-email/send-bulk-email.mjscomponents/sendoso/actions/delete-webhook/delete-webhook.mjscomponents/sendoso/actions/update-send/update-send.mjscomponents/sendoso/actions/list-sends/list-sends.mjs
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12697
File: components/salesforce_rest_api/sources/common-webhook-methods.mjs:1-71
Timestamp: 2024-10-08T15:33:38.240Z
Learning: The `common-webhook-methods.mjs` object is designed to be extended, similar to an abstract class, and intentionally does not implement certain methods like `generateWebhookMeta` and `getEventType` to enforce implementation in subclasses.
Applied to files:
components/sendoso/actions/create-webhook/create-webhook.mjscomponents/sendoso/actions/list-webhooks/list-webhooks.mjscomponents/sendoso/actions/delete-webhook/delete-webhook.mjs
📚 Learning: 2025-09-15T22:01:17.593Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18362
File: components/leonardo_ai/README.md:45-49
Timestamp: 2025-09-15T22:01:17.593Z
Learning: In Leonardo AI components (and likely other Pipedream components), prefer using info alert props on the component itself rather than detailed "Key Features" sections in README files for action documentation.
Applied to files:
components/sendoso/README.md
📚 Learning: 2025-06-04T17:52:05.780Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 16954
File: components/salesloft/salesloft.app.mjs:14-23
Timestamp: 2025-06-04T17:52:05.780Z
Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.
Applied to files:
components/sendoso/sendoso.app.mjs
🧬 Code graph analysis (49)
components/sendoso/actions/update-group/update-group.mjs (4)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/create-group/create-group.mjs (2)
data(34-36)response(39-42)components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/delete-group/delete-group.mjs (3)
components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
response(26-29)
components/sendoso/actions/search-contacts/search-contacts.mjs (2)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)
components/sendoso/actions/delete-contact/delete-contact.mjs (4)
components/sendoso/actions/create-contact/create-contact.mjs (1)
response(110-113)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
response(26-29)
components/sendoso/actions/get-contact/get-contact.mjs (1)
components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-47)response(50-53)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
params(44-47)
components/sendoso/actions/list-group-members/list-group-members.mjs (3)
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/create-touch/create-touch.mjs (1)
response(65-69)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/get-template/get-template.mjs (3)
components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)
components/sendoso/actions/get-send-details/get-send-details.mjs (1)
components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)
components/sendoso/actions/get-current-user/get-current-user.mjs (3)
components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)components/sendoso/actions/create-contact/create-contact.mjs (1)
response(110-113)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/list-all-users/list-all-users.mjs (2)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-campaigns/list-campaigns.mjs (1)
count(43-45)
components/sendoso/actions/get-group/get-group.mjs (3)
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/create-touch/create-touch.mjs (1)
response(65-69)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/create-contact/create-contact.mjs (5)
components/sendoso/actions/create-campaign/create-campaign.mjs (2)
data(43-45)response(49-52)components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)components/sendoso/actions/create-webhook/create-webhook.mjs (2)
data(40-43)response(46-49)components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(24-28)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/create-send/create-send.mjs (1)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(24-28)
components/sendoso/actions/update-touch/update-touch.mjs (2)
components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)components/sendoso/sendoso.app.mjs (5)
data(12-12)data(26-26)data(36-36)data(56-56)data(69-69)
components/sendoso/actions/create-webhook/create-webhook.mjs (3)
components/sendoso/actions/create-campaign/create-campaign.mjs (2)
data(43-45)response(49-52)components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
response(26-29)
components/sendoso/actions/list-egift-links/list-egift-links.mjs (3)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-all-users/list-all-users.mjs (1)
count(43-45)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)
components/sendoso/actions/update-contact/update-contact.mjs (2)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)
components/sendoso/actions/create-group/create-group.mjs (3)
components/sendoso/actions/create-campaign/create-campaign.mjs (2)
data(43-45)response(49-52)components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)
components/sendoso/actions/get-touch/get-touch.mjs (1)
components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)
components/sendoso/actions/remove-group-member/remove-group-member.mjs (2)
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/list-templates/list-templates.mjs (10)
components/sendoso/actions/list-all-users/list-all-users.mjs (1)
count(43-45)components/sendoso/actions/list-campaigns/list-campaigns.mjs (1)
count(43-45)components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (1)
count(53-55)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)components/sendoso/actions/list-egift-links/list-egift-links.mjs (1)
count(43-45)components/sendoso/actions/list-integrations/list-integrations.mjs (1)
count(23-25)components/sendoso/actions/list-sends/list-sends.mjs (1)
count(68-70)components/sendoso/actions/list-webhooks/list-webhooks.mjs (1)
count(23-25)components/sendoso/actions/search-contacts/search-contacts.mjs (1)
count(42-44)components/sendoso/sendoso.app.mjs (1)
result(37-37)
components/sendoso/actions/import-contacts/import-contacts.mjs (2)
components/sendoso/actions/create-contact/create-contact.mjs (1)
response(110-113)components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/resend-gift/resend-gift.mjs (2)
components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/list-webhooks/list-webhooks.mjs (2)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)
components/sendoso/actions/cancel-send/cancel-send.mjs (4)
components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
response(26-29)
components/sendoso/actions/export-contacts/export-contacts.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (1)
response(50-53)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (1)
response(48-52)
components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (2)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(24-28)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/list-contacts/list-contacts.mjs (2)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-all-users/list-all-users.mjs (1)
count(43-45)
components/sendoso/actions/create-campaign/create-campaign.mjs (3)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/create-group/create-group.mjs (2)
data(34-36)response(39-42)components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)
components/sendoso/actions/list-groups/list-groups.mjs (2)
components/sendoso/actions/create-group/create-group.mjs (1)
response(39-42)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/list-sent-gifts/list-sent-gifts.mjs (3)
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/add-group-members/add-group-members.mjs (3)
components/sendoso/actions/create-group/create-group.mjs (1)
response(39-42)components/sendoso/actions/create-touch/create-touch.mjs (1)
response(65-69)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/delete-webhook/delete-webhook.mjs (4)
components/sendoso/actions/create-webhook/create-webhook.mjs (1)
response(46-49)components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)
components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (1)
components/sendoso/actions/list-sends/list-sends.mjs (2)
params(55-58)count(68-70)
components/sendoso/actions/update-send/update-send.mjs (4)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-99)response(110-113)components/sendoso/actions/update-contact/update-contact.mjs (1)
data(70-70)components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/launch-campaign/launch-campaign.mjs (3)
components/sendoso/actions/duplicate-touch/duplicate-touch.mjs (2)
data(45-45)response(48-52)components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)components/sendoso/actions/create-send/create-send.mjs (1)
response(67-78)
components/sendoso/actions/list-integrations/list-integrations.mjs (3)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (1)
response(50-53)components/sendoso/actions/list-all-users/list-all-users.mjs (1)
count(43-45)
components/sendoso/actions/list-campaigns/list-campaigns.mjs (2)
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)
components/sendoso/actions/list-sends/list-sends.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-47)response(50-53)components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (2)
params(42-45)count(53-55)
components/sendoso/actions/delete-touch/delete-touch.mjs (3)
components/sendoso/actions/delete-contact/delete-contact.mjs (1)
response(26-29)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
response(26-29)
components/sendoso/actions/get-campaign/get-campaign.mjs (3)
components/sendoso/actions/create-campaign/create-campaign.mjs (1)
response(49-52)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (1)
response(50-53)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (3)
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
params(44-44)response(48-52)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
params(44-47)components/sendoso/actions/export-contacts/export-contacts.mjs (1)
response(31-36)
components/sendoso/actions/list-touches/list-touches.mjs (3)
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/create-touch/create-touch.mjs (1)
response(65-69)components/sendoso/actions/delete-group/delete-group.mjs (1)
response(26-29)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-47)response(50-53)
components/sendoso/actions/create-touch/create-touch.mjs (1)
components/sendoso/sendoso.app.mjs (5)
data(12-12)data(26-26)data(36-36)data(56-56)data(69-69)
components/sendoso/actions/duplicate-touch/duplicate-touch.mjs (3)
components/sendoso/actions/create-touch/create-touch.mjs (2)
data(58-60)response(65-69)components/sendoso/sendoso.app.mjs (5)
data(12-12)data(26-26)data(36-36)data(56-56)data(69-69)components/sendoso/actions/delete-touch/delete-touch.mjs (1)
response(36-39)
components/sendoso/sendoso.app.mjs (13)
components/sendoso/actions/create-campaign/create-campaign.mjs (1)
data(43-45)components/sendoso/actions/create-contact/create-contact.mjs (1)
data(95-99)components/sendoso/actions/create-group/create-group.mjs (1)
data(34-36)components/sendoso/actions/create-touch/create-touch.mjs (1)
data(58-60)components/sendoso/actions/create-webhook/create-webhook.mjs (1)
data(40-43)components/sendoso/actions/duplicate-touch/duplicate-touch.mjs (1)
data(45-45)components/sendoso/actions/launch-campaign/launch-campaign.mjs (1)
data(35-35)components/sendoso/actions/resend-gift/resend-gift.mjs (1)
data(43-43)components/sendoso/actions/update-contact/update-contact.mjs (1)
data(70-70)components/sendoso/actions/update-group/update-group.mjs (1)
data(42-42)components/sendoso/actions/update-send/update-send.mjs (1)
data(50-50)components/sendoso/actions/update-touch/update-touch.mjs (1)
data(59-59)components/sendoso/actions/list-templates/list-templates.mjs (1)
result(24-24)
🪛 LanguageTool
components/sendoso/IMPLEMENTATION_STATUS.md
[grammar] ~97-~97: Use a hyphen to join words.
Context: ...ic code needed ## Testing Strategy Per phase testing includes: - Manual testing...
(QB_NEW_EN_HYPHEN)
components/sendoso/CI_CD_VALIDATION_REPORT.md
[uncategorized] ~25-~25: The official name of this software platform is spelled with a capital “H”.
Context: ...s ### Workflow 1: Pull Request Checks (.github/workflows/pull-request-checks.yaml) #...
(GITHUB)
[uncategorized] ~136-~136: The official name of this software platform is spelled with a capital “H”.
Context: ...--- ### Workflow 2: Components Checks (.github/workflows/components-pr.yaml) #### ✅ ...
(GITHUB)
components/sendoso/PR_READINESS_ANALYSIS.md
[uncategorized] ~7-~7: The official name of this software platform is spelled with a capital “H”.
Context: ...analysis of Pipedream's CI/CD pipeline (.github/workflows/pull-request-checks.yaml and...
(GITHUB)
[uncategorized] ~84-~84: The official name of this software platform is spelled with a capital “H”.
Context: ...ersion changes What it checks: Uses .github/actions/git-diff-on-components to veri...
(GITHUB)
🔇 Additional comments (50)
components/sendoso/actions/update-contact/update-contact.mjs (1)
3-58: Action metadata and props are consistent with existing Sendoso contact actionsKey, name, annotations, description, and prop wiring (including
contactIdviapropDefinitionand optional update fields) align with the patterns used in the other Sendoso contact actions (create-contact,delete-contact). No issues here.components/sendoso/actions/create-contact/create-contact.mjs (3)
1-13: LGTM!The import, metadata, and annotations are properly structured. The action key and name align correctly, and the API documentation link is included in the description.
14-79: LGTM!The props are well-defined with clear labels and descriptions. The distinction between required fields (firstName, lastName, email) and optional fields is appropriate.
110-117: LGTM!The API call structure and response handling are correct. The summary message helpfully includes the contact's name, and the response is properly returned.
components/sendoso/package.json (1)
3-3: LGTM! Appropriate version bump.The minor version bump from 0.0.3 to 0.1.0 is appropriate for this significant feature expansion adding 51 new actions to the Sendoso integration.
components/sendoso/actions/update-group/update-group.mjs (1)
35-54: LGTM! Clean conditional data building pattern.The implementation correctly builds the data object conditionally to avoid sending undefined values to the API, and the summary export follows proper formatting conventions.
components/sendoso/actions/create-touch/create-touch.mjs (1)
49-73: LGTM! Proper field mapping and conditional data building.The implementation correctly:
- Builds the data object conditionally for optional fields
- Maps camelCase props to snake_case API fields (template → template_id, customMessage → custom_message)
- Provides clear user feedback in the summary
components/sendoso/actions/add-group-members/add-group-members.mjs (1)
28-42: LGTM! Clean implementation with proper array handling.The action correctly uses
members.lengthin the summary, which is safe since themembersprop is typed as"string[]". The implementation follows established patterns from similar actions.components/sendoso/actions/list-sent-gifts/list-sent-gifts.mjs (1)
12-16: The response is confirmed to be an array; review comment can be resolved.The code is correct. The propdef section in
sendoso.app.mjsalready calls.map()directly on the result oflistSendGifts(), which proves the response is an array. This code is currently in use without errors, confirming that_makeRequestreturns data in array format for thesent_gifts.jsonendpoint. The action's assumption thatresponse.lengthis valid is consistent with the confirmed response structure.components/sendoso/actions/update-send/update-send.mjs (1)
1-65: LGTM!The action follows Pipedream conventions correctly. The conditional data payload construction, API method invocation, and summary export are all implemented properly.
components/sendoso/actions/duplicate-touch/duplicate-touch.mjs (1)
1-58: LGTM!The action is well-structured with proper prop dependencies (touchId depends on groupId) and conditional payload construction. The implementation follows Pipedream patterns correctly.
components/sendoso/actions/update-touch/update-touch.mjs (1)
1-74: LGTM!The update touch action correctly handles optional field updates with conditional data construction. The touchId prop properly depends on groupId, ensuring correct context resolution.
components/sendoso/actions/export-contacts/export-contacts.mjs (1)
1-42: LGTM!The export contacts action is cleanly implemented with appropriate default values and format options. The params object pattern for query parameters is used correctly.
components/sendoso/actions/list-templates/list-templates.mjs (1)
17-21: LGTM!The API call is straightforward and correct.
components/sendoso/actions/delete-webhook/delete-webhook.mjs (1)
1-35: LGTM!The delete webhook action is correctly implemented with the destructive hint properly set to true. The implementation follows the established delete action pattern.
components/sendoso/actions/list-contacts/list-contacts.mjs (1)
1-50: LGTM!The list contacts action correctly implements pagination with limit and offset props. The count calculation properly handles different response formats, and the summary message follows the established pattern.
components/sendoso/actions/create-campaign/create-campaign.mjs (1)
1-58: LGTM!The create campaign action is well-implemented with proper handling of required and optional fields. The camelCase to snake_case conversion (groupId → group_id) is correctly applied for the API payload.
components/sendoso/actions/list-webhooks/list-webhooks.mjs (1)
23-26: LGTM! Defensive response handling.The count logic correctly handles both array responses and object responses with a nested
dataproperty, providing a fallback to 0. This defensive pattern prevents potential runtime errors from unexpected API response formats.components/sendoso/sendoso.app.mjs (3)
14-17: LGTM! Cleaner map callbacks.The refactored map callbacks using inline destructuring and implicit returns are more concise and idiomatic. This improves readability without changing behavior.
Also applies to: 45-48, 58-61, 71-74
232-906: LGTM! Comprehensive API surface expansion.The extensive addition of 60+ API methods follows a consistent pattern and is well-organized with section comments. All methods correctly:
- Accept
$for context injection- Use destructuring for parameters
- Call
_makeRequestwith appropriate HTTP methods and paths- Follow RESTful conventions
The organization by domain (Send Management, Touch Management, Contact Management, etc.) enhances maintainability.
87-145: LGTM! Well-structured prop definitions.The new prop definitions are correctly structured and provide good defaults (limit: 50, offset: 0). These support the expanded action surface and follow Pipedream conventions for reusable prop definitions.
components/sendoso/actions/get-send-details/get-send-details.mjs (1)
1-36: LGTM! Clean implementation.This action follows Pipedream conventions correctly with proper propDefinition usage, clear summary messages, and standard error handling (bubbled to platform). The structure is consistent with other get-detail actions in the PR.
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (1)
37-56: LGTM! Proper conditional parameter handling.The implementation correctly builds the params object with required fields and conditionally adds the optional
campaign_idwhen provided. This pattern is consistent with other analytics actions in the PR.components/sendoso/actions/get-current-user/get-current-user.mjs (1)
12-18: LGTM!The implementation is clean and follows best practices. The summary message properly handles the case where
components/sendoso/actions/launch-campaign/launch-campaign.mjs (1)
35-42: Review comment is incorrect. Parameter structure is properly handled.The code correctly uses the spread/rest pattern consistent with the app module's design:
- Action spreads
datainto thelaunchCampaigncall:launchCampaign({ $, campaignId, ...data })launchCampaignreceives these via its...datarest parameter, capturing any spread propertieslaunchCampaignpasses the captureddatato_makeRequestin thedatafield_makeRequestspreads options into axios config, sendingdataas the request bodyThis pattern matches other methods like
updateCampaignandcreateEgiftLinks. Thelaunch_dateparameter flows correctly: spread at call site → captured as part of...data→ passed nested indatafield → sent in request body.Likely an incorrect or invalid review comment.
components/sendoso/actions/pause-campaign/pause-campaign.mjs (1)
23-33: Add error handling or verify API idempotency behavior with Sendoso.The pause-campaign action lacks error handling and unconditionally exports a success message, while other Sendoso actions in the codebase (validate-address, create-send, create-contact) include try/catch patterns. The Sendoso API documentation does not specify whether the pause-campaign endpoint is idempotent or returns an error when pausing an already-paused campaign. Before documenting behavior in the action description, you should either test the API directly, contact Sendoso support for authoritative documentation, or add error-handling logic to gracefully manage both success and failure scenarios.
components/sendoso/actions/cancel-send/cancel-send.mjs (1)
3-46: Implementation of cancel-send action looks correct and consistentAnnotations, prop wiring (
sendIdviapropDefinition), conditional inclusion ofreason, and the summary message are all aligned with other Sendoso destructive actions. No changes needed.components/sendoso/actions/delete-contact/delete-contact.mjs (1)
3-33: Delete-contact action is well‑structured and consistentDestructive annotations, prop wiring, API call, and summary string all match established patterns for Sendoso delete actions. No changes needed.
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
17-21: Confirm thatamountmatches the Sendoso API’s expected meaningHere
amountis documented as “The number of links to generate” and passed directly asamounttocreateEgiftLinks. In some APIs,amountcan instead mean the monetary value of an eGift.Please double‑check the Sendoso REST docs for
create-egift-linksto ensure:
amountindeed represents the number of links (not currency), and- no additional required fields (e.g., per‑link value) are being omitted.
Adjust the prop label/description or payload shape if the docs indicate different semantics.
Also applies to: 24-30
components/sendoso/actions/create-group/create-group.mjs (1)
3-46: Create Group action looks correct and consistentMetadata, props, and
runimplementation align with other Sendoso "create" actions: requiredname, optionaldescription, clean payload, and a clear$summary. Naming (key/name) is also consistent with prior guidance.
Based on learningscomponents/sendoso/actions/search-contacts/search-contacts.mjs (1)
3-47: Search Contacts action aligns with list/search patternsUses
queryandlimitcorrectly, delegates tosearchContacts, and robustly derivescountfrom either an array or{ data }response, with a clear$summary. No functional issues spotted.components/sendoso/actions/remove-group-member/remove-group-member.mjs (1)
3-42: Remove Group Member action is well-structuredProps, destructive annotations, API call, and
$summarymessage are all appropriate and consistent with other destructive actions and summary-format guidance.
Based on learningscomponents/sendoso/actions/list-egift-links/list-egift-links.mjs (1)
3-48: List eGift Links action follows established listing patternRead-only annotations, pagination props, API invocation, and count-based
$summarymirror other list actions and look correct.
Based on learningscomponents/sendoso/actions/delete-touch/delete-touch.mjs (1)
3-43: Delete Touch action is correct; unused groupId is intentional
groupIdis only used to drive thetouchIdpropDefinition options, so it not appearing inrun()is expected. The destructive annotations, API call, and$summaryall look good and consistent with other delete actions.components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
3-56: Get Send Analytics action matches analytics conventionsDate props, optional
groupIdfilter, parameter mapping, and$summaryare all consistent with the existing analytics actions (e.g., campaign analytics). Implementation looks sound.components/sendoso/actions/list-campaigns/list-campaigns.mjs (1)
1-50: LGTM!The action follows Pipedream conventions correctly with proper metadata, annotations, prop definitions, and run method implementation. The count derivation logic handles both array and paginated response shapes appropriately, and the summary message format is correct.
components/sendoso/actions/list-sends/list-sends.mjs (1)
1-75: LGTM!The action correctly implements optional date filtering with proper conditional param addition. The implementation is consistent with other date-filtered actions in the codebase and follows Pipedream conventions.
components/sendoso/actions/list-all-users/list-all-users.mjs (1)
1-50: LGTM!The action follows the established pattern for list actions with proper structure, prop definitions, and summary formatting.
components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (1)
1-60: LGTM!The action correctly implements optional category filtering with consistent conditional param handling. Implementation follows established patterns.
components/sendoso/PR_READINESS_ANALYSIS.md (1)
1-336: Documentation file - no issues found.The static analysis hints about "github" capitalization are false positives. The lowercase
.githubis correct for file system paths in GitHub repositories.components/sendoso/actions/get-campaign/get-campaign.mjs (1)
1-35: LGTM!The action follows the standard pattern for retrieval actions with proper prop wiring and summary formatting.
components/sendoso/actions/get-group/get-group.mjs (1)
1-35: LGTM!The action follows the established pattern for get-by-ID actions with consistent structure and proper implementation.
components/sendoso/actions/get-contact/get-contact.mjs (1)
1-35: LGTM! Well-structured action following Pipedream patterns.The action correctly implements a read-only GET operation with appropriate annotations, proper propDefinition usage, and clear user feedback via the summary export.
components/sendoso/FINAL_IMPLEMENTATION_SUMMARY.md (1)
1-291: Comprehensive implementation documentation.This summary provides excellent context for the PR scope, implementation statistics, and readiness status. Well-organized and helpful for reviewers.
components/sendoso/actions/get-touch/get-touch.mjs (2)
14-32: LGTM! Proper use of dependent dynamic props.The groupId prop correctly provides context for dynamically loading touchId options (lines 26-28), following Pipedream's pattern for dependent props. The API call appropriately uses only touchId since it's sufficient for retrieval.
33-44: Clean implementation of the run function.The function correctly retrieves touch details using the touchId and provides clear user feedback via the summary export.
components/sendoso/actions/get-template/get-template.mjs (1)
1-35: LGTM! Consistent implementation following established patterns.This action mirrors the structure of other GET actions in the PR (e.g., get-contact.mjs), demonstrating good consistency across the new action set. Proper annotations, clear summary, and correct API method invocation.
components/sendoso/READY_FOR_PR.md (1)
1-333: Thorough PR readiness documentation.This checklist provides comprehensive guidance for PR submission, including validation status, step-by-step instructions, and expected outcomes. Well-organized and helpful for ensuring a smooth submission process.
components/sendoso/actions/list-groups/list-groups.mjs (2)
12-13: Disregard the original review comment—the code is correct as written.The
listGroups()method in the Sendoso app is designed to accept no parameters. Passing$would be incorrect and inconsistent with the method signature. While some Sendoso methods accept{ $, params }, the simple list operations (listGroups(),listSendGifts(),listTemplates()) intentionally do not, and the action correctly calls them without additional parameters.Likely an incorrect or invalid review comment.
14-14: Code is correct. No changes needed.The response from
listGroups()is an array, not an object with nested Resources. This is confirmed by the propDefinitions code (line 16 of sendoso.app.mjs) which directly calls.map()on thelistGroups()result—if the response were an object, this would fail. The summary export usingresponse.lengthis correct.
components/sendoso/actions/validate-address/validate-address.mjs
Outdated
Show resolved
Hide resolved
- Fix .wordlist.txt: Replace 'codebaseegift' with 'egift' - Fix create-contact.mjs: Use correct API field names (mobile_no, company_name) - Fix create-send.mjs: Add required fields (via, via_from, confirm_address) and fix response handling - Fix import-contacts.mjs: Properly handle string[] parsing - Mark resend-gift as destructive operation - Add annotations to create-egift-links and send-bulk-email - Mark validate-address as read-only - Add defensive response handling to list-group-members, list-touches, list-integrations - Add date format hints to get-campaign-stats - Refine update-contact payload construction with correct field names - Simplify list-integrations (remove empty params) - Add webhook event examples to create-webhook - Add defensive response handling to delete-group - Fix README version number (v0.1.0) All 22 codeRabbit suggestions addressed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 11
♻️ Duplicate comments (5)
components/sendoso/actions/list-integrations/list-integrations.mjs (1)
17-26: Consider exposing pagination controls (page,per_page) on this list endpoint.The
runimplementation and$summaryexport are correct and follow the established pattern, but callers currently cannot control paging for integrations—listIntegrationsis invoked with only$. If the SendosoGET /integrationsendpoint supports page-based pagination (e.g.page,per_page), consider adding optional numeric props and forwarding them into the app method so users can retrieve large result sets and tune page size. This mirrors the earlier suggestion on this file and may improve usability for high-integration accounts.Please verify against the current Sendoso REST docs:
Does the Sendoso "List Integrations" REST endpoint support page/per_page (or similar) pagination parameters, and how are they passed?components/sendoso/actions/update-contact/update-contact.mjs (1)
59-89: Guard against empty update payloads and allow explicit field clearingTwo behaviors here are worth tightening up:
- If the caller supplies only
contactId(no update fields),datastays empty and you still callupdateContactwith just{ $, contactId }. That’s likely either a 4xx from Sendoso or a confusing no-op.- Using truthy checks (
...(firstName && { ... })) prevents callers from intentionally clearing a field (e.g., settingtitleto an empty string).You can address both by switching to explicit
!== undefinedchecks and enforcing at least one update field before making the API call. For example:async run({ $ }) { @@ - const data = {}; - const updates = { - ...(firstName && { first_name: firstName }), - ...(lastName && { last_name: lastName }), - ...(email && { email }), - ...(phone && { mobile_no: phone }), - ...(company && { company_name: company }), - ...(title && { title }), - }; - - Object.assign(data, updates); - - const response = await this.sendoso.updateContact({ - $, - contactId, - ...data, - }); + const data = {}; + if (firstName !== undefined) data.first_name = firstName; + if (lastName !== undefined) data.last_name = lastName; + if (email !== undefined) data.email = email; + if (phone !== undefined) data.mobile_no = phone; + if (company !== undefined) data.company_name = company; + if (title !== undefined) data.title = title; + + if (!Object.keys(data).length) { + throw new Error("At least one field must be provided to update the contact."); + } + + const response = await this.sendoso.updateContact({ + $, + contactId, + ...data, + });This keeps the common case unchanged while (a) failing fast with a clear message when nothing is being updated, and (b) letting users explicitly clear fields when the underlying Sendoso API supports it.
components/sendoso/actions/delete-group/delete-group.mjs (1)
3-22: Document the “empty group” prerequisite (or validate it pre-flight).The description doesn’t mention that Sendoso won’t delete a group that still has members (no cascade delete), which can lead to confusing API errors for users invoking this action.
Consider either:
- Updating the
descriptionto clearly state that all members must be removed before deletion, or- Adding a pre-flight check (e.g., list group members and fail fast with a helpful message if any exist).
Example description tweak:
- description: "Delete a group from Sendoso. [See the documentation](https://sendoso.docs.apiary.io/#reference/group-management)", + description: "Delete a group from Sendoso. Note: groups must have no members before they can be deleted. [See the documentation](https://sendoso.docs.apiary.io/#reference/group-management)",components/sendoso/actions/create-contact/create-contact.mjs (1)
95-107: Excellent work addressing previous feedback!The API field mappings have been corrected to use
mobile_no(line 99) andcompany_name(line 100), and the cleaner object spread pattern for optional fields is now in place. However, the previous review's concern about thetitlefield (line 101) remains unaddressed.Verify that the
titlefield is supported by the Sendoso Create Contact API.The previous review noted that the
titlefield is not documented in official Sendoso examples. Please confirm whether this field is accepted by the API or should be removed.Does the Sendoso Create Contact API support a "title" field for job title?components/sendoso/actions/create-webhook/create-webhook.mjs (1)
21-25: Past review comment already flagged event validation concern.The events property accepts arbitrary strings without validation or guidance. A previous review suggested either:
- Adding an
optionsmethod to provide dynamic suggestions of valid event types- Expanding the description with a comprehensive list and adding runtime validation
This remains an enhancement opportunity for better UX.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (17)
.wordlist.txt(1 hunks)components/sendoso/GUIDELINES_COMPLIANCE_REPORT.md(1 hunks)components/sendoso/README.md(1 hunks)components/sendoso/actions/create-contact/create-contact.mjs(1 hunks)components/sendoso/actions/create-egift-links/create-egift-links.mjs(1 hunks)components/sendoso/actions/create-send/create-send.mjs(1 hunks)components/sendoso/actions/create-webhook/create-webhook.mjs(1 hunks)components/sendoso/actions/delete-group/delete-group.mjs(1 hunks)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs(1 hunks)components/sendoso/actions/import-contacts/import-contacts.mjs(1 hunks)components/sendoso/actions/list-group-members/list-group-members.mjs(1 hunks)components/sendoso/actions/list-integrations/list-integrations.mjs(1 hunks)components/sendoso/actions/list-touches/list-touches.mjs(1 hunks)components/sendoso/actions/resend-gift/resend-gift.mjs(1 hunks)components/sendoso/actions/send-bulk-email/send-bulk-email.mjs(1 hunks)components/sendoso/actions/update-contact/update-contact.mjs(1 hunks)components/sendoso/actions/validate-address/validate-address.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (7)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/create-contact/create-contact.mjscomponents/sendoso/actions/create-send/create-send.mjscomponents/sendoso/actions/create-egift-links/create-egift-links.mjs
📚 Learning: 2024-10-08T16:42:59.225Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 14229
File: components/americommerce/actions/update-customer/update-customer.mjs:89-94
Timestamp: 2024-10-08T16:42:59.225Z
Learning: When defining boolean properties in AmeriCommerce components (e.g., in `update-customer.mjs`), ensure that the label and description are consistent and clearly indicate the intent, especially when using negations like "No Account", to avoid confusion.
Applied to files:
components/sendoso/actions/create-contact/create-contact.mjscomponents/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.
Applied to files:
components/sendoso/actions/create-contact/create-contact.mjscomponents/sendoso/actions/create-webhook/create-webhook.mjscomponents/sendoso/actions/create-send/create-send.mjscomponents/sendoso/actions/send-bulk-email/send-bulk-email.mjscomponents/sendoso/actions/import-contacts/import-contacts.mjs
📚 Learning: 2024-07-04T18:11:59.822Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjscomponents/sendoso/actions/list-touches/list-touches.mjscomponents/sendoso/actions/create-send/create-send.mjscomponents/sendoso/actions/list-group-members/list-group-members.mjscomponents/sendoso/actions/list-integrations/list-integrations.mjs
📚 Learning: 2025-06-04T17:52:05.780Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 16954
File: components/salesloft/salesloft.app.mjs:14-23
Timestamp: 2025-06-04T17:52:05.780Z
Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.
Applied to files:
components/sendoso/actions/list-touches/list-touches.mjscomponents/sendoso/actions/list-group-members/list-group-members.mjs
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12697
File: components/salesforce_rest_api/sources/common-webhook-methods.mjs:1-71
Timestamp: 2024-10-08T15:33:38.240Z
Learning: The `common-webhook-methods.mjs` object is designed to be extended, similar to an abstract class, and intentionally does not implement certain methods like `generateWebhookMeta` and `getEventType` to enforce implementation in subclasses.
Applied to files:
components/sendoso/actions/create-webhook/create-webhook.mjs
📚 Learning: 2025-09-15T22:01:17.593Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 18362
File: components/leonardo_ai/README.md:45-49
Timestamp: 2025-09-15T22:01:17.593Z
Learning: In Leonardo AI components (and likely other Pipedream components), prefer using info alert props on the component itself rather than detailed "Key Features" sections in README files for action documentation.
Applied to files:
components/sendoso/README.md
🧬 Code graph analysis (13)
components/sendoso/actions/validate-address/validate-address.mjs (1)
components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)
components/sendoso/actions/resend-gift/resend-gift.mjs (3)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-107)response(109-112)components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)
components/sendoso/actions/create-contact/create-contact.mjs (4)
components/sendoso/actions/create-webhook/create-webhook.mjs (2)
data(40-43)response(46-49)components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(29-33)components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)components/sendoso/actions/validate-address/validate-address.mjs (1)
response(53-60)
components/sendoso/actions/delete-group/delete-group.mjs (3)
components/sendoso/actions/list-group-members/list-group-members.mjs (1)
response(19-19)components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)components/sendoso/actions/create-group/create-group.mjs (1)
response(39-42)
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (1)
params(44-47)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
params(44-47)
components/sendoso/actions/list-touches/list-touches.mjs (1)
components/sendoso/actions/list-group-members/list-group-members.mjs (2)
response(19-19)count(20-22)
components/sendoso/actions/create-webhook/create-webhook.mjs (2)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-107)response(109-112)components/sendoso/actions/create-group/create-group.mjs (2)
data(34-36)response(39-42)
components/sendoso/actions/create-send/create-send.mjs (3)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(29-33)components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (1)
response(29-33)components/sendoso/actions/validate-address/validate-address.mjs (1)
response(53-60)
components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (2)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(29-33)components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (2)
components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (1)
response(29-33)
components/sendoso/actions/list-group-members/list-group-members.mjs (2)
components/sendoso/actions/list-integrations/list-integrations.mjs (2)
response(18-20)count(22-24)components/sendoso/actions/list-touches/list-touches.mjs (2)
response(19-19)count(20-22)
components/sendoso/actions/update-contact/update-contact.mjs (1)
components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-107)response(109-112)
components/sendoso/actions/list-integrations/list-integrations.mjs (4)
components/sendoso/actions/list-group-members/list-group-members.mjs (2)
response(19-19)count(20-22)components/sendoso/actions/list-touches/list-touches.mjs (2)
response(19-19)count(20-22)components/sendoso/actions/list-contacts/list-contacts.mjs (1)
count(43-45)components/sendoso/actions/list-webhooks/list-webhooks.mjs (1)
count(23-25)
🔇 Additional comments (28)
components/sendoso/actions/validate-address/validate-address.mjs (1)
3-67: Validate Address action implementation looks correct and consistent with existing Sendoso patternsKey, props, annotations (including
readOnlyHint: true), and therunmethod all align with Pipedream action conventions. The call tothis.sendoso.validateAddresswith the collected fields and the summary derived fromvalid/is_validshould behave as expected. No changes requested.components/sendoso/actions/list-touches/list-touches.mjs (3)
1-8: LGTM!The action metadata follows Pipedream conventions correctly, with a properly formatted component key, descriptive documentation link, and appropriate version number for a new action.
9-17: LGTM!The props are correctly defined using propDefinition, which promotes reusability and consistency across Sendoso actions.
18-25: LGTM! Defensive handling correctly implemented.The run method now includes proper defensive response handling that prevents potential runtime errors. The multi-level fallback pattern (array check → data property → touches property → zero) aligns with similar actions in this PR and addresses the previous review feedback.
components/sendoso/actions/list-integrations/list-integrations.mjs (1)
3-16: Action metadata and props look consistent with Sendoso patterns.Key, name, version, annotations, description, and
sendosoapp prop are all aligned with other Sendoso list-style actions. No issues here.components/sendoso/actions/update-contact/update-contact.mjs (1)
3-58: Action metadata and props look consistent with Pipedream + Sendoso patternsKey, name, annotations, description (with docs link), and prop wiring (app-level
sendoso+contactIdpropDefinition + optional update fields) all look aligned with the conventions used across the other Sendoso actions in this PR. I don’t see structural issues here.components/sendoso/actions/list-group-members/list-group-members.mjs (2)
1-17: LGTM! Well-structured action metadata.The action metadata follows Pipedream conventions correctly with proper key formatting, propDefinition usage, and documentation link.
18-25: LGTM! Defensive response handling already implemented.The run method correctly implements defensive response handling (lines 20-22) with Array.isArray checks and multiple fallback options. This addresses the concern raised in previous review feedback and is consistent with other list actions in this PR (e.g.,
list-integrations.mjs). The summary message format follows conventions, and the return value is appropriate.components/sendoso/actions/resend-gift/resend-gift.mjs (4)
1-2: LGTM!The import statement follows the standard Pipedream pattern for action files.
3-12: Past review concern addressed.The component metadata is correctly configured with
destructiveHint: true, addressing the previous review feedback about marking this action as destructive. The warning in the description appropriately alerts users to potential costs and duplicate sends.
14-35: LGTM!The props are well-defined with appropriate labels, descriptions, and optional markers. The use of
propDefinitionforsendIdfollows Pipedream best practices for reusable prop definitions.
36-56: LGTM!The run function is well-implemented:
- Cleanly builds the data payload from optional props
- Follows the established pattern seen in other Sendoso actions
- Provides a clear summary message
- Returns the API response appropriately
components/sendoso/actions/create-contact/create-contact.mjs (3)
1-13: LGTM! Action metadata and configuration are well-defined.The action key follows Pipedream naming conventions, the version is appropriate for a new action, and the description includes a proper link to the Sendoso API documentation.
14-79: LGTM! Props are well-structured and clearly documented.All required and optional fields are properly configured with appropriate labels and descriptions. The distinction between required (firstName, lastName, email) and optional fields is correct.
109-116: LGTM! API invocation and response handling are correct.The action properly calls
createContact, exports a clear summary message, and returns the API response. The implementation follows Pipedream conventions.components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (1)
8-12: Annotations are now present and correctly configured.The annotations have been added as requested in the previous review. The values are appropriate for a bulk send action: non-destructive (doesn't delete data), makes external API calls (openWorldHint), and performs writes (non-read-only).
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
3-13: LGTM: Component structure and summary message.The component metadata (lines 3-13) follows Pipedream conventions with appropriate annotations for a read-only action. The run method (lines 39-58) implements the standard pattern correctly: destructuring props, building parameters, calling the API method, and exporting a properly formatted summary message.
The summary message format on line 56 aligns with best practices from the retrieved learnings.
Also applies to: 39-58
46-48: Verify: Inconsistent param building pattern across analytics actions—confirmed.The inconsistency identified in the review is confirmed.
get-campaign-stats.mjs(lines 46-48) conditionally assignsstart_dateandend_dateto params only when provided, while bothget-campaign-analytics.mjs(lines 44-47) andget-send-analytics.mjs(lines 44-47) always assign these parameters directly, regardless of their values.The conditional approach is generally better practice as it avoids sending undefined values to the API. Verify which pattern the Sendoso API expects and ensure consistency across all three analytics/stats action files.
components/sendoso/actions/create-egift-links/create-egift-links.mjs (4)
1-2: LGTM!The import statement is clean and follows standard ES module conventions.
3-13: LGTM! Annotations properly describe the action.The action metadata is well-structured with appropriate annotations indicating this is a non-destructive write operation. The past review comment requesting annotations has been addressed.
28-36: LGTM! Run method follows Pipedream patterns.The implementation correctly maps props to API parameters (camelCase to snake_case), exports a clear summary, and returns the response. The structure is consistent with other Sendoso actions in the codebase.
22-26: Based on the clarification, I'll search for the specific limit most relevant to your code: the maximum number of eGift links that can be created in a single API request.Let me search for more specific information about API rate limits and batch size constraints.
Let me search for Pipedream's Sendoso integration documentation to understand the
amountparameter better.Add minimum validation to the amount parameter.
The suggestion to add
min: 1is valid and recommended. This prevents invalid inputs like zero or negative numbers. However, I could not locate explicit documentation from Sendoso specifying a maximum limit on the number of eGift links that can be generated in a single API request. The API documentation examples show generating multiple eGift links, but the exact batch size limit is not documented in publicly available sources.Suggested action: Apply the
min: 1validation as proposed. For the maximum limit, consult Sendoso's API support or documentation directly—they can confirm if there's a documented constraint that should also be added to the schema.amount: { type: "integer", label: "Amount", description: "The number of links to generate.", + min: 1, },components/sendoso/actions/create-send/create-send.mjs (3)
91-109: Response handling looks good.The response field reference has been corrected from the previous review. Line 107 now correctly uses
response.tracking_codeas the primary identifier, with sensible fallbacks toresponse.messageand a generic string. This aligns with the documented Sendoso API response structure.
16-21: Manually verify that touchId is marked as required in sendoso.app.mjs.The initial search output showed the touchId property definition but was truncated. Unable to retrieve the complete definition to confirm whether the
optionalflag is set. Please verify insendoso.app.mjsthat touchId either hasoptional: falseor nooptionalflag (defaults to required per Pipedream conventions), since this field is required by the Sendoso API.
92-106: Code correctly handles both physical and eGift sends; undefined values are properly omitted.The
sendGiftmethod exists and accepts both send types via the generic...datapattern. When axios serializes the payload via JSON, undefined values are automatically removed before transmission to the API. The implementation is correct.components/sendoso/README.md (1)
150-150: Version number is now correct.The past review comment flagged this line as showing "v0.0.3" when it should be "v0.1.0". The current version correctly shows:
- **v0.1.0**: Added comprehensive API endpoint support (50+ new actions)This aligns with the package version bump in
package.json..wordlist.txt (1)
1079-1081: Both "API" (singular) and "APIs" (plural) are justified—wordlist entries are correct.The script results confirm that singular "API" is actively used throughout the Sendoso documentation in contexts like "Sendoso API", "API Rate Limits", "API endpoint support", and "API Coverage". This complements the plural "APIs" that exists at line 34. Both forms serve different spell-checking purposes and should be retained.
All three wordlist entries are valid:
- egift: Lowercase variant for case-insensitive matching
- eGift: Proper Sendoso branding capitalization
- API: Singular form used in documentation and feature descriptions
components/sendoso/actions/create-webhook/create-webhook.mjs (1)
46-49: Code pattern verified as correct.The data spreading in the
createWebhookcall is correct. The method signature insendoso.app.mjsshows:createWebhook({ $, ...data }) { return this._makeRequest({ $, path: "webhooks", method: "POST", data, }); }The method destructures
{ $, ...data }to extract the$parameter and collect remaining properties intodata, which is then passed to_makeRequest. The calling patternthis.sendoso.createWebhook({ $, ...data })correctly spreads the properties (url,events,description) that get re-collected as thedataobject and passed to axios as expected.
components/sendoso/actions/create-egift-links/create-egift-links.mjs
Outdated
Show resolved
Hide resolved
components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs
Outdated
Show resolved
Hide resolved
- Fix update-contact: Use !== undefined checks and guard against empty payloads - Fix delete-group: Document empty group prerequisite - Fix create-egift-links: Add min: 1 validation to amount parameter - Fix get-campaign-analytics & get-send-analytics: Use conditional param building (consistent with get-campaign-stats) - Fix list-integrations: Add pagination controls (limit/offset props) All 11 CodeRabbit round 2 comments addressed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (4)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
22-27: Markamountas required (and consider a sensible default)
amountappears to be mandatory for thecreateEgiftLinksAPI call. Leaving it optional means:
- The action can be invoked without an
amount, likely causing a 4xx from Sendoso.- The summary would render as
Successfully created undefined eGift linkswhenthis.amountis missing.Marking it as required (and optionally setting a default, e.g.
default: 1) will prevent invalid invocations at the UI/schema layer.Suggested change:
amount: { type: "integer", label: "Amount", description: "The number of links to generate.", + required: true, min: 1, },components/sendoso/actions/delete-group/delete-group.mjs (2)
23-35: Previous review issue remains unaddressed: null guards and misleading failure message.The concerns raised in the earlier review comment on these lines have not been resolved:
- No null/undefined guard: If
deleteGroupreturnsnullorundefined(e.g., 204 with no body), line 31 will throw when accessingresponse.successorresponse.error.- Misleading failure message: When
successis false, the summary at line 34 still says "Deletion completed for group ID: ${groupId}", which incorrectly implies the operation succeeded.Apply optional chaining and emit a clear failure message:
- const response = await this.sendoso.deleteGroup({ - $, - groupId, - }); - - const success = response.success !== false && response.error === undefined; - $.export("$summary", success ? - `Successfully deleted group ID: ${groupId}` : - `Deletion completed for group ID: ${groupId}`); + const response = await this.sendoso.deleteGroup({ + $, + groupId, + }); + + const success = response?.success !== false && response?.error === undefined; + $.export("$summary", success + ? `Successfully deleted group ID: ${groupId}` + : `Failed to delete group ID: ${groupId}. Check the response for details.`);
31-34: Consider simplifying or standardizing success handling.This action is the only one in the integration that attempts to derive success from the response shape. Other Sendoso actions (update-contact, cancel-send, list-touches, etc.) simply return the API response without conditional summary logic.
While explicit success/failure messaging is valuable for destructive operations, the current logic (
response.success !== false && response.error === undefined) is fragile. Consider either:
- Simplify: Trust the HTTP status (if deleteGroup throws on 4xx/5xx, success means the call didn't throw) and always emit a success summary.
- Standardize: If Sendoso responses consistently include a
successfield, use a strict check:success = response?.success === true.- Align with other actions: Remove conditional logic entirely and let users inspect the returned response.
Based on learnings from similar patterns, option 1 or 2 would be most maintainable.
components/sendoso/actions/list-integrations/list-integrations.mjs (1)
14-28: Fix pagination parameters: usepageandper_pageinstead oflimitandoffset.The Sendoso API expects page-based pagination with
page(1-based integer) andper_pageparameters. The current implementation inlist-integrations.mjssendslimitandoffsetparameters instead, which will not work with the API.Required changes:
- Lines 16-23: Change prop definitions from
limit/offsettopage/per_page- Lines 29-31: Convert to page-based pagination (e.g.,
page = (offset / limit) + 1)- Or update
sendoso.app.mjsprop definitions and all dependent actions consistentlyThis same issue likely affects other list actions (e.g.,
list-catalog-items.mjs,list-sends.mjs).
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (6)
components/sendoso/actions/create-egift-links/create-egift-links.mjs(1 hunks)components/sendoso/actions/delete-group/delete-group.mjs(1 hunks)components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs(1 hunks)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs(1 hunks)components/sendoso/actions/list-integrations/list-integrations.mjs(1 hunks)components/sendoso/actions/update-contact/update-contact.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/create-egift-links/create-egift-links.mjs
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/delete-group/delete-group.mjscomponents/sendoso/actions/list-integrations/list-integrations.mjs
🧬 Code graph analysis (6)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (2)
components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (1)
response(29-33)components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)
components/sendoso/actions/delete-group/delete-group.mjs (5)
components/sendoso/actions/update-contact/update-contact.mjs (1)
response(82-86)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (1)
response(50-54)components/sendoso/actions/list-touches/list-touches.mjs (1)
response(19-19)components/sendoso/actions/list-group-members/list-group-members.mjs (1)
response(19-19)components/sendoso/actions/cancel-send/cancel-send.mjs (1)
response(36-42)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-44)response(49-52)components/sendoso/actions/list-integrations/list-integrations.mjs (2)
params(30-30)response(34-37)
components/sendoso/actions/list-integrations/list-integrations.mjs (4)
components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (2)
params(42-45)count(53-55)components/sendoso/actions/list-sends/list-sends.mjs (2)
params(55-58)count(68-70)components/sendoso/actions/list-touches/list-touches.mjs (2)
response(19-19)count(20-22)components/sendoso/actions/list-group-members/list-group-members.mjs (2)
response(19-19)count(20-22)
components/sendoso/actions/update-contact/update-contact.mjs (2)
components/sendoso/actions/create-webhook/create-webhook.mjs (2)
data(40-43)response(46-49)components/sendoso/actions/create-contact/create-contact.mjs (2)
data(95-107)response(109-112)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (2)
params(44-44)response(49-52)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
params(46-46)response(50-54)
🔇 Additional comments (14)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (2)
3-13: Action metadata and annotations look consistent and well‑structuredKey, name, description, version, and the
destructiveHint/openWorldHint/readOnlyHintannotations correctly describe a non‑destructive write operation that talks to an external API, matching the intended behavior of generating eGift links.
29-36: Run implementation correctly delegates to app client and exports a clear summaryThe
runmethod cleanly callsthis.sendoso.createEgiftLinkswithtouch_idandamount, returns the API response, and exports a concise summary. Onceamountis enforced as required, this flow should be robust and user‑friendly.components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (1)
1-52: Solid action wiring; confirmgetSendAnalyticscovers full API behavior (e.g., pagination)Import, key/name, annotations, prop wiring, and the camelCase → snake_case mapping into
paramsall look correct and consistent with other Sendoso actions. The call tothis.sendoso.getSendAnalytics({ $, params })is straightforward and matches the established pattern.Please just confirm that
sendoso.app.mjs#getSendAnalyticscorrectly interpretsstart_date,end_date, andgroup_idand—if the Sendoso endpoint paginates—either handles pagination internally or documents that this action returns a single page of results.components/sendoso/actions/update-contact/update-contact.mjs (3)
1-13: LGTM: Metadata follows Pipedream conventions.The component metadata is properly structured with appropriate annotations, versioning, and API documentation link.
14-58: LGTM: Props appropriately configured for partial updates.All update fields are correctly marked as optional, allowing users to update specific fields without requiring all values.
59-91: Excellent implementation: Past review feedback properly addressed.The run function correctly implements the suggestions from the previous review:
- Uses
!== undefinedchecks to allow explicit field clearing via empty strings- Validates at least one field is provided before making the API call
- Field mappings (
phone→mobile_no,company→company_name) are consistent withcreate-contact.mjsThe logic is clean, the error message is actionable, and the implementation follows Pipedream conventions.
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (3)
1-13: LGTM!The metadata and imports are correctly structured. The component key follows the naming convention, annotations are appropriate for a read-only analytics action, and the API documentation link is included.
14-36: LGTM!Props are well-defined using propDefinitions from the app file, following Pipedream best practices. The
campaignIdis appropriately marked as optional with a clear description.
49-56: LGTM!The API call follows Pipedream patterns, and the summary message clearly communicates the operation performed with the date range parameters.
components/sendoso/actions/delete-group/delete-group.mjs (1)
12-12: Good addition: prerequisite documented.The description now explicitly notes that groups must have no members before deletion, addressing the concern raised in previous reviews. This helps users understand the API requirement upfront.
components/sendoso/actions/list-integrations/list-integrations.mjs (4)
4-6: LGTM: Metadata follows conventions.The component key follows the
app_name_slug-slugified-component-nameformat, the name is descriptive, and version0.0.1is appropriate for a new action.
7-11: LGTM: Annotations are appropriate.The annotations correctly reflect that this is a read-only list operation (
readOnlyHint: true,destructiveHint: false) and appropriately interacts with external systems (openWorldHint: true).
30-37: LGTM: Clean params building and API call.The conditional params building (lines 30-32) cleanly prevents sending undefined values to the API, and the pattern matches other similar actions in the codebase. The API call correctly passes both the
$object and theparams.
39-43: LGTM: Robust count logic and correct summary format.The count logic (lines 39-41) defensively handles multiple possible response structures with appropriate fallbacks, matching the pattern used in other Sendoso actions. The summary message format on line 42 follows the correct pattern as per coding learnings, and the pluralization approach is appropriate.
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs
Outdated
Show resolved
Hide resolved
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs
Outdated
Show resolved
Hide resolved
New Issues Fixed (2): - Fix get-send-analytics: Guard summary against undefined values - Fix get-campaign-analytics: Remove unnecessary conditionals for required props Duplicate/Unresolved Issues Fixed (4): - Fix create-egift-links: Add default value (1) for amount parameter - Fix delete-group: Simplify success handling (trust HTTP status) - Fix list-integrations: Use page/per_page pagination instead of limit/offset All 6 CodeRabbit round 3 issues addressed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
22-28: Therequired: trueflag is still missing from the amount prop.This issue was flagged in a previous review but has not been addressed. The
amountparameter is essential for the API call and should be marked as required.Apply this diff:
amount: { type: "integer", label: "Amount", description: "The number of links to generate.", min: 1, default: 1, + required: true, },
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (4)
components/sendoso/actions/create-egift-links/create-egift-links.mjs(1 hunks)components/sendoso/actions/delete-group/delete-group.mjs(1 hunks)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs(1 hunks)components/sendoso/actions/list-integrations/list-integrations.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/get-send-analytics/get-send-analytics.mjscomponents/sendoso/actions/list-integrations/list-integrations.mjscomponents/sendoso/actions/delete-group/delete-group.mjs
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/create-egift-links/create-egift-links.mjs
🧬 Code graph analysis (4)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (3)
components/sendoso/actions/list-integrations/list-integrations.mjs (2)
params(32-32)response(36-39)components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-44)response(49-52)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
params(46-46)response(50-54)
components/sendoso/actions/list-integrations/list-integrations.mjs (3)
components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (2)
params(42-45)count(53-55)components/sendoso/actions/list-touches/list-touches.mjs (2)
response(19-19)count(20-22)components/sendoso/actions/list-group-members/list-group-members.mjs (2)
response(19-19)count(20-22)
components/sendoso/actions/delete-group/delete-group.mjs (3)
components/sendoso/actions/list-touches/list-touches.mjs (1)
response(19-19)components/sendoso/actions/list-group-members/list-group-members.mjs (1)
response(19-19)components/sendoso/actions/add-group-members/add-group-members.mjs (1)
response(34-38)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (2)
components/sendoso/actions/create-send/create-send.mjs (1)
response(92-106)components/sendoso/actions/send-bulk-email/send-bulk-email.mjs (1)
response(29-33)
🔇 Additional comments (9)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
8-12: Annotations added as requested.The annotations object has been successfully added, addressing the previous review feedback. The hints correctly reflect that this is a non-destructive write operation.
components/sendoso/actions/list-integrations/list-integrations.mjs (3)
3-13: LGTM! Metadata and annotations are well-configured.The component key follows the correct naming convention, annotations are appropriate for a read-only list operation, and the description includes a link to the API documentation as required.
32-34: Good defensive programming for params building.The conditional checks on lines 33-34 provide safe handling even though both props have defaults. This approach correctly handles cases where users might explicitly pass
nullorundefined, and properly convertsperPageto the API's expectedper_pageparameter name.
36-46: LGTM! Run method implementation is solid.The implementation correctly:
- Passes pagination params to the API call
- Handles multiple response structures defensively in the count calculation (lines 41-43)
- Uses the correct summary format as per learnings (line 44)
- Returns the complete API response
The defensive count calculation pattern matches other list actions in the codebase and ensures robustness across different API response formats.
Based on learnings
components/sendoso/actions/delete-group/delete-group.mjs (2)
12-12: Prerequisite documented — good improvement.The description now clearly states that groups must have no members before deletion, directly addressing the concern from the previous review. This helps users understand the requirement upfront.
26-33: No changes required—HTTP client error handling is correct.Pipedream's axios throws on HTTP status >= 400 by default, so the current implementation properly handles errors. When
deleteGroupfails, the exception prevents the success summary from being exported. When it succeeds (2xx), the response is returned and the success summary exports as expected. For 204 No Content responses (common for DELETE operations), returningundefinedis expected behavior.components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (3)
1-13: LGTM! Module metadata follows Pipedream conventions.The import, key, annotations, and description are all correctly structured. The read-only annotations and API documentation link align with Pipedream best practices.
37-52: Param building follows standard patterns.The empty params object initialization and conditional property assignment (lines 44-47) align with the patterns used in similar actions across the codebase (e.g.,
list-integrations.mjs,get-campaign-analytics.mjs). The API call structure is consistent with Pipedream conventions.
54-62: Summary building correctly addresses previous feedback.The conditional summary construction (lines 54-61) successfully guards against "undefined" values appearing in the UI, as requested in the previous review. The approach of building an array of parts and joining them creates a clean, user-friendly summary that only includes relevant filter information when present.
Based on learnings.
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs
Outdated
Show resolved
Hide resolved
components/sendoso/actions/list-integrations/list-integrations.mjs
Outdated
Show resolved
Hide resolved
- Fix get-send-analytics: Mark startDate and endDate as optional (consistent with conditional usage) - Fix list-integrations: Add min: 1 validation to page and perPage props Both changes improve prop definition consistency and validation robustness.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (3)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs(1 hunks)components/sendoso/actions/get-send-analytics/get-send-analytics.mjs(1 hunks)components/sendoso/actions/list-integrations/list-integrations.mjs(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/list-integrations/list-integrations.mjscomponents/sendoso/actions/get-send-analytics/get-send-analytics.mjs
🧬 Code graph analysis (3)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (2)
params(46-46)response(51-54)components/sendoso/actions/get-campaign-stats/get-campaign-stats.mjs (2)
params(46-46)response(50-54)
components/sendoso/actions/list-integrations/list-integrations.mjs (4)
components/sendoso/actions/list-catalog-items/list-catalog-items.mjs (2)
params(42-45)count(53-55)components/sendoso/actions/list-sends/list-sends.mjs (2)
params(55-58)count(68-70)components/sendoso/actions/list-group-members/list-group-members.mjs (2)
response(19-19)count(20-22)components/sendoso/actions/list-touches/list-touches.mjs (2)
response(19-19)count(20-22)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (2)
components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (2)
params(44-47)response(50-53)components/sendoso/actions/list-integrations/list-integrations.mjs (2)
params(34-34)response(38-41)
🔇 Additional comments (9)
components/sendoso/actions/get-send-analytics/get-send-analytics.mjs (2)
3-38: Action metadata and props are consistent and well‑structuredKey, name, version, annotations, and prop definitions all follow the established Sendoso / Pipedream patterns.
startDate,endDate, andgroupIdare correctly marked optional, matching how they’re used later, and the description + link give clear UX context.
39-65: Run logic, parameter mapping, and summary construction look solidThe
runimplementation correctly:
- Destructures props, builds a
paramsobject only with defined filters, and maps camelCase props to the expected snake_case API fields.- Calls
this.sendoso.getSendAnalytics({ $, params })in line with other Sendoso actions.- Constructs a defensive
$summarythat never surfacesundefinedand conditionally adds context about date range andgroupId, matching prior guidance on summary formatting. Based on learningscomponents/sendoso/actions/list-integrations/list-integrations.mjs (4)
1-2: LGTM!The import statement follows standard Pipedream patterns and correctly imports the sendoso app module.
3-13: LGTM!The action metadata is well-structured and follows Pipedream conventions. The key follows the correct naming pattern, annotations are appropriate for a read-only operation, and the documentation reference is included.
14-32: Well-defined props with appropriate validation.The pagination props are properly configured with sensible defaults and minimum validation. The implementation successfully addresses the pagination feedback from previous reviews.
43-45: Remove inconsistent fallback for response.integrations property.The count logic uses three fallback properties, but similar list actions throughout the codebase (list-webhooks, list-campaigns, list-contacts) only check for
Array.isArray(response)andresponse.data?.length. The extraresponse.integrations?.lengthfallback at line 45 is inconsistent with the established pattern and should be removed to match other list endpoints.const count = Array.isArray(response) ? response.length : (response.data?.length || 0);⛔ Skipped due to learnings
Learnt from: GTFalcao Repo: PipedreamHQ/pipedream PR: 16954 File: components/salesloft/salesloft.app.mjs:14-23 Timestamp: 2025-06-04T17:52:05.780Z Learning: In the Salesloft API integration (components/salesloft/salesloft.app.mjs), the _makeRequest method returns response.data which directly contains arrays for list endpoints like listPeople, listCadences, listUsers, and listAccounts. The propDefinitions correctly call .map() directly on these responses without needing to destructure a nested data property.components/sendoso/actions/get-campaign-analytics/get-campaign-analytics.mjs (3)
1-13: Component structure follows Pipedream conventions.The component metadata, key naming, annotations, and documentation link are all correctly implemented. The annotations appropriately indicate this is a read-only, non-destructive action.
14-36: Props definitions look good.All props correctly use propDefinitions from the app file, and the required vs. optional distinction is clear. The optional campaignId includes a helpful description.
44-53: Inconsistency confirmed: date parameters handled differently between analytics actions.Verification found a clear pattern inconsistency between similar analytics actions:
- get-send-analytics: Marks
startDateandendDateasoptional: true, conditionally adds them to params only if provided- get-campaign-analytics: Does NOT mark these as optional, always includes
start_dateandend_datein paramsBoth reference the same Sendoso Apiary documentation endpoint. Without access to the official Sendoso API specification for the campaign analytics endpoint, the correct approach cannot be definitively determined. The inconsistency could indicate either different endpoint requirements or a code quality issue.
Action required: Verify against the official Sendoso API documentation whether:
- The campaign analytics endpoint requires
start_dateandend_dateparameters (supporting the current implementation), or- These should be optional like in the send analytics action (requiring code alignment)
components/sendoso/actions/list-integrations/list-integrations.mjs
Outdated
Show resolved
Hide resolved
components/sendoso/actions/list-integrations/list-integrations.mjs
Outdated
Show resolved
Hide resolved
- Fix listUsers method to accept object parameter with spread operator - Update listUsers call in recipientUsers propDefinition - Add array validation to create-webhook action for events parameter - Add array validation to add-group-members action for members parameter - Update @pipedream/platform dependency to ^3.1.1 Addresses all review feedback from @luancazarine
Resolved package.json conflict by keeping @pipedream/platform ^3.1.1 as requested by reviewer @luancazarine
… methods - Deleted obsolete markdown files: CI_CD_VALIDATION_REPORT.md, ENDPOINTS_INVENTORY.md, FINAL_IMPLEMENTATION_SUMMARY.md, GUIDELINES_COMPLIANCE_REPORT.md, IMPLEMENTATION_STATUS.md, PR_READINESS_ANALYSIS.md, PR_SUBMISSION_CHECKLIST.md, and README.md. - Updated action methods to improve parameter handling by integrating a new utility function for parsing input objects. - Ensured all actions maintain compatibility with existing functionality while enhancing code quality and readability. This commit streamlines the Sendoso integration by removing unnecessary documentation and refining action implementations, preparing for a more efficient development process.
luancazarine
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To make the process faster, I've made some changes and am moving it to QA.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (6)
components/sendoso/sources/new-send/new-send.mjs (1)
41-41: Critical: Fix typo in method name "proccessEvent" → "processEvent".Line 41 defines
proccessEventwith a double 'c', which is almost certainly a typo. Pipedream polling sources conventionally use a method namedprocessEvent(single 'c'), which the framework invokes on each polling interval. If the framework expectsprocessEventbut the code definesproccessEvent, polling will silently fail with undefined method calls.Apply this fix:
- async proccessEvent() { + async processEvent() {components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
55-84: Action no longer accepts explicit address fields; confirm this matches intended Sendoso AC flow.Given the current props and payload, this action:
- Does not expose any street/city/state/zip/country fields, and
- Always sends
confirm_address: "TRUE"plus optionalno_address,address_confirmation_via,resume_with_unconfirmed_address, andexpire_after_days.That means the only way to send is via Sendoso’s address confirmation / stored-contact behavior, with no way to override the shipping address inline in this action. If earlier versions allowed a “known address + confirmation” flow, please confirm that:
- This narrowing is intentional and documented, and
- Any “send to explicit address” use case has a dedicated companion action (or is clearly documented) so users know where to route that scenario.
Also applies to: 99-111
components/sendoso/sources/send-status-updated/send-status-updated.mjs (4)
42-42: Fix incorrectgetTime()usage on Line 42.
getTime()is a method that takes no parameters; it returns the timestamp in milliseconds of the date object. The current code passesdate_and_timeas an argument, which is ignored and will always return the current timestamp.- ts: new Date().getTime(date_and_time), + ts: new Date(date_and_time).getTime(),
61-61: Fix method name typo:proccessEvent→processEvent.Line 61 defines
async proccessEvent()with a double 'c'. Standard naming convention isprocessEvent()with a single 'c'.- async proccessEvent() { + async processEvent() {If this method name is inherited or used elsewhere in
common.mjs, verify that the base class also uses the corrected spelling.
34-35: Remove or correct the unusedgetFunc()method which returns an incorrect API method.The
getFunc()method at lines 34-35 returnsthis.sendoso.getSentGifts, which is incorrect for this source. This source tracks send status updates and properly callsthis.sendoso.getSendStatus()in theprepareData()method (line 53). However,getFunc()is never called by the base class or anywhere else in the codebase, making it dead code that should either be removed entirely or corrected to return the propergetSendStatusmethod for consistency with the source's documented purpose.
57-59: Fix theactivities[0].map()pattern on Line 57 — it will cause a runtime error.The code destructures
{ activities }from the API response, and Line 64 correctly treatsactivitiesas a flat array with.filter(). However, Line 57 incorrectly accessesactivities[0].map(), treating the first element as an array. The Sendoso API activities response is a flat array of activity objects, soactivities[0]refers to a single object, not an iterable collection.This will fail at runtime. Change Line 57 to:
- return activities[0].map((activity) => ({ + return activities.map((activity) => ({ ...activity.activity, }));
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (6)
components/sendoso/actions/invite-new-user/invite-new-user.mjs(1 hunks)components/sendoso/actions/send-egift/send-egift.mjs(1 hunks)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs(1 hunks)components/sendoso/sendoso.app.mjs(3 hunks)components/sendoso/sources/new-send/new-send.mjs(1 hunks)components/sendoso/sources/send-status-updated/send-status-updated.mjs(1 hunks)
🔇 Additional comments (8)
components/sendoso/sources/new-send/new-send.mjs (2)
10-10: Version bump is appropriate.The version bump from 0.0.1 to 0.0.2 aligns with the expanded Sendoso integration (component version 0.1.0).
Also applies to: 10-10
43-43: Verify the Sendoso API sent_gifts.json endpoint returnstouch_namefield.The method
getSentGifts()exists insendoso.app.mjs(line 175) and is implemented correctly. However, the actual Sendoso API response schema cannot be verified from public documentation. The code expects the endpoint to return an array of objects with bothidandtouch_namefields (used in lines 27, 31, and 45). Confirm the API response includes thetouch_namefield—otherwise the code will break with undefined values.components/sendoso/actions/invite-new-user/invite-new-user.mjs (1)
1-63: LGTM! Well-structured action implementation.The action follows Pipedream patterns correctly with proper metadata, prop definitions, and API call structure. The data mapping from camelCase props to snake_case API fields is correct, and the summary message is informative.
components/sendoso/sendoso.app.mjs (3)
62-134: LGTM! Well-defined prop definitions.The new propDefinitions for IDs, date filters, and pagination parameters are properly structured with appropriate types, labels, descriptions, and sensible defaults.
155-255: LGTM! API methods follow correct patterns.The new API methods properly follow the
_makeRequestpattern with appropriate HTTP methods and path structures. The mix of.jsonsuffixes on some endpoints (e.g.,sent_gifts.json) while others have none appears intentional and reflects the Sendoso API design.
26-27: The review comment is based on inaccurate assumptions and should be ignored.The
listTouchesmethod does not exist in the codebase. The review claims touchId was changed fromlistTouches(groupId)tolistCampaigns(), but this stated change cannot be verified sincelistToucheswas never present.Regarding the semantic concern: Campaigns and touches are the same entity in the Sendoso API—both
getCampaignandlistCampaignsuse the "touches" endpoint. The current implementation is correct.Likely an incorrect or invalid review comment.
components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (2)
6-6: Version bump looks reasonable; confirm behavior change/migration story.Bumping the action version to
"0.0.3"is good, but since the public surface has changed (address-related props removed and payload adjusted per the PR summary), please confirm that:
- Existing workflows remain pinned to the prior version or are otherwise safe, and
- Any needed migration / release-note guidance for users who previously relied on those fields is captured elsewhere in this PR.
12-12: URL verified as current and correct.The Sendoso REST API documentation at the physicalAC endpoint is the documented reference for the "Send a Physical Gift With Address Confirmation" flow, and the linked documentation includes the relevant parameters and examples. No changes needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
components/sendoso/actions/send-egift/send-egift.mjs(1 hunks)components/sendoso/sendoso.app.mjs(3 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjs
🧬 Code graph analysis (2)
components/sendoso/actions/send-egift/send-egift.mjs (2)
components/sendoso/actions/invite-new-user/invite-new-user.mjs (1)
response(48-59)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
response(99-111)
components/sendoso/sendoso.app.mjs (1)
components/sendoso/sources/new-send/new-send.mjs (2)
data(43-43)data(51-51)
🔇 Additional comments (1)
components/sendoso/sendoso.app.mjs (1)
121-133: Thin wrappers for core endpoints look correct; just ensure response shapes match select / options usage.
createEgiftLinks→POST send/generate_egift_linksgetCurrentUser→GET melistCatalogItems→GET marketplace/productsinviteNewUser→POST usersAll of these align with the current Sendoso REST docs for the v3 API.(developer.sendoso.com) Given they’re just delegating to
_makeRequest, there’s no logic bug here.The only thing to double‑check is that any consuming actions (e.g. list-catalog-items, invite-new-user) are expecting exactly the response envelope the API returns (array vs.
{ items: [...] },{ user: ... }, etc.) when they build UI options.If you haven’t already, quickly confirm shapes by hitting each endpoint once from a dev workflow and logging the raw response, especially for
listCatalogItemsandinviteNewUser, since those are new.Also applies to: 203-209, 220-225
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
components/sendoso/actions/send-egift/send-egift.mjs(1 hunks)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs(2 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjs
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjs
🔇 Additional comments (4)
components/sendoso/actions/send-egift/send-egift.mjs (3)
46-62: LGTM: Implementation correctly fixed from past review.The implementation properly addresses the critical issue from the past review by calling
this.sendoso.sendGiftinstead of the non-existentsendEgiftmethod. The payload structure correctly nests fields underdata.send, hardcodesvia: "single_email_address"as required by the API, and exports a summary with the tracking code.
28-32: LGTM: Email is now required as expected.The
optional: trueflag, making it a required field. This addresses the major issue from the past review and aligns with the Sendoso API requirement.
16-20: Verification confirms bothtouchIdandviaFromare correctly configured as required.The propDefinitions in
sendoso.app.mjsshow thattouchId(lines 8-18) andviaFrom(lines 32-36) are both defined without theoptional: trueflag, making them required by default. This aligns with Sendoso API requirements and the action's usage. No fixes are needed.components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
71-76: Original review comment is incorrect – no missing email prop.The
noAddressdescription references email behavior, which is already controlled by the existingaddressConfirmationViaprop that accepts "email" or "link" options (lines 41-47). No email prop is missing. The description wording is unclear but should be clarified to better reference theaddressConfirmationViabehavior rather than rewritten as a missing prop issue.Likely an incorrect or invalid review comment.
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Outdated
Show resolved
Hide resolved
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Show resolved
Hide resolved
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Show resolved
Hide resolved
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Outdated
Show resolved
Hide resolved
|
/republish |
|
Hello everyone, I have tested this PR and there're some test cases failed or needed improvement. Please check test reports below for more information:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 10
♻️ Duplicate comments (1)
components/sendoso/sendoso.app.mjs (1)
134-139: Confirm allsendGiftcall sites usedatawrapper or normalize here.
sendGiftnow just forwardsoptsinto_makeRequestas axios config:sendGift(opts = {}) { return this._makeRequest({ path: "send", method: "POST", ...opts, }); }This is fine for new actions that pass
data: { send: { ... } }, but any legacy calls that still spread send fields directly (e.g.,{ $, via, touch_id, ... }with nodata) will end up sending an empty POST body.Either:
- Implement the normalization suggested in the earlier review (treat fields outside
dataas thesendpayload), or- Systematically update and verify all
this.sendoso.sendGift(call sites to use thedatawrapper pattern.Example normalization:
- sendGift(opts = {}) { - return this._makeRequest({ - path: "send", - method: "POST", - ...opts, - }); - }, + sendGift(opts = {}) { + const { + $, + data, + ...sendFields + } = opts; + + const requestConfig = { + $, + path: "send", + method: "POST", + }; + + if (data) { + requestConfig.data = data; + Object.assign(requestConfig, sendFields); + } else { + requestConfig.data = { + send: sendFields, + }; + } + + return this._makeRequest(requestConfig); + },To be safe, I’d either adopt this or run a quick search to ensure no remaining legacy-style usages.
#!/bin/bash # Verify all sendGift call sites use a `data` wrapper rg -n "this\.sendoso\.sendGift\(" components/sendoso -S -C3
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (9)
components/sendoso/actions/create-egift-links/create-egift-links.mjs(1 hunks)components/sendoso/actions/invite-new-user/invite-new-user.mjs(1 hunks)components/sendoso/actions/list-all-users/list-all-users.mjs(1 hunks)components/sendoso/actions/list-campaigns/list-campaigns.mjs(1 hunks)components/sendoso/actions/list-groups/list-groups.mjs(1 hunks)components/sendoso/actions/send-egift/send-egift.mjs(1 hunks)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs(2 hunks)components/sendoso/actions/send-physical-gift/send-physical-gift.mjs(1 hunks)components/sendoso/sendoso.app.mjs(6 hunks)
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2024-10-30T15:24:39.294Z
Learnt from: jcortes
Repo: PipedreamHQ/pipedream PR: 14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjscomponents/sendoso/actions/list-campaigns/list-campaigns.mjscomponents/sendoso/actions/create-egift-links/create-egift-links.mjs
📚 Learning: 2025-10-20T01:01:02.970Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 18744
File: components/slack_v2/actions/send-large-message/send-large-message.mjs:49-64
Timestamp: 2025-10-20T01:01:02.970Z
Learning: In components/slack_v2/actions/send-large-message/send-large-message.mjs, the metadata_event_payload prop is typed as string, so the code only needs to handle string-to-JSON parsing and does not need to handle object inputs.
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjscomponents/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjscomponents/sendoso/sendoso.app.mjs
📚 Learning: 2025-07-01T17:07:48.193Z
Learnt from: js07
Repo: PipedreamHQ/pipedream PR: 17375
File: components/zerobounce/actions/get-validation-results-file/get-validation-results-file.mjs:23-27
Timestamp: 2025-07-01T17:07:48.193Z
Learning: For "dir" props in Pipedream components, whether to mark them as optional depends on the action's file I/O behavior - if an action always writes files as output, the "dir" prop should not be marked as optional.
Applied to files:
components/sendoso/actions/send-egift/send-egift.mjs
📚 Learning: 2024-10-08T15:33:38.240Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Applied to files:
components/sendoso/actions/list-groups/list-groups.mjscomponents/sendoso/actions/create-egift-links/create-egift-links.mjscomponents/sendoso/actions/list-all-users/list-all-users.mjs
📚 Learning: 2024-10-08T16:42:59.225Z
Learnt from: GTFalcao
Repo: PipedreamHQ/pipedream PR: 14229
File: components/americommerce/actions/update-customer/update-customer.mjs:89-94
Timestamp: 2024-10-08T16:42:59.225Z
Learning: When defining boolean properties in AmeriCommerce components (e.g., in `update-customer.mjs`), ensure that the label and description are consistent and clearly indicate the intent, especially when using negations like "No Account", to avoid confusion.
Applied to files:
components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
🧬 Code graph analysis (6)
components/sendoso/actions/send-egift/send-egift.mjs (4)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (1)
response(34-46)components/sendoso/actions/invite-new-user/invite-new-user.mjs (1)
response(48-59)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
response(92-110)components/sendoso/actions/send-physical-gift/send-physical-gift.mjs (1)
response(77-95)
components/sendoso/actions/list-groups/list-groups.mjs (4)
components/sendoso/actions/list-all-users/list-all-users.mjs (1)
response(30-36)components/sendoso/actions/list-campaigns/list-campaigns.mjs (1)
response(30-36)components/sendoso/actions/list-sends/list-sends.mjs (1)
response(30-36)components/sendoso/actions/list-group-members/list-group-members.mjs (1)
response(24-27)
components/sendoso/actions/list-campaigns/list-campaigns.mjs (2)
components/sendoso/actions/list-groups/list-groups.mjs (1)
response(30-36)components/sendoso/actions/list-sends/list-sends.mjs (2)
response(30-36)count(38-40)
components/sendoso/actions/create-egift-links/create-egift-links.mjs (11)
components/sendoso/actions/invite-new-user/invite-new-user.mjs (1)
response(48-59)components/sendoso/actions/list-all-users/list-all-users.mjs (1)
response(30-36)components/sendoso/actions/list-campaigns/list-campaigns.mjs (1)
response(30-36)components/sendoso/actions/list-groups/list-groups.mjs (1)
response(30-36)components/sendoso/actions/send-egift/send-egift.mjs (1)
response(47-59)components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
response(92-110)components/sendoso/actions/send-physical-gift/send-physical-gift.mjs (1)
response(77-95)components/sendoso/actions/get-campaign/get-campaign.mjs (1)
response(26-29)components/sendoso/actions/get-current-user/get-current-user.mjs (1)
response(18-20)components/sendoso/actions/list-sends/list-sends.mjs (1)
response(30-36)components/sendoso/actions/list-group-members/list-group-members.mjs (1)
response(24-27)
components/sendoso/actions/list-all-users/list-all-users.mjs (2)
components/sendoso/actions/list-groups/list-groups.mjs (1)
response(30-36)components/sendoso/actions/list-sends/list-sends.mjs (1)
response(30-36)
components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (1)
components/sendoso/actions/send-physical-gift/send-physical-gift.mjs (1)
response(77-95)
🔇 Additional comments (5)
components/sendoso/actions/send-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs (3)
6-6: Version bump correctly addresses breaking changes.The bump to 0.1.0 appropriately reflects the removal of address-related props (address, address1, city, state, country, zip), which is a breaking change from version 0.0.2.
28-32: Email prop correctly added.The email prop is now properly defined as a required field, addressing the past review concern. This aligns with the Sendoso API requirement that email is mandatory for address confirmation flows.
94-109: Payload structure correctly addresses past review concerns.The payload structure has been properly updated:
- ✓
confirm_address: truenow uses a boolean instead of the string"TRUE"(line 102)- ✓ Email field is included in the payload (line 99)
- ✓
via: "single_person_or_company"is correctly hardcoded per API requirements (line 96)- ✓ Nested
data.sendstructure matches the pattern used in other Sendoso actions (see send-physical-gift.mjs)The
datawrapper is correct—it's consumed by thesendGiftmethod which extracts and sendsdataas the request body.components/sendoso/actions/send-egift/send-egift.mjs (1)
3-61: eGift action props and payload mapping look consistent.Props (required
touchId,viaFrom; optionalname,customMessage) and thesendGiftpayload structure are consistent with other Sendoso actions and the shared app surface. Summary handling is also aligned.components/sendoso/actions/invite-new-user/invite-new-user.mjs (1)
14-61: Invite New User action wiring looks correct.Props, payload (
user: { team_group_id, email, first_name, last_name, role }), and summary message are all consistent with the Sendoso app method and other actions in this integration. No issues spotted.
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Show resolved
Hide resolved
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Show resolved
Hide resolved
...end-physical-gift-with-address-confirmation/send-physical-gift-with-address-confirmation.mjs
Show resolved
Hide resolved
|
Hi everyone, all test cases are passed! Ready for release! Test reports
|
WHY
This PR significantly expands the Sendoso integration from 3 actions to 54 total actions, providing comprehensive coverage (~95%) of the Sendoso REST API. This enables users to automate complex gifting and direct mail workflows directly within Pipedream.
Current State
Proposed Changes
Benefits
WHAT
Modified Files
sendoso.app.mjs- Extended with comprehensive API supportREADME.md- Updated with expanded use casespackage.json- Version bump (0.0.3 → 0.1.0).wordlist.txt- Added technical terms for spellcheckNew Actions (51)
Send Management (5)
Touch Management (5)
Contact Management (8)
Group Management (6)
Template & Campaign Management (8)
Webhook & Integration Management (5)
Analytics & Utilities (7)
Additional Actions (7)
Documentation
Testing
CHECKLIST
REFERENCES
Impact: Transforms Sendoso integration from 3 actions to 54 actions (+1700%), covering ~95% of the Sendoso REST API. All actions automatically generate MCP tools for AI assistant integration.
Summary by CodeRabbit
Release Notes
New Features
Improvements
✏️ Tip: You can customize this high-level summary in your review settings.