command_service_object 0.6.5 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +74 -61
- data/README.md +41 -22
- data/command_service_object.gemspec +2 -1
- data/lib/command_service_object.rb +1 -0
- data/lib/command_service_object/helpers/check_helper.rb +9 -0
- data/lib/command_service_object/version.rb +1 -1
- data/lib/generators/.DS_Store +0 -0
- data/lib/generators/service/command/command_generator.rb +23 -3
- data/lib/generators/service/{test/templates/rspec/command.rb.erb → command/templates/command_spec.rb.erb} +0 -0
- data/lib/generators/service/entity/entity_generator.rb +39 -0
- data/lib/generators/service/entity/templates/entity.rb.erb +9 -0
- data/lib/generators/service/external/external_generator.rb +46 -0
- data/lib/generators/service/external/templates/external.rb.erb +16 -0
- data/lib/generators/service/external/templates/external_spec.rb.erb +12 -0
- data/lib/generators/service/external/templates/external_test.rb.erb +0 -0
- data/lib/generators/service/helper.rb +23 -0
- data/lib/generators/service/install/templates/initializer.rb +5 -0
- data/lib/generators/service/install/templates/services/application_service.rb +57 -16
- data/lib/generators/service/install/templates/services/case_base.rb +3 -0
- data/lib/generators/service/install/templates/services/listener_base.rb +7 -0
- data/lib/generators/service/install/templates/services/query_base.rb +55 -0
- data/lib/generators/service/install/templates/services/value_object_base.rb +4 -0
- data/lib/generators/service/listener/listener_generator.rb +39 -0
- data/lib/generators/service/listener/templates/listener.rb.erb +11 -0
- data/lib/generators/service/micro/micro_generator.rb +11 -2
- data/lib/generators/service/query/USAGE +8 -0
- data/lib/generators/service/query/query_generator.rb +39 -0
- data/lib/generators/service/query/templates/query.rb.erb +22 -0
- data/lib/generators/service/service_generator.rb +12 -13
- data/lib/generators/service/setup/setup_generator.rb +20 -6
- data/lib/generators/service/setup/templates/doc.md.erb +39 -0
- data/lib/generators/service/usecase/templates/usecase.rb.erb +17 -3
- data/lib/generators/service/{test/templates/rspec/usecase.rb.erb → usecase/templates/usecase_spec.rb.erb} +0 -0
- data/lib/generators/service/usecase/usecase_generator.rb +22 -3
- data/lib/generators/service/value_object/templates/value_object.rb.erb +17 -0
- data/lib/generators/service/value_object/value_object_generator.rb +40 -0
- metadata +43 -15
- data/lib/generators/service/getter/getter_generator.rb +0 -30
- data/lib/generators/service/getter/templates/getter.rb.erb +0 -8
- data/lib/generators/service/policies.rb +0 -5
- data/lib/generators/service/test/USAGE +0 -8
- data/lib/generators/service/test/templates/minitest/usecase.rb.erb +0 -1
- data/lib/generators/service/test/test_generator.rb +0 -72
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c58b761fce4de1db245e0074625141f0c803f50f4611b359f3a632b1d04ff05b
|
4
|
+
data.tar.gz: e01ded8f6eb6c98a867da1dadab904ac8b00f37a45e248a033b4a2d6728708e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca1fae4e751ecf83514124c0fa189ff667ce7b180c2fdc531bd2e42365f64c4c55b3b71c0665c4ce137669dc578806044677027c37192d0b554bb766827f6263
|
7
|
+
data.tar.gz: 855ac6338a4660bc2fe704c4b42e9cb9ae9b8f45375b827149f23566d23b16fe566ebbf8d994114319fef56882ad896ce2663168747892ef3acd05b633725feb
|
data/Gemfile.lock
CHANGED
@@ -1,135 +1,148 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
command_service_object (
|
4
|
+
command_service_object (1.1.0)
|
5
|
+
hutch (~> 1.0)
|
5
6
|
virtus (~> 1.0, >= 1.0.5)
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: https://rubygems.org/
|
9
10
|
specs:
|
10
|
-
actioncable (5.2.
|
11
|
-
actionpack (= 5.2.
|
11
|
+
actioncable (5.2.4.4)
|
12
|
+
actionpack (= 5.2.4.4)
|
12
13
|
nio4r (~> 2.0)
|
13
14
|
websocket-driver (>= 0.6.1)
|
14
|
-
actionmailer (5.2.
|
15
|
-
actionpack (= 5.2.
|
16
|
-
actionview (= 5.2.
|
17
|
-
activejob (= 5.2.
|
15
|
+
actionmailer (5.2.4.4)
|
16
|
+
actionpack (= 5.2.4.4)
|
17
|
+
actionview (= 5.2.4.4)
|
18
|
+
activejob (= 5.2.4.4)
|
18
19
|
mail (~> 2.5, >= 2.5.4)
|
19
20
|
rails-dom-testing (~> 2.0)
|
20
|
-
actionpack (5.2.
|
21
|
-
actionview (= 5.2.
|
22
|
-
activesupport (= 5.2.
|
23
|
-
rack (~> 2.0)
|
21
|
+
actionpack (5.2.4.4)
|
22
|
+
actionview (= 5.2.4.4)
|
23
|
+
activesupport (= 5.2.4.4)
|
24
|
+
rack (~> 2.0, >= 2.0.8)
|
24
25
|
rack-test (>= 0.6.3)
|
25
26
|
rails-dom-testing (~> 2.0)
|
26
27
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
27
|
-
actionview (5.2.
|
28
|
-
activesupport (= 5.2.
|
28
|
+
actionview (5.2.4.4)
|
29
|
+
activesupport (= 5.2.4.4)
|
29
30
|
builder (~> 3.1)
|
30
31
|
erubi (~> 1.4)
|
31
32
|
rails-dom-testing (~> 2.0)
|
32
33
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
33
|
-
activejob (5.2.
|
34
|
-
activesupport (= 5.2.
|
34
|
+
activejob (5.2.4.4)
|
35
|
+
activesupport (= 5.2.4.4)
|
35
36
|
globalid (>= 0.3.6)
|
36
|
-
activemodel (5.2.
|
37
|
-
activesupport (= 5.2.
|
38
|
-
activerecord (5.2.
|
39
|
-
activemodel (= 5.2.
|
40
|
-
activesupport (= 5.2.
|
37
|
+
activemodel (5.2.4.4)
|
38
|
+
activesupport (= 5.2.4.4)
|
39
|
+
activerecord (5.2.4.4)
|
40
|
+
activemodel (= 5.2.4.4)
|
41
|
+
activesupport (= 5.2.4.4)
|
41
42
|
arel (>= 9.0)
|
42
|
-
activestorage (5.2.
|
43
|
-
actionpack (= 5.2.
|
44
|
-
activerecord (= 5.2.
|
43
|
+
activestorage (5.2.4.4)
|
44
|
+
actionpack (= 5.2.4.4)
|
45
|
+
activerecord (= 5.2.4.4)
|
45
46
|
marcel (~> 0.3.1)
|
46
|
-
activesupport (5.2.
|
47
|
+
activesupport (5.2.4.4)
|
47
48
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
48
49
|
i18n (>= 0.7, < 2)
|
49
50
|
minitest (~> 5.1)
|
50
51
|
tzinfo (~> 1.1)
|
52
|
+
amq-protocol (2.3.2)
|
51
53
|
arel (9.0.0)
|
52
54
|
axiom-types (0.1.1)
|
53
55
|
descendants_tracker (~> 0.0.4)
|
54
56
|
ice_nine (~> 0.11.0)
|
55
57
|
thread_safe (~> 0.3, >= 0.3.1)
|
56
|
-
builder (3.2.
|
58
|
+
builder (3.2.4)
|
59
|
+
bunny (2.15.0)
|
60
|
+
amq-protocol (~> 2.3, >= 2.3.1)
|
57
61
|
byebug (9.0.6)
|
62
|
+
carrot-top (0.0.7)
|
63
|
+
json
|
58
64
|
coercible (1.0.0)
|
59
65
|
descendants_tracker (~> 0.0.1)
|
60
|
-
concurrent-ruby (1.1.
|
61
|
-
crass (1.0.
|
66
|
+
concurrent-ruby (1.1.7)
|
67
|
+
crass (1.0.6)
|
62
68
|
descendants_tracker (0.0.4)
|
63
69
|
thread_safe (~> 0.3, >= 0.3.1)
|
64
70
|
equalizer (0.0.11)
|
65
|
-
erubi (1.
|
71
|
+
erubi (1.9.0)
|
66
72
|
globalid (0.4.2)
|
67
73
|
activesupport (>= 4.2.0)
|
68
|
-
|
74
|
+
hutch (1.0.0)
|
75
|
+
activesupport (>= 4.2, < 7)
|
76
|
+
bunny (>= 2.15, < 2.16)
|
77
|
+
carrot-top (~> 0.0.7)
|
78
|
+
multi_json (~> 1.14)
|
79
|
+
i18n (1.8.5)
|
69
80
|
concurrent-ruby (~> 1.0)
|
70
81
|
ice_nine (0.11.2)
|
71
|
-
|
82
|
+
json (2.3.1)
|
83
|
+
loofah (2.7.0)
|
72
84
|
crass (~> 1.0.2)
|
73
85
|
nokogiri (>= 1.5.9)
|
74
86
|
mail (2.7.1)
|
75
87
|
mini_mime (>= 0.1.1)
|
76
88
|
marcel (0.3.3)
|
77
89
|
mimemagic (~> 0.3.2)
|
78
|
-
method_source (0.
|
79
|
-
mimemagic (0.3.
|
80
|
-
mini_mime (1.0.
|
90
|
+
method_source (1.0.0)
|
91
|
+
mimemagic (0.3.5)
|
92
|
+
mini_mime (1.0.2)
|
81
93
|
mini_portile2 (2.4.0)
|
82
|
-
minitest (5.
|
83
|
-
|
84
|
-
|
94
|
+
minitest (5.14.2)
|
95
|
+
multi_json (1.15.0)
|
96
|
+
nio4r (2.5.4)
|
97
|
+
nokogiri (1.10.10)
|
85
98
|
mini_portile2 (~> 2.4.0)
|
86
|
-
rack (2.
|
99
|
+
rack (2.2.3)
|
87
100
|
rack-test (1.1.0)
|
88
101
|
rack (>= 1.0, < 3)
|
89
|
-
rails (5.2.
|
90
|
-
actioncable (= 5.2.
|
91
|
-
actionmailer (= 5.2.
|
92
|
-
actionpack (= 5.2.
|
93
|
-
actionview (= 5.2.
|
94
|
-
activejob (= 5.2.
|
95
|
-
activemodel (= 5.2.
|
96
|
-
activerecord (= 5.2.
|
97
|
-
activestorage (= 5.2.
|
98
|
-
activesupport (= 5.2.
|
102
|
+
rails (5.2.4.4)
|
103
|
+
actioncable (= 5.2.4.4)
|
104
|
+
actionmailer (= 5.2.4.4)
|
105
|
+
actionpack (= 5.2.4.4)
|
106
|
+
actionview (= 5.2.4.4)
|
107
|
+
activejob (= 5.2.4.4)
|
108
|
+
activemodel (= 5.2.4.4)
|
109
|
+
activerecord (= 5.2.4.4)
|
110
|
+
activestorage (= 5.2.4.4)
|
111
|
+
activesupport (= 5.2.4.4)
|
99
112
|
bundler (>= 1.3.0)
|
100
|
-
railties (= 5.2.
|
113
|
+
railties (= 5.2.4.4)
|
101
114
|
sprockets-rails (>= 2.0.0)
|
102
115
|
rails-dom-testing (2.0.3)
|
103
116
|
activesupport (>= 4.2.0)
|
104
117
|
nokogiri (>= 1.6)
|
105
|
-
rails-html-sanitizer (1.0
|
106
|
-
loofah (~> 2.
|
107
|
-
railties (5.2.
|
108
|
-
actionpack (= 5.2.
|
109
|
-
activesupport (= 5.2.
|
118
|
+
rails-html-sanitizer (1.3.0)
|
119
|
+
loofah (~> 2.3)
|
120
|
+
railties (5.2.4.4)
|
121
|
+
actionpack (= 5.2.4.4)
|
122
|
+
activesupport (= 5.2.4.4)
|
110
123
|
method_source
|
111
124
|
rake (>= 0.8.7)
|
112
125
|
thor (>= 0.19.0, < 2.0)
|
113
|
-
rake (
|
114
|
-
sprockets (
|
126
|
+
rake (13.0.1)
|
127
|
+
sprockets (4.0.2)
|
115
128
|
concurrent-ruby (~> 1.0)
|
116
129
|
rack (> 1, < 3)
|
117
|
-
sprockets-rails (3.2.
|
130
|
+
sprockets-rails (3.2.2)
|
118
131
|
actionpack (>= 4.0)
|
119
132
|
activesupport (>= 4.0)
|
120
133
|
sprockets (>= 3.0.0)
|
121
134
|
thor (0.20.3)
|
122
135
|
thread_safe (0.3.6)
|
123
|
-
tzinfo (1.2.
|
136
|
+
tzinfo (1.2.7)
|
124
137
|
thread_safe (~> 0.1)
|
125
138
|
virtus (1.0.5)
|
126
139
|
axiom-types (~> 0.1)
|
127
140
|
coercible (~> 1.0)
|
128
141
|
descendants_tracker (~> 0.0, >= 0.0.3)
|
129
142
|
equalizer (~> 0.0, >= 0.0.9)
|
130
|
-
websocket-driver (0.7.
|
143
|
+
websocket-driver (0.7.3)
|
131
144
|
websocket-extensions (>= 0.1.0)
|
132
|
-
websocket-extensions (0.1.
|
145
|
+
websocket-extensions (0.1.5)
|
133
146
|
|
134
147
|
PLATFORMS
|
135
148
|
ruby
|
@@ -140,8 +153,8 @@ DEPENDENCIES
|
|
140
153
|
command_service_object!
|
141
154
|
minitest (~> 5.11, >= 5.11.3)
|
142
155
|
rails (~> 5.0)
|
143
|
-
rake (~>
|
156
|
+
rake (~> 13.0)
|
144
157
|
thor (~> 0.20.3)
|
145
158
|
|
146
159
|
BUNDLED WITH
|
147
|
-
2.
|
160
|
+
2.1.4
|
data/README.md
CHANGED
@@ -8,19 +8,24 @@ Rails Generator for command service object.
|
|
8
8
|
|
9
9
|
### Implementation
|
10
10
|
|
11
|
-
Service consists of several objects { `Command Object` `Usecase Object`
|
11
|
+
Service consists of several objects { `Command Object` `Usecase Object` And `Error Object` (business logic error) }.
|
12
12
|
|
13
|
-
- **Command
|
14
|
-
- **Usecase
|
15
|
-
- **Micros:**
|
13
|
+
- **[Command](https://en.wikipedia.org/wiki/Command_pattern):** the object that responsible for containing `Client` requests and run input validations it's implemented using [Virtus](https://github.com/solnic/virtus) gem and can use `activerecord` for validations and it's existed under `commands` dir.
|
14
|
+
- **Usecase:** this object responsible for executing the business logic, Every `usecase` should execute one command type only so that command name should be the same as usecase object name, usecase object existed under 'usecases` dir.
|
15
|
+
- **Micros:** Small reusable logic under the same service.
|
16
|
+
- **Externals:** Simple ruby module works as a service interface whenever you wanna call any external service or even service that lives under the same project you should use it.
|
17
|
+
- **Queries:** This dir is the only entry point for you to get any data form a service.
|
18
|
+
- **Listeners:** An event listener that waits for an event outside the service to occur.
|
19
|
+
- **Entities:** Many objects are not fundamentally defined by their attributes, but rather by a thread of continuity and identity.
|
16
20
|
|
17
|
-
|
21
|
+
### Result Object
|
18
22
|
|
19
23
|
In case of successful or failure `ApplicationService` the responsible object for all services will return `service_result` object this object contain `value!` method containing successful call result, and `errors` method containing failure `errors` objects.
|
20
24
|
|
21
|
-
|
25
|
+
### Helpers:
|
22
26
|
|
23
|
-
|
27
|
+
- Fail: You can use `fail!` helper to raise business logic failures, ex: `fail!('user should not have any active cards')`.
|
28
|
+
- Check: To do business logic validations you can use `check!` helper ex: `check!('user should not have any active cards') { user.active_cards.empty? }`, if the given block returns false then it will raise fail! with the given message.
|
24
29
|
|
25
30
|
> You can check if the result successful or not by using `ok?` method.
|
26
31
|
|
@@ -56,8 +61,8 @@ output
|
|
56
61
|
```bash
|
57
62
|
app/services/
|
58
63
|
├── application_service.rb
|
59
|
-
├── external/
|
60
64
|
├── auth_service
|
65
|
+
│ ├ external/
|
61
66
|
│ ├── commands
|
62
67
|
│ │ └── login.rb
|
63
68
|
│ └── usecases
|
@@ -99,11 +104,9 @@ then you can edit command params
|
|
99
104
|
# frozen_string_literal: true
|
100
105
|
|
101
106
|
module AuthService::Commands
|
102
|
-
class Login
|
107
|
+
class Login < CommandBase
|
103
108
|
# You can read Virtus gem doc for more info.
|
104
109
|
# https://github.com/solnic/virtus
|
105
|
-
include Virtus.model
|
106
|
-
include ActiveModel::Validations
|
107
110
|
|
108
111
|
# Attributes
|
109
112
|
# attribute :REPLACE_ME, String
|
@@ -129,13 +132,29 @@ module AuthService::Usecases
|
|
129
132
|
# methods for Business logic.
|
130
133
|
#
|
131
134
|
def call
|
132
|
-
token = generate_jwt_token_for(user)
|
135
|
+
token = generate_jwt_token_for(cmd.user)
|
136
|
+
replace_me
|
137
|
+
|
138
|
+
output
|
139
|
+
end
|
140
|
+
|
141
|
+
def output
|
142
|
+
# return entity object
|
133
143
|
end
|
134
144
|
|
135
145
|
# This method will run if call method raise error
|
136
146
|
def rollback
|
137
147
|
# rollback logic
|
138
148
|
end
|
149
|
+
|
150
|
+
def allowed?
|
151
|
+
# policies loginc for issuer
|
152
|
+
# ex:
|
153
|
+
#
|
154
|
+
# return false if issuer.role != :admin
|
155
|
+
|
156
|
+
true
|
157
|
+
end
|
139
158
|
|
140
159
|
private
|
141
160
|
|
@@ -154,16 +173,16 @@ You can wrap external apis or services under `external/` dir
|
|
154
173
|
|
155
174
|
```ruby
|
156
175
|
module External
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
176
|
+
module StripeService
|
177
|
+
extend self
|
178
|
+
|
179
|
+
def charge(customer:, amount:, currency:, description: nil)
|
180
|
+
Stripe::Charge.create(
|
181
|
+
customer: customer.id,
|
182
|
+
amount: (round_up(amount, currency) * 100).to_i,
|
183
|
+
description: description || customer.email,
|
184
|
+
currency: currency
|
185
|
+
)
|
167
186
|
end
|
168
187
|
end
|
169
188
|
end
|
@@ -36,8 +36,9 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency 'byebug', '~> 9.0.6'
|
37
37
|
spec.add_development_dependency 'minitest', '~> 5.11', '>= 5.11.3'
|
38
38
|
spec.add_development_dependency 'rails', '~> 5.0'
|
39
|
-
spec.add_development_dependency 'rake', '~>
|
39
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
40
40
|
spec.add_development_dependency 'thor', '~> 0.20.3'
|
41
41
|
|
42
42
|
spec.add_dependency 'virtus', '~> 1.0', '>= 1.0.5'
|
43
|
+
spec.add_dependency 'hutch', '~> 1.0'
|
43
44
|
end
|
@@ -4,6 +4,7 @@ require 'command_service_object/failure'
|
|
4
4
|
require 'command_service_object/helpers/model_helper'
|
5
5
|
require 'command_service_object/helpers/controller_helper'
|
6
6
|
require 'command_service_object/helpers/failure_helper'
|
7
|
+
require 'command_service_object/helpers/check_helper'
|
7
8
|
require 'command_service_object/hooks'
|
8
9
|
require 'virtus'
|
9
10
|
|
Binary file
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../setup/setup_generator.rb'
|
2
|
+
require_relative '../helper'
|
2
3
|
|
3
4
|
module Service
|
4
5
|
module Generators
|
@@ -12,17 +13,36 @@ module Service
|
|
12
13
|
def call
|
13
14
|
invoke Service::Generators::SetupGenerator, [name]
|
14
15
|
@model_attributes = model_attributes
|
16
|
+
|
15
17
|
commands.each do |c|
|
16
18
|
@command = c.classify
|
17
|
-
|
18
|
-
|
19
|
+
create_main(c)
|
20
|
+
create_test(c)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
24
|
private
|
23
25
|
|
26
|
+
def create_main(m)
|
27
|
+
path = "#{service_path}/commands/#{m.underscore}.rb"
|
28
|
+
template 'command.rb.erb', path
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_test(m)
|
32
|
+
path = "#{spec_path}/commands/#{m.underscore}_spec.rb"
|
33
|
+
template 'command_spec.rb.erb', path
|
34
|
+
end
|
35
|
+
|
24
36
|
def service_name
|
25
|
-
|
37
|
+
Service::Helper.service_name(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def service_path
|
41
|
+
Service::Helper.service_path(name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def spec_path
|
45
|
+
Service::Helper.spec_path(name)
|
26
46
|
end
|
27
47
|
end
|
28
48
|
end
|
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../setup/setup_generator.rb'
|
2
|
+
require_relative '../helper'
|
3
|
+
|
4
|
+
module Service
|
5
|
+
module Generators
|
6
|
+
class EntityGenerator < Rails::Generators::NamedBase
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
|
9
|
+
argument :entities, type: :array, default: [], banner: 'entities entities'
|
10
|
+
|
11
|
+
def setup
|
12
|
+
invoke Service::Generators::SetupGenerator, [name]
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_micros
|
16
|
+
entities.each do |m|
|
17
|
+
@entity = m.classify
|
18
|
+
|
19
|
+
path = "#{service_path}/entities/#{m.underscore}.rb"
|
20
|
+
template 'entity.rb.erb', path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def service_name
|
27
|
+
Service::Helper.service_name(name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def service_path
|
31
|
+
Service::Helper.service_path(name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def spec_path
|
35
|
+
Service::Helper.spec_path(name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|