class SmileIdentityCore::WebApi
Public Class Methods
new(partner_id, default_callback, api_key, sid_server)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 13 def initialize(partner_id, default_callback, api_key, sid_server) @partner_id = partner_id.to_s @callback_url = default_callback @api_key = api_key @sid_server = sid_server if !(sid_server =~ URI::regexp) sid_server_mapping = { 0 => 'https://3eydmgh10d.execute-api.us-west-2.amazonaws.com/test', 1 => 'https://la7am6gdm8.execute-api.us-west-2.amazonaws.com/prod' } @url = sid_server_mapping[sid_server.to_i] else @url = sid_server end end
Public Instance Methods
get_job_status(partner_params, options)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 56 def get_job_status(partner_params, options) partner_params = symbolize_keys partner_params @timestamp = Time.now.to_i user_id = partner_params[:user_id] job_id = partner_params[:job_id] utilities = SmileIdentityCore::Utilities.new(@partner_id, @api_key, @sid_server) return utilities.get_job_status(user_id, job_id, options); end
id_info=(id_info)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 103 def id_info=(id_info) updated_id_info = id_info if updated_id_info.nil? updated_id_info = {} end # if it doesnt exist, set it false if(!updated_id_info.key?(:entered) || id_info[:entered].empty?) updated_id_info[:entered] = "false" end # if it's a boolean if(!!updated_id_info[:entered] == updated_id_info[:entered]) updated_id_info[:entered] = id_info[:entered].to_s end if updated_id_info[:entered] && updated_id_info[:entered] == 'true' [:country, :id_type, :id_number].each do |key| unless id_info[key] && !id_info[key].nil? && !id_info[key].empty? raise ArgumentError.new("Please make sure that #{key.to_s} is included in the id_info") end end end @id_info = updated_id_info end
images=(images)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 85 def images=(images) if images == nil raise ArgumentError.new('Please ensure that you send through image details') end if !images.is_a?(Array) raise ArgumentError.new('Image details needs to be an array') end # all job types require atleast a selfie if images.length == 0 || images.none? {|h| h[:image_type_id] == 0 || h[:image_type_id] == 2 } raise ArgumentError.new('You need to send through at least one selfie image') end @images = images.map { |image| symbolize_keys image } end
options=(options)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 132 def options=(options) updated_options = options if updated_options.nil? updated_options = {} end [:optional_callback, :return_job_status, :return_image_links, :return_history].map do |key| if key != :optional_callback updated_options[key] = check_boolean(key, options) else updated_options[key] = check_string(key, options) end end @options = updated_options end
partner_params=(partner_params)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 67 def partner_params=(partner_params) if partner_params == nil raise ArgumentError.new('Please ensure that you send through partner params') end if !partner_params.is_a?(Hash) raise ArgumentError.new('Partner params needs to be a hash') end [:user_id, :job_id, :job_type].each do |key| unless partner_params[key] && !partner_params[key].nil? && !(partner_params[key].empty? if partner_params[key].is_a?(String)) raise ArgumentError.new("Please make sure that #{key.to_s} is included in the partner params") end end @partner_params = partner_params end
submit_job(partner_params, images, id_info, options)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 30 def submit_job(partner_params, images, id_info, options) self.partner_params = symbolize_keys partner_params if @partner_params[:job_type].to_i == 5 return SmileIdentityCore::IDApi.new(@partner_id, @api_key, @sid_server).submit_job(partner_params, id_info) end self.images = images @timestamp = Time.now.to_i self.id_info = symbolize_keys id_info self.options = symbolize_keys options if @options[:optional_callback] && @options[:optional_callback].length > 0 @callback_url = @options[:optional_callback] end if @partner_params[:job_type].to_i == 1 validate_enroll_with_id end validate_return_data return setup_requests end
Private Instance Methods
check_boolean(key, obj)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 168 def check_boolean(key, obj) if (!obj || !obj[key]) return false end if !!obj[key] != obj[key] raise ArgumentError.new("#{key} needs to be a boolean") end return obj[key] end
check_string(key, obj)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 180 def check_string(key, obj) if (!obj || !obj[key]) return '' else return obj[key] end end
configure_image_payload()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 277 def configure_image_payload @images.map { |i| if isImageFile?i[:image_type_id] { image_type_id: i[:image_type_id], image: '', file_name: File.basename(i[:image]) } else { image_type_id: i[:image_type_id], image: i[:image], file_name: '' } end } end
configure_info_json(server_information)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 239 def configure_info_json(server_information) info = { "package_information": { "apiVersion": { "buildNumber": 0, "majorVersion": 2, "minorVersion": 0 }, "language": "ruby" }, "misc_information": { "sec_key": @sec_key, "retry": "false", "partner_params": @partner_params, "timestamp": @timestamp, "file_name": "selfie.zip", # figure out what to do here "smile_client_id": @partner_id, "callback_url": @callback_url, "userData": { # TO ASK what goes here "isVerifiedProcess": false, "name": "", "fbUserID": "", "firstName": "Bill", "lastName": "", "gender": "", "email": "", "phone": "", "countryCode": "+", "countryName": "" } }, "id_info": @id_info, "images": configure_image_payload, "server_information": server_information } return info end
configure_prep_upload_json()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 192 def configure_prep_upload_json body = { file_name: 'selfie.zip', timestamp: @timestamp, sec_key: determine_sec_key, smile_client_id: @partner_id, partner_params: @partner_params, model_parameters: {}, # what is this for callback_url: @callback_url } JSON.generate(body) end
determine_sec_key()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 188 def determine_sec_key @sec_key = SmileIdentityCore::Signature.new(@partner_id, @api_key).generate_sec_key(@timestamp)[:sec_key] end
isImageFile?(type)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 295 def isImageFile?type type.to_i == 0 || type.to_i == 1 end
query_job_status(counter=0)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 353 def query_job_status(counter=0) counter < 4 ? (sleep 2) : (sleep 6) counter += 1 response = @utilies_connection.get_job_status(@partner_params[:user_id], @partner_params[:job_id], @options) if response && (response['job_complete'] == true || counter == 20) return response else return query_job_status(counter) end end
setup_requests()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 207 def setup_requests url = "#{@url}/upload" request = Typhoeus::Request.new( url, method: 'POST', headers: {'Content-Type'=> "application/json"}, body: configure_prep_upload_json ) request.on_complete do |response| if response.success? prep_upload_response = JSON.parse(response.body) info_json = configure_info_json(prep_upload_response) file_upload_response = upload_file(prep_upload_response['upload_url'], info_json, prep_upload_response['smile_job_id']) return file_upload_response elsif response.timed_out? raise "#{response.code.to_s}: #{response.body}" elsif response.code == 0 # Could not get an http response, something's wrong. raise "#{response.code.to_s}: #{response.body}" else # Received a non-successful http response. raise "#{response.code.to_s}: #{response.body}" end end request.run end
symbolize_keys(params)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 152 def symbolize_keys params (params.is_a?(Hash)) ? Hash[params.map{ |k, v| [k.to_sym, v] }] : params end
upload_file(url, info_json, smile_job_id)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 316 def upload_file(url, info_json, smile_job_id) file = zip_up_file(info_json) file.rewind request = Typhoeus::Request.new( url, method: 'PUT', headers: {'Content-Type'=> "application/zip"}, body: file.read, ) request.on_complete do |response| if response.success? if @options[:return_job_status] @utilies_connection = SmileIdentityCore::Utilities.new(@partner_id, @api_key, @sid_server) job_response = query_job_status job_response["success"] = true job_response["smile_job_id"] = smile_job_id return job_response else return {success: true, smile_job_id: smile_job_id}.to_json end elsif response.timed_out? raise " #{response.code.to_s}: #{response.body}" elsif response.code == 0 # Could not get an http response, something's wrong. raise " #{response.code.to_s}: #{response.body}" else # Received a non-successful http response. raise " #{response.code.to_s}: #{response.body}" end end request.run end
validate_enroll_with_id()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 162 def validate_enroll_with_id if(((@images.none? {|h| h[:image_type_id] == 1 || h[:image_type_id] == 3 }) && @id_info[:entered] != 'true')) raise ArgumentError.new("You are attempting to complete a job type 1 without providing an id card image or id info") end end
validate_return_data()
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 156 def validate_return_data if (!@callback_url || @callback_url.empty?) && !@options[:return_job_status] raise ArgumentError.new("Please choose to either get your response via the callback or job status query") end end
zip_up_file(info_json)
click to toggle source
# File lib/smile-identity-core/web_api.rb, line 299 def zip_up_file(info_json) # https://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/ Zip::OutputStream.write_buffer do |zos| zos.put_next_entry('info.json') zos.puts JSON.pretty_generate(info_json) if @images.length > 0 @images.each do |img| if img[:image_type_id] == 0 || img[:image_type_id] == 1 zos.put_next_entry(File.basename(img[:image])) zos.print IO.read(img[:image]) end end end end end