salestation 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: ''
|