active_call-zoho_sign 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +70 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +401 -0
- data/Rakefile +12 -0
- data/lib/zoho_sign/access_token/facade.rb +13 -0
- data/lib/zoho_sign/access_token/get_service.rb +53 -0
- data/lib/zoho_sign/base_service.rb +180 -0
- data/lib/zoho_sign/current_user/facade.rb +63 -0
- data/lib/zoho_sign/current_user/get_service.rb +37 -0
- data/lib/zoho_sign/document/action/embed_token/facade.rb +9 -0
- data/lib/zoho_sign/document/action/embed_token/get_service.rb +51 -0
- data/lib/zoho_sign/document/create_service.rb +70 -0
- data/lib/zoho_sign/document/delete_service.rb +29 -0
- data/lib/zoho_sign/document/facade.rb +50 -0
- data/lib/zoho_sign/document/get_service.rb +43 -0
- data/lib/zoho_sign/document/list_service.rb +98 -0
- data/lib/zoho_sign/document/update_service.rb +63 -0
- data/lib/zoho_sign/error.rb +46 -0
- data/lib/zoho_sign/locale/en.yml +18 -0
- data/lib/zoho_sign/template/document/create_service.rb +82 -0
- data/lib/zoho_sign/template/document/facade.rb +47 -0
- data/lib/zoho_sign/template/facade.rb +35 -0
- data/lib/zoho_sign/template/get_service.rb +43 -0
- data/lib/zoho_sign/template/list_service.rb +98 -0
- data/lib/zoho_sign/version.rb +5 -0
- data/lib/zoho_sign.rb +22 -0
- data/sig/zoho_sign.rbs +4 -0
- metadata +147 -0
| @@ -0,0 +1,180 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::BaseService < ActiveCall::Base
         | 
| 4 | 
            +
              self.abstract_class = true
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              CACHE_KEY = { access_token: 'zoho_sign/base_service/access_token' }.freeze
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              EXCEPTION_MAPPING = {
         | 
| 9 | 
            +
                bad_request:                   ZohoSign::BadRequestError,
         | 
| 10 | 
            +
                unauthorized:                  ZohoSign::UnauthorizedError,
         | 
| 11 | 
            +
                forbidden:                     ZohoSign::ForbiddenError,
         | 
| 12 | 
            +
                not_found:                     ZohoSign::NotFoundError,
         | 
| 13 | 
            +
                proxy_authentication_required: ZohoSign::ProxyAuthenticationRequiredError,
         | 
| 14 | 
            +
                request_timeout:               ZohoSign::RequestTimeoutError,
         | 
| 15 | 
            +
                conflict:                      ZohoSign::ConflictError,
         | 
| 16 | 
            +
                unprocessable_entity:          ZohoSign::UnprocessableEntityError,
         | 
| 17 | 
            +
                too_many_requests:             ZohoSign::TooManyRequestsError,
         | 
| 18 | 
            +
                client_error:                  ZohoSign::ClientError,
         | 
| 19 | 
            +
                server_error:                  ZohoSign::ServerError
         | 
| 20 | 
            +
              }.freeze
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              config_accessor :base_url, default: 'https://sign.zoho.com/api/v1', instance_writer: false
         | 
| 23 | 
            +
              config_accessor :cache, default: ActiveSupport::Cache::MemoryStore.new, instance_writer: false
         | 
| 24 | 
            +
              config_accessor :logger, default: Logger.new($stdout), instance_writer: false
         | 
| 25 | 
            +
              config_accessor :log_level, default: :info, instance_writer: false
         | 
| 26 | 
            +
              config_accessor :log_headers, default: false, instance_writer: false
         | 
| 27 | 
            +
              config_accessor :log_bodies, default: false, instance_writer: false
         | 
| 28 | 
            +
              config_accessor :client_id, :client_secret, :refresh_token, instance_writer: false
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              attr_reader :facade
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              validate on: :response do
         | 
| 33 | 
            +
                throw :abort if response.is_a?(Enumerable)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                errors.add(:base, :server_error) and throw :abort if response.status >= 500
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                errors.add(:base, :unauthorized) and throw :abort if unauthorized?
         | 
| 38 | 
            +
                errors.add(:base, :forbidden) and throw :abort if forbidden?
         | 
| 39 | 
            +
                errors.add(:base, :not_found) and throw :abort if not_found?
         | 
| 40 | 
            +
                errors.add(:base, :proxy_authentication_required) and throw :abort if proxy_authentication_required?
         | 
| 41 | 
            +
                errors.add(:base, :request_timeout) and throw :abort if request_timeout?
         | 
| 42 | 
            +
                errors.add(:base, :conflict) and throw :abort if conflict?
         | 
| 43 | 
            +
                errors.add(:base, :unprocessable_entity) and throw :abort if unprocessable_entity?
         | 
| 44 | 
            +
                errors.add(:base, :too_many_requests) and throw :abort if too_many_requests?
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # Check for bad_request here since too_many_requests also has a status of 400.
         | 
| 47 | 
            +
                errors.add(:base, :bad_request) and throw :abort if bad_request?
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                # We'll use client_error for everything else that we don't have an explicit exception class for.
         | 
| 50 | 
            +
                errors.add(:base, :client_error) and throw :abort if response.status >= 400
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              class << self
         | 
| 54 | 
            +
                def call!(...)
         | 
| 55 | 
            +
                  super
         | 
| 56 | 
            +
                rescue ActiveCall::ValidationError => e
         | 
| 57 | 
            +
                  raise zoho_sign_validation_error(e)
         | 
| 58 | 
            +
                rescue ActiveCall::RequestError => e
         | 
| 59 | 
            +
                  raise zoho_sign_request_error(e)
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def zoho_sign_validation_error(exception)
         | 
| 63 | 
            +
                  ZohoSign::ValidationError.new(exception.errors, exception.message)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def zoho_sign_request_error(exception)
         | 
| 67 | 
            +
                  exception_for(exception.response, exception.errors, exception.message)
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                def exception_for(response, errors, message = nil)
         | 
| 71 | 
            +
                  exception_type = errors.details[:base].first[:error]
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  case exception_type
         | 
| 74 | 
            +
                  when *EXCEPTION_MAPPING.keys
         | 
| 75 | 
            +
                    EXCEPTION_MAPPING[exception_type].new(response, errors, message)
         | 
| 76 | 
            +
                  else
         | 
| 77 | 
            +
                    ZohoSign::RequestError.new(response, errors, message)
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              private
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              delegate :exception_for, to: :class
         | 
| 85 | 
            +
             | 
| 86 | 
            +
              def connection
         | 
| 87 | 
            +
                @_connection ||= Faraday.new do |conn|
         | 
| 88 | 
            +
                  conn.url_prefix = base_url
         | 
| 89 | 
            +
                  conn.request :authorization, 'Zoho-oauthtoken', -> { access_token }
         | 
| 90 | 
            +
                  conn.request :multipart
         | 
| 91 | 
            +
                  conn.request :url_encoded
         | 
| 92 | 
            +
                  conn.request :retry
         | 
| 93 | 
            +
                  conn.response :json
         | 
| 94 | 
            +
                  conn.response :logger, logger, **logger_options do |logger|
         | 
| 95 | 
            +
                    logger.filter(/(Authorization:).*"(.+)."/i, '\1 [FILTERED]')
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
                  conn.adapter Faraday.default_adapter
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
              end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
              def logger_options
         | 
| 102 | 
            +
                {
         | 
| 103 | 
            +
                  headers:   log_headers,
         | 
| 104 | 
            +
                  log_level: log_level,
         | 
| 105 | 
            +
                  bodies:    log_bodies,
         | 
| 106 | 
            +
                  formatter: Faraday::Logging::ColorFormatter, prefix: { request: 'ZohoSign', response: 'ZohoSign' }
         | 
| 107 | 
            +
                }
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              def access_token
         | 
| 111 | 
            +
                access_token = ENV['ZOHO_SIGN_ACCESS_TOKEN'].presence || cache.read(CACHE_KEY[:access_token])
         | 
| 112 | 
            +
                return access_token if access_token.present?
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                service = ZohoSign::AccessToken::GetService.call
         | 
| 115 | 
            +
                cache.fetch(CACHE_KEY[:access_token], expires_in: [service.expires_in - 10, 0].max) { service.facade.access_token }
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
              def bad_request?
         | 
| 119 | 
            +
                response.status == 400
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              def unauthorized?
         | 
| 123 | 
            +
                response.status == 401
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              def forbidden?
         | 
| 127 | 
            +
                response.status == 403
         | 
| 128 | 
            +
                return false unless response.status == 400 && response.body.key?('code')
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                # 4003: Access to view the document is denied.
         | 
| 131 | 
            +
                return true if [4003].include?(response.body['code'])
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                false
         | 
| 134 | 
            +
              end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
              def not_found?
         | 
| 137 | 
            +
                return true if response.status == 404
         | 
| 138 | 
            +
                return false unless response.status == 400 && response.body.key?('code')
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                # 4066: Invalid Request ID.
         | 
| 141 | 
            +
                # 20405: Invalid Template ID.
         | 
| 142 | 
            +
                return true if [4066, 20405].include?(response.body['code'])
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                false
         | 
| 145 | 
            +
              end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
              # TODO: Confirm.
         | 
| 148 | 
            +
              def proxy_authentication_required?
         | 
| 149 | 
            +
                response.status == 407
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              # TODO: Confirm.
         | 
| 153 | 
            +
              def request_timeout?
         | 
| 154 | 
            +
                response.status == 408
         | 
| 155 | 
            +
              end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
              # TODO: Confirm.
         | 
| 158 | 
            +
              def conflict?
         | 
| 159 | 
            +
                response.status == 409
         | 
| 160 | 
            +
              end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
              def unprocessable_entity?
         | 
| 163 | 
            +
                return true if response.status == 422
         | 
| 164 | 
            +
                return false unless response.status == 400 && response.body.key?('code')
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                # 4021: Something went wrong. One or more fields contain errors.
         | 
| 167 | 
            +
                # 9009: ...
         | 
| 168 | 
            +
                # 9043: Extra key found.
         | 
| 169 | 
            +
                # 9056: Action array size mismatch from the templates.
         | 
| 170 | 
            +
                return true if [4021, 9043, 9009, 9056].include?(response.body['code'])
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                false
         | 
| 173 | 
            +
              end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
              def too_many_requests?
         | 
| 176 | 
            +
                return false unless response.status == 400 && response.body.key?('error_description')
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                response.body['error_description'].include?('too many requests')
         | 
| 179 | 
            +
              end
         | 
| 180 | 
            +
            end
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::CurrentUser::Facade
         | 
| 4 | 
            +
              attr_reader :account_id, :account_type, :api_credits_left, :api_documents_used, :automation_limit,
         | 
| 5 | 
            +
                :automation_used_count, :branding, :configurations, :country, :documents_used, :enable_old_viewer_page, :features,
         | 
| 6 | 
            +
                :first_name, :iam_photo_url, :is_admin, :is_api_account, :is_cloud_signing_allowed, :is_owner, :is_sign_trial,
         | 
| 7 | 
            +
                :is_trial, :is_visible_sign_option_allowed, :is_zoho_one, :language, :last_name, :license_type, :logo_url,
         | 
| 8 | 
            +
                :monthly_bulk_used, :monthly_signforms_used, :multiportal_enabled, :no_of_documents, :org_name, :organizations,
         | 
| 9 | 
            +
                :payment_url, :photo_url, :plan_edition, :plan_group, :profile, :profile_details, :send_mail_from,
         | 
| 10 | 
            +
                :show_api_warning_msg, :smtp_configured, :user_email, :user_id, :visible_sign_settings, :zo_users_url, :zooid,
         | 
| 11 | 
            +
                :zuid, :zsoid
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def initialize(hash)
         | 
| 14 | 
            +
                @account_id                     = hash['account_id']
         | 
| 15 | 
            +
                @account_type                   = hash['account_type']
         | 
| 16 | 
            +
                @api_credits_left               = hash['api_credits_left']
         | 
| 17 | 
            +
                @api_documents_used             = hash['api_documents_used']
         | 
| 18 | 
            +
                @automation_limit               = hash['automation_limit']
         | 
| 19 | 
            +
                @automation_used_count          = hash['automation_used_count']
         | 
| 20 | 
            +
                @branding                       = hash['branding']
         | 
| 21 | 
            +
                @configurations                 = hash['configurations']
         | 
| 22 | 
            +
                @country                        = hash['country']
         | 
| 23 | 
            +
                @documents_used                 = hash['documents_used']
         | 
| 24 | 
            +
                @enable_old_viewer_page         = hash['enable_old_viewer_page']
         | 
| 25 | 
            +
                @features                       = hash['features']
         | 
| 26 | 
            +
                @first_name                     = hash['first_name']
         | 
| 27 | 
            +
                @iam_photo_url                  = hash['IAM_photo_url']
         | 
| 28 | 
            +
                @is_admin                       = hash['is_admin']
         | 
| 29 | 
            +
                @is_api_account                 = hash['is_api_account']
         | 
| 30 | 
            +
                @is_cloud_signing_allowed       = hash['is_cloud_signing_allowed']
         | 
| 31 | 
            +
                @is_owner                       = hash['is_owner']
         | 
| 32 | 
            +
                @is_sign_trial                  = hash['is_sign_trial']
         | 
| 33 | 
            +
                @is_trial                       = hash['is_trial']
         | 
| 34 | 
            +
                @is_visible_sign_option_allowed = hash['is_visible_sign_option_allowed']
         | 
| 35 | 
            +
                @is_zoho_one                    = hash['is_zoho_one']
         | 
| 36 | 
            +
                @language                       = hash['language']
         | 
| 37 | 
            +
                @last_name                      = hash['last_name']
         | 
| 38 | 
            +
                @license_type                   = hash['license_type']
         | 
| 39 | 
            +
                @logo_url                       = hash['logo_url']
         | 
| 40 | 
            +
                @monthly_bulk_used              = hash['monthly_bulk_used']
         | 
| 41 | 
            +
                @monthly_signforms_used         = hash['monthly_signforms_used']
         | 
| 42 | 
            +
                @multiportal_enabled            = hash['multiportal_enabled']
         | 
| 43 | 
            +
                @no_of_documents                = hash['no_of_documents']
         | 
| 44 | 
            +
                @org_name                       = hash['org_name']
         | 
| 45 | 
            +
                @organizations                  = hash['organizations']
         | 
| 46 | 
            +
                @payment_url                    = hash['payment_url']
         | 
| 47 | 
            +
                @photo_url                      = hash['photo_url']
         | 
| 48 | 
            +
                @plan_edition                   = hash['plan_edition']
         | 
| 49 | 
            +
                @plan_group                     = hash['plan_group']
         | 
| 50 | 
            +
                @profile                        = hash['profile']
         | 
| 51 | 
            +
                @profile_details                = hash['profile_details']
         | 
| 52 | 
            +
                @send_mail_from                 = hash['send_mail_from']
         | 
| 53 | 
            +
                @show_api_warning_msg           = hash['show_api_warning_msg']
         | 
| 54 | 
            +
                @smtp_configured                = hash['smtp_configured']
         | 
| 55 | 
            +
                @user_email                     = hash['user_email']
         | 
| 56 | 
            +
                @user_id                        = hash['user_id']
         | 
| 57 | 
            +
                @visible_sign_settings          = hash['visible_sign_settings']
         | 
| 58 | 
            +
                @zo_users_url                   = hash['zo_users_url']
         | 
| 59 | 
            +
                @zooid                          = hash['zooid']
         | 
| 60 | 
            +
                @zuid                           = hash['ZUID']
         | 
| 61 | 
            +
                @zsoid                          = hash['ZSOID']
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::CurrentUser::GetService < ZohoSign::BaseService
         | 
| 4 | 
            +
              after_call :set_facade
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              delegate_missing_to :@facade
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def initialize; end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              # Get the current user.
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              # ==== Examples
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              #   service = ZohoSign::CurrentUser::GetService.call
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              #   service.success? # => true
         | 
| 17 | 
            +
              #   service.errors # => #<ActiveModel::Errors []>
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              #   service.response # => #<Faraday::Response ...>
         | 
| 20 | 
            +
              #   service.response.status # => 200
         | 
| 21 | 
            +
              #   service.response.body # => {}
         | 
| 22 | 
            +
              #
         | 
| 23 | 
            +
              #   service.facade # => #<ZohoSign::CurrentUser::Facade ...>
         | 
| 24 | 
            +
              #   service.facade.zsoid
         | 
| 25 | 
            +
              #   service.zsoid
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              # GET /api/v1/currentuser
         | 
| 28 | 
            +
              def call
         | 
| 29 | 
            +
                connection.get('currentuser')
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              def set_facade
         | 
| 35 | 
            +
                @facade = ZohoSign::CurrentUser::Facade.new(response.body['users'])
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::Action::EmbedToken::GetService < ZohoSign::BaseService
         | 
| 4 | 
            +
              attr_reader :id, :request_id, :host
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              after_call :set_facade
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              delegate_missing_to :@facade
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              validates :id, :request_id, :host, presence: true
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def initialize(id:, request_id:, host:)
         | 
| 13 | 
            +
                @id         = id
         | 
| 14 | 
            +
                @request_id = request_id
         | 
| 15 | 
            +
                @host       = host
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              # Get a document.
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              # ==== Examples
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              #   service = ZohoSign::Document::Action::EmbedToken::GetService.call(id: '', request_id: '', host: '')
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              #   service.success? # => true
         | 
| 25 | 
            +
              #   service.errors # => #<ActiveModel::Errors []>
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              #   service.response # => #<Faraday::Response ...>
         | 
| 28 | 
            +
              #   service.response.status # => 200
         | 
| 29 | 
            +
              #   service.response.body # => {}
         | 
| 30 | 
            +
              #
         | 
| 31 | 
            +
              #   service.facade # => #<ZohoSign::Document::Action::EmbedToken::Facade ...>
         | 
| 32 | 
            +
              #   service.facade.request_name
         | 
| 33 | 
            +
              #   service.request_name
         | 
| 34 | 
            +
              #
         | 
| 35 | 
            +
              # POST /api/v1/requests/:request_id/actions/:id/embedtoken
         | 
| 36 | 
            +
              def call
         | 
| 37 | 
            +
                connection.post("/api/v1/requests/#{request_id}/actions/#{id}/embedtoken", **params)
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              private
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              def params
         | 
| 43 | 
            +
                {
         | 
| 44 | 
            +
                  host: host
         | 
| 45 | 
            +
                }
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              def set_facade
         | 
| 49 | 
            +
                @facade = ZohoSign::Document::Action::EmbedToken.new(response.body)
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::CreateService < ZohoSign::BaseService
         | 
| 4 | 
            +
              attr_reader :data, :file, :file_content_type, :file_name
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              validates :file, :file_content_type, :data, presence: true
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              after_call :set_facade
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              delegate_missing_to :@facade
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def initialize(data:, file:, file_content_type:, file_name: nil)
         | 
| 13 | 
            +
                @file              = file
         | 
| 14 | 
            +
                @file_content_type = file_content_type
         | 
| 15 | 
            +
                @file_name         = file_name
         | 
| 16 | 
            +
                @data              = data
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              # Create a document.
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              # ==== Examples
         | 
| 22 | 
            +
              #
         | 
| 23 | 
            +
              #   service = ZohoSign::Document::CreateService.call(
         | 
| 24 | 
            +
              #     file: '/path/to/file.pdf', # or File.open('/path/to/file.pdf')
         | 
| 25 | 
            +
              #     file_name: 'file.pdf',
         | 
| 26 | 
            +
              #     file_content_type: 'application/pdf',
         | 
| 27 | 
            +
              #     data: {
         | 
| 28 | 
            +
              #       requests: {
         | 
| 29 | 
            +
              #         request_name: 'Name',
         | 
| 30 | 
            +
              #         is_sequential: false,
         | 
| 31 | 
            +
              #         actions: [{
         | 
| 32 | 
            +
              #           action_type: 'SIGN',
         | 
| 33 | 
            +
              #           recipient_email: 'eric.cartman@example.com',
         | 
| 34 | 
            +
              #           recipient_name: 'Eric Cartman',
         | 
| 35 | 
            +
              #           verify_recipient: true,
         | 
| 36 | 
            +
              #           verification_type: 'EMAIL'
         | 
| 37 | 
            +
              #         }]
         | 
| 38 | 
            +
              #       }
         | 
| 39 | 
            +
              #     }
         | 
| 40 | 
            +
              #   )
         | 
| 41 | 
            +
              #
         | 
| 42 | 
            +
              #   service.success? # => true
         | 
| 43 | 
            +
              #   service.errors # => #<ActiveModel::Errors []>
         | 
| 44 | 
            +
              #
         | 
| 45 | 
            +
              #   service.response # => #<Faraday::Response ...>
         | 
| 46 | 
            +
              #   service.response.status # => 200
         | 
| 47 | 
            +
              #   service.response.body # => {}
         | 
| 48 | 
            +
              #
         | 
| 49 | 
            +
              #   service.facade # => #<ZohoSign::Document::Facade ...>
         | 
| 50 | 
            +
              #   service.facade.request_name
         | 
| 51 | 
            +
              #   service.request_name
         | 
| 52 | 
            +
              #
         | 
| 53 | 
            +
              # POST /api/v1/requests
         | 
| 54 | 
            +
              def call
         | 
| 55 | 
            +
                connection.post('requests', **params)
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              private
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              def params
         | 
| 61 | 
            +
                {
         | 
| 62 | 
            +
                  file: Faraday::Multipart::FilePart.new(file, file_content_type, file_name),
         | 
| 63 | 
            +
                  data: data.to_json
         | 
| 64 | 
            +
                }
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
              def set_facade
         | 
| 68 | 
            +
                @facade = ZohoSign::Document::Facade.new(response.body['requests'])
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::DeleteService < ZohoSign::BaseService
         | 
| 4 | 
            +
              attr_reader :id
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              validates :id, presence: true
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def initialize(id:)
         | 
| 9 | 
            +
                @id = id
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              # Delete a document.
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # ==== Examples
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              #   service = ZohoSign::Document::DeleteService.call(id: '')
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              #   service.success? # => true
         | 
| 19 | 
            +
              #   service.errors # => #<ActiveModel::Errors []>
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              #   service.response # => #<Faraday::Response ...>
         | 
| 22 | 
            +
              #   service.response.status # => 200
         | 
| 23 | 
            +
              #   service.response.body # => {}
         | 
| 24 | 
            +
              #
         | 
| 25 | 
            +
              # PUT /api/v1/requests/:id/delete
         | 
| 26 | 
            +
              def call
         | 
| 27 | 
            +
                connection.put("requests/#{id}/delete")
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::Facade
         | 
| 4 | 
            +
              attr_reader :action_time, :actions, :attachment_size, :attachments, :created_time, :description, :document_fields,
         | 
| 5 | 
            +
                :document_ids, :email_reminders, :expire_by, :expiration_days, :folder_id, :folder_name, :in_process, :is_deleted,
         | 
| 6 | 
            +
                :is_expiring, :is_sequential, :modified_time, :notes, :owner_email, :owner_first_name, :owner_id, :owner_last_name,
         | 
| 7 | 
            +
                :reminder_period, :request_id, :request_name, :request_status, :request_type_id, :request_type_name, :self_sign,
         | 
| 8 | 
            +
                :sign_percentage, :sign_submitted_time, :template_ids, :templates_used, :validity, :visible_sign_settings,
         | 
| 9 | 
            +
                :zsdocumentid
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def initialize(hash)
         | 
| 12 | 
            +
                @action_time           = hash['action_time']
         | 
| 13 | 
            +
                @actions               = hash['actions']
         | 
| 14 | 
            +
                @attachment_size       = hash['attachment_size']
         | 
| 15 | 
            +
                @attachments           = hash['attachments']
         | 
| 16 | 
            +
                @created_time          = hash['created_time']
         | 
| 17 | 
            +
                @description           = hash['description']
         | 
| 18 | 
            +
                @document_fields       = hash['document_fields']
         | 
| 19 | 
            +
                @document_ids          = hash['document_ids']
         | 
| 20 | 
            +
                @email_reminders       = hash['email_reminders']
         | 
| 21 | 
            +
                @expire_by             = hash['expire_by']
         | 
| 22 | 
            +
                @expiration_days       = hash['expiration_days']
         | 
| 23 | 
            +
                @folder_id             = hash['folder_id']
         | 
| 24 | 
            +
                @folder_name           = hash['folder_name']
         | 
| 25 | 
            +
                @in_process            = hash['in_process']
         | 
| 26 | 
            +
                @is_deleted            = hash['is_deleted']
         | 
| 27 | 
            +
                @is_expiring           = hash['is_expiring']
         | 
| 28 | 
            +
                @is_sequential         = hash['is_sequential']
         | 
| 29 | 
            +
                @modified_time         = hash['modified_time']
         | 
| 30 | 
            +
                @notes                 = hash['notes']
         | 
| 31 | 
            +
                @owner_email           = hash['owner_email']
         | 
| 32 | 
            +
                @owner_first_name      = hash['owner_first_name']
         | 
| 33 | 
            +
                @owner_id              = hash['owner_id']
         | 
| 34 | 
            +
                @owner_last_name       = hash['owner_last_name']
         | 
| 35 | 
            +
                @reminder_period       = hash['reminder_period']
         | 
| 36 | 
            +
                @request_id            = hash['request_id']
         | 
| 37 | 
            +
                @request_name          = hash['request_name']
         | 
| 38 | 
            +
                @request_status        = hash['request_status']
         | 
| 39 | 
            +
                @request_type_id       = hash['request_type_id']
         | 
| 40 | 
            +
                @request_type_name     = hash['request_type_name']
         | 
| 41 | 
            +
                @self_sign             = hash['self_sign']
         | 
| 42 | 
            +
                @sign_percentage       = hash['sign_percentage']
         | 
| 43 | 
            +
                @sign_submitted_time   = hash['sign_submitted_time']
         | 
| 44 | 
            +
                @template_ids          = hash['template_ids']
         | 
| 45 | 
            +
                @templates_used        = hash['templates_used']
         | 
| 46 | 
            +
                @validity              = hash['validity']
         | 
| 47 | 
            +
                @visible_sign_settings = hash['visible_sign_settings']
         | 
| 48 | 
            +
                @zsdocumentid          = hash['zsdocumentid']
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::GetService < ZohoSign::BaseService
         | 
| 4 | 
            +
              attr_reader :id
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              after_call :set_facade
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              delegate_missing_to :@facade
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              validates :id, presence: true
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def initialize(id: nil)
         | 
| 13 | 
            +
                @id = id
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              # Get a document.
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # ==== Examples
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              #   service = ZohoSign::Document::GetService.call(id: '')
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              #   service.success? # => true
         | 
| 23 | 
            +
              #   service.errors # => #<ActiveModel::Errors []>
         | 
| 24 | 
            +
              #
         | 
| 25 | 
            +
              #   service.response # => #<Faraday::Response ...>
         | 
| 26 | 
            +
              #   service.response.status # => 200
         | 
| 27 | 
            +
              #   service.response.body # => {}
         | 
| 28 | 
            +
              #
         | 
| 29 | 
            +
              #   service.facade # => #<ZohoSign::Document::Facade ...>
         | 
| 30 | 
            +
              #   service.facade.request_name
         | 
| 31 | 
            +
              #   service.request_name
         | 
| 32 | 
            +
              #
         | 
| 33 | 
            +
              # GET /api/v1/requests/:id
         | 
| 34 | 
            +
              def call
         | 
| 35 | 
            +
                connection.get("requests/#{id}")
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              private
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def set_facade
         | 
| 41 | 
            +
                @facade = ZohoSign::Document::Facade.new(response.body['requests'])
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| @@ -0,0 +1,98 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class ZohoSign::Document::ListService < ZohoSign::BaseService
         | 
| 4 | 
            +
              SORT_COLUMNS = %w[request_name folder_name owner_full_name recipient_email form_name created_time].freeze
         | 
| 5 | 
            +
              SORT_ORDERS  = %w[ASC DESC].freeze
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              include Enumerable
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              attr_reader :limit, :offset, :sort_column, :sort_order, :search_columns
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              validates :limit, presence: true, numericality: { greater_than_or_equal_to: 1 }
         | 
| 12 | 
            +
              validates :sort_order, inclusion: { in: SORT_ORDERS, message: "Sort order must be one of #{SORT_ORDERS.join(', ')}" }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              validates :sort_column, inclusion: {
         | 
| 15 | 
            +
                in:      SORT_COLUMNS,
         | 
| 16 | 
            +
                message: "Sort column must be one of #{SORT_COLUMNS.join(', ')}"
         | 
| 17 | 
            +
              }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              validate do
         | 
| 20 | 
            +
                next if search_columns.empty?
         | 
| 21 | 
            +
                next if (SORT_COLUMNS | search_columns.keys.map(&:to_s)).size == SORT_COLUMNS.size
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                errors.add(:search_columns, "keys must be one of #{SORT_COLUMNS.join(', ')}")
         | 
| 24 | 
            +
                throw :abort
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              def initialize(limit: Float::INFINITY, offset: 1, sort_column: 'created_time', sort_order: 'DESC', search_columns: {})
         | 
| 28 | 
            +
                @limit          = limit
         | 
| 29 | 
            +
                @offset         = offset
         | 
| 30 | 
            +
                @sort_column    = sort_column
         | 
| 31 | 
            +
                @sort_order     = sort_order
         | 
| 32 | 
            +
                @search_columns = search_columns
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # List documents.
         | 
| 36 | 
            +
              #
         | 
| 37 | 
            +
              # ==== Examples
         | 
| 38 | 
            +
              #
         | 
| 39 | 
            +
              #   service = ZohoSign::Document::ListService.call.first
         | 
| 40 | 
            +
              #   service.request_name
         | 
| 41 | 
            +
              #
         | 
| 42 | 
            +
              #   ZohoSign::Document::ListService.call(offset: 11, limit: 10).each { _1 }
         | 
| 43 | 
            +
              #   ZohoSign::Document::ListService.call(sort_column: 'recipient_email', sort_order: 'ASC').each { _1 }
         | 
| 44 | 
            +
              #   ZohoSign::Document::ListService.call(search_columns: { recipient_email: 'eric.cartman@example.com' }).each { _1 }
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
              # GET /api/v1/requests
         | 
| 47 | 
            +
              def call
         | 
| 48 | 
            +
                self
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              def each
         | 
| 52 | 
            +
                return to_enum(:each) unless block_given?
         | 
| 53 | 
            +
                return if invalid?
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                total = 0
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                catch :list_end do
         | 
| 58 | 
            +
                  loop do
         | 
| 59 | 
            +
                    @response = connection.get('requests', data: params.to_json)
         | 
| 60 | 
            +
                    validate(:response)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    unless success?
         | 
| 63 | 
            +
                      raise exception_for(response, errors) if bang?
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                      throw :list_end
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    response.body['requests'].each do |hash|
         | 
| 69 | 
            +
                      yield ZohoSign::Document::Facade.new(hash)
         | 
| 70 | 
            +
                      total += 1
         | 
| 71 | 
            +
                      throw :list_end if total >= limit
         | 
| 72 | 
            +
                    end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    break unless response.body.dig('page_context', 'has_more_rows')
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    @_params[:page_context][:start_index] += max_limit_per_request
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              private
         | 
| 82 | 
            +
             | 
| 83 | 
            +
              def params
         | 
| 84 | 
            +
                @_params ||= {
         | 
| 85 | 
            +
                  page_context: {
         | 
| 86 | 
            +
                    row_count:      max_limit_per_request,
         | 
| 87 | 
            +
                    start_index:    offset,
         | 
| 88 | 
            +
                    search_columns: search_columns,
         | 
| 89 | 
            +
                    sort_column:    sort_column,
         | 
| 90 | 
            +
                    sort_order:     sort_order
         | 
| 91 | 
            +
                  }
         | 
| 92 | 
            +
                }
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              def max_limit_per_request
         | 
| 96 | 
            +
                @_max_limit_per_request ||= limit.infinite? ? 100 : [limit, 100].min
         | 
| 97 | 
            +
              end
         | 
| 98 | 
            +
            end
         |