Skip to content

Hubspot actions - support end user auth #14958

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

Merged
merged 7 commits into from
Dec 18, 2024
Merged

Hubspot actions - support end user auth #14958

merged 7 commits into from
Dec 18, 2024

Conversation

michelle0927
Copy link
Collaborator

@michelle0927 michelle0927 commented Dec 12, 2024

Resolves #14913

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced objectProperties for structured input in various actions, enhancing object and engagement creation.
    • Added updateIfExists property to allow updates during contact creation errors.
  • Version Updates

    • Incremented version numbers across multiple components for tracking changes.
  • Bug Fixes

    • Improved error handling in additionalProps and creationProps methods for better robustness.
  • Refactor

    • Updated import structure to utilize appProp for property management across multiple actions.

Copy link

vercel bot commented Dec 12, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs-v2 ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 16, 2024 5:38pm
2 Skipped Deployments
Name Status Preview Comments Updated (UTC)
pipedream-docs ⬜️ Ignored (Inspect) Dec 16, 2024 5:38pm
pipedream-docs-redirect-do-not-edit ⬜️ Ignored (Inspect) Dec 16, 2024 5:38pm

Copy link
Contributor

coderabbitai bot commented Dec 12, 2024

Walkthrough

The pull request introduces several enhancements across various HubSpot action files, focusing on the addition of the objectProperties property and improvements to error handling within methods. The changes involve updating import statements to use appProp, incrementing version numbers, and restructuring properties to enhance modularity and flexibility in object creation and updates. The modifications aim to facilitate better handling of user-defined properties and improve the overall robustness of the actions.

Changes

File Change Summary
components/hubspot/actions/common/common-create-object.mjs Added objectProperties to props, updated propertyGroups with hidden: true, modified run method to handle objectProperties.
components/hubspot/actions/common/common-create.mjs Updated additionalProps method to accept existingProps, enhanced error handling, and modified logic for propertyGroups.
components/hubspot/actions/common/common-update-object.mjs Added objectProperties to props, updated run method to handle objectProperties.
components/hubspot/actions/create-communication/create-communication.mjs Added objectProperties to props, updated run method for handling properties, incremented version to 0.0.4.
components/hubspot/actions/create-company/create-company.mjs Incremented version to 0.0.15.
components/hubspot/actions/create-custom-object/create-custom-object.mjs Updated imports to use appProp, incremented version to 0.0.3, modified props structure.
components/hubspot/actions/create-deal/create-deal.mjs Incremented version to 0.0.15.
components/hubspot/actions/create-engagement/create-engagement.mjs Added objectProperties to props, modified run method for property handling.
components/hubspot/actions/create-lead/create-lead.mjs Updated imports to use appProp, incremented version to 0.0.3.
components/hubspot/actions/create-or-update-contact/create-or-update-contact.mjs Added updateIfExists to props, incremented version to 0.0.13.
components/hubspot/actions/create-ticket/create-ticket.mjs Incremented version to 0.0.6.
components/hubspot/actions/search-crm/search-crm.mjs Enhanced error handling in additionalProps, added getObjectType method, incremented version to 0.0.10.
components/hubspot/actions/update-company/update-company.mjs Updated imports to use appProp, incremented version to 0.0.11.
components/hubspot/actions/update-contact/update-contact.mjs Updated imports to use appProp, incremented version to 0.0.12.
components/hubspot/actions/update-custom-object/update-custom-object.mjs Updated imports to use appProp, incremented version to 0.0.3.
components/hubspot/actions/update-deal/update-deal.mjs Updated imports to use appProp, incremented version to 0.0.2.
components/hubspot/actions/update-lead/update-lead.mjs Updated imports to use appProp, incremented version to 0.0.3.
components/hubspot/package.json Incremented package version from 0.12.0 to 0.12.1.

Assessment against linked issues

Objective Addressed Explanation
Enable configuration with end user auth (14913)
Show props even if API call fails (14913)
Allow JSON object input for properties if fetching fails (14913)

Possibly related PRs

Suggested labels

ai-assisted

Suggested reviewers

  • GTFalcao

Poem

In the fields of code we play,
New properties bloom today.
With objectProperties in sight,
Our actions now feel just right.
Error handling, oh so grand,
HubSpot's magic at our hand! 🐇✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f985bdb and 99c7cfb.

📒 Files selected for processing (3)
  • components/boldsign/boldsign.app.mjs (1 hunks)
  • components/calllerapi/calllerapi.app.mjs (1 hunks)
  • components/hubspot/package.json (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • components/calllerapi/calllerapi.app.mjs
  • components/boldsign/boldsign.app.mjs
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/hubspot/package.json

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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Outside diff range and nitpick comments (10)
components/hubspot/actions/update-contact/update-contact.mjs (1)

3-3: LGTM: Common auth props import aligns with end user auth support

The addition of appProp import centralizes authentication-related properties, which is a good architectural decision for supporting end user authentication across HubSpot actions.

components/hubspot/actions/update-lead/update-lead.mjs (1)

Line range hint 1-28: Architecture suggestion for error handling

Given that this component handles lead updates and now supports end-user authentication, consider adding explicit error handling for authentication failures.

Consider adding a try-catch block in the common update object implementation to handle potential authentication errors and provide clear error messages to end users.

components/hubspot/actions/update-custom-object/update-custom-object.mjs (1)

Line range hint 1-34: Architecture recommendation: Document the property inheritance pattern

The refactoring to support end-user auth through common-app-prop.mjs is well-structured. Consider adding documentation that explains:

  1. The purpose and scope of common-app-prop.mjs
  2. The property inheritance hierarchy (appProp → component-specific → common)
  3. Guidelines for adding new properties to prevent conflicts

This will help maintain consistency as more HubSpot actions are updated to support end-user auth.

components/hubspot/actions/search-crm/search-crm.mjs (4)

48-61: Consider logging errors in catch blocks for better debugging

In the additionalProps method, the catch block handling errors when fetching custom object types is currently empty. Logging the error message can aid in troubleshooting issues during runtime.

Apply this diff to log the error:

try {
  props.customObjectType = {
    type: "string",
    label: "Custom Object Type",
    options: await this.getCustomObjectTypes(),
    reloadProps: true,
  };
} catch (error) {
+ console.error("Error fetching custom object types:", error);
  props.customObjectType = {
    type: "string",
    label: "Custom Object Type",
    reloadProps: true,
  };
}

69-86: Add error logging when fetching schema fails

In the additionalProps method, when an error occurs while fetching the schema, consider logging the error to assist with debugging.

Apply this diff to log the error:

try {
  schema = await this.hubspot.getSchema({
    objectType,
  });

  props.searchProperty = {
    type: "string",
    label: "Search Property",
    description: "The field to search",
    options: schema.searchableProperties,
  };
} catch (error) {
+ console.error("Error fetching schema:", error);
  props.searchProperty = {
    type: "string",
    label: "Search Property",
    description: "The field to search",
  };
}

102-129: Log errors when retrieving additional properties fails

When attempting to retrieve additional properties, logging the error in the catch block will help identify issues during property retrieval.

Apply this diff to log the error:

try {
  // eslint-disable-next-line pipedream/props-description
  props.additionalProperties = {
    type: "string[]",
    label: "Additional properties to retrieve",
    optional: true,
    options: async ({ page }) => {
      if (page !== 0) {
        return [];
      }
      const { results: properties } = await this.hubspot.getProperties({
        objectType: this.customObjectType ?? this.objectType,
      });
      const defaultProperties = this.getDefaultProperties();
      return properties.filter(({ name }) => !defaultProperties.includes(name))
        .map((property) => ({
          label: property.label,
          value: property.name,
        }));
    },
  };
} catch (error) {
+ console.error("Error fetching additional properties:", error);
  props.additionalProperties = {
    type: "string[]",
    label: "Additional properties to retrieve",
    optional: true,
  };
}

133-155: Include error logging when generating creation properties

In the additionalProps method, if an error occurs while generating creationProps, logging the error will facilitate debugging.

Apply this diff to log the error:

try {
  const { results: properties } = await this.hubspot.getProperties({
    objectType,
  });
  const relevantProperties = properties.filter(this.isRelevantProperty);
  const propDefinitions = [];
  for (const property of relevantProperties) {
    propDefinitions.push(await this.makePropDefinition(property, schema.requiredProperties));
  }
  creationProps = propDefinitions
    .reduce((props, {
      name, ...definition
    }) => {
      props[name] = definition;
      return props;
    }, {});
} catch (error) {
+ console.error("Error generating creation properties:", error);
  props.creationProps = {
    type: "object",
    label: "Object Properties",
    description: "A JSON object containing the object to create if not found",
  };
}
components/hubspot/actions/create-engagement/create-engagement.mjs (2)

56-60: Consider adding JSON schema validation.

The new objectProperties property provides good flexibility for custom engagement properties. However, consider adding JSON schema validation to prevent invalid property submissions.

     objectProperties: {
       type: "object",
       label: "Object Properties",
       description: "Enter the `engagement` properties as a JSON object",
+      validate: (value) => {
+        try {
+          if (typeof value === "string") {
+            JSON.parse(value);
+          }
+          return true;
+        } catch (e) {
+          return "Invalid JSON format";
+        }
+      },
     },

98-102: Consider adding type safety checks.

While the properties handling logic is sound, consider adding explicit type checks for better error handling.

     const properties = objectProperties
       ? typeof objectProperties === "string"
         ? JSON.parse(objectProperties)
         : objectProperties
+      ? typeof objectProperties === "object" && objectProperties !== null
+        ? objectProperties
+        : throw new Error("objectProperties must be a valid object or JSON string")
       : otherProperties;
components/hubspot/actions/common/common-create.mjs (1)

115-147: Consider enhancing error handling specificity.

The error handling is good but could be more specific to help with debugging.

     try {
       const schema = await this.hubspot.getSchema({
         objectType,
       });
       const { results: properties } = await this.hubspot.getProperties({
         objectType,
       });
       // ... rest of the try block
-    } catch {
+    } catch (error) {
+      console.error(`Failed to fetch properties for ${objectType}:`, error.message);
       if (existingProps.propertyGroups) {
         existingProps.propertyGroups.optional = true;
       }
       return {};
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2b422d2 and ddc98f7.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (18)
  • components/hubspot/actions/common/common-create-object.mjs (3 hunks)
  • components/hubspot/actions/common/common-create.mjs (3 hunks)
  • components/hubspot/actions/common/common-update-object.mjs (2 hunks)
  • components/hubspot/actions/create-communication/create-communication.mjs (4 hunks)
  • components/hubspot/actions/create-company/create-company.mjs (1 hunks)
  • components/hubspot/actions/create-custom-object/create-custom-object.mjs (1 hunks)
  • components/hubspot/actions/create-deal/create-deal.mjs (1 hunks)
  • components/hubspot/actions/create-engagement/create-engagement.mjs (3 hunks)
  • components/hubspot/actions/create-lead/create-lead.mjs (1 hunks)
  • components/hubspot/actions/create-or-update-contact/create-or-update-contact.mjs (1 hunks)
  • components/hubspot/actions/create-ticket/create-ticket.mjs (1 hunks)
  • components/hubspot/actions/search-crm/search-crm.mjs (5 hunks)
  • components/hubspot/actions/update-company/update-company.mjs (2 hunks)
  • components/hubspot/actions/update-contact/update-contact.mjs (2 hunks)
  • components/hubspot/actions/update-custom-object/update-custom-object.mjs (2 hunks)
  • components/hubspot/actions/update-deal/update-deal.mjs (2 hunks)
  • components/hubspot/actions/update-lead/update-lead.mjs (2 hunks)
  • components/hubspot/package.json (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • components/hubspot/actions/create-company/create-company.mjs
  • components/hubspot/package.json
  • components/hubspot/actions/create-deal/create-deal.mjs
  • components/hubspot/actions/create-ticket/create-ticket.mjs
🔇 Additional comments (33)
components/hubspot/actions/update-contact/update-contact.mjs (2)

10-10: Version increment follows semantic versioning

The version bump from 0.0.11 to 0.0.12 appropriately reflects these non-breaking changes to the component's implementation.


Line range hint 19-28: Verify the spread operator ordering for props

The props structure looks correct with the spread operator usage, but let's verify that the property precedence is maintained correctly with this ordering:

  1. ...appProp.props (common auth props)
  2. objectId (component-specific prop)
  3. ...common.props (common update object props)
✅ Verification successful

Props structure is consistent across HubSpot actions

The verification shows that the props structure follows a consistent pattern across all HubSpot action components:

  1. ...appProp.props is always spread first
  2. Component-specific props are defined in the middle
  3. ...common.props is spread last when applicable

This ordering ensures proper property precedence, where component-specific props can override common props while still inheriting default behavior. The implementation in update-contact.mjs follows this established pattern correctly.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistency of props structure across similar HubSpot actions

# Check other HubSpot action files for consistent props structure
rg -l "appProp\.props" components/hubspot/actions/ | while read -r file; do
  echo "=== $file ==="
  # Show the props section with context
  rg -A 10 "props:\s*{" "$file"
done

Length of output: 3073


Script:

#!/bin/bash
# Let's try a different approach to verify the props structure

# First, let's check the specific file under review
echo "=== File under review ==="
rg -B 2 -A 10 "appProp\.props" components/hubspot/actions/update-contact/update-contact.mjs

# Then check other similar files for comparison
echo -e "\n=== Other similar files ==="
fd -e mjs . components/hubspot/actions/ -x rg -B 2 -A 10 "appProp\.props" {}

Length of output: 4052

components/hubspot/actions/update-lead/update-lead.mjs (3)

3-3: LGTM: Import change aligns with end-user auth support

The addition of common-app-prop.mjs import is consistent with the PR's objective to support end-user authentication, moving towards a more standardized property management approach.


19-22: Confirm authentication property integration

The replacement of direct hubspot property with appProp.props and the updated leadId propDefinition looks correct for supporting end-user authentication.

✅ Verification successful

Authentication property integration is consistent across HubSpot actions

The verification shows that:

  • The appProp.props.hubspot pattern is consistently implemented across all HubSpot update and create actions
  • The common app prop implementation correctly extends the HubSpot app with reloadProps enabled
  • The authentication property integration through appProp.props is properly standardized
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify the consistency of appProp implementation across HubSpot actions

# Check if all HubSpot actions are using the new appProp pattern
echo "Checking appProp usage across HubSpot actions:"
rg -g "components/hubspot/actions/*/*.mjs" "appProp.props.hubspot"

# Check the implementation of common-app-prop.mjs
echo -e "\nChecking common-app-prop.mjs implementation:"
cat components/hubspot/actions/common/common-app-prop.mjs

Length of output: 1547


10-10: Verify version bump impact

The version increment from 0.0.2 to 0.0.3 suggests a minor update. Since this involves authentication changes, we should verify if this warrants a more significant version bump.

✅ Verification successful

Based on the shell script results, I can now provide a conclusive response about the version bump concern:

Version bump is appropriate for this change

The version increment from 0.0.2 to 0.0.3 for the update-lead action is consistent with semantic versioning practices in this codebase. Looking at other HubSpot actions:

  • Most actions are at versions like 0.0.11, 0.0.12, 0.0.13
  • Similar lead-related components (create-lead) are also at 0.0.3
  • The change involves authentication modifications which are typically handled as patch versions in this codebase
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check version numbers across other HubSpot action components
# to ensure consistent versioning strategy

echo "Checking versions in other HubSpot action components:"
rg -g "components/hubspot/actions/*/*.mjs" '"version":' -A 1

Length of output: 179


Script:

#!/bin/bash
# Let's try a different approach to find version information
# First, let's check the specific file content
echo "Checking the specific file content:"
cat components/hubspot/actions/update-lead/update-lead.mjs

echo -e "\nChecking for version patterns in all HubSpot action files:"
fd . components/hubspot/actions -e mjs -x grep -l "version" {} \; -x cat {}

Length of output: 38922

components/hubspot/actions/create-custom-object/create-custom-object.mjs (3)

1-2: LGTM: Clean separation of authentication properties

The addition of appProp import helps modularize authentication-related properties, which aligns with the PR's objective of supporting end user authentication.


9-9: LGTM: Appropriate version increment

The patch version increment (0.0.2 → 0.0.3) correctly reflects the backward-compatible addition of end user authentication support.


Line range hint 12-19: Verify appProp structure and props precedence

The props restructuring looks good and properly integrates end user authentication. However, let's verify the complete structure of appProp to ensure all necessary authentication properties are included.

✅ Verification successful

Let me gather more information about the props structure and usage pattern.


Let me check one more thing to verify the common props structure.


Based on the analysis of all the gathered information, I can now provide the final response:

Props restructuring is correctly implemented and safe

The changes to the props structure in create-custom-object.mjs are verified to be correct and follow the established pattern across other Hubspot actions:

  • appProp.props spread correctly includes the authenticated hubspot instance and related auth props
  • customObjectType prop properly references the hubspot instance from appProp.props
  • The order of spreads is consistent with other actions (appProp -> specific props -> common props)
  • The base props structure from common-create-object.mjs is maintained
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the structure of appProp and its usage across other Hubspot actions

# Check the appProp definition
echo "Checking appProp definition:"
cat components/hubspot/actions/common/common-app-prop.mjs

# Check for consistent usage across other actions
echo -e "\nChecking usage pattern across other actions:"
rg -l "appProp" components/hubspot/actions/

Length of output: 980


Script:

#!/bin/bash
# Check the common props structure and its usage
echo "Checking common props structure:"
cat components/hubspot/actions/common/common.mjs

# Check how appProp and common props are used in other create actions
echo -e "\nChecking create-lead action:"
cat components/hubspot/actions/create-lead/create-lead.mjs

echo -e "\nChecking create-communication action:"
cat components/hubspot/actions/create-communication/create-communication.mjs

# Check the base hubspot app definition
echo -e "\nChecking base hubspot app:"
cat components/hubspot/hubspot.app.mjs

Length of output: 32858


Script:

#!/bin/bash
# Check the common-create-object.mjs file
echo "Checking common-create-object.mjs:"
cat components/hubspot/actions/common/common-create-object.mjs

Length of output: 3194

components/hubspot/actions/update-company/update-company.mjs (3)

3-3: LGTM: Import change aligns with end-user auth support

The addition of appProp import from common-app-prop.mjs is consistent with the PR's objective of supporting end-user authentication.


19-22: LGTM: Props restructuring enhances authentication flexibility

The changes effectively:

  1. Incorporate common auth properties via ...appProp.props
  2. Update the objectId prop to reference the standardized HubSpot client
✅ Verification successful

Props restructuring is consistently applied across HubSpot actions

The verification confirms that appProp.props.hubspot is consistently used across multiple HubSpot action components for prop definitions, including:

  • update-lead
  • update-deal
  • update-custom-object
  • update-contact
  • update-company
  • create-lead
  • create-custom-object
  • create-communication

The restructuring pattern matches the standardized approach used throughout the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verify consistent usage of appProp.props.hubspot across HubSpot actions
echo "Checking appProp.props.hubspot usage in other HubSpot actions..."
rg -g "components/hubspot/actions/*/*.mjs" "appProp\.props\.hubspot" -B 2 -A 2

Length of output: 5086


10-10: Verify semantic versioning compliance

The version bump from 0.0.10 to 0.0.11 suggests a patch change. Given that we're adding end-user auth support, should this be a minor version bump instead (0.1.0)?

components/hubspot/actions/update-custom-object/update-custom-object.mjs (3)

9-9: LGTM: Version bump is appropriate

The version increment from 0.0.2 to 0.0.3 appropriately reflects the addition of end-user auth support while maintaining backward compatibility.


2-2: Verify the common-app-prop implementation for end-user auth support

The addition of appProp import suggests this component is being updated to support end-user authentication. Let's verify the implementation of the common properties.

✅ Verification successful

Import of appProp is correctly implemented for end-user auth support

The verification confirms that:

  1. The common-app-prop.mjs correctly extends the HubSpot app with reloadProps: true for dynamic auth properties
  2. The HubSpot app implementation includes OAuth authentication via this.$auth.oauth_access_token
  3. The import is consistently used across all update actions in the HubSpot component
  4. The pattern aligns with other actions like update-company which follows the same structure
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the common-app-prop.mjs implementation and its usage across HubSpot actions

# Check the common-app-prop implementation
echo "Checking common-app-prop.mjs implementation:"
cat components/hubspot/actions/common/common-app-prop.mjs

# Check for consistent usage across other HubSpot actions
echo -e "\nChecking usage across other HubSpot actions:"
rg -l "common-app-prop.mjs" components/hubspot/actions/

Length of output: 1024


Script:

#!/bin/bash
# Let's verify if the hubspot app implementation supports end-user auth
echo "Checking hubspot app implementation:"
cat components/hubspot/hubspot.app.mjs

# Check if other update actions have similar structure
echo -e "\nChecking structure of another update action for comparison:"
cat components/hubspot/actions/update-company/update-company.mjs

Length of output: 28745


Line range hint 18-34: Verify property resolution order and potential conflicts

The props restructuring looks good, following a clear pattern:

  1. Base properties from appProp
  2. Component-specific properties
  3. Common update object properties

However, let's verify there are no property conflicts or unintended overrides in this inheritance chain.

✅ Verification successful

Property resolution order is correct and no conflicts found

The property resolution follows the intended pattern and is conflict-free:

  1. appProp.props provides the base hubspot property
  2. Component-specific properties (customObjectType, objectId) are defined with correct dependencies
  3. common.props spreads last, adding propertyGroups and objectProperties without overriding the previous properties

The inheritance chain is properly structured with no duplicate property definitions or unintended overrides. Each property serves a distinct purpose:

  • hubspot: Authentication and base app functionality
  • customObjectType: Custom object type selection
  • objectId: Object identification (depends on customObjectType)
  • propertyGroups and objectProperties: Common update functionality
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for potential property naming conflicts

# Check property definitions in all related files
echo "Checking property definitions in common files:"
ast-grep --pattern 'props: {
  $$$
}' components/hubspot/actions/common/common-app-prop.mjs components/hubspot/actions/common/common-update-object.mjs

# Check for any duplicate property definitions
echo -e "\nChecking for properties defined in multiple places:"
rg -A 5 'propDefinition:' components/hubspot/actions/common/

Length of output: 435


Script:

#!/bin/bash
# Let's try a different approach to check property definitions

# First, let's check the content of common files
echo "Content of common-app-prop.mjs:"
cat components/hubspot/actions/common/common-app-prop.mjs

echo -e "\nContent of common-update-object.mjs:"
cat components/hubspot/actions/common/common-update-object.mjs

# Check the update-custom-object component
echo -e "\nContent of update-custom-object.mjs:"
cat components/hubspot/actions/update-custom-object/update-custom-object.mjs

Length of output: 3598

components/hubspot/actions/update-deal/update-deal.mjs (4)

3-3: LGTM: Good modularization of auth properties

The addition of appProp import aligns with centralizing authentication-related properties, which supports the PR's objective of enabling end-user authentication.


19-22: LGTM: Clean property restructuring

The property restructuring maintains functionality while properly centralizing authentication-related properties. The use of spread operator and correct referencing of appProp.props.hubspot follows good practices.


Line range hint 1-31: Verify complete end-user auth implementation

Since this PR aims to support end-user authentication, let's verify the complete implementation.


10-10: Verify version bump follows project guidelines

The version increment to "0.0.2" seems appropriate for the auth-related changes. Let's verify this follows the project's versioning pattern.

✅ Verification successful

Version increment follows component patterns

Based on the search results, the version increment from 0.0.1 to 0.0.2 for the "Update Deal" component is consistent with the versioning pattern used across other HubSpot components. Other similar components show incremental version numbers like:

  • Update Contact: 0.0.12
  • Update Lead: 0.0.3
  • Update Company: 0.0.11
  • Update Custom Object: 0.0.3

The minor version bump is appropriate for auth-related changes and follows the established pattern in the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check versioning pattern in other HubSpot components
# Expected: Find version numbers in other HubSpot action components for comparison

echo "Checking versioning pattern in HubSpot components..."
rg '"version":' components/hubspot/actions/ -A 1 -B 1

Length of output: 170


Script:

#!/bin/bash
# Let's try a different approach to find version patterns
# 1. Search for "version" string in component props
echo "Searching for version patterns in HubSpot components..."
rg "version[\"']?: [\"'][\d\.]+" components/hubspot/actions/ --type js

# 2. Also check package.json files if they exist
echo -e "\nChecking package.json files in HubSpot components..."
fd package.json components/hubspot/actions/ --exec cat {}

# 3. Look for version in component definitions
echo -e "\nChecking component definitions..."
ast-grep --pattern 'prop: {
  $$$
  version: $_
  $$$
}'

Length of output: 522


Script:

#!/bin/bash
# Let's try one more approach to find version patterns
# 1. Search for version property in .mjs files
echo "Searching for version in .mjs files..."
rg "version" components/hubspot/actions/ --type mjs -C 2

# 2. Look for any files with similar structure
echo -e "\nSearching for similar component structure files..."
fd . components/hubspot/actions/ -e mjs -x head -n 20 {}

Length of output: 17443

components/hubspot/actions/create-lead/create-lead.mjs (3)

5-5: LGTM: Good centralization of common properties

The addition of appProp import aligns with the standardization of property management across HubSpot actions.


Line range hint 33-52: Verify end user authentication flow

The object creation logic remains unchanged, but we should verify that the end user authentication is properly handled through the common properties.

✅ Verification successful

Let me gather more information about the authentication implementation.


Based on the analysis of the code, I can now provide the final response:

Authentication is properly implemented through OAuth token

The authentication is correctly handled through the HubSpot app's common implementation:

  • OAuth access token is securely managed via this.$auth.oauth_access_token
  • Authentication headers are properly set in the _getHeaders() method
  • All API requests use these headers through the makeRequest method
  • The create-lead action inherits this authentication through the common app properties
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify end user authentication implementation
# Expected: Proper auth handling in common properties and usage in create method

echo "Checking auth implementation..."
# Check common app properties implementation
cat components/hubspot/actions/common/common-app-prop.mjs

# Check auth-related patterns in create object implementation
ast-grep --pattern 'createObject($$$) {
  $$$
}'

Length of output: 330


Script:

#!/bin/bash
# Check the main hubspot app implementation for auth handling
cat components/hubspot/hubspot.app.mjs

# Look for auth-related patterns in the codebase
rg -l "auth" --type js components/hubspot/

# Check for OAuth or authentication configurations
rg -l "oauth" --type js components/hubspot/

Length of output: 27789


15-18: Verify backward compatibility of property changes

The restructuring of props looks good, but let's verify that existing implementations aren't affected by the property source changes.

✅ Verification successful

Based on the search results, I can see that the property restructuring in create-lead.mjs follows a consistent pattern used across other actions in the codebase. The changes maintain the same property structure where hubspot is accessed through appProp.props, which is the standard way properties are handled in other components like search-crm, create-communication, etc.

Let me verify one more aspect to ensure complete backwards compatibility:


Let me try one more verification to check the property structure:


Property changes maintain backward compatibility

The restructuring of props is safe and maintains backward compatibility because:

  1. The hubspot property is correctly accessed through appProp.props.hubspot which is the standard pattern used across the codebase
  2. The spread operator ...appProp.props preserves all common properties
  3. The property definition structure follows the same pattern used in other components
  4. The actual usage of the hubspot property in the createObject method remains unchanged
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for potential breaking changes in property usage
# Expected: No direct references to the old property structure

echo "Checking for potential breaking changes in property usage..."
rg -A 5 'hubspot\.' components/hubspot/actions/

Length of output: 43827


Script:

#!/bin/bash
# Check the history of create-lead.mjs to see the previous property structure
ast-grep --pattern 'props: {
  $$$
  hubspot,
  $$$
}' components/hubspot/actions/create-lead/create-lead.mjs

Length of output: 111


Script:

#!/bin/bash
# Check the entire create-lead.mjs file to understand the property structure
cat components/hubspot/actions/create-lead/create-lead.mjs

Length of output: 1475

components/hubspot/actions/create-or-update-contact/create-or-update-contact.mjs (3)

9-9: LGTM! Version bump is appropriate.

The patch version increment aligns with the addition of the new updateIfExists property.


Line range hint 1-24: Verify PR scope and implementation completeness

The changes in this file focus on error handling improvements rather than end user authentication support mentioned in the PR description.

Let's verify if end user auth related changes are present in other files:


Line range hint 13-17: Clarify property behavior and add validation

While the new property adds useful functionality for error handling, there are a few concerns:

  1. The description could be more specific about when and how updates occur
  2. Consider adding a default value for consistent behavior
  3. This change seems unrelated to the PR's stated objective of supporting end user auth

Let's check how this integrates with the common create object implementation:

Consider applying these improvements:

     updateIfExists: {
       label: "Update If Exists",
-      description: "When selected, if Hubspot returns an error upon creation the resource should be updated.",
+      description: "When enabled and a contact already exists (based on email), the existing contact will be updated instead of returning an error.",
       type: "boolean",
+      default: false,
     },
✅ Verification successful

Property description accurately reflects implementation, but needs default value

The implementation shows that updateIfExists is correctly used to handle CONFLICT and OBJECT_ALREADY_EXISTS errors by attempting an update operation. The current description could be more precise, but it's not misleading. The main improvement needed is adding a default value.

     updateIfExists: {
       label: "Update If Exists",
       description: "When selected, if Hubspot returns an error upon creation the resource should be updated.",
       type: "boolean",
+      default: false,
     },
  • The property is well integrated with the common create object implementation at components/hubspot/actions/common/common-create-object.mjs
  • The error handling logic properly checks for specific error categories before attempting updates
  • While this change appears unrelated to end user auth, it's a valid enhancement to the contact creation functionality
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check how the updateIfExists property is used in the common module
ast-grep --pattern 'updateIfExists' 

Length of output: 141


Script:

#!/bin/bash
# Let's check the implementation context around updateIfExists usage
ast-grep --pattern $'if (updateIfExists && err?.message) {
  $$$
}'

Length of output: 1772

components/hubspot/actions/search-crm/search-crm.mjs (2)

18-18: Version updated to 0.0.10

The version bump reflects the new changes and improvements made in this action.


164-166: Addition of getObjectType() method enhances modularity

Introducing the getObjectType() method improves code reuse and aligns with the patterns used in other components.

components/hubspot/actions/common/common-create-object.mjs (1)

12-12: Property propertyGroups should remain visible if required

Setting propertyGroups to hidden: true may impact the user experience if they need to select property groups. Ensure this change aligns with the intended functionality.

Is there an alternative approach that maintains necessary functionality without hiding this property?

components/hubspot/actions/create-communication/create-communication.mjs (2)

2-2: Update import path to ensure module resolution

The import path for appProp has been changed. Verify that the new path '../common/common-app-prop.mjs' correctly resolves the module.

Ensure that common-app-prop.mjs is located at the updated path and accessible.


11-11: Version updated to 0.0.4

The version increment reflects the updates made to this action.

components/hubspot/actions/create-engagement/create-engagement.mjs (2)

12-12: LGTM: Version bump is appropriate.

Version increment reflects the addition of end user auth support feature.


90-91: LGTM: Clean property extraction.

The destructuring properly separates objectProperties while collecting remaining properties.

components/hubspot/actions/common/common-create.mjs (2)

4-4: LGTM: Clean modular import.

Good separation of concerns by importing common app properties from a dedicated module.


46-46: LGTM: Clean props composition.

Effectively incorporates common app properties while maintaining extensibility.

luancazarine
luancazarine previously approved these changes Dec 13, 2024
Copy link
Collaborator

@luancazarine luancazarine left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @michelle0927, LGTM! Ready for QA!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
components/hubspot/actions/common/common-create.mjs (1)

115-115: Add parameter validation for existingProps.

While the property manipulation logic is sound, consider adding validation to ensure existingProps is an object and has the expected structure.

  async additionalProps(existingProps) {
+   if (!existingProps || typeof existingProps !== 'object') {
+     throw new Error('existingProps must be an object');
+   }
    const objectType = this.getObjectType();

Also applies to: 140-146

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ddc98f7 and f985bdb.

📒 Files selected for processing (1)
  • components/hubspot/actions/common/common-create.mjs (3 hunks)
🔇 Additional comments (2)
components/hubspot/actions/common/common-create.mjs (2)

4-4: LGTM! Good refactoring to use shared props.

The change to import and spread appProp.props improves code reuse and maintainability.

Also applies to: 46-46


136-138: Consider adding property value validation.

While the code filters properties appropriately, consider adding validation for property values before they're used in the API calls to prevent potential injection or data integrity issues.

@michelle0927
Copy link
Collaborator Author

/approve

@michelle0927 michelle0927 merged commit 0d5d83c into master Dec 18, 2024
11 checks passed
@michelle0927 michelle0927 deleted the issue-14913 branch December 18, 2024 15:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BUG] Hubspot actions can't be configured with end user auth
2 participants