55require 'uri'
66
77module Mailtrap
8- class Client
8+ class Client # rubocop:disable Metrics/ClassLength
99 SENDING_API_HOST = 'send.api.mailtrap.io'
1010 BULK_SENDING_API_HOST = 'bulk.api.mailtrap.io'
1111 SANDBOX_API_HOST = 'sandbox.api.mailtrap.io'
12+ TEMPLATES_API_HOST = 'mailtrap.io'
1213 API_PORT = 443
1314
1415 attr_reader :api_key , :api_host , :api_port , :bulk , :sandbox , :inbox_id
@@ -55,6 +56,27 @@ def send(mail)
5556 handle_response ( response )
5657 end
5758
59+ def list_templates ( account_id :)
60+ template_request ( :get , "/api/accounts/#{ account_id } /email_templates" )
61+ end
62+
63+ def create_template ( account_id :, **params )
64+ template_request ( :post , "/api/accounts/#{ account_id } /email_templates" , params )
65+ end
66+
67+ def update_template ( account_id :, email_template_id :, **params )
68+ template_request (
69+ :patch ,
70+ "/api/accounts/#{ account_id } /email_templates/#{ email_template_id } " ,
71+ params
72+ )
73+ end
74+
75+ def destroy_template ( account_id :, email_template_id :)
76+ template_request ( :delete , "/api/accounts/#{ account_id } /email_templates/#{ email_template_id } " )
77+ true
78+ end
79+
5880 private
5981
6082 def select_api_host ( bulk :, sandbox :)
@@ -77,6 +99,10 @@ def http_client
7799 @http_client ||= Net ::HTTP . new ( api_host , api_port ) . tap { |client | client . use_ssl = true }
78100 end
79101
102+ def template_http_client
103+ @template_http_client ||= Net ::HTTP . new ( TEMPLATES_API_HOST , api_port ) . tap { |client | client . use_ssl = true }
104+ end
105+
80106 def post_request ( path , body )
81107 request = Net ::HTTP ::Post . new ( path )
82108 request . body = body
@@ -113,5 +139,42 @@ def handle_response(response) # rubocop:disable Metrics/AbcSize, Metrics/Cycloma
113139 def json_response ( body )
114140 JSON . parse ( body , symbolize_names : true )
115141 end
142+
143+ def template_request ( http_method , path , body = nil ) # rubocop:disable Metrics/MethodLength
144+ request_class = {
145+ get : Net ::HTTP ::Get ,
146+ post : Net ::HTTP ::Post ,
147+ patch : Net ::HTTP ::Patch ,
148+ delete : Net ::HTTP ::Delete
149+ } . fetch ( http_method )
150+
151+ request = request_class . new ( path )
152+ request [ 'Authorization' ] = "Bearer #{ api_key } "
153+ request [ 'User-Agent' ] = 'mailtrap-ruby (https://github.com/railsware/mailtrap-ruby)'
154+ if body
155+ request [ 'Content-Type' ] = 'application/json'
156+ request . body = JSON . generate ( body )
157+ end
158+
159+ response = template_http_client . request ( request )
160+ handle_template_response ( response )
161+ end # rubocop:enable Metrics/MethodLength
162+
163+ def handle_template_response ( response ) # rubocop:disable Metrics/MethodLength
164+ case response
165+ when Net ::HTTPNoContent
166+ true
167+ when Net ::HTTPSuccess
168+ json_response ( response . body )
169+ when Net ::HTTPUnauthorized
170+ raise Mailtrap ::AuthorizationError , json_response ( response . body ) [ :errors ]
171+ when Net ::HTTPForbidden
172+ raise Mailtrap ::RejectionError , json_response ( response . body ) [ :errors ]
173+ when Net ::HTTPClientError , Net ::HTTPServerError
174+ raise Mailtrap ::Error , json_response ( response . body ) [ :errors ]
175+ else
176+ raise Mailtrap ::Error , [ "unexpected status code=#{ response . code } " ]
177+ end
178+ end # rubocop:enable Metrics/MethodLength
116179 end
117180end
0 commit comments