From f45ab813cf619c7d81ce2e495d7b2260eea0771d Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 18:57:11 +0545 Subject: [PATCH 1/8] fix: Refactor to use the gem implementation convention --- .gitignore | 1 + lib/merge_ruby_client.rb | 4 +- lib/merge_ruby_client/integrations/client.rb | 103 ++++++----------- .../integrations/provider/client.rb | 86 ++++++++++++++ .../integrations/types/integration.rb | 105 ------------------ lib/types_export.rb | 2 +- 6 files changed, 122 insertions(+), 179 deletions(-) create mode 100644 lib/merge_ruby_client/integrations/provider/client.rb delete mode 100644 lib/merge_ruby_client/integrations/types/integration.rb diff --git a/.gitignore b/.gitignore index a97c182a..ec2a65ce 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /tmp/ *.gem .env +.Idea/ diff --git a/lib/merge_ruby_client.rb b/lib/merge_ruby_client.rb index 88a3cc09..71847f09 100644 --- a/lib/merge_ruby_client.rb +++ b/lib/merge_ruby_client.rb @@ -51,7 +51,7 @@ def initialize(api_key:, base_url: nil, environment: Merge::Environment::PRODUCT @filestorage = Merge::Filestorage::Client.new(request_client: @request_client) @ticketing = Merge::Ticketing::Client.new(request_client: @request_client) @accounting = Merge::Accounting::Client.new(request_client: @request_client) - @integrations = Merge::IntegrationClient.new(request_client: @request_client) + @integrations = Merge::Integrations::Client.new(request_client: @request_client) end end @@ -94,7 +94,7 @@ def initialize(api_key:, base_url: nil, environment: Merge::Environment::PRODUCT @filestorage = Merge::Filestorage::AsyncClient.new(request_client: @async_request_client) @ticketing = Merge::Ticketing::AsyncClient.new(request_client: @async_request_client) @accounting = Merge::Accounting::AsyncClient.new(request_client: @async_request_client) - @integrations = Merge::IntegrationClient.new(request_client: @async_request_client) + @integrations = Merge::Integrations::AsyncClient.new(request_client: @async_request_client) end end end diff --git a/lib/merge_ruby_client/integrations/client.rb b/lib/merge_ruby_client/integrations/client.rb index 55d8ea89..c2da3518 100644 --- a/lib/merge_ruby_client/integrations/client.rb +++ b/lib/merge_ruby_client/integrations/client.rb @@ -1,82 +1,43 @@ # frozen_string_literal: true require_relative "../../requests" -require_relative "types/integration" - -# client = Merge::Basics::IntegrationClient::Client.new(request_client: request_client) -# integrations = client.list +require_relative "provider/client" +require_relative "link_token/client" +require_relative "account_token/client" module Merge - class IntegrationClient - # @param request_client [Merge::RequestClient] - # @return [Merge::Basics::IntegrationClient::Client] - def initialize(request_client:) - @request_client = request_client - end - - # Returns a list of all integrations available in Merge - # - # @param request_options [Merge::RequestOptions] - # @return [Array] List of integrations with their metadata - def list(request_options: nil) - response = @request_client.conn.get do |req| - req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? - req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? - req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? - req.headers = { - **(req.headers || {}), - **@request_client.get_headers, - **(request_options&.additional_headers || {}) - }.compact - unless request_options.nil? || request_options&.additional_query_parameters.nil? - req.params = { **(request_options&.additional_query_parameters || {}) }.compact - end - unless request_options.nil? || request_options&.additional_body_parameters.nil? - req.body = { **(request_options&.additional_body_parameters || {}) }.compact - end - req.url "#{@request_client.get_url(request_options: request_options)}/organizations/integrations" - end - - JSON.parse(response.body)["results"].map do |integration| - Merge::Integration.from_json(json_object: integration.to_json) + module Integrations + class Client + # @return [Merge::Integrations::ProviderClient] + attr_reader :provider + # @return [Merge::Integrations::LinkTokenClient] + attr_reader :link_token + # @return [Merge::Integrations::AccountTokenClient] + attr_reader :account_token + + # @param request_client [Merge::RequestClient] + # @return [Merge::Integrations::Client] + def initialize(request_client:) + @provider = Merge::Integrations::ProviderClient.new(request_client: request_client) + @link_token = Merge::Integrations::LinkTokenClient.new(request_client: request_client) + @account_token = Merge::Integrations::AccountTokenClient.new(request_client: request_client) end end - end - - class AsyncIntegrationClient - # @param request_client [Merge::AsyncRequestClient] - # @return [Merge::Basics::IntegrationClient::AsyncClient] - def initialize(request_client:) - @request_client = request_client - end - - # Returns a list of all integrations available in Merge - # - # @param request_options [Merge::RequestOptions] - # @return [Array] List of integrations with their metadata - def list(request_options: nil) - Async do - response = @request_client.conn.get do |req| - req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? - req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? - req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? - req.headers = { - **(req.headers || {}), - **@request_client.get_headers, - **(request_options&.additional_headers || {}) - }.compact - unless request_options.nil? || request_options&.additional_query_parameters.nil? - req.params = { **(request_options&.additional_query_parameters || {}) }.compact - end - unless request_options.nil? || request_options&.additional_body_parameters.nil? - req.body = { **(request_options&.additional_body_parameters || {}) }.compact - end - req.url "#{@request_client.get_url(request_options: request_options)}/organizations/integrations" - end - JSON.parse(response.body)["results"].map do |integration| - Merge::Basics::Integration.from_json(json_object: integration.to_json) - end + class AsyncClient + # @return [Merge::Integrations::AsyncProviderClient] + attr_reader :provider + # @return [Merge::Integrations::AsyncLinkTokenClient] + attr_reader :link_token + # @return [Merge::Integrations::AsyncAccountTokenClient] + attr_reader :account_token + + # @param request_client [Merge::RequestClient] + # @return [Merge::Integrations::Client] + def initialize(request_client:) + @provider = Merge::Integrations::AsyncProviderClient.new(request_client: request_client) + @link_token = Merge::Integrations::AsyncLinkTokenClient.new(request_client: request_client) + @account_token = Merge::Integrations::AccountTokenClient.new(request_client: request_client) end end end diff --git a/lib/merge_ruby_client/integrations/provider/client.rb b/lib/merge_ruby_client/integrations/provider/client.rb new file mode 100644 index 00000000..9fc24a8d --- /dev/null +++ b/lib/merge_ruby_client/integrations/provider/client.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require_relative "../../../requests" +require_relative "../types/provider" + +# client = Merge::Basics::IntegrationClient::Client.new(request_client: request_client) +# integrations = client.list + +module Merge + module Integrations + class ProviderClient + # @param request_client [Merge::RequestClient] + # @return [Merge::Basics::IntegrationClient::Client] + def initialize(request_client:) + @request_client = request_client + end + + # Returns a list of all integrations available in Merge + # + # @param request_options [Merge::RequestOptions] + # @return [Array] List of integrations with their metadata + def list(request_options: nil) + response = @request_client.conn.get do |req| + req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + unless request_options.nil? || request_options&.additional_query_parameters.nil? + req.params = { **(request_options&.additional_query_parameters || {}) }.compact + end + unless request_options.nil? || request_options&.additional_body_parameters.nil? + req.body = { **(request_options&.additional_body_parameters || {}) }.compact + end + req.url "#{@request_client.get_url(request_options: request_options)}/organizations/integrations" + end + + JSON.parse(response.body)["results"].map do |integration| + Merge::Integrations::Provider.from_json(json_object: integration.to_json) + end + end + end + + class AsyncProviderClient + # @param request_client [Merge::AsyncRequestClient] + # @return [Merge::Basics::IntegrationClient::AsyncClient] + def initialize(request_client:) + @request_client = request_client + end + + # Returns a list of all integrations available in Merge + # + # @param request_options [Merge::RequestOptions] + # @return [Array] List of integrations with their metadata + def list(request_options: nil) + Async do + response = @request_client.conn.get do |req| + req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + unless request_options.nil? || request_options&.additional_query_parameters.nil? + req.params = { **(request_options&.additional_query_parameters || {}) }.compact + end + unless request_options.nil? || request_options&.additional_body_parameters.nil? + req.body = { **(request_options&.additional_body_parameters || {}) }.compact + end + req.url "#{@request_client.get_url(request_options: request_options)}/organizations/integrations" + end + + JSON.parse(response.body)["results"].map do |integration| + Merge::Integrations::Provider.from_json(json_object: integration.to_json) + end + end + end + end + end +end + diff --git a/lib/merge_ruby_client/integrations/types/integration.rb b/lib/merge_ruby_client/integrations/types/integration.rb deleted file mode 100644 index 89a473b8..00000000 --- a/lib/merge_ruby_client/integrations/types/integration.rb +++ /dev/null @@ -1,105 +0,0 @@ -# frozen_string_literal: true - -require "date" -require "ostruct" -require "json" - -module Merge - class Integration - # @return [String] - attr_reader :name - # @return [String] - attr_reader :slug - # @return [String] - attr_reader :image - # @return [String] - attr_reader :square_image - # @return [String] - attr_reader :color - # @return [Array] - attr_reader :categories - # @return [Array] - attr_reader :enabled_categories - # @return [OpenStruct] Additional properties unmapped to the current class definition - attr_reader :additional_properties - # @return [Object] - attr_reader :_field_set - protected :_field_set - - OMIT = Object.new - - # @param name [String] - # @param slug [String] - # @param image [String] - # @param square_image [String] - # @param color [String] - # @param categories [Array] - # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition - # @return [Merge::Basics::Integration] - def initialize(name: OMIT, slug: OMIT, image: OMIT, square_image: OMIT, color: OMIT, categories: OMIT, enabled_categories: OMIT, additional_properties: nil) - @name = name if name != OMIT - @slug = slug if slug != OMIT - @image = image if image != OMIT - @square_image = square_image if square_image != OMIT - @color = color if color != OMIT - @categories = categories if categories != OMIT - @enabled_categories = enabled_categories if enabled_categories != OMIT - @additional_properties = additional_properties - @_field_set = { - "name": name, - "slug": slug, - "image": image, - "square_image": square_image, - "color": color, - "categories": categories, - "enabled_categories": enabled_categories - }.reject do |_k, v| - v == OMIT - end - end - - # Deserialize a JSON object to an instance of Integration - # - # @param json_object [String] - # @return [Merge::Basics::Integration] - def self.from_json(json_object:) - struct = JSON.parse(json_object, object_class: OpenStruct) - parsed_json = JSON.parse(json_object) - name = parsed_json["name"] - slug = parsed_json["slug"] - image = parsed_json["image"] - square_image = parsed_json["square_image"] - color = parsed_json["color"] - categories = parsed_json["categories"] - enabled_categories = parsed_json["enabled_categories"] - additional_properties = struct.to_h.reject { |k, _| %w[name slug image square_image color categories].include?(k) } - new( - name: name, - slug: slug, - image: image, - square_image: square_image, - color: color, - categories: categories, - enabled_categories: enabled_categories, - additional_properties: OpenStruct.new(additional_properties) - ) - end - - # Serialize an instance of Integration to a JSON object - # - # @return [String] - def to_json(*_args) - @_field_set&.to_json - end - - # Leveraged for Union-type generation, validate_raw attempts to parse the given - # hash and check each fields type against the current object's property - # definitions. - # - # @param obj [Object] - # @return [Void] - def self.validate_raw(obj:) - # TODO: Implement validation - end - end -end diff --git a/lib/types_export.rb b/lib/types_export.rb index 5d434c1b..aa6eb7a7 100644 --- a/lib/types_export.rb +++ b/lib/types_export.rb @@ -1297,4 +1297,4 @@ require_relative "merge_ruby_client/accounting/types/vendor_credit_response" require_relative "merge_ruby_client/accounting/types/warning_validation_problem" require_relative "merge_ruby_client/accounting/types/webhook_receiver" -require_relative "merge_ruby_client/integrations/types/integration" +require_relative "merge_ruby_client/integrations/types/provider" From 4d0587e773d0f946729c5dc5fd6871525c3bc676 Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 18:59:14 +0545 Subject: [PATCH 2/8] feat: Implement link_token for merge integrations to the gem --- .../integrations/link_token/client.rb | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 lib/merge_ruby_client/integrations/link_token/client.rb diff --git a/lib/merge_ruby_client/integrations/link_token/client.rb b/lib/merge_ruby_client/integrations/link_token/client.rb new file mode 100644 index 00000000..44f50965 --- /dev/null +++ b/lib/merge_ruby_client/integrations/link_token/client.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +require_relative "../../../requests" +require_relative "../types/link_token" + +module Merge + module Integrations + class LinkTokenClient + # @return [Merge::RequestClient] + attr_reader :request_client + + # @param request_client [Merge::RequestClient] + # @return [Merge::Integrations::LinkTokenClient] + def initialize(request_client:) + @request_client = request_client + end + + # Creates a link token to be used when linking a new end user. + # + # @param end_user_email_address [String] Your end user's email address. + # @param end_user_organization_name [String] Your end user's organization name. + # @param end_user_origin_id [String] A unique identifier for your end user. + # @param categories [Array] The integration categories to show in Merge Link. + # @param integration [String, nil] The slug of a specific pre-selected integration. + # @param link_expiry_mins [Integer, nil] The number of minutes the token is valid. + # @param should_create_magic_link_url [Boolean, nil] Whether to generate a Magic Link URL. + # @param request_options [Merge::RequestOptions, nil] + # @return [Merge::Integrations::LinkToken] + def create(end_user_email_address:, end_user_organization_name:, end_user_origin_id:, categories:, + integration: nil, link_expiry_mins: nil, should_create_magic_link_url: nil, request_options: nil) + response = @request_client.conn.post do |req| + req.options.timeout = request_options&.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options&.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options&.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + + req.body = { + end_user_email_address: end_user_email_address, + end_user_organization_name: end_user_organization_name, + end_user_origin_id: end_user_origin_id, + categories: categories, + integration: integration, + link_expiry_mins: link_expiry_mins, + should_create_magic_link_url: should_create_magic_link_url, + }.compact + req.url "#{@request_client.get_url(request_options: request_options)}/integrations/create-link-token" + end + + Merge::Integrations::LinkToken.from_json(json_object: response.body) + end + end + + class AsyncLinkTokenClient + # @return [Merge::RequestClient] + attr_reader :request_client + + # @param request_client [Merge::RequestClient] + # @return [Merge::Integrations::LinkTokenClient] + def initialize(request_client:) + @request_client = request_client + end + + # Creates a link token to be used when linking a new end user. + # + # @param end_user_email_address [String] Your end user's email address. + # @param end_user_organization_name [String] Your end user's organization name. + # @param end_user_origin_id [String] A unique identifier for your end user. + # @param categories [Array] The integration categories to show in Merge Link. + # @param integration [String, nil] The slug of a specific pre-selected integration. + # @param link_expiry_mins [Integer, nil] The number of minutes the token is valid. + # @param should_create_magic_link_url [Boolean, nil] Whether to generate a Magic Link URL. + # @param request_options [Merge::RequestOptions, nil] + # @return [Merge::Integrations::LinkToken] + def create(end_user_email_address:, end_user_organization_name:, end_user_origin_id:, categories:, + integration: nil, link_expiry_mins: nil, should_create_magic_link_url: nil, request_options: nil) + response = @request_client.conn.post do |req| + req.options.timeout = request_options&.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options&.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options&.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + + req.body = { + end_user_email_address: end_user_email_address, + end_user_organization_name: end_user_organization_name, + end_user_origin_id: end_user_origin_id, + categories: categories, + integration: integration, + link_expiry_mins: link_expiry_mins, + should_create_magic_link_url: should_create_magic_link_url, + }.compact + + req.url "#{@request_client.get_url(request_options: request_options)}/integrations/create-link-token" + end + + Merge::Integrations::LinkToken.from_json(json_object: response.body) + end + end + end +end From be8ac3f799561e12441da83c324356eb38318a13 Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 18:59:32 +0545 Subject: [PATCH 3/8] feat: Implement account_token for merge integration to the gem --- .../integrations/account_token/client.rb | 100 ++++++++++++++++ .../integrations/types/account_token.rb | 79 +++++++++++++ .../integrations/types/link_token.rb | 80 +++++++++++++ .../integrations/types/provider.rb | 107 ++++++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 lib/merge_ruby_client/integrations/account_token/client.rb create mode 100644 lib/merge_ruby_client/integrations/types/account_token.rb create mode 100644 lib/merge_ruby_client/integrations/types/link_token.rb create mode 100644 lib/merge_ruby_client/integrations/types/provider.rb diff --git a/lib/merge_ruby_client/integrations/account_token/client.rb b/lib/merge_ruby_client/integrations/account_token/client.rb new file mode 100644 index 00000000..ee7561f9 --- /dev/null +++ b/lib/merge_ruby_client/integrations/account_token/client.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +require_relative "../../../requests" +require_relative "../types/account_token" +require "async" + +module Merge + module Integrations + class AccountTokenClient + # @return [Merge::RequestClient] + attr_reader :request_client + + # @param request_client [Merge::RequestClient] + # @return [Merge::Integrations::AccountTokenClient] + def initialize(request_client:) + @request_client = request_client + end + + # Returns the account token for the end user with the provided public token. + # + # @param public_token [String] + # @param request_options [Merge::RequestOptions] + # @return [Merge::Integrations::AccountToken] + # @example + # api = Merge::Client.new( + # base_url: "https://api.example.com", + # environment: Merge::Environment::PRODUCTION, + # api_key: "YOUR_AUTH_TOKEN" + # ) + # api.integrations.account_token.retrieve(public_token: "public_token") + def retrieve(public_token:, request_options: nil) + response = @request_client.conn.get do |req| + req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + unless request_options.nil? || request_options&.additional_query_parameters.nil? + req.params = { **(request_options&.additional_query_parameters || {}) }.compact + end + unless request_options.nil? || request_options&.additional_body_parameters.nil? + req.body = { **(request_options&.additional_body_parameters || {}) }.compact + end + req.url "#{@request_client.get_url(request_options: request_options)}/integrations/account-token/#{public_token}" + end + + Merge::Integrations::AccountToken.from_json(json_object: response.body) + end + end + + class AsyncAccountTokenClient + # @return [Merge::AsyncRequestClient] + attr_reader :request_client + + # @param request_client [Merge::AsyncRequestClient] + # @return [Merge::Integrations::AsyncAccountTokenClient] + def initialize(request_client:) + @request_client = request_client + end + + # Returns the account token for the end user with the provided public token. + # + # @param public_token [String] + # @param request_options [Merge::RequestOptions] + # @return [Merge::Integrations::AccountToken] + # @example + # api = Merge::Client.new( + # base_url: "https://api.example.com", + # environment: Merge::Environment::PRODUCTION, + # api_key: "YOUR_AUTH_TOKEN" + # ) + # api.Integrations.account_token.retrieve(public_token: "public_token") + def retrieve(public_token:, request_options: nil) + Async do + response = @request_client.conn.get do |req| + req.options.timeout = request_options.timeout_in_seconds unless request_options&.timeout_in_seconds.nil? + req.headers["Authorization"] = request_options.api_key unless request_options&.api_key.nil? + req.headers["X-Account-Token"] = request_options.account_token unless request_options&.account_token.nil? + req.headers = { + **(req.headers || {}), + **@request_client.get_headers, + **(request_options&.additional_headers || {}) + }.compact + unless request_options.nil? || request_options&.additional_query_parameters.nil? + req.params = { **(request_options&.additional_query_parameters || {}) }.compact + end + unless request_options.nil? || request_options&.additional_body_parameters.nil? + req.body = { **(request_options&.additional_body_parameters || {}) }.compact + end + req.url "#{@request_client.get_url(request_options: request_options)}/Integrations/v1/account-token/#{public_token}" + end + Merge::Integrations::AccountToken.from_json(json_object: response.body) + end + end + end + end +end diff --git a/lib/merge_ruby_client/integrations/types/account_token.rb b/lib/merge_ruby_client/integrations/types/account_token.rb new file mode 100644 index 00000000..1d7b55f9 --- /dev/null +++ b/lib/merge_ruby_client/integrations/types/account_token.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +require "ostruct" +require "json" + +module Merge + module Integrations + class AccountToken + # @return [String] + attr_reader :account_token + # @return [Merge::Integrations::AccountIntegration] + attr_reader :integration + # @return [String] + attr_reader :id + # @return [OpenStruct] Additional properties unmapped to the current class definition + attr_reader :additional_properties + # @return [Object] + attr_reader :_field_set + protected :_field_set + + OMIT = Object.new + + # @param account_token [String] + # @param integration [Merge::Integrations::AccountIntegration] + # @param id [String] + # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition + # @return [Merge::Integrations::AccountToken] + def initialize(account_token:, integration:, id:, additional_properties: nil) + @account_token = account_token + @integration = integration + @id = id + @additional_properties = additional_properties + @_field_set = { "account_token": account_token, "integration": integration, "id": id } + end + + # Deserialize a JSON object to an instance of AccountToken + # + # @param json_object [String] + # @return [Merge::Integrations::AccountToken] + def self.from_json(json_object:) + struct = JSON.parse(json_object, object_class: OpenStruct) + parsed_json = JSON.parse(json_object) + account_token = parsed_json["account_token"] + if parsed_json["integration"].nil? + integration = nil + else + integration = parsed_json["integration"].to_json + integration = Merge::Integrations::AccountIntegration.from_json(json_object: integration) + end + id = parsed_json["id"] + new( + account_token: account_token, + integration: integration, + id: id, + additional_properties: struct + ) + end + + # Serialize an instance of AccountToken to a JSON object + # + # @return [String] + def to_json(*_args) + @_field_set&.to_json + end + + # Leveraged for Union-type generation, validate_raw attempts to parse the given + # hash and check each fields type against the current object's property + # definitions. + # + # @param obj [Object] + # @return [Void] + def self.validate_raw(obj:) + obj.account_token.is_a?(String) != false || raise("Passed value for field obj.account_token is not the expected type, validation failed.") + Merge::Integrations::AccountIntegration.validate_raw(obj: obj.integration) + obj.id.is_a?(String) != false || raise("Passed value for field obj.id is not the expected type, validation failed.") + end + end + end +end diff --git a/lib/merge_ruby_client/integrations/types/link_token.rb b/lib/merge_ruby_client/integrations/types/link_token.rb new file mode 100644 index 00000000..1ced4122 --- /dev/null +++ b/lib/merge_ruby_client/integrations/types/link_token.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "ostruct" +require "json" + +module Merge + module Integrations + class LinkToken + # @return [String] + attr_reader :link_token + # @return [String] + attr_reader :integration_name + # @return [String] + attr_reader :magic_link_url + # @return [OpenStruct] Additional properties unmapped to the current class definition + attr_reader :additional_properties + # @return [Object] + attr_reader :_field_set + protected :_field_set + + OMIT = Object.new + + # @param link_token [String] + # @param integration_name [String] + # @param magic_link_url [String] + # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition + # @return [Merge::Integrations::LinkToken] + def initialize(link_token:, integration_name: OMIT, magic_link_url: OMIT, additional_properties: nil) + @link_token = link_token + @integration_name = integration_name if integration_name != OMIT + @magic_link_url = magic_link_url if magic_link_url != OMIT + @additional_properties = additional_properties + @_field_set = { + "link_token": link_token, + "integration_name": integration_name, + "magic_link_url": magic_link_url + }.reject do |_k, v| + v == OMIT + end + end + + # Deserialize a JSON object to an instance of LinkToken + # + # @param json_object [String] + # @return [Merge::Integrations::LinkToken] + def self.from_json(json_object:) + struct = JSON.parse(json_object, object_class: OpenStruct) + parsed_json = JSON.parse(json_object) + link_token = parsed_json["link_token"] + integration_name = parsed_json["integration_name"] + magic_link_url = parsed_json["magic_link_url"] + new( + link_token: link_token, + integration_name: integration_name, + magic_link_url: magic_link_url, + additional_properties: struct + ) + end + + # Serialize an instance of LinkToken to a JSON object + # + # @return [String] + def to_json(*_args) + @_field_set&.to_json + end + + # Leveraged for Union-type generation, validate_raw attempts to parse the given + # hash and check each fields type against the current object's property + # definitions. + # + # @param obj [Object] + # @return [Void] + def self.validate_raw(obj:) + obj.link_token.is_a?(String) != false || raise("Passed value for field obj.link_token is not the expected type, validation failed.") + obj.integration_name&.is_a?(String) != false || raise("Passed value for field obj.integration_name is not the expected type, validation failed.") + obj.magic_link_url&.is_a?(String) != false || raise("Passed value for field obj.magic_link_url is not the expected type, validation failed.") + end + end + end +end diff --git a/lib/merge_ruby_client/integrations/types/provider.rb b/lib/merge_ruby_client/integrations/types/provider.rb new file mode 100644 index 00000000..7f896985 --- /dev/null +++ b/lib/merge_ruby_client/integrations/types/provider.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +require "date" +require "ostruct" +require "json" + +module Merge + module Integrations + class Provider + # @return [String] + attr_reader :name + # @return [String] + attr_reader :slug + # @return [String] + attr_reader :image + # @return [String] + attr_reader :square_image + # @return [String] + attr_reader :color + # @return [Array] + attr_reader :categories + # @return [Array] + attr_reader :enabled_categories + # @return [OpenStruct] Additional properties unmapped to the current class definition + attr_reader :additional_properties + # @return [Object] + attr_reader :_field_set + protected :_field_set + + OMIT = Object.new + + # @param name [String] + # @param slug [String] + # @param image [String] + # @param square_image [String] + # @param color [String] + # @param categories [Array] + # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition + # @return [Merge::Basics::Integration] + def initialize(name: OMIT, slug: OMIT, image: OMIT, square_image: OMIT, color: OMIT, categories: OMIT, enabled_categories: OMIT, additional_properties: nil) + @name = name if name != OMIT + @slug = slug if slug != OMIT + @image = image if image != OMIT + @square_image = square_image if square_image != OMIT + @color = color if color != OMIT + @categories = categories if categories != OMIT + @enabled_categories = enabled_categories if enabled_categories != OMIT + @additional_properties = additional_properties + @_field_set = { + "name": name, + "slug": slug, + "image": image, + "square_image": square_image, + "color": color, + "categories": categories, + "enabled_categories": enabled_categories + }.reject do |_k, v| + v == OMIT + end + end + + # Deserialize a JSON object to an instance of Integration + # + # @param json_object [String] + # @return [Merge::Basics::Integration] + def self.from_json(json_object:) + struct = JSON.parse(json_object, object_class: OpenStruct) + parsed_json = JSON.parse(json_object) + name = parsed_json["name"] + slug = parsed_json["slug"] + image = parsed_json["image"] + square_image = parsed_json["square_image"] + color = parsed_json["color"] + categories = parsed_json["categories"] + enabled_categories = parsed_json["enabled_categories"] + additional_properties = struct.to_h.reject { |k, _| %w[name slug image square_image color categories].include?(k) } + new( + name: name, + slug: slug, + image: image, + square_image: square_image, + color: color, + categories: categories, + enabled_categories: enabled_categories, + additional_properties: OpenStruct.new(additional_properties) + ) + end + + # Serialize an instance of Integration to a JSON object + # + # @return [String] + def to_json(*_args) + @_field_set&.to_json + end + + # Leveraged for Union-type generation, validate_raw attempts to parse the given + # hash and check each fields type against the current object's property + # definitions. + # + # @param obj [Object] + # @return [Void] + def self.validate_raw(obj:) + # TODO: Implement validation + end + end + end +end From 3a002f1a61dc3fdbbf0b5ea7179bb39f62935c52 Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 19:37:39 +0545 Subject: [PATCH 4/8] Feat/fix: Implement the account_integration for account_token --- lib/merge_ruby_client/integrations/account_token/client.rb | 4 ++-- .../integrations/types/account_integration.rb | 0 lib/merge_ruby_client/integrations/types/categories_enum.rb | 0 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 lib/merge_ruby_client/integrations/types/account_integration.rb create mode 100644 lib/merge_ruby_client/integrations/types/categories_enum.rb diff --git a/lib/merge_ruby_client/integrations/account_token/client.rb b/lib/merge_ruby_client/integrations/account_token/client.rb index ee7561f9..d3e33acb 100644 --- a/lib/merge_ruby_client/integrations/account_token/client.rb +++ b/lib/merge_ruby_client/integrations/account_token/client.rb @@ -72,7 +72,7 @@ def initialize(request_client:) # environment: Merge::Environment::PRODUCTION, # api_key: "YOUR_AUTH_TOKEN" # ) - # api.Integrations.account_token.retrieve(public_token: "public_token") + # api.integrations.account_token.retrieve(public_token: "public_token") def retrieve(public_token:, request_options: nil) Async do response = @request_client.conn.get do |req| @@ -90,7 +90,7 @@ def retrieve(public_token:, request_options: nil) unless request_options.nil? || request_options&.additional_body_parameters.nil? req.body = { **(request_options&.additional_body_parameters || {}) }.compact end - req.url "#{@request_client.get_url(request_options: request_options)}/Integrations/v1/account-token/#{public_token}" + req.url "#{@request_client.get_url(request_options: request_options)}/integrations/account-token/#{public_token}" end Merge::Integrations::AccountToken.from_json(json_object: response.body) end diff --git a/lib/merge_ruby_client/integrations/types/account_integration.rb b/lib/merge_ruby_client/integrations/types/account_integration.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/merge_ruby_client/integrations/types/categories_enum.rb b/lib/merge_ruby_client/integrations/types/categories_enum.rb new file mode 100644 index 00000000..e69de29b From ce6d61ee3690d3460e61182633d055db84d3f634 Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 19:56:20 +0545 Subject: [PATCH 5/8] fix: Add missing code for integration and categories --- .../integrations/types/account_integration.rb | 158 ++++++++++++++++++ .../integrations/types/categories_enum.rb | 23 +++ 2 files changed, 181 insertions(+) diff --git a/lib/merge_ruby_client/integrations/types/account_integration.rb b/lib/merge_ruby_client/integrations/types/account_integration.rb index e69de29b..2a204439 100644 --- a/lib/merge_ruby_client/integrations/types/account_integration.rb +++ b/lib/merge_ruby_client/integrations/types/account_integration.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true + +require_relative "categories_enum" +require "ostruct" +require "json" + +module Merge + module Integrations + class AccountIntegration + # @return [String] Company name. + attr_reader :name + # @return [String] Optional. This shortened name appears in places with limited space, usually in + # conjunction with the platform's logo (e.g., Merge Link menu).

Example: + # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP + # SuccessFactors) + attr_reader :abbreviated_name + # @return [Array] Category or categories this integration belongs to. Multiple categories should + # be comma separated, i.e. [ats, integrations]. + attr_reader :categories + # @return [String] Company logo in rectangular shape. + attr_reader :image + # @return [String] Company logo in square shape. + attr_reader :square_image + # @return [String] The color of this integration used for buttons and text throughout the app and + # landing pages. Choose a darker, saturated color. + attr_reader :color + # @return [String] + attr_reader :slug + # @return [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': + # [['/common-model-scopes', + # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', + # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], + # 'POST': []} + attr_reader :api_endpoints_to_documentation_urls + # @return [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. + attr_reader :webhook_setup_guide_url + # @return [Hash{String => Object}] Category or categories this integration is in beta status for. + attr_reader :category_beta_status + # @return [OpenStruct] Additional properties unmapped to the current class definition + attr_reader :additional_properties + # @return [Object] + attr_reader :_field_set + protected :_field_set + + OMIT = Object.new + + # @param name [String] Company name. + # @param abbreviated_name [String] Optional. This shortened name appears in places with limited space, usually in + # conjunction with the platform's logo (e.g., Merge Link menu).

Example: + # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP + # SuccessFactors) + # @param categories [Array] Category or categories this integration belongs to. Multiple categories should + # be comma separated, i.e. [ats, integrations]. + # @param image [String] Company logo in rectangular shape. + # @param square_image [String] Company logo in square shape. + # @param color [String] The color of this integration used for buttons and text throughout the app and + # landing pages. Choose a darker, saturated color. + # @param slug [String] + # @param api_endpoints_to_documentation_urls [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': + # [['/common-model-scopes', + # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', + # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], + # 'POST': []} + # @param webhook_setup_guide_url [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. + # @param category_beta_status [Hash{String => Object}] Category or categories this integration is in beta status for. + # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition + # @return [Merge::Integrations::AccountIntegration] + def initialize(name:, abbreviated_name: OMIT, categories: OMIT, image: OMIT, square_image: OMIT, color: OMIT, + slug: OMIT, api_endpoints_to_documentation_urls: OMIT, webhook_setup_guide_url: OMIT, category_beta_status: OMIT, additional_properties: nil) + @name = name + @abbreviated_name = abbreviated_name if abbreviated_name != OMIT + @categories = categories if categories != OMIT + @image = image if image != OMIT + @square_image = square_image if square_image != OMIT + @color = color if color != OMIT + @slug = slug if slug != OMIT + if api_endpoints_to_documentation_urls != OMIT + @api_endpoints_to_documentation_urls = api_endpoints_to_documentation_urls + end + @webhook_setup_guide_url = webhook_setup_guide_url if webhook_setup_guide_url != OMIT + @category_beta_status = category_beta_status if category_beta_status != OMIT + @additional_properties = additional_properties + @_field_set = { + "name": name, + "abbreviated_name": abbreviated_name, + "categories": categories, + "image": image, + "square_image": square_image, + "color": color, + "slug": slug, + "api_endpoints_to_documentation_urls": api_endpoints_to_documentation_urls, + "webhook_setup_guide_url": webhook_setup_guide_url, + "category_beta_status": category_beta_status + }.reject do |_k, v| + v == OMIT + end + end + + # Deserialize a JSON object to an instance of AccountIntegration + # + # @param json_object [String] + # @return [Merge::Integrtions::AccountIntegration] + def self.from_json(json_object:) + struct = JSON.parse(json_object, object_class: OpenStruct) + parsed_json = JSON.parse(json_object) + name = parsed_json["name"] + abbreviated_name = parsed_json["abbreviated_name"] + categories = parsed_json["categories"] + image = parsed_json["image"] + square_image = parsed_json["square_image"] + color = parsed_json["color"] + slug = parsed_json["slug"] + api_endpoints_to_documentation_urls = parsed_json["api_endpoints_to_documentation_urls"] + webhook_setup_guide_url = parsed_json["webhook_setup_guide_url"] + category_beta_status = parsed_json["category_beta_status"] + new( + name: name, + abbreviated_name: abbreviated_name, + categories: categories, + image: image, + square_image: square_image, + color: color, + slug: slug, + api_endpoints_to_documentation_urls: api_endpoints_to_documentation_urls, + webhook_setup_guide_url: webhook_setup_guide_url, + category_beta_status: category_beta_status, + additional_properties: struct + ) + end + + # Serialize an instance of AccountIntegration to a JSON object + # + # @return [String] + def to_json(*_args) + @_field_set&.to_json + end + + # Leveraged for Union-type generation, validate_raw attempts to parse the given + # hash and check each fields type against the current object's property + # definitions. + # + # @param obj [Object] + # @return [Void] + def self.validate_raw(obj:) + obj.name.is_a?(String) != false || raise("Passed value for field obj.name is not the expected type, validation failed.") + obj.abbreviated_name&.is_a?(String) != false || raise("Passed value for field obj.abbreviated_name is not the expected type, validation failed.") + obj.categories&.is_a?(Array) != false || raise("Passed value for field obj.categories is not the expected type, validation failed.") + obj.image&.is_a?(String) != false || raise("Passed value for field obj.image is not the expected type, validation failed.") + obj.square_image&.is_a?(String) != false || raise("Passed value for field obj.square_image is not the expected type, validation failed.") + obj.color&.is_a?(String) != false || raise("Passed value for field obj.color is not the expected type, validation failed.") + obj.slug&.is_a?(String) != false || raise("Passed value for field obj.slug is not the expected type, validation failed.") + obj.api_endpoints_to_documentation_urls&.is_a?(Hash) != false || raise("Passed value for field obj.api_endpoints_to_documentation_urls is not the expected type, validation failed.") + obj.webhook_setup_guide_url&.is_a?(String) != false || raise("Passed value for field obj.webhook_setup_guide_url is not the expected type, validation failed.") + obj.category_beta_status&.is_a?(Hash) != false || raise("Passed value for field obj.category_beta_status is not the expected type, validation failed.") + end + end + end +end diff --git a/lib/merge_ruby_client/integrations/types/categories_enum.rb b/lib/merge_ruby_client/integrations/types/categories_enum.rb index e69de29b..f7f5dd4d 100644 --- a/lib/merge_ruby_client/integrations/types/categories_enum.rb +++ b/lib/merge_ruby_client/integrations/types/categories_enum.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Merge + module Accounting + # * `hris` - hris + # * `ats` - ats + # * `accounting` - accounting + # * `ticketing` - ticketing + # * `crm` - crm + # * `mktg` - mktg + # * `filestorage` - filestorage + class CategoriesEnum + HRIS = "hris" + ATS = "ats" + ACCOUNTING = "accounting" + TICKETING = "ticketing" + CRM = "crm" + MKTG = "mktg" + FILESTORAGE = "filestorage" + INTEGRATIONS = "integrations" + end + end +end From 1737a6b70daf976fbebf3aedfb45d7c40718a42a Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Tue, 29 Apr 2025 20:13:12 +0545 Subject: [PATCH 6/8] Revert "fix: Add missing code for integration and categories" This reverts commit ce6d61ee3690d3460e61182633d055db84d3f634. --- lib/merge_ruby_client/integrations/client.rb | 2 +- .../integrations/types/account_integration.rb | 158 ------------------ .../integrations/types/account_token.rb | 5 +- .../integrations/types/categories_enum.rb | 23 --- 4 files changed, 4 insertions(+), 184 deletions(-) delete mode 100644 lib/merge_ruby_client/integrations/types/account_integration.rb delete mode 100644 lib/merge_ruby_client/integrations/types/categories_enum.rb diff --git a/lib/merge_ruby_client/integrations/client.rb b/lib/merge_ruby_client/integrations/client.rb index c2da3518..dde99921 100644 --- a/lib/merge_ruby_client/integrations/client.rb +++ b/lib/merge_ruby_client/integrations/client.rb @@ -37,7 +37,7 @@ class AsyncClient def initialize(request_client:) @provider = Merge::Integrations::AsyncProviderClient.new(request_client: request_client) @link_token = Merge::Integrations::AsyncLinkTokenClient.new(request_client: request_client) - @account_token = Merge::Integrations::AccountTokenClient.new(request_client: request_client) + @account_token = Merge::Integrations::AsyncAccountTokenClient.new(request_client: request_client) end end end diff --git a/lib/merge_ruby_client/integrations/types/account_integration.rb b/lib/merge_ruby_client/integrations/types/account_integration.rb deleted file mode 100644 index 2a204439..00000000 --- a/lib/merge_ruby_client/integrations/types/account_integration.rb +++ /dev/null @@ -1,158 +0,0 @@ -# frozen_string_literal: true - -require_relative "categories_enum" -require "ostruct" -require "json" - -module Merge - module Integrations - class AccountIntegration - # @return [String] Company name. - attr_reader :name - # @return [String] Optional. This shortened name appears in places with limited space, usually in - # conjunction with the platform's logo (e.g., Merge Link menu).

Example: - # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP - # SuccessFactors) - attr_reader :abbreviated_name - # @return [Array] Category or categories this integration belongs to. Multiple categories should - # be comma separated, i.e. [ats, integrations]. - attr_reader :categories - # @return [String] Company logo in rectangular shape. - attr_reader :image - # @return [String] Company logo in square shape. - attr_reader :square_image - # @return [String] The color of this integration used for buttons and text throughout the app and - # landing pages. Choose a darker, saturated color. - attr_reader :color - # @return [String] - attr_reader :slug - # @return [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': - # [['/common-model-scopes', - # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', - # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], - # 'POST': []} - attr_reader :api_endpoints_to_documentation_urls - # @return [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. - attr_reader :webhook_setup_guide_url - # @return [Hash{String => Object}] Category or categories this integration is in beta status for. - attr_reader :category_beta_status - # @return [OpenStruct] Additional properties unmapped to the current class definition - attr_reader :additional_properties - # @return [Object] - attr_reader :_field_set - protected :_field_set - - OMIT = Object.new - - # @param name [String] Company name. - # @param abbreviated_name [String] Optional. This shortened name appears in places with limited space, usually in - # conjunction with the platform's logo (e.g., Merge Link menu).

Example: - # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP - # SuccessFactors) - # @param categories [Array] Category or categories this integration belongs to. Multiple categories should - # be comma separated, i.e. [ats, integrations]. - # @param image [String] Company logo in rectangular shape. - # @param square_image [String] Company logo in square shape. - # @param color [String] The color of this integration used for buttons and text throughout the app and - # landing pages. Choose a darker, saturated color. - # @param slug [String] - # @param api_endpoints_to_documentation_urls [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': - # [['/common-model-scopes', - # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', - # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], - # 'POST': []} - # @param webhook_setup_guide_url [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. - # @param category_beta_status [Hash{String => Object}] Category or categories this integration is in beta status for. - # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition - # @return [Merge::Integrations::AccountIntegration] - def initialize(name:, abbreviated_name: OMIT, categories: OMIT, image: OMIT, square_image: OMIT, color: OMIT, - slug: OMIT, api_endpoints_to_documentation_urls: OMIT, webhook_setup_guide_url: OMIT, category_beta_status: OMIT, additional_properties: nil) - @name = name - @abbreviated_name = abbreviated_name if abbreviated_name != OMIT - @categories = categories if categories != OMIT - @image = image if image != OMIT - @square_image = square_image if square_image != OMIT - @color = color if color != OMIT - @slug = slug if slug != OMIT - if api_endpoints_to_documentation_urls != OMIT - @api_endpoints_to_documentation_urls = api_endpoints_to_documentation_urls - end - @webhook_setup_guide_url = webhook_setup_guide_url if webhook_setup_guide_url != OMIT - @category_beta_status = category_beta_status if category_beta_status != OMIT - @additional_properties = additional_properties - @_field_set = { - "name": name, - "abbreviated_name": abbreviated_name, - "categories": categories, - "image": image, - "square_image": square_image, - "color": color, - "slug": slug, - "api_endpoints_to_documentation_urls": api_endpoints_to_documentation_urls, - "webhook_setup_guide_url": webhook_setup_guide_url, - "category_beta_status": category_beta_status - }.reject do |_k, v| - v == OMIT - end - end - - # Deserialize a JSON object to an instance of AccountIntegration - # - # @param json_object [String] - # @return [Merge::Integrtions::AccountIntegration] - def self.from_json(json_object:) - struct = JSON.parse(json_object, object_class: OpenStruct) - parsed_json = JSON.parse(json_object) - name = parsed_json["name"] - abbreviated_name = parsed_json["abbreviated_name"] - categories = parsed_json["categories"] - image = parsed_json["image"] - square_image = parsed_json["square_image"] - color = parsed_json["color"] - slug = parsed_json["slug"] - api_endpoints_to_documentation_urls = parsed_json["api_endpoints_to_documentation_urls"] - webhook_setup_guide_url = parsed_json["webhook_setup_guide_url"] - category_beta_status = parsed_json["category_beta_status"] - new( - name: name, - abbreviated_name: abbreviated_name, - categories: categories, - image: image, - square_image: square_image, - color: color, - slug: slug, - api_endpoints_to_documentation_urls: api_endpoints_to_documentation_urls, - webhook_setup_guide_url: webhook_setup_guide_url, - category_beta_status: category_beta_status, - additional_properties: struct - ) - end - - # Serialize an instance of AccountIntegration to a JSON object - # - # @return [String] - def to_json(*_args) - @_field_set&.to_json - end - - # Leveraged for Union-type generation, validate_raw attempts to parse the given - # hash and check each fields type against the current object's property - # definitions. - # - # @param obj [Object] - # @return [Void] - def self.validate_raw(obj:) - obj.name.is_a?(String) != false || raise("Passed value for field obj.name is not the expected type, validation failed.") - obj.abbreviated_name&.is_a?(String) != false || raise("Passed value for field obj.abbreviated_name is not the expected type, validation failed.") - obj.categories&.is_a?(Array) != false || raise("Passed value for field obj.categories is not the expected type, validation failed.") - obj.image&.is_a?(String) != false || raise("Passed value for field obj.image is not the expected type, validation failed.") - obj.square_image&.is_a?(String) != false || raise("Passed value for field obj.square_image is not the expected type, validation failed.") - obj.color&.is_a?(String) != false || raise("Passed value for field obj.color is not the expected type, validation failed.") - obj.slug&.is_a?(String) != false || raise("Passed value for field obj.slug is not the expected type, validation failed.") - obj.api_endpoints_to_documentation_urls&.is_a?(Hash) != false || raise("Passed value for field obj.api_endpoints_to_documentation_urls is not the expected type, validation failed.") - obj.webhook_setup_guide_url&.is_a?(String) != false || raise("Passed value for field obj.webhook_setup_guide_url is not the expected type, validation failed.") - obj.category_beta_status&.is_a?(Hash) != false || raise("Passed value for field obj.category_beta_status is not the expected type, validation failed.") - end - end - end -end diff --git a/lib/merge_ruby_client/integrations/types/account_token.rb b/lib/merge_ruby_client/integrations/types/account_token.rb index 1d7b55f9..5ca90542 100644 --- a/lib/merge_ruby_client/integrations/types/account_token.rb +++ b/lib/merge_ruby_client/integrations/types/account_token.rb @@ -45,7 +45,8 @@ def self.from_json(json_object:) integration = nil else integration = parsed_json["integration"].to_json - integration = Merge::Integrations::AccountIntegration.from_json(json_object: integration) + # TODO - Fix this + # integration = Merge::Integrations::AccountIntegration.from_json(json_object: integration) end id = parsed_json["id"] new( @@ -71,7 +72,7 @@ def to_json(*_args) # @return [Void] def self.validate_raw(obj:) obj.account_token.is_a?(String) != false || raise("Passed value for field obj.account_token is not the expected type, validation failed.") - Merge::Integrations::AccountIntegration.validate_raw(obj: obj.integration) + # Merge::Integrations::AccountIntegration.validate_raw(obj: obj.integration) obj.id.is_a?(String) != false || raise("Passed value for field obj.id is not the expected type, validation failed.") end end diff --git a/lib/merge_ruby_client/integrations/types/categories_enum.rb b/lib/merge_ruby_client/integrations/types/categories_enum.rb deleted file mode 100644 index f7f5dd4d..00000000 --- a/lib/merge_ruby_client/integrations/types/categories_enum.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module Merge - module Accounting - # * `hris` - hris - # * `ats` - ats - # * `accounting` - accounting - # * `ticketing` - ticketing - # * `crm` - crm - # * `mktg` - mktg - # * `filestorage` - filestorage - class CategoriesEnum - HRIS = "hris" - ATS = "ats" - ACCOUNTING = "accounting" - TICKETING = "ticketing" - CRM = "crm" - MKTG = "mktg" - FILESTORAGE = "filestorage" - INTEGRATIONS = "integrations" - end - end -end From 8320c222bed780bbcfafcc481837579cb1d81fca Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Wed, 30 Apr 2025 12:46:35 +0545 Subject: [PATCH 7/8] feat: Implement account_integration into account_token --- .../integrations/types/account_integration.rb | 158 ++++++++++++++++++ .../integrations/types/account_token.rb | 6 +- .../integrations/types/categories_enum.rb | 24 +++ 3 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 lib/merge_ruby_client/integrations/types/account_integration.rb create mode 100644 lib/merge_ruby_client/integrations/types/categories_enum.rb diff --git a/lib/merge_ruby_client/integrations/types/account_integration.rb b/lib/merge_ruby_client/integrations/types/account_integration.rb new file mode 100644 index 00000000..29d0da6d --- /dev/null +++ b/lib/merge_ruby_client/integrations/types/account_integration.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true + +require_relative "categories_enum" +require "ostruct" +require "json" + +module Merge + module Integrations + class AccountIntegration + # @return [String] Company name. + attr_reader :name + # @return [String] Optional. This shortened name appears in places with limited space, usually in + # conjunction with the platform's logo (e.g., Merge Link menu).

Example: + # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP + # SuccessFactors) + attr_reader :abbreviated_name + # @return [Array] Category or categories this integration belongs to. Multiple categories should + # be comma separated, i.e. [ats, integrations]. + attr_reader :categories + # @return [String] Company logo in rectangular shape. + attr_reader :image + # @return [String] Company logo in square shape. + attr_reader :square_image + # @return [String] The color of this integration used for buttons and text throughout the app and + # landing pages. Choose a darker, saturated color. + attr_reader :color + # @return [String] + attr_reader :slug + # @return [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': + # [['/common-model-scopes', + # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', + # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], + # 'POST': []} + attr_reader :api_endpoints_to_documentation_urls + # @return [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. + attr_reader :webhook_setup_guide_url + # @return [Hash{String => Object}] Category or categories this integration is in beta status for. + attr_reader :category_beta_status + # @return [OpenStruct] Additional properties unmapped to the current class definition + attr_reader :additional_properties + # @return [Object] + attr_reader :_field_set + protected :_field_set + + OMIT = Object.new + + # @param name [String] Company name. + # @param abbreviated_name [String] Optional. This shortened name appears in places with limited space, usually in + # conjunction with the platform's logo (e.g., Merge Link menu).

Example: + # Workforce Now (in lieu of ADP Workforce Now), SuccessFactors (in lieu of SAP + # SuccessFactors) + # @param categories [Array] Category or categories this integration belongs to. Multiple categories should + # be comma separated, i.e. [ats, integrations]. + # @param image [String] Company logo in rectangular shape. + # @param square_image [String] Company logo in square shape. + # @param color [String] The color of this integration used for buttons and text throughout the app and + # landing pages. Choose a darker, saturated color. + # @param slug [String] + # @param api_endpoints_to_documentation_urls [Hash{String => Object}] Mapping of API endpoints to documentation urls for support. Example: {'GET': + # [['/common-model-scopes', + # ng/common-model-scopes/#common_model_scopes_retrieve'],['/common-model-actions', + # ocs.merge.dev/accounting/common-model-actions/#common_model_actions_retrieve']], + # 'POST': []} + # @param webhook_setup_guide_url [String] Setup guide URL for third party webhook creation. Exposed in Merge Docs. + # @param category_beta_status [Hash{String => Object}] Category or categories this integration is in beta status for. + # @param additional_properties [OpenStruct] Additional properties unmapped to the current class definition + # @return [Merge::Integrations::AccountIntegration] + def initialize(name:, abbreviated_name: OMIT, categories: OMIT, image: OMIT, square_image: OMIT, color: OMIT, + slug: OMIT, api_endpoints_to_documentation_urls: OMIT, webhook_setup_guide_url: OMIT, category_beta_status: OMIT, additional_properties: nil) + @name = name + @abbreviated_name = abbreviated_name if abbreviated_name != OMIT + @categories = categories if categories != OMIT + @image = image if image != OMIT + @square_image = square_image if square_image != OMIT + @color = color if color != OMIT + @slug = slug if slug != OMIT + if api_endpoints_to_documentation_urls != OMIT + @api_endpoints_to_documentation_urls = api_endpoints_to_documentation_urls + end + @webhook_setup_guide_url = webhook_setup_guide_url if webhook_setup_guide_url != OMIT + @category_beta_status = category_beta_status if category_beta_status != OMIT + @additional_properties = additional_properties + @_field_set = { + "name": name, + "abbreviated_name": abbreviated_name, + "categories": categories, + "image": image, + "square_image": square_image, + "color": color, + "slug": slug, + "api_endpoints_to_documentation_urls": api_endpoints_to_documentation_urls, + "webhook_setup_guide_url": webhook_setup_guide_url, + "category_beta_status": category_beta_status + }.reject do |_k, v| + v == OMIT + end + end + + # Deserialize a JSON object to an instance of AccountIntegration + # + # @param json_object [String] + # @return [Merge::Integrations::AccountIntegration] + def self.from_json(json_object:) + struct = JSON.parse(json_object, object_class: OpenStruct) + parsed_json = JSON.parse(json_object) + name = parsed_json["name"] + abbreviated_name = parsed_json["abbreviated_name"] + categories = parsed_json["categories"] + image = parsed_json["image"] + square_image = parsed_json["square_image"] + color = parsed_json["color"] + slug = parsed_json["slug"] + api_endpoints_to_documentation_urls = parsed_json["api_endpoints_to_documentation_urls"] + webhook_setup_guide_url = parsed_json["webhook_setup_guide_url"] + category_beta_status = parsed_json["category_beta_status"] + new( + name: name, + abbreviated_name: abbreviated_name, + categories: categories, + image: image, + square_image: square_image, + color: color, + slug: slug, + api_endpoints_to_documentation_urls: api_endpoints_to_documentation_urls, + webhook_setup_guide_url: webhook_setup_guide_url, + category_beta_status: category_beta_status, + additional_properties: struct + ) + end + + # Serialize an instance of AccountIntegration to a JSON object + # + # @return [String] + def to_json(*_args) + @_field_set&.to_json + end + + # Leveraged for Union-type generation, validate_raw attempts to parse the given + # hash and check each fields type against the current object's property + # definitions. + # + # @param obj [Object] + # @return [Void] + def self.validate_raw(obj:) + obj.name.is_a?(String) != false || raise("Passed value for field obj.name is not the expected type, validation failed.") + obj.abbreviated_name&.is_a?(String) != false || raise("Passed value for field obj.abbreviated_name is not the expected type, validation failed.") + obj.categories&.is_a?(Array) != false || raise("Passed value for field obj.categories is not the expected type, validation failed.") + obj.image&.is_a?(String) != false || raise("Passed value for field obj.image is not the expected type, validation failed.") + obj.square_image&.is_a?(String) != false || raise("Passed value for field obj.square_image is not the expected type, validation failed.") + obj.color&.is_a?(String) != false || raise("Passed value for field obj.color is not the expected type, validation failed.") + obj.slug&.is_a?(String) != false || raise("Passed value for field obj.slug is not the expected type, validation failed.") + obj.api_endpoints_to_documentation_urls&.is_a?(Hash) != false || raise("Passed value for field obj.api_endpoints_to_documentation_urls is not the expected type, validation failed.") + obj.webhook_setup_guide_url&.is_a?(String) != false || raise("Passed value for field obj.webhook_setup_guide_url is not the expected type, validation failed.") + obj.category_beta_status&.is_a?(Hash) != false || raise("Passed value for field obj.category_beta_status is not the expected type, validation failed.") + end + end + end +end diff --git a/lib/merge_ruby_client/integrations/types/account_token.rb b/lib/merge_ruby_client/integrations/types/account_token.rb index 5ca90542..bf8e4f54 100644 --- a/lib/merge_ruby_client/integrations/types/account_token.rb +++ b/lib/merge_ruby_client/integrations/types/account_token.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require_relative "account_integration" require "ostruct" require "json" @@ -45,8 +46,7 @@ def self.from_json(json_object:) integration = nil else integration = parsed_json["integration"].to_json - # TODO - Fix this - # integration = Merge::Integrations::AccountIntegration.from_json(json_object: integration) + integration = Merge::Integrations::AccountIntegration.from_json(json_object: integration) end id = parsed_json["id"] new( @@ -72,7 +72,7 @@ def to_json(*_args) # @return [Void] def self.validate_raw(obj:) obj.account_token.is_a?(String) != false || raise("Passed value for field obj.account_token is not the expected type, validation failed.") - # Merge::Integrations::AccountIntegration.validate_raw(obj: obj.integration) + Merge::Integrations::AccountIntegration.validate_raw(obj: obj.integration) obj.id.is_a?(String) != false || raise("Passed value for field obj.id is not the expected type, validation failed.") end end diff --git a/lib/merge_ruby_client/integrations/types/categories_enum.rb b/lib/merge_ruby_client/integrations/types/categories_enum.rb new file mode 100644 index 00000000..cb1c4569 --- /dev/null +++ b/lib/merge_ruby_client/integrations/types/categories_enum.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Merge + module Integrations + # * `hris` - hris + # * `ats` - ats + # * `accounting` - accounting + # * `ticketing` - ticketing + # * `crm` - crm + # * `mktg` - mktg + # * `filestorage` - filestorage + # * `integrations` - integrations + class CategoriesEnum + HRIS = "hris" + ATS = "ats" + ACCOUNTING = "accounting" + TICKETING = "ticketing" + CRM = "crm" + MKTG = "mktg" + FILESTORAGE = "filestorage" + INTEGRATIONS = "integrations" + end + end +end From 350054eabbefde4afa474305de1d25d4db9357cf Mon Sep 17 00:00:00 2001 From: Rajan Bhattarai Date: Wed, 30 Apr 2025 12:58:48 +0545 Subject: [PATCH 8/8] fix: Add missing types in export --- lib/types_export.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/types_export.rb b/lib/types_export.rb index aa6eb7a7..f832994e 100644 --- a/lib/types_export.rb +++ b/lib/types_export.rb @@ -1297,4 +1297,8 @@ require_relative "merge_ruby_client/accounting/types/vendor_credit_response" require_relative "merge_ruby_client/accounting/types/warning_validation_problem" require_relative "merge_ruby_client/accounting/types/webhook_receiver" +require_relative "merge_ruby_client/integrations/types/account_integration" +require_relative "merge_ruby_client/integrations/types/account_token" +require_relative "merge_ruby_client/integrations/types/categories_enum" +require_relative "merge_ruby_client/integrations/types/link_token" require_relative "merge_ruby_client/integrations/types/provider"