hasura_handler 0.1.4 → 0.1.9
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 +4 -23
- data/app/controllers/hasura_handler/actions_controller.rb +10 -12
- data/app/controllers/hasura_handler/application_controller.rb +14 -3
- data/app/controllers/hasura_handler/auth_hook_controller.rb +39 -0
- data/app/controllers/hasura_handler/events_controller.rb +3 -25
- data/config/routes.rb +5 -0
- data/lib/hasura_handler.rb +12 -2
- data/lib/hasura_handler/action.rb +3 -1
- data/lib/hasura_handler/authenticator.rb +22 -0
- data/lib/hasura_handler/engine.rb +8 -0
- data/lib/hasura_handler/event_handler.rb +4 -2
- metadata +15 -15
- data/lib/hasura_handler/version.rb +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b476da389358677671ebee56a1d014dc90779a73ade92eaf6d17f894192d0f4c
|
|
4
|
+
data.tar.gz: 1aef41672a1832e2abe57e78b260fdef87a0e0147c470898ccb17dfb3b05c791
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 466c57748a94c57040c9d963af6982f4796370c30c582c0c3a306b5d4bc0573f3d3989d6a4e3702f7c162c8e5ad659ee50b032aecc7ac606003dddafca9ffe1a
|
|
7
|
+
data.tar.gz: 921d0f38484c4d6f127660e7a999ef5af1a0bce82013aeccace3abf1ca6d4468c567d11355dc35691c97480056ad88829cba2dd0984ba9b6208679f62ff2b02b
|
data/README.md
CHANGED
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
# HasuraHandler
|
|
2
|
-
|
|
1
|
+
# HasuraHandler  [](https://github.com/KazW/HasuraHandler/actions?query=workflow%3Atests) [](https://codeclimate.com/github/KazW/HasuraHandler/maintainability) [](https://codeclimate.com/github/KazW/HasuraHandler/test_coverage)
|
|
2
|
+
HasuraHandler is a Rails framework that makes building microservices for Hasura easy.
|
|
3
|
+
HasuraHandler also simplifies adding Hasura to an existing Rails app.
|
|
3
4
|
|
|
4
5
|
## Usage
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Installation
|
|
8
|
-
Add this line to your application's Gemfile:
|
|
9
|
-
|
|
10
|
-
```ruby
|
|
11
|
-
gem 'hasura_handler'
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
And then execute:
|
|
15
|
-
```bash
|
|
16
|
-
$ bundle
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Or install it yourself as:
|
|
20
|
-
```bash
|
|
21
|
-
$ gem install hasura_handler
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Contributing
|
|
25
|
-
Contribution directions go here.
|
|
6
|
+
Please see the [documentation site](https://kazw.github.io/HasuraHandler).
|
|
26
7
|
|
|
27
8
|
## License
|
|
28
9
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
@@ -2,29 +2,27 @@ require_dependency 'hasura_handler/application_controller'
|
|
|
2
2
|
|
|
3
3
|
module HasuraHandler
|
|
4
4
|
class ActionsController < ApplicationController
|
|
5
|
+
before_action :check_header
|
|
6
|
+
|
|
5
7
|
def index
|
|
6
|
-
unless HasuraHandler::Action.hasura_actions.keys.include?(
|
|
8
|
+
unless HasuraHandler::Action.hasura_actions.keys.include?(raw_params['action']['name'])
|
|
7
9
|
render json: { error: true, message: 'action name not registered' }, status: 404
|
|
8
10
|
return
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
klass = HasuraHandler::Action.hasura_actions[
|
|
12
|
-
action = klass.new(
|
|
13
|
-
|
|
13
|
+
klass = HasuraHandler::Action.hasura_actions[raw_params['action']['name']]
|
|
14
|
+
action = klass.new(
|
|
15
|
+
clean_headers,
|
|
16
|
+
raw_params['session_variables'].to_h,
|
|
17
|
+
raw_params['input'].to_h
|
|
18
|
+
)
|
|
14
19
|
|
|
20
|
+
action.run
|
|
15
21
|
if action.error_message.present?
|
|
16
22
|
render json: { error: true, message: action.error_message }, status: 400
|
|
17
23
|
else
|
|
18
24
|
render json: action.output
|
|
19
25
|
end
|
|
20
26
|
end
|
|
21
|
-
|
|
22
|
-
def action_params
|
|
23
|
-
full_params.permit(
|
|
24
|
-
action: [:name],
|
|
25
|
-
input: {},
|
|
26
|
-
session_variables: {}
|
|
27
|
-
)
|
|
28
|
-
end
|
|
29
27
|
end
|
|
30
28
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module HasuraHandler
|
|
2
2
|
class ApplicationController < ActionController::API
|
|
3
|
-
|
|
3
|
+
def protect_against_forgery?
|
|
4
|
+
false
|
|
5
|
+
end
|
|
4
6
|
|
|
5
7
|
private
|
|
6
8
|
|
|
@@ -10,8 +12,17 @@ module HasuraHandler
|
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
+
def raw_params
|
|
16
|
+
@raw_params ||= JSON.parse(request.raw_post)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def clean_headers
|
|
20
|
+
request.
|
|
21
|
+
headers.
|
|
22
|
+
reject{ |k,v| k.include?('.') }.
|
|
23
|
+
to_h.
|
|
24
|
+
select{ |k,v| k =~ /\AHTTP_/ }.
|
|
25
|
+
to_h
|
|
15
26
|
end
|
|
16
27
|
end
|
|
17
28
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_dependency "hasura_handler/application_controller"
|
|
2
|
+
|
|
3
|
+
module HasuraHandler
|
|
4
|
+
class AuthHookController < ApplicationController
|
|
5
|
+
def get_mode
|
|
6
|
+
@headers = clean_headers
|
|
7
|
+
authenticate
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def post_mode
|
|
11
|
+
@headers = raw_params['headers'].
|
|
12
|
+
to_h.
|
|
13
|
+
map{ |k,v| [standardize_header(k), v] }.
|
|
14
|
+
to_h
|
|
15
|
+
|
|
16
|
+
authenticate
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def authenticate
|
|
22
|
+
@authenticator = HasuraHandler.
|
|
23
|
+
authenticator.
|
|
24
|
+
to_s.
|
|
25
|
+
constantize.
|
|
26
|
+
new(@headers)
|
|
27
|
+
|
|
28
|
+
if @authenticator.success?
|
|
29
|
+
render json: @authenticator.response, status: 200
|
|
30
|
+
else
|
|
31
|
+
render json: { error: true, message: @authenticator.error_message }, status: 401
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def standardize_header(header)
|
|
36
|
+
"HTTP_#{header.to_s.gsub('-', '_').upcase}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -2,8 +2,10 @@ require_dependency 'hasura_handler/application_controller'
|
|
|
2
2
|
|
|
3
3
|
module HasuraHandler
|
|
4
4
|
class EventsController < ApplicationController
|
|
5
|
+
before_action :check_header
|
|
6
|
+
|
|
5
7
|
def index
|
|
6
|
-
processor = HasuraHandler::EventProcessor.new(
|
|
8
|
+
processor = HasuraHandler::EventProcessor.new(raw_params)
|
|
7
9
|
|
|
8
10
|
unless processor.event.valid?
|
|
9
11
|
error_response(processor.event.errors)
|
|
@@ -30,29 +32,5 @@ module HasuraHandler
|
|
|
30
32
|
response.set_header('Retry-After', HasuraHandler.retry_after)
|
|
31
33
|
render json: { success: false, errors: errors }, status: 400
|
|
32
34
|
end
|
|
33
|
-
|
|
34
|
-
def event_params
|
|
35
|
-
full_params.permit(
|
|
36
|
-
:id,
|
|
37
|
-
:created_at,
|
|
38
|
-
table: [
|
|
39
|
-
:schema,
|
|
40
|
-
:name
|
|
41
|
-
],
|
|
42
|
-
trigger: [
|
|
43
|
-
:name
|
|
44
|
-
],
|
|
45
|
-
event: [
|
|
46
|
-
:op,
|
|
47
|
-
{
|
|
48
|
-
session_variables: {},
|
|
49
|
-
data: {
|
|
50
|
-
new: {},
|
|
51
|
-
old: {}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
)
|
|
56
|
-
end
|
|
57
35
|
end
|
|
58
36
|
end
|
data/config/routes.rb
CHANGED
data/lib/hasura_handler.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'hasura_handler/engine'
|
|
2
|
+
require 'hasura_handler/authenticator'
|
|
2
3
|
require 'hasura_handler/event_handler'
|
|
3
4
|
require 'hasura_handler/event_processor'
|
|
4
5
|
require 'hasura_handler/event'
|
|
@@ -8,6 +9,8 @@ module HasuraHandler
|
|
|
8
9
|
class << self
|
|
9
10
|
mattr_accessor :auth_header,
|
|
10
11
|
:auth_key,
|
|
12
|
+
:authentication_enabled,
|
|
13
|
+
:authenticator,
|
|
11
14
|
:events_enabled,
|
|
12
15
|
:actions_enabled,
|
|
13
16
|
:event_job_queue,
|
|
@@ -17,6 +20,8 @@ module HasuraHandler
|
|
|
17
20
|
:retry_after
|
|
18
21
|
|
|
19
22
|
self.auth_header = 'HTTP_X_HASURA_SERVICE_KEY'
|
|
23
|
+
self.authentication_enabled = false
|
|
24
|
+
self.authenticator = nil
|
|
20
25
|
self.events_enabled = true
|
|
21
26
|
self.async_events = true
|
|
22
27
|
self.fanout_events = true
|
|
@@ -28,8 +33,13 @@ module HasuraHandler
|
|
|
28
33
|
|
|
29
34
|
def self.setup(&block)
|
|
30
35
|
yield self
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
|
|
37
|
+
if (self.events_enabled || self.actions_enabled) && self.auth_key.blank?
|
|
38
|
+
raise 'HasuraHandler requires the auth_key to be configured if actions or events are enabled.'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
if self.authentication_enabled && self.authenticator.blank?
|
|
42
|
+
raise 'HasuraHandler requires the authenticator to be configured if authentication hook is enabled.'
|
|
33
43
|
end
|
|
34
44
|
end
|
|
35
45
|
end
|
|
@@ -17,11 +17,13 @@ module HasuraHandler
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
attr_reader :session_variables,
|
|
20
|
+
:headers,
|
|
20
21
|
:input,
|
|
21
22
|
:output,
|
|
22
23
|
:error_message
|
|
23
24
|
|
|
24
|
-
def initialize(session_variables, input)
|
|
25
|
+
def initialize(headers, session_variables, input)
|
|
26
|
+
@headers = headers
|
|
25
27
|
@session_variables = session_variables
|
|
26
28
|
@input = input
|
|
27
29
|
@output = {}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module HasuraHandler
|
|
2
|
+
class Authenticator
|
|
3
|
+
attr_reader :headers
|
|
4
|
+
attr_accessor :response,
|
|
5
|
+
:error_message
|
|
6
|
+
|
|
7
|
+
def initialize(headers)
|
|
8
|
+
@headers = headers
|
|
9
|
+
@response = {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def success?
|
|
13
|
+
begin
|
|
14
|
+
authenticate
|
|
15
|
+
ensure
|
|
16
|
+
return false if @response.blank?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@response.present? || @error_message.blank?
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -2,5 +2,13 @@ module HasuraHandler
|
|
|
2
2
|
class Engine < ::Rails::Engine
|
|
3
3
|
isolate_namespace HasuraHandler
|
|
4
4
|
config.generators.api_only = true
|
|
5
|
+
|
|
6
|
+
if Rails.version.to_f < 6
|
|
7
|
+
config.eager_load_paths += Dir[Rails.root.join('app', '{actions,reactions}', '*.rb')]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
config.to_prepare do
|
|
11
|
+
Dir[Rails.root.join('app', '{actions,reactions}', '*.rb')].each{ |file| require_dependency file }
|
|
12
|
+
end
|
|
5
13
|
end
|
|
6
14
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module HasuraHandler
|
|
2
2
|
class EventHandler
|
|
3
|
+
extend ActiveSupport::DescendantsTracker
|
|
4
|
+
|
|
3
5
|
class << self
|
|
4
6
|
attr_reader :hasura_matchers
|
|
5
7
|
|
|
@@ -8,8 +10,8 @@ module HasuraHandler
|
|
|
8
10
|
allowed_matchers = [:table, :trigger, :op]
|
|
9
11
|
|
|
10
12
|
matchers.keys.each do |matcher|
|
|
11
|
-
raise
|
|
12
|
-
raise
|
|
13
|
+
raise "invalid matcher: #{matcher}" unless allowed_matchers.include?(matcher)
|
|
14
|
+
raise "invalid matcher value for: #{matcher}" unless matchers[matcher].is_a?(String)
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
@hasura_matchers = matchers
|
metadata
CHANGED
|
@@ -1,36 +1,31 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hasura_handler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.9
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kaz Walker
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-09-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 6.0.3
|
|
20
17
|
- - ">="
|
|
21
18
|
- !ruby/object:Gem::Version
|
|
22
|
-
version:
|
|
19
|
+
version: '5.0'
|
|
23
20
|
type: :runtime
|
|
24
21
|
prerelease: false
|
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
23
|
requirements:
|
|
27
|
-
- - "~>"
|
|
28
|
-
- !ruby/object:Gem::Version
|
|
29
|
-
version: 6.0.3
|
|
30
24
|
- - ">="
|
|
31
25
|
- !ruby/object:Gem::Version
|
|
32
|
-
version:
|
|
33
|
-
description:
|
|
26
|
+
version: '5.0'
|
|
27
|
+
description: HasuraHandler is a Rails framework that makes building microservices
|
|
28
|
+
for Hasura easy.
|
|
34
29
|
email:
|
|
35
30
|
- me@kaz.codes
|
|
36
31
|
executables: []
|
|
@@ -42,6 +37,7 @@ files:
|
|
|
42
37
|
- Rakefile
|
|
43
38
|
- app/controllers/hasura_handler/actions_controller.rb
|
|
44
39
|
- app/controllers/hasura_handler/application_controller.rb
|
|
40
|
+
- app/controllers/hasura_handler/auth_hook_controller.rb
|
|
45
41
|
- app/controllers/hasura_handler/events_controller.rb
|
|
46
42
|
- app/jobs/hasura_handler/application_job.rb
|
|
47
43
|
- app/jobs/hasura_handler/event_handler_job.rb
|
|
@@ -49,16 +45,20 @@ files:
|
|
|
49
45
|
- config/routes.rb
|
|
50
46
|
- lib/hasura_handler.rb
|
|
51
47
|
- lib/hasura_handler/action.rb
|
|
48
|
+
- lib/hasura_handler/authenticator.rb
|
|
52
49
|
- lib/hasura_handler/engine.rb
|
|
53
50
|
- lib/hasura_handler/event.rb
|
|
54
51
|
- lib/hasura_handler/event_handler.rb
|
|
55
52
|
- lib/hasura_handler/event_processor.rb
|
|
56
|
-
- lib/hasura_handler/version.rb
|
|
57
53
|
- lib/tasks/hasura_handler_tasks.rake
|
|
58
|
-
homepage: https://github.
|
|
54
|
+
homepage: https://kazw.github.io/HasuraHandler
|
|
59
55
|
licenses:
|
|
60
56
|
- MIT
|
|
61
|
-
metadata:
|
|
57
|
+
metadata:
|
|
58
|
+
bug_tracker_uri: https://github.com/KazW/HasuraHandler/issues
|
|
59
|
+
documentation_uri: https://kazw.github.io/HasuraHandler
|
|
60
|
+
homepage_uri: https://kazw.github.io/HasuraHandler
|
|
61
|
+
source_code_uri: https://github.com/KazW/HasuraHandler
|
|
62
62
|
post_install_message:
|
|
63
63
|
rdoc_options: []
|
|
64
64
|
require_paths:
|
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
75
|
version: '0'
|
|
76
76
|
requirements: []
|
|
77
|
-
rubygems_version: 3.1.
|
|
77
|
+
rubygems_version: 3.1.2
|
|
78
78
|
signing_key:
|
|
79
79
|
specification_version: 4
|
|
80
80
|
summary: Integrates Hasura with Rails
|