-
Couldn't load subscription status.
- Fork 5.5k
[Components] finerworks #10976 #18830
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
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| import app from "../../finerworks.app.mjs"; | ||
|
|
||
| export default { | ||
| key: "finerworks-get-prices", | ||
| name: "Get Prices", | ||
| description: "Get the price of a product. [See the documentation](https://v2.api.finerworks.com/Help/Api/POST-v3-get_prices)", | ||
| version: "0.0.1", | ||
| annotations: { | ||
| destructiveHint: false, | ||
| openWorldHint: true, | ||
| readOnlyHint: true, | ||
| }, | ||
| type: "action", | ||
| props: { | ||
| app, | ||
| productSku: { | ||
| propDefinition: [ | ||
| app, | ||
| "productSku", | ||
| ], | ||
| }, | ||
| productQty: { | ||
| propDefinition: [ | ||
| app, | ||
| "productQty", | ||
| ], | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const response = await this.app.getPrices({ | ||
| $, | ||
| data: [ | ||
| { | ||
| product_qty: this.productQty, | ||
| product_sku: this.productSku, | ||
| }, | ||
| ], | ||
| }); | ||
| $.export("$summary", "Successfully sent the request"); | ||
| return response; | ||
| }, | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| import app from "../../finerworks.app.mjs"; | ||
|
|
||
| export default { | ||
| key: "finerworks-get-product-details", | ||
| name: "Get Product Details", | ||
| description: "Get details of a product. [See the documentation](https://v2.api.finerworks.com/Help/Api/POST-v3-get_product_details)", | ||
| version: "0.0.1", | ||
| annotations: { | ||
| destructiveHint: false, | ||
| openWorldHint: true, | ||
| readOnlyHint: true, | ||
| }, | ||
| type: "action", | ||
| props: { | ||
| app, | ||
| productSku: { | ||
| propDefinition: [ | ||
| app, | ||
| "productSku", | ||
| ], | ||
| }, | ||
| productQty: { | ||
| propDefinition: [ | ||
| app, | ||
| "productQty", | ||
| ], | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const response = await this.app.getProductDetails({ | ||
| $, | ||
| data: { | ||
| products: [ | ||
| { | ||
| product_sku: this.productSku, | ||
| product_qty: this.productQty, | ||
| }, | ||
| ], | ||
| }, | ||
| }); | ||
| $.export("$summary", "Successfully sent the request to get details of the specified product"); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here, summary usually describes the action being performed (a request being sent is implied and is usually not part of the summary) |
||
| return response; | ||
| }, | ||
| }; | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,105 @@ | ||||||
| import app from "../../finerworks.app.mjs"; | ||||||
|
|
||||||
| export default { | ||||||
| key: "finerworks-validate-address", | ||||||
| name: "Validate Address", | ||||||
| description: "Validate an address. [See the documentation](https://v2.api.finerworks.com/Help/Api/POST-v3-validate_recipient_address)", | ||||||
| version: "0.0.1", | ||||||
| annotations: { | ||||||
| destructiveHint: false, | ||||||
| openWorldHint: true, | ||||||
| readOnlyHint: true, | ||||||
| }, | ||||||
| type: "action", | ||||||
| props: { | ||||||
| app, | ||||||
| firstName: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "firstName", | ||||||
| ], | ||||||
| }, | ||||||
| lastName: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "lastName", | ||||||
| ], | ||||||
| }, | ||||||
| companyName: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "companyName", | ||||||
| ], | ||||||
| }, | ||||||
| address: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "address", | ||||||
| ], | ||||||
| }, | ||||||
| city: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "city", | ||||||
| ], | ||||||
| }, | ||||||
| stateCode: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "stateCode", | ||||||
| ], | ||||||
| }, | ||||||
| province: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "province", | ||||||
| ], | ||||||
| }, | ||||||
| zipPostalCode: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "zipPostalCode", | ||||||
| ], | ||||||
| }, | ||||||
| countryCode: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "countryCode", | ||||||
| ], | ||||||
| }, | ||||||
| phone: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "phone", | ||||||
| ], | ||||||
| }, | ||||||
| email: { | ||||||
| propDefinition: [ | ||||||
| app, | ||||||
| "email", | ||||||
| ], | ||||||
| }, | ||||||
| }, | ||||||
| async run({ $ }) { | ||||||
| const response = await this.app.validateAddress({ | ||||||
| $, | ||||||
| data: { | ||||||
| recipient: { | ||||||
| first_name: this.firstName, | ||||||
| last_name: this.lastName, | ||||||
| company_name: this.companyName, | ||||||
| address_1: this.address, | ||||||
| city: this.city, | ||||||
| state_code: this.stateCode, | ||||||
| province: this.province, | ||||||
| zip_postal_code: this.zipPostalCode, | ||||||
| country_code: this.countryCode, | ||||||
| phone: this.phone, | ||||||
| email: this.email, | ||||||
| }, | ||||||
| }, | ||||||
| }); | ||||||
| $.export("$summary", "Successfully sent the request. Validation success: " + response.status.success); | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Guard against undefined response.status.success. The summary message directly concatenates Consider using optional chaining and a fallback: - $.export("$summary", "Successfully sent the request. Validation success: " + response.status.success);
+ $.export("$summary", `Successfully sent the request. Validation success: ${response.status?.success ?? 'unknown'}`);📝 Committable suggestion
Suggested change
🤖 Prompt for AI AgentsThere was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same for this summary (also worth checking CodeRabbit's comment) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: Length of output: 247 @GTFalcao, I checked all the summary messages in this PR. The good news is that get-prices.mjs and get-product-details.mjs are already using safe static strings for their summaries, so they don't have the same issue. Only validate-address.mjs has the unsafe property access problem that CodeRabbit flagged. You should apply the fix here using optional chaining and a template literal: $.export("$summary", `Successfully sent the request. Validation success: ${response.status?.success ?? 'unknown'}`);Alternatively, if you want to make it more robust and user-friendly, you could use: $.export("$summary", `Address validation ${response.status?.success ? 'succeeded' : 'failed'}`);This would give a clearer message about whether the validation actually passed or not. 🧠 Learnings used |
||||||
| return response; | ||||||
| }, | ||||||
| }; | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,140 @@ | ||
| import { axios } from "@pipedream/platform"; | ||
|
|
||
| export default { | ||
| type: "app", | ||
| app: "finerworks", | ||
| propDefinitions: {}, | ||
| propDefinitions: { | ||
| firstName: { | ||
| type: "string", | ||
| label: "First Name", | ||
| description: "Recipient first name", | ||
| }, | ||
| lastName: { | ||
| type: "string", | ||
| label: "Last Name", | ||
| description: "Recipient last name", | ||
| }, | ||
| companyName: { | ||
| type: "string", | ||
| label: "Company Name", | ||
| description: "Recipient company name", | ||
| optional: true, | ||
| }, | ||
| address: { | ||
| type: "string", | ||
| label: "Address", | ||
| description: "Street address for the recipient", | ||
| }, | ||
| city: { | ||
| type: "string", | ||
| label: "City", | ||
| description: "Recipient city", | ||
| optional: true, | ||
| }, | ||
| stateCode: { | ||
| type: "string", | ||
| label: "State Code", | ||
| description: "Required if in U.S. A valid USPS recognized 2 digit state code, i.e.: `CA`", | ||
| optional: true, | ||
| }, | ||
| province: { | ||
| type: "string", | ||
| label: "Province", | ||
| description: "Province or region name", | ||
| optional: true, | ||
| }, | ||
| zipPostalCode: { | ||
| type: "string", | ||
| label: "ZIP or Postal Code", | ||
| description: "ZIP or postal code of the recipient", | ||
| }, | ||
| countryCode: { | ||
| type: "string", | ||
| label: "Country Code", | ||
| description: "Two-letter ISO country code, e.g.: `US`, `CA`, `GB`", | ||
| }, | ||
| phone: { | ||
| type: "string", | ||
| label: "Phone", | ||
| description: "Recipient phone number", | ||
| optional: true, | ||
| }, | ||
| email: { | ||
| type: "string", | ||
| label: "Email", | ||
| description: "Recipient email address", | ||
| optional: true, | ||
| }, | ||
| productQty: { | ||
| type: "integer", | ||
| label: "Product Quantity", | ||
| description: "Quantity of the product", | ||
| }, | ||
| productSku: { | ||
| type: "string", | ||
| label: "Product SKU", | ||
| description: "SKU identifier of the product", | ||
| async options() { | ||
| const response = await this.getProducts(); | ||
| const products = response.products; | ||
| return products.map(({ | ||
| sku, name, | ||
| }) => ({ | ||
| label: name, | ||
| value: sku, | ||
| })); | ||
| }, | ||
| }, | ||
| }, | ||
| methods: { | ||
| // this.$auth contains connected account data | ||
| authKeys() { | ||
| console.log(Object.keys(this.$auth)); | ||
| _baseUrl() { | ||
| return "https://v2.api.finerworks.com/v3"; | ||
| }, | ||
| async _makeRequest(opts = {}) { | ||
| const { | ||
| $ = this, | ||
| path, | ||
| headers, | ||
| ...otherOpts | ||
| } = opts; | ||
| return axios($, { | ||
| ...otherOpts, | ||
| url: this._baseUrl() + path, | ||
| headers: { | ||
| "web_api_key": `${this.$auth.web_api_key}`, | ||
| "app_key": `${this.$auth.app_key}`, | ||
| ...headers, | ||
| }, | ||
| }); | ||
| }, | ||
| async validateAddress(args = {}) { | ||
| return this._makeRequest({ | ||
| path: "/validate_recipient_address", | ||
| method: "post", | ||
| ...args, | ||
| }); | ||
| }, | ||
| async getPrices(args = {}) { | ||
| return this._makeRequest({ | ||
| path: "/get_prices", | ||
| method: "post", | ||
| ...args, | ||
| }); | ||
| }, | ||
| async getProductDetails(args = {}) { | ||
| return this._makeRequest({ | ||
| path: "/get_product_details", | ||
| method: "post", | ||
| ...args, | ||
| }); | ||
| }, | ||
| async getProducts(args = {}) { | ||
| return this._makeRequest({ | ||
| path: "/list_virtual_inventory", | ||
| method: "post", | ||
| data: {}, | ||
| ...args, | ||
| }); | ||
| }, | ||
| }, | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| { | ||
| "name": "@pipedream/finerworks", | ||
| "version": "0.0.1", | ||
| "version": "0.1.0", | ||
| "description": "Pipedream FinerWorks Components", | ||
| "main": "finerworks.app.mjs", | ||
| "keywords": [ | ||
|
|
@@ -11,5 +11,8 @@ | |
| "author": "Pipedream <[email protected]> (https://pipedream.com/)", | ||
| "publishConfig": { | ||
| "access": "public" | ||
| }, | ||
| "dependencies": { | ||
| "@pipedream/platform": "^3.1.0" | ||
| } | ||
| } | ||
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.
Summary is a bit odd - does the action not return the prices immediately?