companies_house_input_gateway 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/base.rb +9 -0
- data/lib/companies_house_input_gateway/client.rb +46 -0
- data/lib/companies_house_input_gateway/config.rb +35 -0
- data/lib/companies_house_input_gateway/constants.rb +21 -0
- data/lib/companies_house_input_gateway/errors/api_error.rb +18 -0
- data/lib/companies_house_input_gateway/errors/companies_house_gateway_error.rb +20 -0
- data/lib/companies_house_input_gateway/errors/invalid_request_error.rb +12 -0
- data/lib/companies_house_input_gateway/errors/invalid_response_error.rb +6 -0
- data/lib/companies_house_input_gateway/form_validator.rb +29 -0
- data/lib/companies_house_input_gateway/forms/form_abstract_builder.rb +61 -0
- data/lib/companies_house_input_gateway/forms/form_company_data_request.rb +20 -0
- data/lib/companies_house_input_gateway/forms/form_confirmation_statement.rb +21 -0
- data/lib/companies_house_input_gateway/forms/form_get_submission_status.rb +21 -0
- data/lib/companies_house_input_gateway/forms/form_returnof_allotment_shares.rb +21 -0
- data/lib/companies_house_input_gateway/forms/form_submission.rb +39 -0
- data/lib/companies_house_input_gateway/middleware/check_response.rb +30 -0
- data/lib/companies_house_input_gateway/request.rb +57 -0
- data/lib/companies_house_input_gateway/requests/abstract_performer.rb +52 -0
- data/lib/companies_house_input_gateway/requests/company_data_request.rb +9 -0
- data/lib/companies_house_input_gateway/requests/confirmation_statement.rb +11 -0
- data/lib/companies_house_input_gateway/requests/get_submission_status.rb +9 -0
- data/lib/companies_house_input_gateway/requests/returnof_allotment_shares.rb +11 -0
- data/lib/companies_house_input_gateway/util.rb +28 -0
- data/lib/companies_house_input_gateway/validations/company_data_request.rb +20 -0
- data/lib/companies_house_input_gateway/validations/confirmation_statement.rb +96 -0
- data/lib/companies_house_input_gateway/validations/form_submission.rb +23 -0
- data/lib/companies_house_input_gateway/validations/get_submission_status.rb +24 -0
- data/lib/companies_house_input_gateway/validations/returnof_allotment_shares.rb +41 -0
- data/lib/companies_house_input_gateway/version.rb +5 -0
- data/lib/companies_house_input_gateway/xml_forms_binder.rb +81 -0
- data/lib/companies_house_input_gateway.rb +76 -0
- data/spec/client_spec.rb +59 -0
- data/spec/companies_house_input_gateway_spec.rb +47 -0
- data/spec/data_samples.rb +147 -0
- data/spec/fixtures/bad_response.xml +35 -0
- data/spec/fixtures/response_company_data_request.xml +330 -0
- data/spec/fixtures/response_confirmation_statement.xml +28 -0
- data/spec/fixtures/response_get_submission_status.xml +40 -0
- data/spec/fixtures/response_returnof_allotment_shares.xml +28 -0
- data/spec/form_validator_spec.rb +61 -0
- data/spec/request_spec.rb +132 -0
- data/spec/spec_helper.rb +32 -0
- metadata +206 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 76d1a45ee9a75590b55377e828568d02003f3f3fe39e912b7dc8cad6e73e305c
|
4
|
+
data.tar.gz: 5fb3eff3d7eb8a43775141f51f7807fc39e258a89f9c93ad33ea118c60848c7e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7f41ea2e376bd5f447b0e137b0fda339ad2a5b12b23514dfe510f647880d66d6f1d4a5ccd0933ec2ff2522484a7e78902d5b1bb4a505257c78e2432283736d5a
|
7
|
+
data.tar.gz: 5e96ab1ab1b0df528c86200d93a1b1e1bc0ab87da230f9f92cbd06cfa66c97d49dd39b40884eeff124af39c7580380dd57e68ad8d030be7f21623e749b12bcd2
|
data/lib/base.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class Client
|
5
|
+
def initialize(config = nil)
|
6
|
+
@config = (config || CompaniesHouseInputGateway.config).clone
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform_check(*args)
|
10
|
+
request = Request.new(connection, @config)
|
11
|
+
request.perform(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :config
|
15
|
+
|
16
|
+
Constants::SUPPORTED_REQUESTS.each do |name|
|
17
|
+
class_eval <<-EOM
|
18
|
+
def #{Util.underscore(name)}(*args)
|
19
|
+
check = CompaniesHouseInputGateway::Requests.const_get(:#{name}).new(self)
|
20
|
+
check.perform(*args)
|
21
|
+
end
|
22
|
+
EOM
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def connection
|
28
|
+
options = {
|
29
|
+
ssl: { verify: false },
|
30
|
+
url: @config[:api_endpoint],
|
31
|
+
headers: {
|
32
|
+
'Accept' => 'application/xml',
|
33
|
+
'User-Agent' => @config[:user_agent]
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
Faraday.new(options) do |c|
|
38
|
+
c.response :check_ch_response unless @config[:raw] # Check XML
|
39
|
+
c.response :xml unless @config[:raw] # Parse response
|
40
|
+
c.response :follow_redirects, limit: 3 # Follow redirect
|
41
|
+
c.response :raise_error # Raise errors
|
42
|
+
c.adapter @config[:adapter]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class Config
|
5
|
+
DEFAULT_OPTIONS = {
|
6
|
+
adapter: Faraday.default_adapter,
|
7
|
+
sender_id: nil,
|
8
|
+
password: nil,
|
9
|
+
email: nil,
|
10
|
+
gateway: nil,
|
11
|
+
raw: false,
|
12
|
+
api_endpoint: 'https://xmlgw.companieshouse.gov.uk/v1-0/xmlgw/Gateway',
|
13
|
+
user_agent: "CompaniesHouseGateway Ruby Gem #{CompaniesHouseInputGateway::VERSION}",
|
14
|
+
open_timeout: 1,
|
15
|
+
timeout: 3
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@config = {}
|
20
|
+
yield self if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](name)
|
24
|
+
@config.fetch(name, DEFAULT_OPTIONS[name])
|
25
|
+
end
|
26
|
+
|
27
|
+
def []=(name, val)
|
28
|
+
@config[name] = val
|
29
|
+
end
|
30
|
+
|
31
|
+
def clone
|
32
|
+
Config.new { |config| @config.each { |k, v| config[k] = v } }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Constants
|
5
|
+
SUPPORTED_REQUESTS = %w[ReturnofAllotmentShares ConfirmationStatement GetSubmissionStatus CompanyDataRequest].freeze
|
6
|
+
|
7
|
+
COUNTRIES = %w[USA IRL DEU FRA ITA ESP PRT NLD POL BEL NOR SWE DNK
|
8
|
+
AUS NZL CAN ZAF AUT HRV CYP CZE EST HUN GRC LTU GBR GB-ENG GB-WLS GB-SCT GB-NIR].freeze
|
9
|
+
|
10
|
+
SPECIAL_FIELDS_MAPPER = {
|
11
|
+
dtr_5_applies: 'DTR5Applies',
|
12
|
+
psc_exempt_as_trading_on_regulated_market: 'PSCExemptAsTradingOnRegulatedMarket',
|
13
|
+
psc_exempt_as_shares_admitted_on_market: 'PSCExemptAsSharesAdmittedOnMarket',
|
14
|
+
psc_exempt_as_trading_on_uk_regulated_market: 'PSCExemptAsTradingOnUKRegulatedMarket',
|
15
|
+
sic_codes: 'SICCodes',
|
16
|
+
sic_code: 'SICCode',
|
17
|
+
presenter_id: 'PresenterID',
|
18
|
+
'SICCode' => 'SICCode'
|
19
|
+
}.freeze
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class APIError < CompaniesHouseGatewayError
|
5
|
+
attr_accessor :error_code
|
6
|
+
|
7
|
+
def initialize(message = nil, error_code = nil, status = nil, response_body = nil)
|
8
|
+
super(message, status, response_body)
|
9
|
+
@error_code = error_code
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
str = super
|
14
|
+
str += " [Error code: #{error_code}]" if error_code
|
15
|
+
str
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class CompaniesHouseGatewayError < StandardError
|
5
|
+
attr_reader :message
|
6
|
+
attr_reader :status
|
7
|
+
attr_reader :response_body
|
8
|
+
|
9
|
+
def initialize(message = nil, status = nil, _response = nil)
|
10
|
+
@message = message
|
11
|
+
@status = status
|
12
|
+
@response_body = response_body
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
status_string = @status.nil? ? '' : "(Status #{@status}) "
|
17
|
+
"#{status_string}#{@message}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class InvalidRequestError < CompaniesHouseGatewayError
|
5
|
+
attr_accessor :param
|
6
|
+
|
7
|
+
def initialize(message = nil, param = nil, status = nil, response_body = nil)
|
8
|
+
super(message, status, response_body)
|
9
|
+
@param = param
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class FormValidator
|
5
|
+
def self.validate(data, request_class)
|
6
|
+
form_validator = new(data, request_class)
|
7
|
+
validation = form_validator.validate_data
|
8
|
+
|
9
|
+
if validation.failure?
|
10
|
+
msg = "#{request_class} - has request parameters error: #{validation.errors.to_hash}"
|
11
|
+
raise InvalidRequestError.new(msg, data)
|
12
|
+
end
|
13
|
+
validation
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(data, request_class)
|
17
|
+
@data = data
|
18
|
+
@request_class = request_class
|
19
|
+
end
|
20
|
+
|
21
|
+
def validate_data
|
22
|
+
Validations.const_get(:"#{request_class}").call(data)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :data, :request_class
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormAbstractBuilder
|
6
|
+
attr_reader :xml, :data
|
7
|
+
|
8
|
+
def initialize(xml: nil, data: {})
|
9
|
+
@xml = xml
|
10
|
+
@data = data
|
11
|
+
end
|
12
|
+
|
13
|
+
def build_form(_request_type, _requested_form = nil)
|
14
|
+
raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_xml_from_incoming_data(data, request_type, parent = nil, first_iteration = false)
|
18
|
+
return if data.to_s.empty?
|
19
|
+
return unless data.is_a?(Hash)
|
20
|
+
|
21
|
+
unless parent
|
22
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
23
|
+
xml.send(request_type, form_namespace) do
|
24
|
+
generate_xml_from_incoming_data(data, request_type, xml)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
return builder
|
29
|
+
end
|
30
|
+
|
31
|
+
if first_iteration
|
32
|
+
request_type = Util.camelize(request_type)
|
33
|
+
parent.send(request_type, form_namespace) do
|
34
|
+
generate_xml_from_incoming_data(data, request_type, parent)
|
35
|
+
end
|
36
|
+
|
37
|
+
return parent
|
38
|
+
end
|
39
|
+
|
40
|
+
data.each do |label, value|
|
41
|
+
label = Constants::SPECIAL_FIELDS_MAPPER[label] || Util.camelize(label)
|
42
|
+
if value.is_a?(Hash)
|
43
|
+
parent.send(label) do
|
44
|
+
generate_xml_from_incoming_data(value, request_type, parent)
|
45
|
+
end
|
46
|
+
|
47
|
+
elsif value.is_a?(Array)
|
48
|
+
value.each do |el|
|
49
|
+
el = { label => el }
|
50
|
+
generate_xml_from_incoming_data(el, request_type, parent)
|
51
|
+
end
|
52
|
+
|
53
|
+
else
|
54
|
+
value = value.is_a?(BigDecimal) ? value.to_f : value
|
55
|
+
parent.send(label, value)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormCompanyDataRequest < FormAbstractBuilder
|
6
|
+
def build_form(request_type, requested_form = nil)
|
7
|
+
generate_xml_from_incoming_data(data, request_type, requested_form, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def form_namespace
|
11
|
+
{
|
12
|
+
|
13
|
+
'xmlns' => 'http://xmlgw.companieshouse.gov.uk',
|
14
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
15
|
+
'xsi:schemaLocation' => 'http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v2-1/schema/CompanyData-v3-4.xsd'
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormConfirmationStatement < FormAbstractBuilder
|
6
|
+
def build_form(request_type, requested_form = nil)
|
7
|
+
generate_xml_from_incoming_data(data, request_type, requested_form, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def form_namespace
|
11
|
+
{
|
12
|
+
|
13
|
+
'xmlns' => 'http://xmlgw.companieshouse.gov.uk',
|
14
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
15
|
+
'xsi:schemaLocation' => 'http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v1-0/schema/forms/ConfirmationStatement-v1-2.xsd'
|
16
|
+
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormGetSubmissionStatus < FormAbstractBuilder
|
6
|
+
def build_form(request_type, requested_form = nil)
|
7
|
+
generate_xml_from_incoming_data(data, request_type, requested_form, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def form_namespace
|
11
|
+
{
|
12
|
+
|
13
|
+
'xmlns' => 'http://xmlgw.companieshouse.gov.uk',
|
14
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
15
|
+
'xsi:schemaLocation' => 'http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v1-0/schema/forms/GetSubmissionStatus-v2-9.xsd'
|
16
|
+
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormReturnofAllotmentShares < FormAbstractBuilder
|
6
|
+
def build_form(request_type, requested_form = nil)
|
7
|
+
generate_xml_from_incoming_data(data, request_type, requested_form, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def form_namespace
|
11
|
+
{
|
12
|
+
|
13
|
+
'xmlns' => 'http://xmlgw.companieshouse.gov.uk',
|
14
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
15
|
+
'xsi:schemaLocation' => 'http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v1-0/schema/forms/ReturnofAllotmentShares-v3-0.xsd'
|
16
|
+
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Forms
|
5
|
+
class FormSubmission < FormAbstractBuilder
|
6
|
+
def build_form(request_type, requested_form = nil)
|
7
|
+
FormValidator.validate(data, Util.demodulize(self.class))
|
8
|
+
|
9
|
+
xml.FormSubmission(submission_namespace) do
|
10
|
+
form_header(xml, request_type, data)
|
11
|
+
xml.DateSigned data[:date_signed] # "2015-07-01"
|
12
|
+
xml.Form do
|
13
|
+
requested_form.build_form(request_type, xml)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def submission_namespace
|
19
|
+
{
|
20
|
+
'xmlns' => 'http://xmlgw.companieshouse.gov.uk/Header',
|
21
|
+
'xmlns:bs' => 'http://xmlgw.companieshouse.gov.uk',
|
22
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
23
|
+
'xsi:schemaLocation' => 'http://xmlgw.companieshouse.gov.uk/Header http://xmlgw.companieshouse.gov.uk/v1-0/schema/forms/FormSubmission-v2-9.xsd'
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def form_header(root_xml, request_type, data)
|
28
|
+
root_xml.FormHeader do
|
29
|
+
root_xml.CompanyNumber data[:company_number]
|
30
|
+
root_xml.CompanyName data[:company_name]
|
31
|
+
root_xml.CompanyAuthenticationCode data[:company_authentication_code]
|
32
|
+
root_xml.PackageReference data[:package_reference]
|
33
|
+
root_xml.FormIdentifier Util.camelize(request_type)
|
34
|
+
root_xml.SubmissionNumber data[:submission_number]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Middleware
|
5
|
+
class CheckResponse < Faraday::Middleware
|
6
|
+
def call(env)
|
7
|
+
@app.call(env).on_complete do |item|
|
8
|
+
check_for_errors(item)
|
9
|
+
response_values(item)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def response_values(env)
|
14
|
+
{ status: env[:status], headers: env[:headers], body: env[:body] }
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_for_errors(env)
|
18
|
+
body = env[:body]['GovTalkMessage']
|
19
|
+
raise InvalidResponseError.new(env[:body], env[:status], env) unless body && body['GovTalkDetails']
|
20
|
+
|
21
|
+
if body['GovTalkDetails']['GovTalkErrors']
|
22
|
+
error = body['GovTalkDetails']['GovTalkErrors'].values.flatten.first
|
23
|
+
raise APIError.new(error['Text'], error['Number'], env[:status], env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Faraday::Response.register_middleware check_ch_response: CheckResponse
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
class Request
|
5
|
+
def initialize(connection, config)
|
6
|
+
@connection = connection
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def perform(request_type, request_data = {}, require_submission_form)
|
11
|
+
xml_form = XmlFormsBinder.new(request_type, @config, request_data)
|
12
|
+
|
13
|
+
request_type = Util.camelize(request_type)
|
14
|
+
unless Constants::SUPPORTED_REQUESTS.include?(request_type)
|
15
|
+
msg = "Unsupported request type #{request_type}"
|
16
|
+
raise CompaniesHouseGatewayError, msg
|
17
|
+
end
|
18
|
+
|
19
|
+
response = @connection.post do |request|
|
20
|
+
request.path = @config[:api_endpoint]
|
21
|
+
request_body = xml_form.build_request_xml(require_submission_form).to_s
|
22
|
+
if defined?(Rails)
|
23
|
+
Rails.logger.tagged('CompaniesHouseInputGateway', 'XmlRequest') do
|
24
|
+
Rails.logger.info xml_data: request_body
|
25
|
+
end
|
26
|
+
end
|
27
|
+
request.body = request_body
|
28
|
+
request.options.open_timeout = @config[:open_timeout]
|
29
|
+
request.options.timeout = @config[:timeout]
|
30
|
+
end
|
31
|
+
|
32
|
+
xml_response = @config[:raw] ? response : response.body
|
33
|
+
if defined?(Rails)
|
34
|
+
Rails.logger.tagged('CompaniesHouseInputGateway', 'XmlResponse') do
|
35
|
+
Rails.logger.info xml_data: xml_response
|
36
|
+
end
|
37
|
+
end
|
38
|
+
xml_response
|
39
|
+
rescue Faraday::ClientError => e
|
40
|
+
if e.response.nil?
|
41
|
+
raise CompaniesHouseGatewayError
|
42
|
+
else
|
43
|
+
raise CompaniesHouseGatewayError.new(e.response[:body],
|
44
|
+
e.response[:status],
|
45
|
+
e.response)
|
46
|
+
end
|
47
|
+
rescue Faraday::ServerError => e
|
48
|
+
raise CompaniesHouseGatewayError.new(e.response[:body],
|
49
|
+
e.response[:status],
|
50
|
+
e.response)
|
51
|
+
rescue Faraday::ParsingError => e
|
52
|
+
raise CompaniesHouseGatewayError.new(e.response[:body],
|
53
|
+
e.response[:status],
|
54
|
+
e.response)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Requests
|
5
|
+
module AbstractPerformer
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(client)
|
11
|
+
@client = client
|
12
|
+
end
|
13
|
+
|
14
|
+
def perform(data = {})
|
15
|
+
require_submission_form = self.class.submission_form
|
16
|
+
validate_params(data, Util.demodulize(self.class))
|
17
|
+
check_type = Util.underscore(Util.demodulize(self.class))
|
18
|
+
response = @client.perform_check(check_type, data, require_submission_form)
|
19
|
+
|
20
|
+
@client.config[:raw] ? response : response_body(response)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def validate_params(data, request_class)
|
26
|
+
FormValidator.validate(data[:request_data], request_class)
|
27
|
+
end
|
28
|
+
|
29
|
+
def response_body(response)
|
30
|
+
body = response['GovTalkMessage']['Body']
|
31
|
+
|
32
|
+
return response if body.nil?
|
33
|
+
|
34
|
+
body[Util.demodulize(self.class)] || body.dig('SubmissionStatus', 'Status') || body['CompanyData']
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
def require_submission_form(value)
|
39
|
+
unless [true, false].include?(value)
|
40
|
+
raise ArgumentError, "The method #{__method__} in called in accepts only Boolean true, false values"
|
41
|
+
end
|
42
|
+
|
43
|
+
@submission_form = value
|
44
|
+
end
|
45
|
+
|
46
|
+
def submission_form
|
47
|
+
@submission_form
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module CompaniesHouseInputGateway
|
6
|
+
module Util
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def camelize(str)
|
10
|
+
str.to_s.split('_').map(&:capitalize).join
|
11
|
+
end
|
12
|
+
|
13
|
+
def underscore(str)
|
14
|
+
str.to_s.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
15
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
16
|
+
.tr('-', '_')
|
17
|
+
.downcase
|
18
|
+
end
|
19
|
+
|
20
|
+
def demodulize(str)
|
21
|
+
str.to_s.split('::').last
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_digest(value)
|
25
|
+
Digest::MD5.hexdigest(value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CompaniesHouseInputGateway
|
4
|
+
module Validations
|
5
|
+
CompanyDataRequest = Dry::Validation.Schema do
|
6
|
+
configure do
|
7
|
+
config.messages_file = File.join(Base.root, './errors.yml')
|
8
|
+
|
9
|
+
def company_number_format?(value)
|
10
|
+
value ? value.match(/^([\d]*\d){8}$/) : true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
required(:company_number).filled(:str?)
|
15
|
+
required(:company_authentication_code).filled(:str?, size?: 6)
|
16
|
+
required(:made_up_date).filled(:date?)
|
17
|
+
required(:company_number).filled(:company_number_format?)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|