creditario-client 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +14 -0
  4. data/.gitlab-ci.yml +23 -0
  5. data/.rubocop.yml +155 -0
  6. data/.travis.yml +5 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Dockerfile +3 -0
  9. data/Gemfile +8 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +241 -0
  12. data/Rakefile +21 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/creditario-client.gemspec +35 -0
  16. data/lib/creditario/api/create.rb +29 -0
  17. data/lib/creditario/api/delete.rb +25 -0
  18. data/lib/creditario/api/list.rb +27 -0
  19. data/lib/creditario/api/multipart.rb +29 -0
  20. data/lib/creditario/api/request.rb +101 -0
  21. data/lib/creditario/api/retrieve.rb +32 -0
  22. data/lib/creditario/api/update.rb +32 -0
  23. data/lib/creditario/client.rb +183 -0
  24. data/lib/creditario/client/railtie.rb +14 -0
  25. data/lib/creditario/client/version.rb +9 -0
  26. data/lib/creditario/exceptions.rb +121 -0
  27. data/lib/creditario/repositories/applications.rb +50 -0
  28. data/lib/creditario/repositories/attachments.rb +50 -0
  29. data/lib/creditario/repositories/catalogs.rb +59 -0
  30. data/lib/creditario/repositories/contracts.rb +29 -0
  31. data/lib/creditario/repositories/credit_estimates.rb +29 -0
  32. data/lib/creditario/repositories/credits.rb +35 -0
  33. data/lib/creditario/repositories/customers.rb +50 -0
  34. data/lib/creditario/repositories/expenses.rb +41 -0
  35. data/lib/creditario/repositories/incomes.rb +41 -0
  36. data/lib/creditario/repositories/payments.rb +34 -0
  37. data/lib/creditario/repositories/products.rb +38 -0
  38. data/lib/creditario/repositories/references.rb +41 -0
  39. data/lib/creditario/resources/application.rb +27 -0
  40. data/lib/creditario/resources/attachment.rb +19 -0
  41. data/lib/creditario/resources/catalog.rb +35 -0
  42. data/lib/creditario/resources/contract.rb +21 -0
  43. data/lib/creditario/resources/credit.rb +19 -0
  44. data/lib/creditario/resources/credit_estimate.rb +19 -0
  45. data/lib/creditario/resources/customer.rb +25 -0
  46. data/lib/creditario/resources/expense.rb +19 -0
  47. data/lib/creditario/resources/income.rb +19 -0
  48. data/lib/creditario/resources/payment.rb +21 -0
  49. data/lib/creditario/resources/product.rb +21 -0
  50. data/lib/creditario/resources/reference.rb +19 -0
  51. data/lib/creditario/resources/resource.rb +96 -0
  52. data/lib/creditario/utils/paginated_collection.rb +45 -0
  53. data/lib/creditario/utils/resources_collection.rb +35 -0
  54. data/lib/generators/creditario/USAGE +13 -0
  55. data/lib/generators/creditario/install_generator.rb +17 -0
  56. data/lib/generators/creditario/templates/creditario.yml +12 -0
  57. data/lib/generators/creditario/templates/initializer.rb +4 -0
  58. data/rakelib/fixture_api_response.rake +10 -0
  59. data/rakelib/fixture_api_response.rb +114 -0
  60. metadata +214 -0
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "creditario/client"
4
+ require "rails"
5
+
6
+ module Creditario # :nodoc:
7
+ class Railtie < Rails::Railtie # :nodoc:
8
+ railtie_name :creditario
9
+
10
+ generators do
11
+ require_relative "../../generators/creditario/install_generator"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario
4
+ module Client
5
+ ###
6
+ # Versión actual de la gema *creditario-client*
7
+ VERSION = "0.0.1.alpha"
8
+ end
9
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario
4
+ ###
5
+ # === Creditario::Exceptions
6
+ #
7
+ # Modulo para definir todas las excepciones reconocidas para esta gema.
8
+ module Exceptions
9
+ ###
10
+ # Excepción arrojada cuando se intenta hacer un request sin haber
11
+ # especificado un api_key.
12
+ #
13
+ # Para arreglar este error es necesario definir el api_key de la siguiente manera:
14
+ #
15
+ # Creditario::Client.api_key = "tu-api-key"
16
+ class MissingAPIKeyError < StandardError
17
+ def initialize(msg = "No API Key Provided") # :nodoc:
18
+ super
19
+ end
20
+ end
21
+
22
+ ###
23
+ # Excepción arrojada cuando se intenta acceder a algún recurso
24
+ # que no existe en creditar.io
25
+ #
26
+ # Si se rescata esta excepción, se puede acceder a su atributo *server_response*
27
+ # para obtener la respuesta de creditar.io
28
+ class ResourceNotFoundError < StandardError
29
+ ###
30
+ # Contiene los detalles de la respuesta de creditar.io
31
+ attr_reader :server_response
32
+
33
+ def initialize(response) # :nodoc:
34
+ @server_response = Oj.load(response.body)
35
+ super(msg = "The resource does not exist")
36
+ end
37
+ end
38
+
39
+ ###
40
+ # Excepción arrojada cuando durante la creación o actualización
41
+ # de algún recurso, se envían datos inválidos a creditar.io
42
+ #
43
+ # Si se rescata esta excepción, se puede acceder a su atributo *server_response*
44
+ # para obtener la respuesta de creditar.io
45
+ class UnprocessableEntityError < StandardError
46
+ ###
47
+ # Contiene los detalles de la respuesta de creditar.io
48
+ attr_reader :server_response
49
+
50
+ def initialize(response) # :nodoc:
51
+ @server_response = Oj.load(response.body)
52
+ super(msg = "There are some validation issues")
53
+ end
54
+ end
55
+
56
+ ###
57
+ # Excepción arrojada cuando existen restricciones para crear o modificar un
58
+ # recurso en creditar.io
59
+ #
60
+ # Si se rescata esta excepción, se puede acceder a su atributo *server_response*
61
+ # para obtener la respuesta de creditar.io
62
+ class ForbiddenError < StandardError
63
+ ###
64
+ # Contiene los detalles de la respuesta de creditar.io
65
+ attr_reader :server_response
66
+
67
+ def initialize(response) # :nodoc:
68
+ @server_response = Oj.load(response.body)
69
+ super(msg = "There are restrictions on the resource")
70
+ end
71
+ end
72
+
73
+ ###
74
+ # Excepción arrojada cuando se intenta hacer un request con una API Key inválida.
75
+ # Para arreglar este error es necesario definir la API Key correcta.
76
+ #
77
+ # Creditario::Client.api_key = "tu-api-key"
78
+ class InvalidAPIKeyError < StandardError
79
+ def initialize(msg = "The API Key provided is invalid or it has expired.") # :nodoc:
80
+ super
81
+ end
82
+ end
83
+
84
+ ###
85
+ # Excepción arrojada cuando no se puede establecer comunicación con el servidor
86
+ # de la API de creditar.io
87
+ class APINotReachableError < StandardError
88
+ TECHNICAL_MESSAGE = "Technical message -> " # :nodoc:
89
+ HUMAN_MESSAGE = "Looks like the API for creditar.io is down.\n" # :nodoc:
90
+
91
+ def initialize(message) # :nodoc:
92
+ super(msg = "#{HUMAN_MESSAGE}#{TECHNICAL_MESSAGE}#{message}")
93
+ end
94
+ end
95
+
96
+ ###
97
+ # Excepción arrojada cuando el servidor de creditar.io regresa una respuesta que no es JSON
98
+ # Probablemente estás mandando un header incorrecto.
99
+ class InvalidResponseBodyError < StandardError
100
+ TECHNICAL_MESSAGE = "Technical message -> " # :nodoc:
101
+ HUMAN_MESSAGE = "The API responded with something that is not JSON, is your request ok?\n" # :nodoc:
102
+
103
+ def initialize(message) # :nodoc:
104
+ super(msg = "#{HUMAN_MESSAGE}#{TECHNICAL_MESSAGE}#{message}")
105
+ end
106
+ end
107
+
108
+ ###
109
+ # Excepción arrojada cuando el servidor de creditar.io se tarda mucho en responder.
110
+ # O cuando se pierde la conexión de internet a medio request.
111
+ # Probablemente reintentando la petición se solucione el problema.
112
+ class APIBusyError < StandardError
113
+ TECHNICAL_MESSAGE = "Technical message -> " # :nodoc:
114
+ HUMAN_MESSAGE = "The communication with the API has timed out.\n" # :nodoc:
115
+
116
+ def initialize(message) # :nodoc:
117
+ super(msg = "#{HUMAN_MESSAGE}#{TECHNICAL_MESSAGE}#{message}")
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Applications
6
+ #
7
+ # Repositorio de Solicitudes de Crédito, permite realizar las siguientes operaciones
8
+ # sobre Solicitudes de Crédito de creditar.io
9
+ #
10
+ # - Obtener todas las Solicitudes:
11
+ #
12
+ # result = Creditario::Applications.list
13
+ # => Creditario::PaginatedCollection
14
+ #
15
+ # result.items
16
+ # => [Creditario::Application, Creditario::Application, ...]
17
+ #
18
+ # - Obtener una Solicitud en especifico:
19
+ #
20
+ # Creditario::Applications.retrieve("0b19e3b6-9fae-40e1-a7c2-f2db1cae8a5a")
21
+ # => Creditario::Application
22
+ #
23
+ # - Crear una Solicitud:
24
+ #
25
+ # result = Creditario::Applications.create(customer_id: "2e9d05b8-2180-4779-bab6-bdfd41d1569f", product_id: "c005b7f7-a44a-4ec0-bf7f-73d15d806fd9")
26
+ # => Creditario::Application
27
+ #
28
+ # - Actualizar una Solicitud:
29
+ #
30
+ # result = Creditario::Applications.update("c0324939-0802-41b2-b81e-04e8982270ec", { street: "Avenida Siempre Viva", exterior_number: "742" })
31
+ # => Creditario::Application
32
+ module Applications
33
+ extend Creditario::API::List
34
+ extend Creditario::API::Retrieve
35
+ extend Creditario::API::Create
36
+ extend Creditario::API::Update
37
+
38
+ ###
39
+ # Path de la API donde se ejecutan las peticiones para Solicitudes.
40
+ def self.resource_path
41
+ "/applications"
42
+ end
43
+
44
+ ###
45
+ # Clase a utilizar para transformar las respuestas de la API.
46
+ def self.resource_class
47
+ Creditario::Application
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Attachments
6
+ #
7
+ # Repositorio de Archivos, permite realizar las siguientes operaciones
8
+ # sobre Archivos para Solicitudes de Crédito y Clientes de creditario.io
9
+ #
10
+ # - Obtener un Archivo en especifico:
11
+ #
12
+ # Creditario::Attachments.retrieve("aabfd43d-6f63-44dd-b7d9-9352a101d11e")
13
+ # => Creditario::Attachment
14
+ #
15
+ # - Crear un Archivo:
16
+ #
17
+ # Nota: Para el envío del archivo es necesario utilizar la clase +UploadIO.new+.
18
+ #
19
+ # file_upload_io = UploadIO.new(File.new("@/path/to/a/file.jpg"), "image/jpg", "file.jpg")
20
+ #
21
+ # result = Creditario::Attachments.create(
22
+ # attachmentable_type: "credit_application",
23
+ # attachmentable_id: "4e9ece5f-d4e6-4fcd-bc9b-b437bef23ceb",
24
+ # attachment_type: "INE",
25
+ # file: file_upload_io
26
+ # )
27
+ # => Creditario::Attachment
28
+ #
29
+ # - Eliminar un Archivo:
30
+ #
31
+ # result = Creditario::Attachments.delete("aabfd43d-6f63-44dd-b7d9-9352a101d11e")
32
+ # => true
33
+ class Attachments
34
+ extend Creditario::API::Multipart
35
+ extend Creditario::API::Retrieve
36
+ extend Creditario::API::Delete
37
+
38
+ ###
39
+ # Path de la API donde se ejecutan las peticiones para Egresos.
40
+ def self.resource_path
41
+ "/attachments"
42
+ end
43
+
44
+ ###
45
+ # Clase a utilizar para transformar las respuestas de la API.
46
+ def self.resource_class
47
+ Creditario::Attachment
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Catalogs
6
+ #
7
+ # Repositorio de Catálogos, permite realizar las siguientes operaciones
8
+ # sobre Catálogos de creditar.io:
9
+ #
10
+ # - Obtener todos los Catálogos disponibles:
11
+ #
12
+ # result = Creditario::Catalogs.list
13
+ # => Creditario::ResourcesCollection
14
+ #
15
+ # result.items
16
+ # => [Creditario::Catalog, Creditario::Catalog, ...]
17
+ #
18
+ # - Obtener los valores de un Catálogo en especifico:
19
+ #
20
+ # Creditario::Catalog.retrieve(resource: "customer", field: "source")
21
+ # => Creditario::ResourcesCollection
22
+ module Catalogs
23
+ extend Creditario::API::List
24
+
25
+ ###
26
+ # Path de la API donde se ejecutan las peticiones para Catálogos
27
+ def self.resource_path
28
+ if caller_locations[0].label == "retrieve"
29
+ "/catalog"
30
+ else
31
+ "/catalogs"
32
+ end
33
+ end
34
+
35
+ ###
36
+ # Clase a utilizar para transformar las respuestas de la API.
37
+ def self.resource_class
38
+ if caller_locations[0].label == "retrieve"
39
+ Creditario::CatalogValue
40
+ else
41
+ Creditario::Catalog
42
+ end
43
+ end
44
+
45
+ ###
46
+ # Método para obtener los valores de un Catálogo, que generalmente son varios.
47
+ # Es por ello que no se extendió el modulo Creditario::API::Retrieve ya que ese está pensado
48
+ # para procesar un solo Recurso a la vez.
49
+ #
50
+ # Los *search_params* necesitan ser **resource** y **field** tal y como se especifica
51
+ # en la descripción del Repositorio Creditario::Catalogs.
52
+ def self.retrieve(**search_params)
53
+ response = API.request(:get, resource_path, search_params)
54
+ ResourcesCollection.new(response, self.resource_class)
55
+ rescue Creditario::Exceptions::ResourceNotFoundError => exception
56
+ exception.server_response
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Contracts
6
+ #
7
+ # Repositorio de Contratos, permite realizar las siguientes operaciones
8
+ # sobre Contratos de creditar.io:
9
+ #
10
+ # - Obtener un Contrato en especifico:
11
+ #
12
+ # Creditario::Contracts.retrieve("c005b7f7-a44a-4ec0-bf7f-73d15d806fd9")
13
+ # => Creditario::Contract
14
+ module Contracts
15
+ extend Creditario::API::Retrieve
16
+
17
+ ###
18
+ # Path de la API donde se ejecutan las peticiones para Contratos.
19
+ def self.resource_path
20
+ "/contracts"
21
+ end
22
+
23
+ ###
24
+ # Clase a utilizar para transformar las respuestas de la API.
25
+ def self.resource_class
26
+ Creditario::Contract
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::CreditEstimates
6
+ #
7
+ # Repositorio de Estimaciones de Crédito, permite obtener una Estimación de Crédito
8
+ # en base a un Producto de creditar.io:
9
+ #
10
+ # - Obtener una Estimación:
11
+ #
12
+ # Creditario::CreditEstimates.retrieve(nil, product_id: "c005b7f7-a44a-4ec0-bf7f-73d15d806fd9", amount_cents: 1000000, installments_number: 12)
13
+ # => Creditario::CreditEstimate
14
+ module CreditEstimates
15
+ extend Creditario::API::Retrieve
16
+
17
+ ###
18
+ # Path de la API donde se ejecutan las peticiones para Estimaciones.
19
+ def self.resource_path
20
+ "/credit_estimates"
21
+ end
22
+
23
+ ###
24
+ # Clase a utilizar para transformar las respuestas de la API.
25
+ def self.resource_class
26
+ Creditario::CreditEstimate
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Credits
6
+ #
7
+ # Repositorio de Créditos, permite obtener la lista de Créditos a partir de un Cliente
8
+ # así como obtener un Crédito a partir de su ID.
9
+ #
10
+ # - Listar Créditos por Cliente:
11
+ #
12
+ # Creditario::Credits.list(customer_id: "2e9d05b8-2180-4779-bab6-bdfd41d1569f")
13
+ # => Creditario::ResourcesCollection
14
+ #
15
+ # - Obtener un Crédito:
16
+ #
17
+ # Creditario::Credits.retrieve("636264b1-dc0d-453e-8804-4ac451e1dbd5")
18
+ # => Creditario::Credit
19
+ module Credits
20
+ extend Creditario::API::List
21
+ extend Creditario::API::Retrieve
22
+
23
+ ###
24
+ # Path de la API donde se ejecutan las peticiones para Créditos.
25
+ def self.resource_path
26
+ "/credits"
27
+ end
28
+
29
+ ###
30
+ # Clase a utilizar para transformar las respuestas de la API
31
+ def self.resource_class
32
+ Creditario::Credit
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Creditario # :nodoc:
4
+ ###
5
+ # == Creditario::Customers
6
+ #
7
+ # Repositorio de Clientes, permite realizar las siguientes operaciones
8
+ # sobre Clientes de creditar.io
9
+ #
10
+ # - Obtener todos los Clientes:
11
+ #
12
+ # result = Creditario::Customers.list
13
+ # => Creditario::PaginatedCollection
14
+ #
15
+ # result.items
16
+ # => [Creditario::Customer, Creditario::Customer, ...]
17
+ #
18
+ # - Obtener un Cliente en especifico:
19
+ #
20
+ # Creditario::Customers.retrieve("2e9d05b8-2180-4779-bab6-bdfd41d1569f")
21
+ # => Creditario::Customer
22
+ #
23
+ # - Crear un Cliente:
24
+ #
25
+ # result = Creditario::Customers.create(email: "karla@quieredinero.com")
26
+ # => Creditario::Customer
27
+ #
28
+ # - Actualizar un cliente:
29
+ #
30
+ # result = Creditario::Customers.update("2e9d05b8-2180-4779-bab6-bdfd41d1569f", { email: "karina@necesitadinero.com" })
31
+ # => Creditario::Customer
32
+ module Customers
33
+ extend Creditario::API::List
34
+ extend Creditario::API::Retrieve
35
+ extend Creditario::API::Create
36
+ extend Creditario::API::Update
37
+
38
+ ###
39
+ # Path de la API donde se ejecutan las peticiones para Clientes.
40
+ def self.resource_path
41
+ "/customers"
42
+ end
43
+
44
+ ###
45
+ # Clase a utilizar para transformar las respuestas de la API
46
+ def self.resource_class
47
+ Creditario::Customer
48
+ end
49
+ end
50
+ end