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,11 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ class Null
4
+ attr_reader :password
5
+
6
+ def initialize
7
+ @password = nil
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,40 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ class Presenter
4
+ include Shogun::Presenter
5
+ include Accounts
6
+
7
+ def id
8
+ source.id
9
+ end
10
+
11
+ def signature
12
+ source.signature
13
+ end
14
+
15
+ def username
16
+ source.username
17
+ end
18
+
19
+ def email
20
+ source.email
21
+ end
22
+
23
+ def name
24
+ source.name
25
+ end
26
+
27
+ def created_at
28
+ source.created_at.to_datetime.rfc3339
29
+ end
30
+
31
+ def updated_at
32
+ source.updated_at.to_datetime.rfc3339 if source.updated_at
33
+ end
34
+
35
+ def destroyed_at
36
+ source.destroyed_at.to_datetime.rfc3339 if source.destroyed_at
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,10 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Show
4
+ require_relative "show/control"
5
+ require_relative "show/denormalizer"
6
+ require_relative "show/normalizer"
7
+ require_relative "show/validator"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Show
4
+ class Control
5
+ include Shogun::Control
6
+ include Accounts
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
+ @presenter = Presenter.new(resource: @model, meta: @normalizer.as_meta)
17
+ @denormalizer = Denormalizer.new(object: @presenter, fields: @normalizer.fields)
18
+ @status = OK
19
+ else
20
+ @status = NOT_FOUND
21
+ end
22
+ else
23
+ @presenters = Shogun::Presenters.new(resources: @validator.invalids, cast: Errors::Presenter)
24
+ @denormalizer = Errors::Denormalizer.new(object: @presenters)
25
+ @status = UNPROCESSABLE_ENTITY
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Show
4
+ class Denormalizer
5
+ include Shogun::Denormalizer
6
+ include Accounts
7
+
8
+ MAPPING = {
9
+ "id" => "id",
10
+ "signature" => "signature",
11
+ "username" => "username",
12
+ "email" => "email",
13
+ "name" => "name",
14
+ "created_at" => "created_at",
15
+ "destroyed_at" => "destroyed_at",
16
+ "updated_at" => "updated_at",
17
+ "href" => "href"
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Show
4
+ class Normalizer
5
+ include Shogun::Normalizer
6
+ include Accounts
7
+
8
+ METADATA = %w|id fields|
9
+ LIST_DELIMITER = /\s*,\s*/
10
+ DEFAULT_FIELDS = %w|updated_at destroyed_at href created_at name email username signature id|
11
+ AUTOMATIC_FIELDS = %w|id href|
12
+
13
+ def initialize(raw:)
14
+ @id = raw["id"]
15
+ @fields = raw["fields"]
16
+ end
17
+
18
+ def id
19
+ @id
20
+ end
21
+
22
+ def fields
23
+ case
24
+ when @fields.is_a?(String) && @fields.match(LIST_DELIMITER)
25
+ @fields.split(LIST_DELIMITER) + AUTOMATIC_FIELDS
26
+ when @fields.is_a?(Array)
27
+ @fields + AUTOMATIC_FIELDS
28
+ when @fields.is_a?(String)
29
+ [@fields.strip] + AUTOMATIC_FIELDS
30
+ else
31
+ DEFAULT_FIELDS
32
+ end.uniq
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Show
4
+ class Validator
5
+ include Shogun::Validator
6
+ include Accounts
7
+
8
+ ID_MATCH = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
9
+ FIELDS_ALLOWED = %w|updated_at destroyed_at href created_at bio name email username signature id|
10
+
11
+ def initialize(data:)
12
+ @verifiers = [
13
+ Shogun::Verifier::Presence.new(data: data.id, name: "id"),
14
+ Shogun::Verifier::Match.new(data: data.id, name: "id", comparison: ID_MATCH),
15
+ Shogun::Verifier::Allowed.new(data: data.fields, name: "fields", list: FIELDS_ALLOWED)
16
+ ]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ require_relative "update/authorizer"
5
+ require_relative "update/control"
6
+ require_relative "update/denormalizer"
7
+ require_relative "update/normalizer"
8
+ require_relative "update/validator"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ class Authorizer
5
+ include Shogun::Authorizer
6
+ include Accounts
7
+
8
+ def initialize(requester:, resource:)
9
+ if requester
10
+ @requester = requester.account
11
+ end
12
+ @resource = resource
13
+ end
14
+
15
+ def allowed?
16
+ @requester == @resource
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ class Control
5
+ include Shogun::Control
6
+ include Accounts
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
+ @session = Sessions::Model.find_by(id: @normalizer.session)
14
+ @model = Model.find_by(id: @normalizer.id)
15
+ @authorizer = Authorizer.new(requester: @session, resource: @model)
16
+
17
+ case
18
+ when @model && @authorizer.allowed?
19
+ @model.update(@normalizer.to_hash)
20
+ @presenter = Presenter.new(resource: @model, meta: @normalizer.as_meta)
21
+ @denormalizer = Denormalizer.new(object: @presenter)
22
+ @status = OK
23
+ when @model && @authorizer.denied?
24
+ @status = UNAUTHORIZED
25
+ else
26
+ @status = NOT_FOUND
27
+ end
28
+ else
29
+ @presenters = Shogun::Presenters.new(resources: @validator.invalids, cast: Errors::Presenter)
30
+ @denormalizer = Errors::Denormalizer.new(object: @presenters)
31
+ @status = UNPROCESSABLE_ENTITY
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ class Denormalizer
5
+ include Shogun::Denormalizer
6
+ include Accounts
7
+
8
+ MAPPING = {
9
+ "id" => "id",
10
+ "signature" => "signature",
11
+ "username" => "username",
12
+ "email" => "email",
13
+ "name" => "name",
14
+ "created_at" => "created_at",
15
+ "destroyed_at" => "destroyed_at",
16
+ "updated_at" => "updated_at",
17
+ "href" => "href"
18
+ }
19
+
20
+ def initialize(object:)
21
+ @object = object
22
+ @meta = object.meta
23
+ @links = object.links
24
+ @linked = object.linked
25
+ end
26
+
27
+ private def document
28
+ mapping.inject({}) do |hash, (field, name)|
29
+ hash.merge(field => @object.public_send(name))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,52 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ class Normalizer
5
+ include Shogun::Normalizer
6
+ include Accounts
7
+
8
+ METADATA = %w|id|
9
+ ATTRIBUTES = %w|signature name email username|
10
+
11
+ def initialize(raw:)
12
+ @id = raw["id"]
13
+
14
+ if raw["rack.authentication"] && raw["rack.authentication"]["sessions"]
15
+ @session = raw["rack.authentication"]["sessions"]["id"]
16
+ end
17
+
18
+ if raw[NAMESPACE]
19
+ @signature = raw[namespace]["signature"]
20
+ @name = raw[namespace]["name"]
21
+ @email = raw[namespace]["email"]
22
+ @username = raw[namespace]["username"]
23
+ end
24
+ end
25
+
26
+ def id
27
+ @id
28
+ end
29
+
30
+ def session
31
+ @session
32
+ end
33
+
34
+ def signature
35
+ @signature.strip if @signature.is_a?(String)
36
+ end
37
+
38
+ def name
39
+ @name.strip if @name.is_a?(String)
40
+ end
41
+
42
+ def email
43
+ @email.strip if @email.is_a?(String)
44
+ end
45
+
46
+ def username
47
+ @username.strip if @username.is_a?(String)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,47 @@
1
+ module {{namespace_module}}
2
+ module Accounts
3
+ module Update
4
+ class Validator
5
+ include Shogun::Validator
6
+ include Accounts
7
+
8
+ ID_MATCH = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
9
+ EMAIL_MATCH = /^[^@\s]+@([^@\s]+\.)+[^@\s]+$/
10
+ SIGNATURE_RANGE = 2..64
11
+ USERNAME_MATCH = /^\S*$/
12
+ USERNAME_RANGE = 2..64
13
+
14
+ def initialize(data:)
15
+ @verifiers = [
16
+ Shogun::Verifier::Presence.new(data: data.id, name: "id"),
17
+ Shogun::Verifier::Match.new(data: data.id, name: "id", comparison: ID_MATCH),
18
+ Shogun::Verifier::Presence.new(data: data.session, name: "session")
19
+ ]
20
+
21
+ if data.name
22
+ @verifiers << Shogun::Verifier::Presence.new(data: data.name, name: "name")
23
+ end
24
+
25
+ if data.email
26
+ @verifiers << Shogun::Verifier::Presence.new(data: data.email, name: "email")
27
+ @verifiers << Shogun::Verifier::Match.new(data: data.email, name: "email", comparison: EMAIL_MATCH)
28
+ @verifiers << Shogun::Verifier::Uniqueness.new(data: data.email, name: "email", list: Model.pluck(:email))
29
+ end
30
+
31
+ if data.signature
32
+ @verifiers << Shogun::Verifier::Presence.new(data: data.signature, name: "signature")
33
+ @verifiers << Shogun::Verifier::Range.new(data: data.signature, name: "signature", range: SIGNATURE_RANGE)
34
+ @verifiers << Shogun::Verifier::Uniqueness.new(data: data.signature, name: "signature", list: Model.pluck(:signature))
35
+ end
36
+
37
+ if data.username
38
+ @verifiers << Shogun::Verifier::Match.new(data: data.username, name: "username", comparison: USERNAME_MATCH)
39
+ @verifiers << Shogun::Verifier::Range.new(data: data.username, name: "username", range: USERNAME_RANGE)
40
+ @verifiers << Shogun::Verifier::Presence.new(data: data.username, name: "username")
41
+ @verifiers << Shogun::Verifier::Uniqueness.new(data: data.username, name: "username", list: Model.pluck(:username))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,8 @@
1
+ module {{namespace_module}}
2
+ module Errors
3
+ NAMESPACE = "errors"
4
+
5
+ require_relative "errors/presenter"
6
+ require_relative "errors/denormalizer"
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ module {{namespace_module}}
2
+ module Errors
3
+ class Denormalizer
4
+ include Shogun::Denormalizer
5
+ include Errors
6
+
7
+ def initialize(object:)
8
+ @object = object
9
+ @meta = object.meta
10
+ @links = object.links
11
+ @linked = object.linked
12
+ end
13
+
14
+ private def document
15
+ @object.map do |object|
16
+ {
17
+ "id" => object.id,
18
+ "context" => object.context
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ module {{namespace_module}}
2
+ module Errors
3
+ class Presenter
4
+ include Shogun::Presenter
5
+ include Errors
6
+
7
+ def id
8
+ source.id
9
+ end
10
+
11
+ def context
12
+ source.context
13
+ end
14
+ end
15
+ end
16
+ end