Class: Swisspost::AddressService

Inherits:
BaseService show all
Defined in:
lib/swisspost/address_service.rb

Defined Under Namespace

Modules: Qualities Classes: Quality, Result

Constant Summary collapse

API_SCOPE =
"DCAPI_ADDRESS_VALIDATE"
API_URL =
"https://dcapi.api.post.ch/address/v1"
VALIDATE_VALIDATOR =
Dry::Validation.Contract do
  params do
    required(:address).value(Types::Instance(Model::Address))
  end
end

Instance Method Summary collapse

Methods inherited from BaseService

#access_token, #httpx_apikey, #httpx_oauth

Instance Method Details

#validate(attributes) ⇒ Object

Raises:

  • (ValidationError)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/swisspost/address_service.rb', line 17

def validate(attributes)
  path = "/addresses/validation"

  result = VALIDATE_VALIDATOR.call(attributes)
  raise ValidationError, result.errors.to_h.inspect if result.failure?

  validated_data = result.to_h
  address = validated_data[:address]

  response = httpx.post(API_URL + path, json: {
    addressee: {
      firstName: address.first_name,
      lastName: address.last_name,
    }, geographicalLocation: {
      house: {
        street: address.street,
        houseNumber: address.house_number,
      },
      zip: {
        zip: address.zip,
        city: address.city,
      }
    },
    fullValidation: true,
  })

  response.raise_for_status

  result = response.json

  address = Address.new(
    first_name: result[:addressee][:first_name],
    last_name: result[:addressee][:last_name],
    street: result[:geographical_location][:house][:street],
    house_number: result[:geographical_location][:house][:house_number],
    zip: result[:geographical_location][:zip][:zip],
    city: result[:geographical_location][:zip][:city],
  )

  quality = Qualities.for(result[:quality])

  return Result.new(
    address: address,
    quality: quality,
  )
end