rider-kick 0.0.1 → 0.0.3
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 +34 -9
- data/lib/generators/rider_kick/USAGE +12 -0
- data/lib/generators/rider_kick/clean_arch_generator.rb +160 -0
- data/lib/generators/rider_kick/init_generator.rb +15 -0
- data/lib/generators/rider_kick/scaffold_generator.rb +125 -0
- data/lib/generators/rider_kick/structure_generator.rb +77 -0
- data/lib/generators/rider_kick/templates/.gitignore +57 -0
- data/lib/generators/rider_kick/templates/.rspec +5 -0
- data/lib/generators/rider_kick/templates/.rubocop.yml +1141 -0
- data/lib/generators/rider_kick/templates/README.md +69 -0
- data/lib/generators/rider_kick/templates/config/database.yml +21 -0
- data/lib/generators/rider_kick/templates/config/initializers/clean_archithecture.rb.tt +10 -0
- data/lib/generators/rider_kick/templates/config/initializers/generators.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/config/initializers/hashie.rb.tt +16 -0
- data/lib/generators/rider_kick/templates/config/initializers/pagy.rb.tt +13 -0
- data/lib/generators/rider_kick/templates/config/initializers/rider_kick.rb +3 -0
- data/lib/generators/rider_kick/templates/config/initializers/version.rb.tt +6 -0
- data/lib/generators/rider_kick/templates/config/initializers/zeitwerk.rb.tt +3 -0
- data/lib/generators/rider_kick/templates/db/migrate/20220613145533_init_database.rb +5 -0
- data/lib/generators/rider_kick/templates/db/structures/example.yaml.tt +96 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/builder.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/error.rb.tt +5 -0
- data/lib/generators/rider_kick/templates/domains/core/builders/pagination.rb.tt +14 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/entity.rb.tt +9 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/error.rb.tt +7 -0
- data/lib/generators/rider_kick/templates/domains/core/entities/pagination.rb.tt +8 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/abstract_repository.rb.tt +51 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/create.rb.tt +15 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/destroy.rb.tt +16 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/fetch_by_id.rb.tt +13 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/list.rb.tt +19 -0
- data/lib/generators/rider_kick/templates/domains/core/repositories/update.rb.tt +23 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/default.rb.tt +17 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/contract/pagination.rb.tt +15 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/create.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/destroy.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/fetch_by_id.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/get_version.rb.tt +17 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/list.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/use_cases/update.rb.tt +18 -0
- data/lib/generators/rider_kick/templates/domains/core/utils/request_methods.rb.tt +81 -0
- data/lib/generators/rider_kick/templates/env.development +14 -0
- data/lib/generators/rider_kick/templates/env.production +14 -0
- data/lib/generators/rider_kick/templates/env.test +14 -0
- data/lib/generators/rider_kick/templates/spec/fixtures/sample.pdf +5 -0
- data/lib/generators/rider_kick/templates/spec/rails_helper.rb +87 -0
- data/lib/generators/rider_kick/templates/spec/support/file_stuber.rb +13 -0
- data/lib/generators/rider_kick/templates/spec/support/repository_stubber.rb +10 -0
- data/lib/rider-kick.rb +3 -3
- data/lib/rider_kick/builders/abstract_active_record_entity_builder.rb +23 -21
- data/lib/rider_kick/builders/abstract_active_record_entity_builder_spec.rb +116 -0
- data/lib/rider_kick/configuration.rb +29 -0
- data/lib/rider_kick/matchers/use_case_result_spec.rb +1 -0
- data/lib/rider_kick/types.rb +0 -3
- data/lib/rider_kick/version.rb +1 -1
- metadata +52 -4
- data/sig/rider_kick.rbs +0 -4
@@ -0,0 +1,69 @@
|
|
1
|
+
## Setup project
|
2
|
+
|
3
|
+
### Init Project
|
4
|
+
```bash
|
5
|
+
$ cp env.example .env.development
|
6
|
+
$ bundle install
|
7
|
+
$ rails db:create
|
8
|
+
$ rails db:migrate
|
9
|
+
$ rails db:seed
|
10
|
+
```
|
11
|
+
### Run Server
|
12
|
+
```bash
|
13
|
+
$ rails s -b 0.0.0.0 -e development
|
14
|
+
# open new tab then run
|
15
|
+
# open your browser then serve to http://0.0.0.0:3000
|
16
|
+
```
|
17
|
+
|
18
|
+
### Run Console
|
19
|
+
```bash
|
20
|
+
$ rails console
|
21
|
+
(dev)> use_case = Core::UseCases::GetVersion
|
22
|
+
(dev)> contract = use_case.contract!({})
|
23
|
+
(dev)> result = use_case.new(contract).result
|
24
|
+
=> Success({:version=>"v1"}) # success
|
25
|
+
(dev)> result.success?
|
26
|
+
=> true
|
27
|
+
(dev)> result.success
|
28
|
+
=> {:version=>"0.0.1"}
|
29
|
+
```
|
30
|
+
|
31
|
+
Project Structure
|
32
|
+
## Clean Architecture
|
33
|
+
This structure provides helper interfaces and classes to assist in the construction of application with Clean Architecture, as described in Robert Martin's seminal book.
|
34
|
+
|
35
|
+
```
|
36
|
+
- app
|
37
|
+
- domains
|
38
|
+
- core
|
39
|
+
- entities (Contract Response)
|
40
|
+
- builder
|
41
|
+
- repositories (Business logic)
|
42
|
+
- use_cases (Just Usecase)
|
43
|
+
- utils (Class Reusable)
|
44
|
+
```
|
45
|
+
## Screaming architecture - use cases as an organisational principle
|
46
|
+
Uncle Bob suggests that your source code organisation should allow developers to easily find a listing of all use cases your application provides. Here's an example of how this might look in a this application.
|
47
|
+
```
|
48
|
+
- app
|
49
|
+
- domains
|
50
|
+
- core
|
51
|
+
...
|
52
|
+
- usecase
|
53
|
+
- retail_customer_opens_bank_account.rb
|
54
|
+
- retail_customer_makes_deposit.rb
|
55
|
+
- ...
|
56
|
+
```
|
57
|
+
Note that the use case name contains:
|
58
|
+
|
59
|
+
- the user role
|
60
|
+
- the action
|
61
|
+
- the (sometimes implied) subject
|
62
|
+
```ruby
|
63
|
+
[user role][action][subject].rb
|
64
|
+
# retail_customer_opens_bank_account.rb
|
65
|
+
# admin_fetch_info.rb [specific usecase]
|
66
|
+
# fetch_info.rb [generic usecase] every role can access it
|
67
|
+
```
|
68
|
+
|
69
|
+
Happy Coding!
|
@@ -0,0 +1,21 @@
|
|
1
|
+
default: &default
|
2
|
+
adapter: postgresql
|
3
|
+
encoding: unicode
|
4
|
+
pool: <%%= ENV.fetch("DATABASE_POOL") { 50 } %>
|
5
|
+
database: <%%= ENV["DATABASE_NAME"] %>
|
6
|
+
username: <%%= ENV["DATABASE_USERNAME"] %>
|
7
|
+
password: <%%= ENV["DATABASE_PASSWORD"] %>
|
8
|
+
host: <%%= ENV['DATABASE_HOSTNAME'] %>
|
9
|
+
port: <%%= ENV['DATABASE_PORT'].to_i %>
|
10
|
+
|
11
|
+
|
12
|
+
production:
|
13
|
+
primary:
|
14
|
+
<<: *default
|
15
|
+
|
16
|
+
development:
|
17
|
+
primary:
|
18
|
+
<<: *default
|
19
|
+
|
20
|
+
test:
|
21
|
+
<<: *default
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'dry/monads/all'
|
5
|
+
require 'dry-types'
|
6
|
+
module Types
|
7
|
+
include Dry.Types()
|
8
|
+
File = Types.Instance(::File) | Types.Instance(ActionDispatch::Http::UploadedFile) | Types.Instance(Rack::Test::UploadedFile)
|
9
|
+
public_constant :File
|
10
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Rails.application.config.generators do |gs|
|
2
|
+
gs.orm :active_record, primary_key_type: :uuid
|
3
|
+
gs.fixture_replacement :factory_bot
|
4
|
+
gs.assets = false
|
5
|
+
gs.helper = false
|
6
|
+
gs.test_framework :rspec,
|
7
|
+
fixtures: false,
|
8
|
+
view_specs: false,
|
9
|
+
model_specs: false,
|
10
|
+
helper_specs: false,
|
11
|
+
routing_specs: false,
|
12
|
+
request_specs: false,
|
13
|
+
controller_specs: false
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
as_attributes = <<-RUBY
|
2
|
+
def attributes
|
3
|
+
ActiveSupport::HashWithIndifferentAccess.new(self.as_json).symbolize_keys
|
4
|
+
end
|
5
|
+
RUBY
|
6
|
+
|
7
|
+
to_methods = <<-RUBY
|
8
|
+
def to_mash
|
9
|
+
Hashie::Mash.new(self)
|
10
|
+
end
|
11
|
+
RUBY
|
12
|
+
|
13
|
+
Hash.class_eval(as_attributes)
|
14
|
+
Hash.class_eval(to_methods)
|
15
|
+
Hashie::Mash.class_eval(as_attributes)
|
16
|
+
ActiveSupport::HashWithIndifferentAccess.class_eval(as_attributes)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Optionally override some pagy default with your own in the pagy initializer
|
5
|
+
Pagy::DEFAULT[:limit] = 30 # items per page
|
6
|
+
Pagy::DEFAULT[:size] = 9 # nav bar links
|
7
|
+
# Better user experience handled automatically
|
8
|
+
require 'pagy/extras/overflow'
|
9
|
+
Pagy::DEFAULT[:overflow] = :empty_page
|
10
|
+
require 'pagy/extras/elasticsearch_rails'
|
11
|
+
require 'pagy/extras/array'
|
12
|
+
|
13
|
+
include Pagy::Backend
|
@@ -0,0 +1,96 @@
|
|
1
|
+
model: <%= @model_class %>
|
2
|
+
resource_name: <%= @scope_path %>
|
3
|
+
actor: <%= @actor %>
|
4
|
+
fields:
|
5
|
+
<% @model_class.columns.each do |field| -%>
|
6
|
+
- <%= field.name.to_s %>
|
7
|
+
<% end -%>
|
8
|
+
uploaders:
|
9
|
+
<% @uploaders.each do |field| -%>
|
10
|
+
- <%= field %>
|
11
|
+
<% end -%>
|
12
|
+
search_able:
|
13
|
+
<% contract_fields.each do |field| -%>
|
14
|
+
<% if ['title', 'name'].include?(field) -%>
|
15
|
+
- <%= field %>
|
16
|
+
<% end -%>
|
17
|
+
<% end -%>
|
18
|
+
controllers:
|
19
|
+
route_scope: <%= @route_scope_path %>
|
20
|
+
list_fields:
|
21
|
+
<% @fields.each do |field| -%>
|
22
|
+
- <%= field %>
|
23
|
+
<% end -%>
|
24
|
+
show_fields:
|
25
|
+
<% @model_class.columns.each do |field| -%>
|
26
|
+
- <%= field.name.to_s %>
|
27
|
+
<% end -%>
|
28
|
+
form_fields:
|
29
|
+
<% (@fields + @uploaders).each do |field| -%>
|
30
|
+
- <%= field %>
|
31
|
+
<% end -%>
|
32
|
+
domains:
|
33
|
+
action_list:
|
34
|
+
endpoint:
|
35
|
+
is_auth: true
|
36
|
+
is_skip: false
|
37
|
+
parameters:
|
38
|
+
use_case:
|
39
|
+
contract:
|
40
|
+
action_fetch_by_id:
|
41
|
+
endpoint:
|
42
|
+
is_auth: true
|
43
|
+
is_skip: false
|
44
|
+
parameters:
|
45
|
+
use_case:
|
46
|
+
contract:
|
47
|
+
- required(:id).filled(:string)
|
48
|
+
action_create:
|
49
|
+
endpoint:
|
50
|
+
is_auth: true
|
51
|
+
is_skip: false
|
52
|
+
parameters:
|
53
|
+
use_case:
|
54
|
+
contract:
|
55
|
+
<% (@fields + @uploaders).each do |field| -%>
|
56
|
+
<% column_type = get_column_type(field) -%>
|
57
|
+
<% dry_type = @type_mapping[column_type.to_s] || ':string' -%>
|
58
|
+
<% if @uploaders.include?(field) -%>
|
59
|
+
- optional(:<%= field %>).maybe(<%= dry_type %>)
|
60
|
+
<% else -%>
|
61
|
+
- required(:<%= field %>).filled(<%= dry_type %>)
|
62
|
+
<% end -%>
|
63
|
+
<% end -%>
|
64
|
+
action_update:
|
65
|
+
endpoint:
|
66
|
+
is_auth: true
|
67
|
+
is_skip: false
|
68
|
+
parameters:
|
69
|
+
use_case:
|
70
|
+
contract:
|
71
|
+
- required(:id).filled(:string)
|
72
|
+
<% (@fields + @uploaders).each do |field| -%>
|
73
|
+
<% column_type = get_column_type(field) -%>
|
74
|
+
<% dry_type = @type_mapping[column_type.to_s] || ':string' -%>
|
75
|
+
<% if @uploaders.include?(field) -%>
|
76
|
+
- optional(:<%= field %>).maybe(<%= dry_type %>)
|
77
|
+
<% else -%>
|
78
|
+
- optional(:<%= field %>).maybe(<%= dry_type %>)
|
79
|
+
<% end -%>
|
80
|
+
<% end -%>
|
81
|
+
action_destroy:
|
82
|
+
endpoint:
|
83
|
+
is_auth: true
|
84
|
+
is_skip: false
|
85
|
+
parameters:
|
86
|
+
use_case:
|
87
|
+
contract:
|
88
|
+
- required(:id).filled(:string)
|
89
|
+
entity:
|
90
|
+
skipped_fields:
|
91
|
+
- id
|
92
|
+
- created_at
|
93
|
+
- updated_at
|
94
|
+
<% if @model_class.columns.map(&:name).include?(:type) -%>
|
95
|
+
- type
|
96
|
+
<% end -%>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Builders::<%= @subject_class %> < RiderKick::Builders::AbstractActiveRecordEntityBuilder
|
4
|
+
acts_as_builder_for_entity Core::Entities::<%= @subject_class%>
|
5
|
+
<% if @uploaders.present? -%>
|
6
|
+
def attributes_for_entity
|
7
|
+
{
|
8
|
+
<% @uploaders.each_with_index do |upload, index| -%>
|
9
|
+
<%= upload %>: (Rails.application.routes.url_helpers.polymorphic_url(params.<%= upload %>) rescue '')<%= ',' if index < @uploaders.size - 1 %>
|
10
|
+
<% end -%>
|
11
|
+
}
|
12
|
+
end
|
13
|
+
<% end -%>
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Builders::Pagination < RiderKick::Builders::AbstractActiveRecordEntityBuilder
|
4
|
+
acts_as_builder_for_entity Core::Entities::Pagination
|
5
|
+
|
6
|
+
def attributes_for_entity
|
7
|
+
{
|
8
|
+
total_count: params[:count],
|
9
|
+
page: params.page,
|
10
|
+
per_page: params.limit,
|
11
|
+
page_count: params.last
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Entities::<%= @subject_class %> < Dry::Struct
|
4
|
+
<% (['id'] + @fields + @uploaders + ['created_at', 'updated_at']).each do |field| -%>
|
5
|
+
<% column_type = get_column_type(field) -%>
|
6
|
+
<% dry_type = @entity_type_mapping[column_type.to_s] || 'Types::Strict::String' -%>
|
7
|
+
attribute :<%= field %>, <%= dry_type %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Entities::Pagination < Dry::Struct
|
4
|
+
attribute :total_count, Types::Strict::Integer
|
5
|
+
attribute :page, Types::Strict::Integer
|
6
|
+
attribute :per_page, Types::Strict::Integer
|
7
|
+
attribute :page_count, Types::Strict::Integer
|
8
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::AbstractRepository
|
4
|
+
include Dry::Monads[:result, :do]
|
5
|
+
|
6
|
+
def http
|
7
|
+
extend(Core::Utils::RequestMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_response(response)
|
11
|
+
begin
|
12
|
+
res = JSON.parse(response.body)
|
13
|
+
rescue => e
|
14
|
+
return Failure e
|
15
|
+
end
|
16
|
+
unless ['200', '201', '202'].include?(response.code.to_s)
|
17
|
+
return Failure Hashie::Mash.new(res)
|
18
|
+
end
|
19
|
+
Success Hashie::Mash.new(res)
|
20
|
+
end
|
21
|
+
|
22
|
+
def error_messages_for(record)
|
23
|
+
record.errors.to_a.join(', ')
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_errors(resource)
|
27
|
+
errors = []
|
28
|
+
resource.errors.each do |error|
|
29
|
+
errors << Core::Builders::Error.new(error.as_json).build
|
30
|
+
end
|
31
|
+
errors
|
32
|
+
end
|
33
|
+
|
34
|
+
def prepare!(params, sanitize: true)
|
35
|
+
if sanitize
|
36
|
+
Hashie::Mash.new(params.reject { |_, v| v.nil? || (v.is_a?(String) && v.blank?) })
|
37
|
+
else
|
38
|
+
Hashie::Mash.new(params)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def paginate!(pagy)
|
43
|
+
Core::Builders::Pagination.new(Hashie::Mash.new(pagy.as_json)).build
|
44
|
+
end
|
45
|
+
|
46
|
+
def build_pagination_variable!(params)
|
47
|
+
@per_page = params[:per_page] || Pagy::DEFAULT[:limit]
|
48
|
+
@page = params[:page] || Pagy::DEFAULT[:page]
|
49
|
+
@search = params[:search]
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::<%= @scope_class %>::<%= @repository_class %> < Core::Repositories::AbstractRepository
|
4
|
+
def initialize(params: {})
|
5
|
+
@params = prepare! params, sanitize: true
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(builder: true)
|
9
|
+
resource = <%= @model_class %>.new(@params.to_h)
|
10
|
+
unless resource.save
|
11
|
+
return Failure build_errors(resource)
|
12
|
+
end
|
13
|
+
Success Core::Builders::<%= @subject_class %>.new(resource).build
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::<%= @scope_class %>::<%= @repository_class %> < Core::Repositories::AbstractRepository
|
4
|
+
def initialize(id:)
|
5
|
+
@id = id
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(builder: true)
|
9
|
+
resource = <%= @model_class %>.find_by(id: @id)
|
10
|
+
return Failure '<%= @subject_class %> not found' unless resource.present?
|
11
|
+
unless resource.destroy
|
12
|
+
return Failure build_errors(resource)
|
13
|
+
end
|
14
|
+
Success '<%= @subject_class%> Destroyed.'
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::<%= @scope_class %>::<%= @repository_class %> < Core::Repositories::AbstractRepository
|
4
|
+
def initialize(id:)
|
5
|
+
@id = id
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(builder: true)
|
9
|
+
resource = <%= @model_class %>.find_by(id: @id)
|
10
|
+
return Failure '<%= @subject_class %> not found' unless resource.present?
|
11
|
+
Success Core::Builders::<%= @subject_class %>.new(resource).build
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::<%= @scope_class %>::<%= @repository_class%> < Core::Repositories::AbstractRepository
|
4
|
+
def initialize(params:)
|
5
|
+
@params = prepare! params, sanitize: true
|
6
|
+
build_pagination_variable! @params
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(builder: true)
|
10
|
+
resources = <%= @model_class %>
|
11
|
+
if @search.present?
|
12
|
+
resources = resources.where('<%= @search_able.map { |field| "LOWER(#{field}) LIKE :search" }.join(' OR ')%>', search: "%#{search}%")
|
13
|
+
end
|
14
|
+
return Success [] unless resources.present?
|
15
|
+
pagy, results = pagy(resources.order(created_at: :desc), limit: @per_page, page: @page)
|
16
|
+
response = results.map { |result| Core::Builders::<%= @subject_class %>.new(result).build }
|
17
|
+
Success Hashie::Mash.new(response: response, meta: paginate!(pagy))
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::Repositories::<%= @scope_class %>::<%= @repository_class %> < Core::Repositories::AbstractRepository
|
4
|
+
def initialize(id:, params: {})
|
5
|
+
@id = id
|
6
|
+
@params = prepare! params, sanitize: true
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(builder: true)
|
10
|
+
resource = <%= @model_class %>.find_by(id: @id)
|
11
|
+
return Failure '<%= @subject_class %> not found' unless resource.present?
|
12
|
+
<% if @uploaders.present? -%>
|
13
|
+
# Remove the existing images if a new one is being uploaded
|
14
|
+
<% @uploaders.each do |uplaoder| -%>
|
15
|
+
resource.<%=uplaoder %>.purge if @params.<%=uplaoder %>.present? && resource.<%=uplaoder %>.attached?
|
16
|
+
<% end -%>
|
17
|
+
<% end -%>
|
18
|
+
unless resource.update(@params.to_h)
|
19
|
+
return Failure build_errors(resource)
|
20
|
+
end
|
21
|
+
Success Core::Builders::<%= @subject_class %>.new(resource).build
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::Contract::Default
|
4
|
+
def call
|
5
|
+
default
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def default
|
11
|
+
Dry::Schema.Params do
|
12
|
+
<% if RiderKick.scope_owner_column.present? -%>
|
13
|
+
required(:<%=RiderKick.scope_owner_column%> ).filled(:string)
|
14
|
+
<% end-%>
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Core::UseCases::Contract::Pagination
|
2
|
+
def call
|
3
|
+
pagination
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def pagination
|
9
|
+
Dry::Schema.Params do
|
10
|
+
optional(:page).maybe(:integer)
|
11
|
+
optional(:per_page).maybe(:integer)
|
12
|
+
optional(:search).maybe(:string)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].join("::") %> < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params(Core::UseCases::Contract::Default.new.call) do
|
6
|
+
<% @contract_create.each do |field| -%>
|
7
|
+
<%= field %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# Set specific return monads at method 'result'
|
12
|
+
include Dry::Monads::Do.for(:result)
|
13
|
+
|
14
|
+
def result
|
15
|
+
params = yield build_parameter!
|
16
|
+
Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].join("::") %> < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params(Core::UseCases::Contract::Default.new.call) do
|
6
|
+
<% @contract_destroy.each do |field| -%>
|
7
|
+
<%= field %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# Set specific return monads at method 'result'
|
12
|
+
include Dry::Monads::Do.for(:result)
|
13
|
+
|
14
|
+
def result
|
15
|
+
params = yield build_parameter!
|
16
|
+
Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(id: params.id).call(builder: true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].join("::") %> < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params(Core::UseCases::Contract::Default.new.call) do
|
6
|
+
<% @contract_fetch_by_id.each do |field| -%>
|
7
|
+
<%= field %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# Set specific return monads at method 'result'
|
12
|
+
include Dry::Monads::Do.for(:result)
|
13
|
+
|
14
|
+
def result
|
15
|
+
params = yield build_parameter!
|
16
|
+
Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(id: params.id).call(builder: true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::GetVersion < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params do
|
6
|
+
# required(:version).filled(:string)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
# Set specific return monads at method 'result'
|
10
|
+
include Dry::Monads::Do.for(:result)
|
11
|
+
|
12
|
+
def result
|
13
|
+
params = yield build_parameter!
|
14
|
+
response = { version: <%= Rails.application.class.module_parent_name %>::VERSION }
|
15
|
+
Success response
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].join("::") %> < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params(Core::UseCases::Contract::Default.new.call, Core::UseCases::Contract::Pagination.new.call) do
|
6
|
+
<% @contract_list.each do |field| -%>
|
7
|
+
<%= field %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# Set specific return monads at method 'result'
|
12
|
+
include Dry::Monads::Do.for(:result)
|
13
|
+
|
14
|
+
def result
|
15
|
+
params = yield build_parameter!
|
16
|
+
Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(params: params).call(builder: true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Core::UseCases::<%= [@route_scope_class, @scope_class, @use_case_class].join("::") %> < RiderKick::UseCases::AbstractUseCase
|
4
|
+
contract do
|
5
|
+
params(Core::UseCases::Contract::Default.new.call) do
|
6
|
+
<% @contract_update.each do |field| -%>
|
7
|
+
<%= field %>
|
8
|
+
<% end -%>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# Set specific return monads at method 'result'
|
12
|
+
include Dry::Monads::Do.for(:result)
|
13
|
+
|
14
|
+
def result
|
15
|
+
params = yield build_parameter!
|
16
|
+
Core::Repositories::<%= @scope_class%>::<%= @repository_class%>.new(id: params.id, params: params.except(:id)).call(builder: true)
|
17
|
+
end
|
18
|
+
end
|