salestation 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/lib/salestation/web.rb +3 -0
- data/lib/salestation/web/input_validator.rb +25 -0
- data/lib/salestation/web/input_validators/accept_header.rb +32 -0
- data/lib/salestation/web/input_validators/content_type_header.rb +35 -0
- data/salestation.gemspec +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fcf3aa0603e1d5f3d69869ff66efb2dd01b45d59c01fd6fc420ff059a982243
|
4
|
+
data.tar.gz: 5be0e81ae79ab73818e5eca163d2b2519d693f8fcaf4f6e2bf1a0adfa7028046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a62b86a731b21328bc616c5703377edb694d539c0c5677f23a865b2b693346ac850fc9b1a3fdffe75d88e6bab56c22a6bcc4a4710e9407b04c6d65eeec10e8f
|
7
|
+
data.tar.gz: d0a00c8c57fb9c7515532025d54c94e2540bd10c9889afe8788bff1c3b38b097ea300cd268e3ac5436b4d62f94112892fa18fb734173bc5e84d412c61bd1cfbf
|
data/README.md
CHANGED
@@ -98,10 +98,27 @@ end
|
|
98
98
|
post '/hello/:name' do |name|
|
99
99
|
extractor = BodyParamExtractor[:age]
|
100
100
|
.merge(ConstantInput[name: name])
|
101
|
-
.merge(HeadersExtractor[
|
101
|
+
.merge(HeadersExtractor[
|
102
|
+
'accept' => :accept,
|
103
|
+
'content-type' => :content_type,
|
104
|
+
'x-my-value' => :my_value
|
105
|
+
])
|
102
106
|
.coerce(age: ->(age) { age.to_s })
|
103
107
|
|
108
|
+
validate_input = Salestation::Web::InputValidator[
|
109
|
+
accept: Salestation::Web::InputValidators::AcceptHeader['application/json', 'application/xml'],
|
110
|
+
content_type: Salestation::Web::InputValidators::ContentTypeHeader['application/json'],
|
111
|
+
my_value: lambda do |my_value|
|
112
|
+
if my_value == 'foo'
|
113
|
+
Deterministic::Result::Success(nil)
|
114
|
+
else
|
115
|
+
Deterministic::Result::Failure('invalid value')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
]
|
119
|
+
|
104
120
|
response = extractor.call(request)
|
121
|
+
.map(validate_input)
|
105
122
|
.map(create_app_request)
|
106
123
|
.map(HelloUser)
|
107
124
|
.map(Responses.to_ok)
|
data/lib/salestation/web.rb
CHANGED
@@ -45,3 +45,6 @@ require_relative './result_helper'
|
|
45
45
|
require_relative './web/active_record_connection_management'
|
46
46
|
require_relative './web/request_logger'
|
47
47
|
require_relative './web/statsd_middleware'
|
48
|
+
require_relative './web/input_validator'
|
49
|
+
require_relative './web/input_validators/accept_header'
|
50
|
+
require_relative './web/input_validators/content_type_header'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Salestation
|
4
|
+
class Web < Module
|
5
|
+
class InputValidator
|
6
|
+
include Deterministic::Prelude
|
7
|
+
|
8
|
+
def self.[](**validations)
|
9
|
+
new(validations)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(**validations)
|
13
|
+
@validations = validations
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(input)
|
17
|
+
@validations.reduce(Deterministic::Result::Success({})) do |result, (key, validation)|
|
18
|
+
result.map do
|
19
|
+
validation.call(input.fetch(key, nil))
|
20
|
+
end
|
21
|
+
end.map(->(_) { Deterministic::Result::Success(input) })
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Salestation
|
4
|
+
class Web < Module
|
5
|
+
module InputValidators
|
6
|
+
class AcceptHeader
|
7
|
+
include Deterministic::Prelude
|
8
|
+
|
9
|
+
def self.[](*allowed_headers)
|
10
|
+
new(allowed_headers)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(allowed_headers)
|
14
|
+
@allowed_headers = allowed_headers
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(header_value)
|
18
|
+
header_valid = @allowed_headers.empty? || @allowed_headers.include?(header_value)
|
19
|
+
|
20
|
+
if header_valid
|
21
|
+
Success(nil)
|
22
|
+
else
|
23
|
+
Failure(App::Errors::NotAcceptable.new(
|
24
|
+
message: "Unsupported Accept Header '#{header_value}'",
|
25
|
+
debug_message: "Available Accept Headers are #{@allowed_headers.join(', ')}"
|
26
|
+
))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Salestation
|
4
|
+
class Web < Module
|
5
|
+
module InputValidators
|
6
|
+
class ContentTypeHeader
|
7
|
+
include Deterministic::Prelude
|
8
|
+
|
9
|
+
def self.[](*allowed_headers)
|
10
|
+
new(allowed_headers)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(allowed_headers)
|
14
|
+
@allowed_headers = allowed_headers
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(header_value)
|
18
|
+
# Some headers can have additional information such as `multipart/form-data`
|
19
|
+
parsed_header_value = header_value ? header_value.split(';').first : nil
|
20
|
+
|
21
|
+
header_valid = @allowed_headers.empty? || @allowed_headers.include?(parsed_header_value)
|
22
|
+
|
23
|
+
if header_valid
|
24
|
+
Success(nil)
|
25
|
+
else
|
26
|
+
Failure(App::Errors::UnsupportedMediaType.new(
|
27
|
+
message: "Unsupported Content-Type Header '#{header_value}'",
|
28
|
+
debug_message: "Available Content-Type Headers are #{@allowed_headers.join(', ')}"
|
29
|
+
))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/salestation.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: salestation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SaleMove TechMovers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -132,6 +132,9 @@ files:
|
|
132
132
|
- lib/salestation/web/active_record_connection_management.rb
|
133
133
|
- lib/salestation/web/error_mapper.rb
|
134
134
|
- lib/salestation/web/extractors.rb
|
135
|
+
- lib/salestation/web/input_validator.rb
|
136
|
+
- lib/salestation/web/input_validators/accept_header.rb
|
137
|
+
- lib/salestation/web/input_validators/content_type_header.rb
|
135
138
|
- lib/salestation/web/request_logger.rb
|
136
139
|
- lib/salestation/web/responses.rb
|
137
140
|
- lib/salestation/web/statsd_middleware.rb
|
@@ -155,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
158
|
- !ruby/object:Gem::Version
|
156
159
|
version: '0'
|
157
160
|
requirements: []
|
158
|
-
|
159
|
-
rubygems_version: 2.7.6
|
161
|
+
rubygems_version: 3.0.4
|
160
162
|
signing_key:
|
161
163
|
specification_version: 4
|
162
164
|
summary: ''
|