shogun 6.2.1 → 6.2.2

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.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shogun/version.rb +1 -1
  3. data/scaffold/generate/resource.rb +15 -0
  4. data/scaffold/generate/resource/create.rb +10 -0
  5. data/scaffold/generate/resource/create/authorizer.rb +21 -0
  6. data/scaffold/generate/resource/create/control.rb +27 -0
  7. data/scaffold/generate/resource/create/denormalizer.rb +31 -0
  8. data/scaffold/generate/resource/create/normalizer.rb +22 -0
  9. data/scaffold/generate/resource/create/validator.rb +14 -0
  10. data/scaffold/generate/resource/destroy.rb +11 -0
  11. data/scaffold/generate/resource/destroy/authorizer.rb +21 -0
  12. data/scaffold/generate/resource/destroy/control.rb +37 -0
  13. data/scaffold/generate/resource/destroy/denormalizer.rb +31 -0
  14. data/scaffold/generate/resource/destroy/normalizer.rb +28 -0
  15. data/scaffold/generate/resource/destroy/validator.rb +20 -0
  16. data/scaffold/generate/resource/endpoint.rb +16 -0
  17. data/scaffold/generate/resource/list.rb +10 -0
  18. data/scaffold/generate/resource/list/authorizer.rb +21 -0
  19. data/scaffold/generate/resource/list/control.rb +26 -0
  20. data/scaffold/generate/resource/list/denormalizer.rb +33 -0
  21. data/scaffold/generate/resource/list/normalizer.rb +58 -0
  22. data/scaffold/generate/resource/list/validator.rb +24 -0
  23. data/scaffold/generate/resource/model.rb +21 -0
  24. data/scaffold/generate/resource/null.rb +11 -0
  25. data/scaffold/generate/resource/presenter.rb +24 -0
  26. data/scaffold/generate/resource/show.rb +10 -0
  27. data/scaffold/generate/resource/show/authorizer.rb +21 -0
  28. data/scaffold/generate/resource/show/control.rb +31 -0
  29. data/scaffold/generate/resource/show/denormalizer.rb +18 -0
  30. data/scaffold/generate/resource/show/normalizer.rb +37 -0
  31. data/scaffold/generate/resource/show/validator.rb +21 -0
  32. data/scaffold/generate/resource/update.rb +11 -0
  33. data/scaffold/generate/resource/update/authorizer.rb +21 -0
  34. data/scaffold/generate/resource/update/control.rb +37 -0
  35. data/scaffold/generate/resource/update/denormalizer.rb +31 -0
  36. data/scaffold/generate/resource/update/normalizer.rb +37 -0
  37. data/scaffold/generate/resource/update/validator.rb +14 -0
  38. data/scaffold/new/project/Envfile +17 -0
  39. data/scaffold/new/project/Gemfile +18 -0
  40. data/scaffold/new/project/LICENSE +22 -0
  41. data/scaffold/new/project/Procfile +1 -0
  42. data/scaffold/new/project/README.md +32 -0
  43. data/scaffold/new/project/Rakefile +9 -0
  44. data/scaffold/new/project/config.ru +8 -0
  45. data/scaffold/new/project/config/puma.rb +167 -0
  46. data/scaffold/new/project/gitignore +39 -0
  47. data/scaffold/new/project/lib/namespace.rb +29 -0
  48. data/scaffold/new/project/lib/namespace/accounts.rb +15 -0
  49. data/scaffold/new/project/lib/namespace/accounts/create.rb +10 -0
  50. data/scaffold/new/project/lib/namespace/accounts/create/control.rb +27 -0
  51. data/scaffold/new/project/lib/namespace/accounts/create/denormalizer.rb +35 -0
  52. data/scaffold/new/project/lib/namespace/accounts/create/normalizer.rb +42 -0
  53. data/scaffold/new/project/lib/namespace/accounts/create/validator.rb +34 -0
  54. data/scaffold/new/project/lib/namespace/accounts/destroy.rb +11 -0
  55. data/scaffold/new/project/lib/namespace/accounts/destroy/authorizer.rb +21 -0
  56. data/scaffold/new/project/lib/namespace/accounts/destroy/control.rb +37 -0
  57. data/scaffold/new/project/lib/namespace/accounts/destroy/denormalizer.rb +35 -0
  58. data/scaffold/new/project/lib/namespace/accounts/destroy/normalizer.rb +28 -0
  59. data/scaffold/new/project/lib/namespace/accounts/destroy/validator.rb +20 -0
  60. data/scaffold/new/project/lib/namespace/accounts/endpoint.rb +16 -0
  61. data/scaffold/new/project/lib/namespace/accounts/list.rb +10 -0
  62. data/scaffold/new/project/lib/namespace/accounts/list/control.rb +26 -0
  63. data/scaffold/new/project/lib/namespace/accounts/list/denormalizer.rb +37 -0
  64. data/scaffold/new/project/lib/namespace/accounts/list/normalizer.rb +58 -0
  65. data/scaffold/new/project/lib/namespace/accounts/list/validator.rb +24 -0
  66. data/scaffold/new/project/lib/namespace/accounts/model.rb +49 -0
  67. data/scaffold/new/project/lib/namespace/accounts/null.rb +11 -0
  68. data/scaffold/new/project/lib/namespace/accounts/presenter.rb +40 -0
  69. data/scaffold/new/project/lib/namespace/accounts/show.rb +10 -0
  70. data/scaffold/new/project/lib/namespace/accounts/show/control.rb +31 -0
  71. data/scaffold/new/project/lib/namespace/accounts/show/denormalizer.rb +22 -0
  72. data/scaffold/new/project/lib/namespace/accounts/show/normalizer.rb +37 -0
  73. data/scaffold/new/project/lib/namespace/accounts/show/validator.rb +21 -0
  74. data/scaffold/new/project/lib/namespace/accounts/update.rb +11 -0
  75. data/scaffold/new/project/lib/namespace/accounts/update/authorizer.rb +21 -0
  76. data/scaffold/new/project/lib/namespace/accounts/update/control.rb +37 -0
  77. data/scaffold/new/project/lib/namespace/accounts/update/denormalizer.rb +35 -0
  78. data/scaffold/new/project/lib/namespace/accounts/update/normalizer.rb +52 -0
  79. data/scaffold/new/project/lib/namespace/accounts/update/validator.rb +47 -0
  80. data/scaffold/new/project/lib/namespace/errors.rb +8 -0
  81. data/scaffold/new/project/lib/namespace/errors/denormalizer.rb +24 -0
  82. data/scaffold/new/project/lib/namespace/errors/presenter.rb +16 -0
  83. data/scaffold/new/project/lib/namespace/server.rb +54 -0
  84. data/scaffold/new/project/lib/namespace/sessions.rb +11 -0
  85. data/scaffold/new/project/lib/namespace/sessions/create.rb +11 -0
  86. data/scaffold/new/project/lib/namespace/sessions/create/authorizer.rb +19 -0
  87. data/scaffold/new/project/lib/namespace/sessions/create/control.rb +26 -0
  88. data/scaffold/new/project/lib/namespace/sessions/create/denormalizer.rb +30 -0
  89. data/scaffold/new/project/lib/namespace/sessions/create/normalizer.rb +31 -0
  90. data/scaffold/new/project/lib/namespace/sessions/create/validator.rb +21 -0
  91. data/scaffold/new/project/lib/namespace/sessions/destroy.rb +10 -0
  92. data/scaffold/new/project/lib/namespace/sessions/destroy/control.rb +32 -0
  93. data/scaffold/new/project/lib/namespace/sessions/destroy/denormalizer.rb +29 -0
  94. data/scaffold/new/project/lib/namespace/sessions/destroy/normalizer.rb +20 -0
  95. data/scaffold/new/project/lib/namespace/sessions/destroy/validator.rb +16 -0
  96. data/scaffold/new/project/lib/namespace/sessions/endpoint.rb +13 -0
  97. data/scaffold/new/project/lib/namespace/sessions/model.rb +25 -0
  98. data/scaffold/new/project/lib/namespace/sessions/presenter.rb +40 -0
  99. data/scaffold/new/project/spec/lib/namespace/accounts/create/control_spec.rb +1 -0
  100. data/scaffold/new/project/spec/lib/namespace/accounts/create/denormalizer_spec.rb +1 -0
  101. data/scaffold/new/project/spec/lib/namespace/accounts/create/normalizer_spec.rb +1 -0
  102. data/scaffold/new/project/spec/lib/namespace/accounts/create/validator_spec.rb +1 -0
  103. data/scaffold/new/project/spec/lib/namespace/accounts/destroy/control_spec.rb +1 -0
  104. data/scaffold/new/project/spec/lib/namespace/accounts/destroy/denormalizer_spec.rb +1 -0
  105. data/scaffold/new/project/spec/lib/namespace/accounts/destroy/normalizer_spec.rb +1 -0
  106. data/scaffold/new/project/spec/lib/namespace/accounts/destroy/validator_spec.rb +1 -0
  107. data/scaffold/new/project/spec/lib/namespace/accounts/endpoint_spec.rb +1 -0
  108. data/scaffold/new/project/spec/lib/namespace/accounts/list/control_spec.rb +1 -0
  109. data/scaffold/new/project/spec/lib/namespace/accounts/list/denormalizer_spec.rb +1 -0
  110. data/scaffold/new/project/spec/lib/namespace/accounts/list/normalizer_spec.rb +1 -0
  111. data/scaffold/new/project/spec/lib/namespace/accounts/list/validator_spec.rb +1 -0
  112. data/scaffold/new/project/spec/lib/namespace/accounts/model_spec.rb +1 -0
  113. data/scaffold/new/project/spec/lib/namespace/accounts/presenter_spec.rb +1 -0
  114. data/scaffold/new/project/spec/lib/namespace/accounts/show/control_spec.rb +1 -0
  115. data/scaffold/new/project/spec/lib/namespace/accounts/show/denormalizer_spec.rb +1 -0
  116. data/scaffold/new/project/spec/lib/namespace/accounts/show/normalizer_spec.rb +1 -0
  117. data/scaffold/new/project/spec/lib/namespace/accounts/show/validator_spec.rb +1 -0
  118. data/scaffold/new/project/spec/lib/namespace/accounts/update/control_spec.rb +1 -0
  119. data/scaffold/new/project/spec/lib/namespace/accounts/update/denormalizer_spec.rb +1 -0
  120. data/scaffold/new/project/spec/lib/namespace/accounts/update/normalizer_spec.rb +1 -0
  121. data/scaffold/new/project/spec/lib/namespace/accounts/update/validator_spec.rb +1 -0
  122. data/scaffold/new/project/spec/lib/namespace/errors/denormalizer_spec.rb +1 -0
  123. data/scaffold/new/project/spec/lib/namespace/errors/presenter_spec.rb +1 -0
  124. data/scaffold/new/project/spec/lib/namespace/errors/presenters_spec.rb +1 -0
  125. data/scaffold/new/project/spec/lib/namespace/model_spec.rb +1 -0
  126. data/scaffold/new/project/spec/lib/namespace/server_spec.rb +1 -0
  127. data/scaffold/new/project/spec/lib/namespace/sessions/create/control_spec.rb +1 -0
  128. data/scaffold/new/project/spec/lib/namespace/sessions/create/denormalizer_spec.rb +1 -0
  129. data/scaffold/new/project/spec/lib/namespace/sessions/create/normalizer_spec.rb +1 -0
  130. data/scaffold/new/project/spec/lib/namespace/sessions/create/validator_spec.rb +1 -0
  131. data/scaffold/new/project/spec/lib/namespace/sessions/destroy/control_spec.rb +1 -0
  132. data/scaffold/new/project/spec/lib/namespace/sessions/destroy/denormalizer_spec.rb +1 -0
  133. data/scaffold/new/project/spec/lib/namespace/sessions/destroy/normalizer_spec.rb +1 -0
  134. data/scaffold/new/project/spec/lib/namespace/sessions/destroy/validator_spec.rb +1 -0
  135. data/scaffold/new/project/spec/lib/namespace/sessions/endpoint_spec.rb +1 -0
  136. data/scaffold/new/project/spec/lib/namespace/sessions/model_spec.rb +1 -0
  137. data/scaffold/new/project/spec/lib/namespace/sessions/presenter_spec.rb +1 -0
  138. data/scaffold/new/project/spec/lib/namespace_spec.rb +7 -0
  139. data/scaffold/new/project/spec/spec_helper.rb +3 -0
  140. metadata +138 -1
@@ -0,0 +1,54 @@
1
+ require "oj"
2
+ require "jwt"
3
+
4
+ module {{namespace_module}}
5
+ class Server
6
+ include Shogun::Server
7
+
8
+ VERSION = "1.0.0"
9
+ ORIGIN_WHITELIST = [ENV["CLIENT_HOST"]]
10
+ DESERIALIZATION_MAP = {
11
+ "*/*" => Oj,
12
+ "application/vnd.{{namespace}}+json; version=#{VERSION}" => Oj,
13
+ "application/json" => Oj
14
+ }
15
+ SERIALIZATION_MAP = {
16
+ "application/vnd.{{namespace}}+json; version=#{VERSION}" => Oj
17
+ }
18
+ DEFAULT_SERIALIZER = Oj
19
+ ACCEPT_TYPES = [
20
+ "application/vnd.{{namespace}}+json; version=#{VERSION}",
21
+ "application/json"
22
+ ]
23
+ ENDPOINTS = ->(router) do
24
+ Accounts::Endpoint.new(router: router)
25
+ Sessions::Endpoint.new(router: router)
26
+ end
27
+ BEARER = ->(token) do
28
+ begin
29
+ JWT.decode(token, ENV["APPLICATION_SESSION_SECRET"]).first
30
+ rescue JWT::DecodeError
31
+ {}
32
+ end
33
+ end
34
+ CORS = ->(policy) do
35
+ policy.allow do
36
+ origins(ENV["SERVER_HOST"], ENV["CLIENT_HOST"])
37
+ resource("*", headers: :any, methods: [:get, :post, :patch, :post, :delete, :options, :head])
38
+ end
39
+ end
40
+
41
+ def initialize(rack:, logger:)
42
+ @rack = rack
43
+ @logger = logger
44
+
45
+ ActiveSupport::Cache::Store.logger = logger
46
+
47
+ Oj.default_options = {
48
+ mode: :object
49
+ }
50
+
51
+ serve
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,11 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ NAMESPACE = "sessions"
4
+
5
+ require_relative "sessions/model"
6
+ require_relative "sessions/endpoint"
7
+ require_relative "sessions/presenter"
8
+ require_relative "sessions/create"
9
+ require_relative "sessions/destroy"
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ require_relative "create/control"
5
+ require_relative "create/authorizer"
6
+ require_relative "create/denormalizer"
7
+ require_relative "create/normalizer"
8
+ require_relative "create/validator"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ class Authorizer
5
+ include Shogun::Authorizer
6
+ include Sessions
7
+
8
+ def initialize(resource:, password:)
9
+ @resource = resource
10
+ @password = password
11
+ end
12
+
13
+ def allowed?
14
+ @resource.password == password
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ class Control
5
+ include Shogun::Control
6
+ include Sessions
7
+
8
+ def initialize(payload:)
9
+ @normalizer = Normalizer.new(raw: payload.to_hash)
10
+ @validator = Validator.new(data: @normalizer)
11
+
12
+ if @validator.valid?
13
+ @model = Model.create(@normalizer.to_hash)
14
+ @presenter = Presenter.new(resource: @model)
15
+ @denormalizer = Denormalizer.new(object: @presenter)
16
+ @status = OK
17
+ else
18
+ @presenters = Shogun::Presenters.new(resources: @validator.invalids, cast: Errors::Presenter)
19
+ @denormalizer = Errors::Denormalizer.new(object: @presenters)
20
+ @status = UNPROCESSABLE_ENTITY
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ class Denormalizer
5
+ include Shogun::Denormalizer
6
+ include Sessions
7
+
8
+ MAPPING = {
9
+ "token" => "token",
10
+ "accounts" => "accounts",
11
+ "created_at" => "created_at",
12
+ "accounts" => "accounts"
13
+ }
14
+
15
+ def initialize(object:)
16
+ @object = object
17
+ @meta = object.meta
18
+ @links = object.links
19
+ @linked = object.linked
20
+ end
21
+
22
+ private def document
23
+ mapping.inject({}) do |hash, (field, name)|
24
+ hash.merge(field => @object.public_send(name))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ class Normalizer
5
+ include Shogun::Normalizer
6
+ include Sessions
7
+
8
+ ATTRIBUTES = %w|account|
9
+
10
+ def initialize(raw:)
11
+ if raw[namespace]
12
+ @key = raw[namespace]["key"]
13
+ @secret = raw[namespace]["secret"]
14
+ end
15
+ end
16
+
17
+ def key
18
+ @key.strip if @key.is_a?(String)
19
+ end
20
+
21
+ def secret
22
+ @secret
23
+ end
24
+
25
+ def account
26
+ Accounts::Model.find_by(email: key) || Accounts::Model.find_by(username: key) || Accounts::Null.new
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Create
4
+ class Validator
5
+ include Shogun::Validator
6
+ include Sessions
7
+
8
+ PASSWORD_RANGE = 8..1024
9
+
10
+ def initialize(data:)
11
+ @verifiers = [
12
+ Shogun::Verifier::Presence.new(data: data.key, name: "key"),
13
+ Shogun::Verifier::Presence.new(data: data.secret, name: "secret"),
14
+ Shogun::Verifier::Range.new(data: data.secret, name: "secret", range: PASSWORD_RANGE),
15
+ Shogun::Verifier::Match.new(data: data.secret, name: "secret", comparison: data.account.password)
16
+ ]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Destroy
4
+ require_relative "destroy/control"
5
+ require_relative "destroy/denormalizer"
6
+ require_relative "destroy/normalizer"
7
+ require_relative "destroy/validator"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,32 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Destroy
4
+ class Control
5
+ include Shogun::Control
6
+ include Sessions
7
+
8
+ def initialize(payload:)
9
+ @normalizer = Normalizer.new(raw: payload.to_hash)
10
+ @validator = Validator.new(data: @normalizer)
11
+
12
+ if @validator.valid?
13
+ @model = Model.find_by(id: @normalizer.id)
14
+
15
+ if @model
16
+ @model.destroy
17
+ @presenter = Presenter.new(resource: @model)
18
+ @denormalizer = Denormalizer.new(object: @presenter)
19
+ @status = OK
20
+ else
21
+ @status = NOT_FOUND
22
+ end
23
+ else
24
+ @presenters = Shogun::Presenters.new(resources: @validator.invalids, cast: Errors::Presenter)
25
+ @denormalizer = Errors::Denormalizer.new(object: @presenters)
26
+ @status = UNPROCESSABLE_ENTITY
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Destroy
4
+ class Denormalizer
5
+ include Shogun::Denormalizer
6
+ include Sessions
7
+
8
+ MAPPING = {
9
+ "token" => "token",
10
+ "created_at" => "created_at",
11
+ "destroyed_at" => "destroyed_at"
12
+ }
13
+
14
+ def initialize(object:)
15
+ @object = object
16
+ @meta = object.meta
17
+ @links = object.links
18
+ @linked = object.linked
19
+ end
20
+
21
+ private def document
22
+ mapping.inject({}) do |hash, (field, name)|
23
+ hash.merge(field => @object.public_send(name))
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Destroy
4
+ class Normalizer
5
+ include Shogun::Normalizer
6
+ include Sessions
7
+
8
+ def initialize(raw:)
9
+ if raw["rack.authentication"] && raw["rack.authentication"]["sessions"]
10
+ @id = raw["rack.authentication"]["sessions"]["id"]
11
+ end
12
+ end
13
+
14
+ def id
15
+ @id
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ module Destroy
4
+ class Validator
5
+ include Shogun::Validator
6
+ include Sessions
7
+
8
+ def initialize(data:)
9
+ @verifiers = [
10
+ Shogun::Verifier::Presence.new(data: data.id, name: "id")
11
+ ]
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ class Endpoint
4
+ include Shogun::Endpoint
5
+ include Sessions
6
+
7
+ def initialize(router:)
8
+ router.push route: route(verb: :post, control: Create::Control)
9
+ router.push route: route(verb: :delete, control: Destroy::Control)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ class Model < ActiveRecord::Base
4
+ include BCrypt
5
+ include Sessions
6
+
7
+ self.table_name = NAMESPACE
8
+
9
+ belongs_to :account, class_name: "{{namespace_module}}::Accounts::Model", foreign_key: "account_id"
10
+
11
+ def self.setup!
12
+ ActiveRecord::Migration.create_table table_name, force: true, id: :uuid do |table|
13
+ table.string :account_id, null: false
14
+ table.index :account_id
15
+
16
+ table.datetime :created_at
17
+ table.index :created_at
18
+
19
+ table.datetime :destroyed_at
20
+ table.index :destroyed_at
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,40 @@
1
+ module {{namespace_module}}
2
+ module Sessions
3
+ class Presenter
4
+ include Shogun::Presenter
5
+ include Sessions
6
+
7
+ ALGORITHM = "HS512"
8
+
9
+ def token
10
+ JWT.encode(payload, secret, ALGORITHM)
11
+ end
12
+
13
+ def accounts
14
+ {
15
+ "id" => source.account_id
16
+ }
17
+ end
18
+
19
+ def created_at
20
+ source.created_at.to_datetime.rfc3339
21
+ end
22
+
23
+ def destroyed_at
24
+ source.destroyed_at.to_datetime.rfc3339 if source.destroyed_at
25
+ end
26
+
27
+ private def secret
28
+ ENV["APPLICATION_SESSION_SECRET"]
29
+ end
30
+
31
+ private def payload
32
+ {
33
+ "sessions" => {
34
+ "id" => source.id
35
+ }
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end