-
Notifications
You must be signed in to change notification settings - Fork 5.3k
New Components - attio #14236
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
New Components - attio #14236
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎ 3 Skipped Deployments
|
WalkthroughThe pull request introduces multiple new modules and functionalities within the Attio application. Key additions include modules for creating notes, creating or updating records, and deleting list entries, along with enhancements to the main application file for improved API interactions. Utility functions for handling streams and pagination are also added. The overall structure is designed to facilitate better management of records and events in the Attio system, enhancing the application's capabilities in processing user-defined data. Changes
Assessment against linked issues
Possibly related PRs
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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: 17
🧹 Outside diff range and nitpick comments (22)
components/attio/sources/record-updated-instant/test-event.mjs (2)
3-8
: LGTM: ID structure is well-defined. Consider adding UUID validation.The
id
object provides a comprehensive identification system for the updated record, using UUID-like strings for each property. This ensures uniqueness across different entities.Consider adding validation to ensure these strings are valid UUIDs. You could use a regular expression or a dedicated UUID validation function. For example:
function isValidUUID(uuid) { const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; return uuidRegex.test(uuid); }
9-13
: LGTM: Actor information is well-structured. Consider adding type validation.The
actor
object effectively captures information about who performed the update action, using a type categorization and a unique identifier.Consider adding validation for the
type
property to ensure it only accepts predefined values. This could prevent potential issues with unexpected actor types. For example:const validActorTypes = ['workspace-member', 'system', 'api']; function isValidActorType(type) { return validActorTypes.includes(type); }components/attio/sources/new-list-entry-instant/test-event.mjs (3)
3-7
: Consider using camelCase for consistencyThe 'id' object structure is well-designed, providing clear identification for the workspace, list, and entry. The use of UUIDs is excellent for ensuring uniqueness.
For consistency with JavaScript naming conventions, consider using camelCase for the property names:
"id": { - "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c", - "list_id": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0", - "entry_id": "2e6e29ea-c4e0-4f44-842d-78a891f8c156" + "workspaceId": "14beef7a-99f7-4534-a87e-70b564330a4c", + "listId": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0", + "entryId": "2e6e29ea-c4e0-4f44-842d-78a891f8c156" }This change would align with common JavaScript style guides and improve consistency if other parts of the codebase use camelCase.
10-13
: LGTM: Well-structured actor objectThe 'actor' object is well-structured, providing clear information about the entity responsible for the event. The use of a specific type ("workspace-member") is excellent for distinguishing different kinds of actors, and the UUID for the id ensures uniqueness.
For consistency with earlier suggestions, consider using camelCase for the 'id' property:
"actor": { "type": "workspace-member", - "id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b" + "id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b" }This change would align with common JavaScript style guides and improve consistency if other parts of the codebase use camelCase.
1-14
: Overall: Well-structured test event with minor improvements suggestedThis test event provides a comprehensive representation of a "list-entry.created" event in the Attio system. The use of nested objects and UUIDs for identifiers is consistent and appropriate.
To further enhance this test event:
- Consider adding a brief comment at the top of the file explaining the purpose of this test event and how it relates to the Attio system's functionality.
- If possible, provide a short description for each property, especially for less obvious ones like
parent_object_id
andparent_record_id
. This would greatly improve the file's self-documentation.- Ensure consistency in naming conventions across the Attio integration, preferably using camelCase for property names as suggested in previous comments.
These improvements would make the test event more self-explanatory and easier to maintain in the long run.
components/attio/actions/delete-list-entry/delete-list-entry.mjs (3)
3-8
: LGTM: Module definition is well-structured.The module definition follows the expected structure for a Pipedream action. The metadata is comprehensive and includes a link to the API documentation, which is helpful for users.
Consider expanding the description to include information about when this action should be used or any prerequisites for using it effectively.
9-26
: LGTM: Props are well-defined and use appropriate propDefinitions.The props structure is suitable for the action's purpose. The use of propDefinitions and the conditional function for
entryId
ensures data consistency and proper association betweenlistId
andentryId
.Consider adding input validation for
listId
andentryId
to ensure they meet any specific format requirements (e.g., UUID, numeric ID) before making the API call. This could help prevent unnecessary API requests with invalid data.
27-35
: LGTM: Run method is well-structured, but could benefit from error handling.The run method is correctly implemented as an async function and uses the
attio
object to perform the deletion operation. The summary export provides useful feedback to the user.Consider implementing error handling to catch and handle potential API errors gracefully. Also, it would be beneficial to validate the response before returning it. Here's a suggested improvement:
async run({ $ }) { try { const response = await this.attio.deleteListEntry({ $, listId: this.listId, entryId: this.entryId, }); if (response && response.success) { $.export("$summary", `Successfully deleted list entry with ID: ${this.entryId}`); return response; } else { throw new Error("Deletion was not successful"); } } catch (error) { $.export("$summary", `Failed to delete list entry: ${error.message}`); throw error; } }This implementation adds error handling and validates the response before considering the operation successful.
components/attio/sources/new-list-entry-instant/new-list-entry-instant.mjs (3)
4-11
: LGTM: Component definition is well-structured. Consider adding more detailed documentation.The component is well-defined with appropriate key, name, description, version, type, and deduplication strategy. The version "0.0.1" is suitable for a new component.
Consider adding more detailed documentation, such as:
- Explaining the significance of the "unique" deduplication strategy.
- Providing examples of how this component can be used in a Pipedream workflow.
12-20
: Add documentation for the 'listId' prop.The 'listId' prop is correctly defined, but its purpose and any constraints are not immediately clear.
Consider adding a comment or description to the 'listId' prop definition explaining:
- Its purpose in the context of this component.
- Any constraints or expected format for the list ID.
- How it relates to the Attio API or data model.
Example:
listId: { propDefinition: [ common.props.attio, "listId", ], description: "The ID of the Attio list to monitor for new entries. This should be a valid list ID from your Attio workspace.", },
26-36
: Consider adding a comment explaining the filter structure in getFilter() method.The filter structure looks correct, but its purpose and how it's used in the Attio API context could be clearer.
Add a comment explaining:
- The purpose of this filter in the context of the Attio API.
- Why we're checking for equality with the listId.
- Any potential variations or additional conditions that might be added in the future.
Example:
getFilter() { // This filter ensures we only receive events for entries added to the specified list. // It compares the list_id field of the event with the listId prop of this component. return { "$and": [ { field: "id.list_id", operator: "equals", value: this.listId, }, ], }; },components/attio/sources/new-record-created-instant/new-record-created-instant.mjs (3)
4-11
: LGTM: Well-structured module export with comprehensive metadata.The module export is well-organized, extending the common base module and providing clear metadata. This approach promotes code reusability and maintainability.
Consider bumping the version number to 0.1.0 for the initial release, following semantic versioning principles.
12-20
: LGTM: Props section is well-structured and extends common props.The props section correctly extends the common props and adds the objectId prop using a standardized propDefinition approach. This ensures consistency across the application.
Consider adding a brief comment explaining the purpose and significance of the objectId prop for better code documentation.
21-44
: LGTM: Methods section provides necessary functionality for new record events.The methods section extends common methods and adds three crucial functions for handling new record creation events. The implementation looks correct and aligns with the module's purpose.
Consider the following suggestions for potential improvements:
- Simplify the filter construction in the
getFilter
method:getFilter() { return { "id.object_id": this.objectId, }; }
- Enhance the
generateMeta
method to include more record details if available:generateMeta(record) { return { id: record.id.record_id, summary: `New ${this.objectId} Record: ${record.name || record.id.record_id}`, ts: Date.now(), record: record, // Include the full record for more context }; }components/attio/sources/record-updated-instant/record-updated-instant.mjs (3)
4-20
: LGTM: Component definition is well-structured. Consider semantic versioning.The component definition is clear and comprehensive. It extends common properties and adds specific ones as needed. The key, name, description, type, and deduplication strategy are all appropriate for a source component that emits events when records are updated.
Consider using semantic versioning (e.g., "1.0.0") instead of "0.0.1" for the initial release, unless this is intentionally a pre-release version.
26-36
: LGTM: getFilter method constructs an appropriate filter. Consider simplifying the structure.The method correctly constructs a filter object to check for equality on the
id.object_id
field using theobjectId
prop. This aligns with the component's purpose of filtering events for a specific object.Consider simplifying the filter structure since there's only one condition:
getFilter() { return { field: "id.object_id", operator: "equals", value: this.objectId, }; }This simplification maintains the same functionality while reducing unnecessary nesting.
37-44
: LGTM: generateMeta method creates appropriate metadata. Consider enhancing the summary.The method correctly generates metadata for the event, including a unique ID, timestamp, and summary. The approach for creating a unique ID by combining the record ID and timestamp is effective.
Consider enhancing the summary to provide more context about the update:
generateMeta(record) { const ts = Date.now(); return { id: `${record.id.record_id}-${ts}`, summary: `Record updated: ${record.id.record_id} in ${this.objectId}`, ts, }; }This change provides more specific information about which object was updated, improving the event's clarity.
components/attio/actions/create-note/create-note.mjs (2)
3-8
: LGTM: Module metadata is well-defined.The module metadata provides clear information about the component's purpose and functionality. The inclusion of the API documentation link is helpful.
Consider adding a brief mention of the Attio platform in the description for users who might not be familiar with it. For example:
- description: "Creates a new note for a given record. The note will be linked to the specified record. [See the documentation](https://developers.attio.com/reference/post_v2-notes)", + description: "Creates a new note for a given record in Attio, a customer data platform. The note will be linked to the specified record. [See the documentation](https://developers.attio.com/reference/post_v2-notes)",
9-40
: LGTM: Props are well-defined and comprehensive.The props cover all necessary inputs for creating a note and use propDefinitions where appropriate to ensure consistency with the Attio data model. The descriptions provide clear guidance for users.
Consider adding a
optional
field to thecontent
prop if it's not required for creating a note. If it is required, consider adding arequired: true
field for clarity. For example:content: { type: "string", label: "Content", description: "The content of the note", + optional: true, // or required: true },
components/attio/attio.app.mjs (1)
174-181
: Clarify parameters inupsertRecord
methodThe
upsertRecord
method acceptsobjectId
and spreads...opts
, which may not clearly indicate the required parameters for upserting a record. Consider explicitly defining the parameters or adding validation to ensure all necessary data is provided.Define expected parameters for clarity:
upsertRecord({ objectId, recordData, params = {}, ...opts }) { // Use recordData in the request body }components/attio/sources/common/base.mjs (2)
46-50
: Clarify implementation requirements forgetEventType
andgenerateMeta
methodsThe methods
getEventType()
andgenerateMeta()
currently throw generic errors:getEventType() { throw new Error("getEventType is not implemented"); }, generateMeta() { throw new Error("generateMeta is not implemented"); },Consider providing more informative error messages or documentation to guide developers implementing these methods. Alternatively, you could use comments to indicate that these methods are intended to be overridden by subclasses.
54-56
: Handle cases whereevents
is not an arrayThe check
if (!events?.length)
assumes thatevents
is an array. Ifevents
can benull
,undefined
, or another type, consider adding additional checks or type validation to prevent runtime errors.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (13)
- components/attio/actions/create-note/create-note.mjs (1 hunks)
- components/attio/actions/create-update-record/create-update-record.mjs (1 hunks)
- components/attio/actions/delete-list-entry/delete-list-entry.mjs (1 hunks)
- components/attio/attio.app.mjs (1 hunks)
- components/attio/common/utils.mjs (1 hunks)
- components/attio/package.json (2 hunks)
- components/attio/sources/common/base.mjs (1 hunks)
- components/attio/sources/new-list-entry-instant/new-list-entry-instant.mjs (1 hunks)
- components/attio/sources/new-list-entry-instant/test-event.mjs (1 hunks)
- components/attio/sources/new-record-created-instant/new-record-created-instant.mjs (1 hunks)
- components/attio/sources/new-record-created-instant/test-event.mjs (1 hunks)
- components/attio/sources/record-updated-instant/record-updated-instant.mjs (1 hunks)
- components/attio/sources/record-updated-instant/test-event.mjs (1 hunks)
🧰 Additional context used
🔇 Additional comments (24)
components/attio/sources/new-record-created-instant/test-event.mjs (1)
1-12
: LGTM! Well-structured test event object.The exported object is well-organized and provides a clear representation of a "record.created" event in the Attio system. The use of UUIDs for identifiers and the separation of workspace, object, and record IDs provide good granularity and ensure uniqueness.
Consider adding a brief comment at the beginning of the file to explain its purpose, e.g.:
// Test event object for the "new-record-created-instant" Attio source
To ensure this structure aligns with the Attio API documentation, please run the following script:
This will help confirm that the test event structure is consistent with other parts of the Attio integration and API usage.
components/attio/package.json (2)
3-3
: Version update looks good.The version bump from 0.0.1 to 0.1.0 is appropriate, indicating new features or improvements without breaking changes. This aligns with semantic versioning principles.
15-17
: Dependency addition looks good, but verify usage.The addition of
@pipedream/platform
as a dependency is appropriate. The version constraint^3.0.3
allows for compatible updates, which is a good practice.Please ensure that this dependency is actually used in the component code. Run the following script to verify its usage:
✅ Verification successful
Previous script had a syntax error. Please run the corrected script below to verify the usage of
@pipedream/platform
.
Previous script still has a syntax error. Please run the corrected script below to verify the usage of
@pipedream/platform
.
No usage of
@pipedream/platform
found in.js
or.mjs
files. Performing a broader search to confirm.
Previous script encountered a file type error. Please run the corrected script below to verify the usage of
@pipedream/platform
.
Dependency addition verified.
@pipedream/platform
is imported incomponents/attio/attio.app.mjs
.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the usage of @pipedream/platform in the component code. # Test: Search for import statements or require calls for @pipedream/platform # Expect: At least one occurrence in .js or .mjs files rg --type js 'from\s+[\'"]@pipedream/platform[\'"]|require\([\'"]@pipedream/platform[\'"]\)' components/attio/Length of output: 93
Script:
#!/bin/bash # Description: Verify the usage of @pipedream/platform in the component code. # Test: Search for import statements or require calls for @pipedream/platform # Expect: At least one occurrence in .js or .mjs files rg --type js "from\s+['\"]@pipedream/platform['\"]|require\(['\"]@pipedream/platform['\"]\)" components/attio/Length of output: 120
Script:
#!/bin/bash # Description: Verify the usage of @pipedream/platform in the component code. # Test: Search for import statements or require calls for @pipedream/platform # Expect: At least one occurrence in .js or .mjs files rg --type js 'from\s+["]@pipedream/platform["]|require\(["]@pipedream/platform["]\)' components/attio/Length of output: 104
Script:
#!/bin/bash # Description: Verify the usage of @pipedream/platform in various file types within the component code. # Test: Search for import statements or require calls for @pipedream/platform in .js, .mjs, .ts, .jsx, .tsx files # Expect: At least one occurrence in the specified files rg --type js --type mjs --type ts --type jsx --type tsx 'from\s+["]@pipedream/platform["]|require\(["]@pipedream/platform["]\)' components/attio/Length of output: 175
Script:
#!/bin/bash # Description: Verify the usage of @pipedream/platform in various file types within the component code. # Test: Search for import statements or require calls for @pipedream/platform in .js, .mjs, .ts, .jsx, .tsx files # Expect: At least one occurrence in the specified files rg --glob '*.js' --glob '*.mjs' --glob '*.ts' --glob '*.jsx' --glob '*.tsx' 'from\s+["]@pipedream/platform["]|require\(["]@pipedream/platform["]\)' components/attio/Length of output: 243
components/attio/sources/record-updated-instant/test-event.mjs (2)
1-2
: LGTM: Event type is correctly defined.The
event_type
property accurately describes the purpose of this test event object as a record update event.
1-13
: Overall structure looks good. Verify against Attio API documentation.The test event object is well-structured and provides a comprehensive representation of a record update event in the Attio system. The use of UUIDs for identification and the inclusion of actor information are good practices.
To ensure this test event accurately represents the Attio API response structure, please verify it against the official Attio API documentation. Run the following script to search for any Attio API documentation files in the repository:
If no documentation is found locally, please refer to the official Attio API documentation to confirm the structure of record update events.
components/attio/sources/new-list-entry-instant/test-event.mjs (1)
1-14
: LGTM: Well-structured test event objectThe overall structure of this test event object is well-organized and appropriate for simulating a "list-entry.created" event in the Attio system. It provides a good representation of the expected data structure for such an event, including nested objects for complex properties like 'id' and 'actor'.
components/attio/actions/delete-list-entry/delete-list-entry.mjs (1)
1-1
: LGTM: Import statement is correct.The import of the
attio
object from the relative path is appropriate and follows best practices for module imports.components/attio/sources/new-list-entry-instant/new-list-entry-instant.mjs (3)
1-2
: LGTM: Imports are appropriate and well-structured.The imports for common functionalities and the sample event emitter are correctly implemented using relative paths, indicating a well-organized project structure.
23-25
: LGTM: getEventType() method is correctly implemented.The method returns the appropriate event type string for list entry creation.
1-46
: Overall assessment: Well-implemented component with minor suggestions for improvement.This new Attio component for detecting new list entries is well-structured and should function as intended. The code follows good practices by extending common functionalities and implementing the necessary methods for event filtering and metadata generation.
Key strengths:
- Clear component definition with appropriate properties.
- Well-structured props extending common properties.
- Correct implementation of required methods.
Suggestions for improvement:
- Add more detailed documentation for the component and its props.
- Enhance the generateMeta() method to provide more informative event data.
- Include comments explaining the purpose and structure of the getFilter() method.
These improvements will enhance the component's usability and maintainability without changing its core functionality.
components/attio/sources/new-record-created-instant/new-record-created-instant.mjs (1)
1-2
: LGTM: Imports are appropriate and use modern JavaScript syntax.The imports for the common base module and sample event emitter are correctly structured using ES module syntax (.mjs extension). This approach aligns with modern JavaScript practices and ensures proper module separation.
components/attio/sources/record-updated-instant/record-updated-instant.mjs (2)
1-2
: LGTM: Imports are appropriate and follow good practices.The imports are well-structured, utilizing relative paths for modularity. Importing common functionalities and a sample event emitter aligns with the component's purpose.
23-25
: LGTM: getEventType method is concise and clear.The method correctly returns the string "record.updated", which aligns with the component's purpose of emitting events when records are updated.
components/attio/actions/create-note/create-note.mjs (2)
1-1
: LGTM: Import statement is correct.The import statement correctly imports the
attio
module from the relative path. This is likely the main application file for Attio integration.
1-57
: Overall assessment: Well-implemented Attio note creation component.This new module for creating notes in Attio is well-structured and follows good practices for Pipedream component development. It provides a clear interface for users to create notes linked to specific records in Attio. The implementation aligns well with the PR objectives of developing new components for integration with external services.
A few minor suggestions have been made to enhance the component:
- Adding a brief mention of Attio in the component description.
- Clarifying whether the content field is optional or required.
- Implementing error handling in the run method.
These suggestions, if implemented, would further improve the usability and robustness of the component. Great job on this implementation!
components/attio/actions/create-update-record/create-update-record.mjs (2)
36-42
: Validate prop types for dynamic attributesIn the
additionalProps
method (lines 36-42), when defining dynamic props for attributes, all attributes are assigned atype
of"string"
or"string[]"
. Ensure that this correctly reflects the data types expected by the Attio API for each attribute. Some attributes might expect types likenumber
,boolean
, or specific formats.Consider enhancing the
type
assignment to handle different attribute types accurately. You might need to map Attio's attribute data types to the corresponding prop types.
7-7
: Verify the documentation URL in the descriptionThe documentation link provided in the
description
(line 7) should point to the correct endpoint for theCreate or Update Record
action.Please confirm that
[See the documentation](https://developers.attio.com/reference/put_v2-objects-object-records)
is the correct URL. If the API documentation has moved or the endpoint has changed, update the link accordingly.components/attio/attio.app.mjs (3)
1-2
: LGTM: Correct import and default limit definitionThe import of
axios
from@pipedream/platform
and the definition ofDEFAULT_LIMIT
are appropriate and correctly implemented.
14-19
: Confirm the structure oflistId
options mappingIn the
listId
prop definition, you're accessingid.list_id
to get the list ID. Verify that the API response structure containsid.list_id
and adjust if necessary. Ifid
directly contains thelist_id
, you might need to change it tovalue: id
.You can check the response structure from the
listLists
method to ensure correct data mapping.
104-110
: Verify usage ofaxios
with context$
In the
_makeRequest
method,axios
is called with$
as the first argument. Ensure that this usage aligns with the@pipedream/platform
implementation ofaxios
. Incorrect usage might lead to issues with request execution.To confirm the correct usage, you can search the codebase for other instances of
axios
usage:components/attio/sources/common/base.mjs (4)
11-24
:⚠️ Potential issueReview nested
data
properties in webhook creationIn the
activate()
method, there's a double nesting ofdata
in the request payload sent tothis.attio.createWebhook()
:await this.attio.createWebhook({ data: { data: { target_url: this.http.endpoint, subscriptions: [ { event_type: this.getEventType(), filter: this.getFilter(), }, ], }, }, });Please verify whether the double
data
nesting aligns with the Attio API specification. Incorrect nesting might cause the webhook creation to fail or lead to unexpected behavior.
11-11
:⚠️ Potential issueConfirm response structure of
createWebhook
methodThe destructuring assignment used to extract
hookId
assumes a specific response structure:const { data: { id: { webhook_id: hookId } } } = await this.attio.createWebhook({ /* ... */ });Please confirm that the response from
this.attio.createWebhook()
matches this structure. Misalignment could result inhookId
beingundefined
, which would affect subsequent operations.
27-32
:⚠️ Potential issueValidate parameter name in
deleteWebhook
callIn the
deactivate()
method, the call to delete the webhook useshookId
as a parameter:await this.attio.deleteWebhook({ hookId, });Ensure that
deleteWebhook()
expects a parameter namedhookId
. If the API requires a different parameter name (e.g.,id
), the deletion might not work as intended.
53-54
:⚠️ Potential issueEnsure correct access to
events
in therun
methodThe code assumes that
events
can be accessed viaevent.body.events
:const { body: { events } } = event;Verify that this path accurately reflects the structure of incoming webhook payloads from Attio. Misalignment might result in
events
beingundefined
, causing the function to exit prematurely.
components/attio/sources/new-list-entry-instant/new-list-entry-instant.mjs
Show resolved
Hide resolved
components/attio/sources/new-record-created-instant/new-record-created-instant.mjs
Show resolved
Hide resolved
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! Left one comment regarding a possible, optional summary improvement
}, | ||
}, | ||
}); | ||
$.export("$summary", "Successfully created or updated record"); |
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.
Does the response specify whether it was a create or update operation?
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.
No, it just returns the record, but good suggestion. The record has a created_at
date, but no updated_at
. If it had both, I could compare them to see if the record is newly created.
/approve |
Resolves #14210
Summary by CodeRabbit
Release Notes
New Features
Improvements
Version Update