-
Notifications
You must be signed in to change notification settings - Fork 5.5k
17674 components pingback #17750
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
17674 components pingback #17750
Conversation
Actions - Create Subscriber - Get Subscriber - Update Subscriber - Add Subscriber To Segmentation Lists - Remove Subscriber From Segmentation List
The latest updates on your projects. Learn more about Vercel for Git ↗︎ 3 Skipped Deployments
|
WalkthroughA comprehensive Pingback integration was implemented, introducing a new app definition with detailed property definitions and HTTP methods for managing subscribers. Five new actions were added: creating, retrieving, updating subscribers, adding to segmentation lists, and removing from segmentation lists. Supporting utilities and constants were introduced, and the package configuration was updated. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Action
participant PingbackApp
participant PingbackAPI
User->>Action: Invoke action (e.g., Create, Get, Update Subscriber)
Action->>PingbackApp: Call method (e.g., createSubscriber, getSubscriber)
PingbackApp->>PingbackAPI: HTTP request to Pingback API
PingbackAPI-->>PingbackApp: API response
PingbackApp-->>Action: Return processed response
Action-->>User: Output summary and data
Estimated code review effort3 (~45 minutes) Poem
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjsOops! Something went wrong! :( ESLint: 8.57.1 Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs components/pingback/actions/create-subscriber/create-subscriber.mjsOops! Something went wrong! :( ESLint: 8.57.1 Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjsOops! Something went wrong! :( ESLint: 8.57.1 Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (5)
🚧 Files skipped from review as they are similar to previous changes (5)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
✨ Finishing Touches
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
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
🧹 Nitpick comments (4)
components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
44-65
: Implementation looks solid with proper data transformation.The action correctly uses the parseObject utility and transforms customFields into the API-expected format. The summary message follows good practices.
Consider removing the optional chaining operator on line 52, as
Object.entries()
never returns null/undefined:- customFields: Object.entries(parseObject(this.customFields))?.map(([ + customFields: Object.entries(parseObject(this.customFields) || {}).map(([This change also handles the case where
parseObject
returnsundefined
.components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (1)
18-24
: Remove redundant type specification.The
segmentationListId
property already has its type defined in the app'spropDefinition
. Addingtype: "string"
here is redundant and could lead to conflicts.Apply this diff to remove the redundant type:
segmentationListId: { propDefinition: [ pingback, "segmentationListId", ], - type: "string", },
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
26-26
: Consider defensive programming for nested data access.The summary message directly accesses
response.data.data.email
without checking if these nested properties exist. Consider adding null-safe access to prevent potential runtime errors if the API response structure changes.Apply this diff for safer property access:
-$.export("$summary", `Subscriber retrieved successfully with email: ${response.data.data.email}`); +$.export("$summary", `Subscriber retrieved successfully with email: ${response.data?.data?.email || this.email}`);components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
68-68
: Consider defensive programming for nested data access.Similar to the get-subscriber action, the summary message directly accesses
response.data.data.id
without null-safe checks.Apply this diff for safer property access:
-$.export("$summary", `Subscriber created successfully with ID: ${response.data.data.id}`); +$.export("$summary", `Subscriber created successfully with ID: ${response.data?.data?.id || 'N/A'}`);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (9)
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs
(1 hunks)components/pingback/actions/create-subscriber/create-subscriber.mjs
(1 hunks)components/pingback/actions/get-subscriber/get-subscriber.mjs
(1 hunks)components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs
(1 hunks)components/pingback/actions/update-subscriber/update-subscriber.mjs
(1 hunks)components/pingback/common/constants.mjs
(1 hunks)components/pingback/common/utils.mjs
(1 hunks)components/pingback/package.json
(2 hunks)components/pingback/pingback.app.mjs
(1 hunks)
🧠 Learnings (7)
components/pingback/package.json (1)
Learnt from: jcortes
PR: #14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like fs
to package.json
dependencies, as they are native modules provided by the Node.js runtime.
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (2)
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/actions/update-subscriber/update-subscriber.mjs (3)
Learnt from: jcortes
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".
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (1)
Learnt from: jcortes
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".
components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
Learnt from: jcortes
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".
components/pingback/actions/get-subscriber/get-subscriber.mjs (3)
Learnt from: jcortes
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".
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/pingback.app.mjs (3)
Learnt from: GTFalcao
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.
Learnt from: GTFalcao
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.
Learnt from: GTFalcao
PR: #12697
File: components/salesforce_rest_api/sources/common-webhook-methods.mjs:1-71
Timestamp: 2024-07-24T02:06:47.016Z
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.
🧬 Code Graph Analysis (6)
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/update-subscriber/update-subscriber.mjs (3)
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
response
(21-24)components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
response
(50-66)components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (2)
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
response
(21-24)components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
response
(27-33)
components/pingback/actions/create-subscriber/create-subscriber.mjs (2)
components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
response
(45-60)components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/get-subscriber/get-subscriber.mjs (4)
components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
response
(50-66)components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
response
(45-60)components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
response
(27-33)components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (1)
response
(27-31)
components/pingback/pingback.app.mjs (1)
components/pingback/common/constants.mjs (2)
STATUS_OPTIONS
(1-14)STATUS_OPTIONS
(1-14)
🧰 Additional context used
🧠 Learnings (7)
components/pingback/package.json (1)
Learnt from: jcortes
PR: #14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like fs
to package.json
dependencies, as they are native modules provided by the Node.js runtime.
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (2)
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/actions/update-subscriber/update-subscriber.mjs (3)
Learnt from: jcortes
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".
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (1)
Learnt from: jcortes
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".
components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
Learnt from: jcortes
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".
components/pingback/actions/get-subscriber/get-subscriber.mjs (3)
Learnt from: jcortes
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".
Learnt from: GTFalcao
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
.
Learnt from: GTFalcao
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
.
components/pingback/pingback.app.mjs (3)
Learnt from: GTFalcao
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.
Learnt from: GTFalcao
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.
Learnt from: GTFalcao
PR: #12697
File: components/salesforce_rest_api/sources/common-webhook-methods.mjs:1-71
Timestamp: 2024-07-24T02:06:47.016Z
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.
🧬 Code Graph Analysis (6)
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/update-subscriber/update-subscriber.mjs (3)
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
response
(21-24)components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
response
(50-66)components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (2)
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
response
(21-24)components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
response
(27-33)
components/pingback/actions/create-subscriber/create-subscriber.mjs (2)
components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
response
(45-60)components/pingback/common/utils.mjs (2)
parseObject
(1-24)parseObject
(1-24)
components/pingback/actions/get-subscriber/get-subscriber.mjs (4)
components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
response
(50-66)components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
response
(45-60)components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
response
(27-33)components/pingback/actions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs (1)
response
(27-31)
components/pingback/pingback.app.mjs (1)
components/pingback/common/constants.mjs (2)
STATUS_OPTIONS
(1-14)STATUS_OPTIONS
(1-14)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Lint Code Base
- GitHub Check: Publish TypeScript components
- GitHub Check: pnpm publish
- GitHub Check: Verify TypeScript components
🔇 Additional comments (9)
components/pingback/common/utils.mjs (1)
1-24
: Well-designed utility function with proper error handling.The
parseObject
function correctly handles various input types (arrays, strings, objects) and gracefully falls back to the original value when JSON parsing fails. The implementation is robust and follows good practices.components/pingback/package.json (1)
3-17
: Package configuration updated appropriately.The version bump to 0.1.0 correctly reflects new functionality, and the @pipedream/platform dependency is properly added to support the new Pingback integration actions.
components/pingback/common/constants.mjs (1)
1-14
: Well-structured constants for subscriber status options.The
STATUS_OPTIONS
array provides clear labels and consistent values using snake_case convention. Centralizing these constants ensures consistency across the integration.components/pingback/actions/update-subscriber/update-subscriber.mjs (1)
5-10
: Action properly structured with correct naming and documentation.The action follows Pipedream conventions with appropriate name, description, key, and version. The documentation link is included for user reference.
components/pingback/actions/add-subscriber-to-segmentation-lists/add-subscriber-to-segmentation-lists.mjs (1)
5-38
: Clean and well-implemented action.The action follows Pipedream conventions properly, uses the parseObject utility correctly for handling segmentation lists, and provides a clear summary message. The implementation is focused and appropriate for the task.
components/pingback/actions/get-subscriber/get-subscriber.mjs (1)
20-31
: LGTM! Good error handling pattern.The try-catch block with
ConfigurationError
provides proper error handling for API failures. The pattern of catching the response and throwing a more user-friendly error is well-implemented.components/pingback/actions/create-subscriber/create-subscriber.mjs (1)
57-63
: LGTM! Proper data transformation for custom fields.The transformation of custom fields using
Object.entries(parseObject(this.customFields))?.map()
correctly converts the input object into the API's expected format withlabel
andvalue
properties. The optional chaining prevents errors when customFields is undefined.components/pingback/pingback.app.mjs (2)
46-62
: LGTM! Well-structured HTTP abstraction.The
_makeRequest
method provides a clean abstraction for HTTP requests with proper base URL and authentication header handling. The use of axios with spread operators for additional options is well-implemented.
63-104
: LGTM! Comprehensive API method coverage.The API methods correctly implement the full CRUD operations for subscriber management:
createSubscriber
(POST /subscriber)getSubscriber
(GET /subscriber/{email})updateSubscriber
(PUT /subscriber/{email})addSubscriberToSegmentationLists
(POST /segmentation/add-subscriber/{email})removeSubscriberFromSegmentationList
(DELETE /segmentation/{segmentationListId}/remove-subscriber/{email})The HTTP methods and URL patterns align with REST conventions.
...ctions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs
Outdated
Show resolved
Hide resolved
...ctions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs
Show resolved
Hide resolved
components/pingback/actions/create-subscriber/create-subscriber.mjs
Outdated
Show resolved
Hide resolved
...ctions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs
Outdated
Show resolved
Hide resolved
...ctions/remove-subscriber-from-segmentation-list/remove-subscriber-from-segmentation-list.mjs
Outdated
Show resolved
Hide resolved
components/pingback/actions/update-subscriber/update-subscriber.mjs
Outdated
Show resolved
Hide resolved
…consistency. Updated Add, Create, Remove, and Update Subscriber actions to use a unified data structure. Introduced parseCustomFields utility for better custom fields management.
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.
LGTM! Ready for QA
Resolves #17674
Summary by CodeRabbit
New Features
Chores
Documentation