sun-sword 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +1141 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +96 -0
- data/Rakefile +12 -0
- data/lib/generators/sun_sword/USAGE +9 -0
- data/lib/generators/sun_sword/frontend_generator.rb +148 -0
- data/lib/generators/sun_sword/scaffold_generator.rb +97 -0
- data/lib/generators/sun_sword/templates_frontend/Procfile.dev +1 -0
- data/lib/generators/sun_sword/templates_frontend/assets/config/manifest.js +1 -0
- data/lib/generators/sun_sword/templates_frontend/bin/watch +3 -0
- data/lib/generators/sun_sword/templates_frontend/config/database.yml +21 -0
- data/lib/generators/sun_sword/templates_frontend/config/vite.json +17 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/application_controller.rb.tt +36 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/dashboard/site_controller.rb +6 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/site_controller.rb +15 -0
- data/lib/generators/sun_sword/templates_frontend/env.development +14 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/.keep +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/kotaro.ico +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/logo.svg +16 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/profile.jpeg +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/entrypoints/application.js +17 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/entrypoints/stimulus.js +9 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/pages/stimulus.js +10 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/pages/web.js +122 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/stylesheets/application.scss +198 -0
- data/lib/generators/sun_sword/templates_frontend/helpers/application_helper.rb +5 -0
- data/lib/generators/sun_sword/templates_frontend/package.json +7 -0
- data/lib/generators/sun_sword/templates_frontend/postcss.config.js +6 -0
- data/lib/generators/sun_sword/templates_frontend/rubocop.yml.tt +1141 -0
- data/lib/generators/sun_sword/templates_frontend/tailwind.config.js +39 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_destroy.html.erb.tt +48 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_edit.html.erb.tt +7 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_show.html.erb.tt +8 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_alert.html.erb.tt +66 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_error_form_submit.html.erb.tt +20 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_link_action.html.erb.tt +9 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/layouts/_sidebar_logo.html.erb +18 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/application.html.erb.tt +42 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/dashboard/_sidebar.html.erb.tt +60 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/dashboard/application.html.erb.tt +71 -0
- data/lib/generators/sun_sword/templates_frontend/views/site/_comment.html.erb.tt +3 -0
- data/lib/generators/sun_sword/templates_frontend/views/site/stimulus.html.erb.tt +26 -0
- data/lib/generators/sun_sword/templates_frontend/vite.config.ts.tt +27 -0
- data/lib/generators/sun_sword/templates_scaffold/controllers/controller.rb.tt +90 -0
- data/lib/generators/sun_sword/templates_scaffold/example.rb.tt +2 -0
- data/lib/generators/sun_sword/templates_scaffold/views/_form.html.erb.tt +22 -0
- data/lib/generators/sun_sword/templates_scaffold/views/components/menu/link.html.erb.tt +1 -0
- data/lib/generators/sun_sword/templates_scaffold/views/edit.html.erb.tt +10 -0
- data/lib/generators/sun_sword/templates_scaffold/views/index.html.erb.tt +50 -0
- data/lib/generators/sun_sword/templates_scaffold/views/new.html.erb.tt +10 -0
- data/lib/generators/sun_sword/templates_scaffold/views/show.html.erb.tt +26 -0
- data/lib/sun-sword.rb +7 -0
- data/lib/sun_sword/version.rb +6 -0
- metadata +141 -0
data/CHANGELOG.md
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2024 kotarominami
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# SunSword
|
2
|
+
This gem provides helper interfaces and classes to assist in the construction of application with
|
3
|
+
Clean Architecture, as described in [Robert Martin's seminal book](https://www.amazon.com/gp/product/0134494164).
|
4
|
+
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'rider-kick'
|
12
|
+
gem 'sun-sword'
|
13
|
+
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
$ rails new kotaro_minami -d=postgresql -T --skip-javascript --skip-asset-pipeline
|
18
|
+
$ bundle install
|
19
|
+
$ rails generate rider_kick:init
|
20
|
+
$ rails generate rider_kick:clean_arch --setup
|
21
|
+
$ rails db:drop db:create db:migrate db:seed
|
22
|
+
$ rails generate sun_sword:frontend
|
23
|
+
|
24
|
+
$ rubocop -a
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
```bash
|
28
|
+
Description:
|
29
|
+
Clean Architecture CRUD generator
|
30
|
+
rails new kotaro_minami -d=postgresql -T --skip-javascript --skip-asset-pipeline
|
31
|
+
|
32
|
+
Example:
|
33
|
+
To Generate Init:
|
34
|
+
bin/rails generate rider_kick:init
|
35
|
+
|
36
|
+
To Generate Pattern:
|
37
|
+
bin/rails generate rider_kick:clean_arch --setup
|
38
|
+
|
39
|
+
To Generate Frontend:
|
40
|
+
bin/rails generate sun_sword:frontend --setup
|
41
|
+
|
42
|
+
To Generate scaffold:
|
43
|
+
bin/rails generate sun_sword:scaffold Models::Contact actor:user
|
44
|
+
```
|
45
|
+
|
46
|
+
## Philosophy
|
47
|
+
|
48
|
+
The intention of this gem is to help you build applications that are built from the use case down,
|
49
|
+
and decisions about I/O can be deferred until the last possible moment.
|
50
|
+
|
51
|
+
## Clean Architecture
|
52
|
+
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.
|
53
|
+
|
54
|
+
```
|
55
|
+
- app
|
56
|
+
- controllers
|
57
|
+
- ...
|
58
|
+
- models
|
59
|
+
- models
|
60
|
+
- ...
|
61
|
+
- domains
|
62
|
+
- entities (Contract Response)
|
63
|
+
- builder
|
64
|
+
- repositories (Business logic)
|
65
|
+
- use_cases (Just Usecase)
|
66
|
+
- utils (Class Reusable)
|
67
|
+
```
|
68
|
+
## Screaming architecture - use cases as an organisational principle
|
69
|
+
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.
|
70
|
+
```
|
71
|
+
- app
|
72
|
+
- controllers
|
73
|
+
- ...
|
74
|
+
- models
|
75
|
+
- models
|
76
|
+
- ...
|
77
|
+
- domains
|
78
|
+
- core
|
79
|
+
...
|
80
|
+
- usecase
|
81
|
+
- retail_customer_opens_bank_account.rb
|
82
|
+
- retail_customer_makes_deposit.rb
|
83
|
+
- ...
|
84
|
+
```
|
85
|
+
Note that the use case name contains:
|
86
|
+
|
87
|
+
- the user role
|
88
|
+
- the action
|
89
|
+
- the (sometimes implied) subject
|
90
|
+
```ruby
|
91
|
+
[user role][action][subject].rb
|
92
|
+
# retail_customer_opens_bank_account.rb
|
93
|
+
# admin_fetch_info.rb [specific usecase]
|
94
|
+
# fetch_info.rb [generic usecase] every role can access it
|
95
|
+
```
|
96
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Description:
|
2
|
+
Clean Architecture CRUD generator
|
3
|
+
rails new jendral_jack -d=postgresql -T --skip-javascript --skip-asset-pipeline
|
4
|
+
|
5
|
+
Example:
|
6
|
+
bin/rails generate sun_sword:frontend --setup
|
7
|
+
bin/rails generate sun_sword:scaffold contacts<check in db/structure>
|
8
|
+
|
9
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
module SunSword
|
2
|
+
class FrontendGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates_frontend', __dir__)
|
4
|
+
|
5
|
+
class_option :setup, type: :boolean, default: false, desc: 'Setup domain structure'
|
6
|
+
|
7
|
+
def validate_setup_option
|
8
|
+
unless options.setup
|
9
|
+
raise Thor::Error, 'The --setup option must be specified to create the domain structure.'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'This generator installs Vite with Rails 7 configuration'
|
14
|
+
|
15
|
+
def setup
|
16
|
+
remove_assets_folder
|
17
|
+
copy_assets_from_template
|
18
|
+
|
19
|
+
# copy_database_config
|
20
|
+
# copy_env_development
|
21
|
+
|
22
|
+
add_vite_to_gemfile
|
23
|
+
install_vite
|
24
|
+
configure_vite
|
25
|
+
|
26
|
+
modify_application_js
|
27
|
+
generate_default_frontend
|
28
|
+
generate_controllers_site
|
29
|
+
generate_components
|
30
|
+
modify_layout_for_vite
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def remove_assets_folder
|
36
|
+
assets_path = "#{path_app}/assets"
|
37
|
+
if Dir.exist?(assets_path)
|
38
|
+
remove_dir(assets_path)
|
39
|
+
say "Folder '#{assets_path}' has been removed.", :green
|
40
|
+
else
|
41
|
+
say "Folder '#{assets_path}' does not exist.", :yellow
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def copy_assets_from_template
|
46
|
+
template 'assets/config/manifest.js', File.join('assets/config/manifest.js')
|
47
|
+
say "File '#{path_app}/assets' has been copied from template.", :green
|
48
|
+
end
|
49
|
+
|
50
|
+
def copy_database_config
|
51
|
+
template 'config/database.yml', File.join('config/database.yml')
|
52
|
+
end
|
53
|
+
|
54
|
+
def copy_env_development
|
55
|
+
template 'env.development', File.join('.env.development')
|
56
|
+
template 'env.development', File.join('env.example')
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_vite_to_gemfile
|
60
|
+
gem_dependencies = <<~RUBY
|
61
|
+
|
62
|
+
# --- SunSword Package frontend
|
63
|
+
gem "turbo-rails"
|
64
|
+
gem "stimulus-rails"
|
65
|
+
gem "vite_rails"
|
66
|
+
RUBY
|
67
|
+
append_to_file('Gemfile', gem_dependencies)
|
68
|
+
say 'Vite Rails gem added and bundle installed', :green
|
69
|
+
end
|
70
|
+
|
71
|
+
def install_vite
|
72
|
+
template 'package.json', 'package.json'
|
73
|
+
run 'bundle exec vite install'
|
74
|
+
run 'yarn add -D sass vite-plugin-full-reload vite-plugin-ruby vite-plugin-stimulus-hmr'
|
75
|
+
run 'yarn add -D tailwindcss @tailwindcss/forms @tailwindcss/typography @tailwindcss/aspect-ratio @tailwindcss/forms @tailwindcss/line-clamp autoprefixer'
|
76
|
+
run 'yarn add -D eslint prettier eslint-plugin-prettier eslint-config-prettier eslint-plugin-tailwindcss path'
|
77
|
+
run 'yarn add @hotwired/stimulus @hotwired/turbo-rails stimulus-vite-helpers vite animejs stimulus-use'
|
78
|
+
say 'Vite installed successfully', :green
|
79
|
+
end
|
80
|
+
|
81
|
+
def configure_vite
|
82
|
+
say 'Configuring Vite...'
|
83
|
+
|
84
|
+
# Add a basic Vite configuration file to your Rails app
|
85
|
+
template 'tailwind.config.js', 'tailwind.config.js'
|
86
|
+
template 'postcss.config.js', 'postcss.config.js'
|
87
|
+
template 'vite.config.ts.tt', 'vite.config.ts'
|
88
|
+
template 'Procfile.dev', 'Procfile.dev'
|
89
|
+
template 'bin/watch', 'bin/watch'
|
90
|
+
run 'chmod +x bin/watch'
|
91
|
+
template 'config/vite.json', 'config/vite.json'
|
92
|
+
|
93
|
+
say 'Vite configuration completed', :green
|
94
|
+
end
|
95
|
+
|
96
|
+
def modify_application_js
|
97
|
+
if File.exist?('app/javascript/application.js')
|
98
|
+
|
99
|
+
say 'Updated application.js for Vite', :green
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def generate_default_frontend
|
104
|
+
directory('frontend', 'app/frontend')
|
105
|
+
say 'Generate default controller', :green
|
106
|
+
end
|
107
|
+
|
108
|
+
def generate_components
|
109
|
+
directory('views/components', 'app/views/components')
|
110
|
+
say 'Generate default controller', :green
|
111
|
+
end
|
112
|
+
|
113
|
+
def generate_controllers_site
|
114
|
+
run 'rails g controller site stimulus'
|
115
|
+
template 'controllers/site_controller.rb', File.join('app/controllers/site_controller.rb')
|
116
|
+
template 'controllers/application_controller.rb.tt', File.join('app/controllers/application_controller.rb')
|
117
|
+
site_route = <<-RUBY
|
118
|
+
|
119
|
+
root "site#stimulus"
|
120
|
+
get "site/jadi_a"
|
121
|
+
get "site/jadi_b"
|
122
|
+
|
123
|
+
namespace :dashboard do
|
124
|
+
get "site" => "site#index", as: :dashboard_site_index
|
125
|
+
end
|
126
|
+
|
127
|
+
RUBY
|
128
|
+
inject_into_file 'config/routes.rb', site_route, after: "Rails.application.routes.draw do\n"
|
129
|
+
|
130
|
+
say 'Generate default controller', :green
|
131
|
+
end
|
132
|
+
|
133
|
+
def path_app
|
134
|
+
'app'
|
135
|
+
end
|
136
|
+
|
137
|
+
def modify_layout_for_vite
|
138
|
+
template 'views/site/stimulus.html.erb.tt', 'app/views/site/stimulus.html.erb'
|
139
|
+
template 'views/site/_comment.html.erb.tt', 'app/views/site/_comment.html.erb'
|
140
|
+
template 'views/layouts/application.html.erb.tt', 'app/views/layouts/application.html.erb'
|
141
|
+
|
142
|
+
directory('views/layouts/dashboard', 'app/views/layouts/dashboard')
|
143
|
+
directory('helpers', 'app/helpers')
|
144
|
+
template('controllers/dashboard/site_controller.rb', 'app/controllers/dashboard/site_controller.rb')
|
145
|
+
say 'Updated application layout for Vite integration', :green
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module SunSword
|
2
|
+
class ScaffoldGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('templates_scaffold', __dir__)
|
4
|
+
|
5
|
+
argument :arg_structure, type: :string, default: '', banner: ''
|
6
|
+
|
7
|
+
def running
|
8
|
+
validation!
|
9
|
+
setup_variables
|
10
|
+
create_root_folder
|
11
|
+
create_controller_file
|
12
|
+
create_view_file
|
13
|
+
create_link_file
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def validation!
|
19
|
+
unless File.exist?('config/initializers/rider_kick.rb')
|
20
|
+
say 'Error must create init configuration for rider_kick!'
|
21
|
+
raise Thor::Error, 'run: bin/rails generate rider_kick:init'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup_variables
|
26
|
+
config = YAML.load_file("db/structures/#{arg_structure}_structure.yaml")
|
27
|
+
@structure = Hashie::Mash.new(config)
|
28
|
+
|
29
|
+
# Mengambil detail konfigurasi
|
30
|
+
model_name = @structure.model
|
31
|
+
resource_name = @structure.resource_name.singularize.underscore.downcase
|
32
|
+
entity = @structure.entity || {}
|
33
|
+
|
34
|
+
@actor = @structure.actor
|
35
|
+
@uploaders = @structure.uploaders || []
|
36
|
+
@search_able = @structure.search_able || []
|
37
|
+
@services = @structure.domains || {}
|
38
|
+
@controllers = @structure.controllers || {}
|
39
|
+
@contract_list = @services.action_list.use_case.contract || []
|
40
|
+
@contract_fetch_by_id = @services.action_fetch_by_id.use_case.contract || []
|
41
|
+
@contract_create = @services.action_create.use_case.contract || []
|
42
|
+
@contract_update = @services.action_update.use_case.contract || []
|
43
|
+
@contract_destroy = @services.action_destroy.use_case.contract || []
|
44
|
+
@skipped_fields = entity.skipped_fields || []
|
45
|
+
@custom_fields = entity.custom_fields || []
|
46
|
+
@route_scope_path = @structure.controllers.route_scope.downcase rescue ''
|
47
|
+
@route_scope_class = @route_scope_path.camelize rescue ''
|
48
|
+
|
49
|
+
@variable_subject = model_name.split('::').last.underscore.downcase
|
50
|
+
@scope_path = resource_name.pluralize.underscore.downcase
|
51
|
+
@scope_class = @scope_path.camelize
|
52
|
+
@model_class = model_name.camelize.constantize
|
53
|
+
@subject_class = resource_name.camelize
|
54
|
+
@fields = contract_fields
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_usecase_filename(action, suffix = '')
|
58
|
+
"#{@actor}_#{action}_#{@variable_subject}#{suffix}".camelize
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_root_folder
|
62
|
+
empty_directory File.join('app/views', @route_scope_path.to_s, @scope_path.to_s)
|
63
|
+
end
|
64
|
+
|
65
|
+
def create_controller_file
|
66
|
+
template 'controllers/controller.rb.tt', File.join('app/controllers', @route_scope_path.to_s, "#{@scope_path}_controller.rb")
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_view_file
|
70
|
+
template 'views/_form.html.erb.tt', File.join('app/views', @route_scope_path.to_s, @scope_path.to_s, '_form.html.erb')
|
71
|
+
template 'views/edit.html.erb.tt', File.join('app/views', @route_scope_path.to_s, @scope_path.to_s, 'edit.html.erb')
|
72
|
+
template 'views/index.html.erb.tt', File.join('app/views', @route_scope_path.to_s, @scope_path.to_s, 'index.html.erb')
|
73
|
+
template 'views/new.html.erb.tt', File.join('app/views', @route_scope_path.to_s, @scope_path.to_s, 'new.html.erb')
|
74
|
+
template 'views/show.html.erb.tt', File.join('app/views', @route_scope_path.to_s, @scope_path.to_s, 'show.html.erb')
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_link_file
|
78
|
+
template 'views/components/menu/link.html.erb.tt', File.join('app/views/components/menu', "_link_to_#{@scope_path}.html.erb")
|
79
|
+
link_to = " <li><%= render 'components/menu/#{"link_to_#{@scope_path}"}' %></li>\n"
|
80
|
+
inject_into_file 'app/views/layouts/dashboard/_sidebar.html.erb', link_to, before: " <%# generate_link %>\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
def contract_fields
|
84
|
+
skip_contract_fields = @skipped_fields.map(&:strip).uniq
|
85
|
+
if RiderKick.scope_owner_column.present?
|
86
|
+
skip_contract_fields << RiderKick.scope_owner_column.to_s
|
87
|
+
end
|
88
|
+
@model_class.columns.reject { |column| skip_contract_fields.include?(column.name.to_s) }.map(&:name).map(&:to_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
def strong_params
|
92
|
+
results = ''
|
93
|
+
@controllers.form_fields.map { |tc| results << ":#{tc}," }
|
94
|
+
results[0..-2]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
vite: bin/vite dev --clobber
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link application.css
|
@@ -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,17 @@
|
|
1
|
+
{
|
2
|
+
"all": {
|
3
|
+
"sourceCodeDir": "app/frontend",
|
4
|
+
"watchAdditionalPaths": []
|
5
|
+
},
|
6
|
+
"development": {
|
7
|
+
"autoBuild": true,
|
8
|
+
"host": "127.0.0.1",
|
9
|
+
"publicOutputDir": "vite-dev",
|
10
|
+
"port": 3036
|
11
|
+
},
|
12
|
+
"test": {
|
13
|
+
"autoBuild": true,
|
14
|
+
"publicOutputDir": "vite-test",
|
15
|
+
"port": 3037
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
|
3
|
+
allow_browser versions: :modern
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def build_contract(params)
|
8
|
+
# { "<%=RiderKick.scope_owner_column.to_s%>": current_auth.account.id SecureRandom.uuid }.merge(params)
|
9
|
+
{ <%=RiderKick.scope_owner_column.to_s%>: SecureRandom.uuid }.merge(params)
|
10
|
+
end
|
11
|
+
|
12
|
+
def build_form_errors(params, model, errors)
|
13
|
+
params.keys.each do |key|
|
14
|
+
model[key] = params[key]
|
15
|
+
end
|
16
|
+
if errors.is_a?(Hash)
|
17
|
+
errors.keys.each do |key|
|
18
|
+
model.errors.add(key, :invalid, message: errors[key][0])
|
19
|
+
end
|
20
|
+
elsif errors.is_a?(Array)
|
21
|
+
errors.each do |error|
|
22
|
+
if error.options.present?
|
23
|
+
model.errors.add(error.attribute, error.type, message: error.options['message'])
|
24
|
+
else
|
25
|
+
model.errors.add(error.attribute, error.type)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
model
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_layouts
|
33
|
+
# "#{current_auth.user.role}/application"
|
34
|
+
'dashboard/application'
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class SiteController < ApplicationController
|
2
|
+
def stimulus
|
3
|
+
@comment = '- WELCOME -'
|
4
|
+
end
|
5
|
+
|
6
|
+
def jadi_a
|
7
|
+
@comment = 'Kotaro'
|
8
|
+
render partial: 'site/comment'
|
9
|
+
end
|
10
|
+
|
11
|
+
def jadi_b
|
12
|
+
@comment = 'Minami'
|
13
|
+
render partial: 'site/comment'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
BASE_URL="http://localhost:3000"
|
2
|
+
|
3
|
+
# database primary
|
4
|
+
DATABASE_NAME=<%= Rails.application.class.module_parent_name.underscore %>_development
|
5
|
+
DATABASE_USERNAME=postgres
|
6
|
+
DATABASE_PASSWORD=bayangan
|
7
|
+
DATABASE_HOSTNAME=localhost
|
8
|
+
DATABASE_PORT="5433"
|
9
|
+
DATABASE_POOL="10"
|
10
|
+
|
11
|
+
RAILS_MAX_THREADS="5"
|
12
|
+
RAILS_ENV="development"
|
13
|
+
WEB_CONCURRENCY="5"
|
14
|
+
WORKER_TIMEOUT="3600"
|
File without changes
|
Binary file
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 26.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
4
|
+
viewBox="0 0 1024 704" style="enable-background:new 0 0 1024 704;" xml:space="preserve">
|
5
|
+
<path d="M759.9,602.1c-15.8,11.4-26.8,26.1-35.4,42.9c-5,9.7-5,9.6-15.4,6.4c-69.1-21-138.3-41.9-207.5-62.8
|
6
|
+
c-81.7-24.7-163.4-49.2-245.1-73.9c-75-22.6-150-45.3-225-68c-2.9-0.9-6.2-1.1-8.5-3.6c0.1-2.5,1.9-3.8,3.3-5.3
|
7
|
+
c79.8-89.3,172.4-162.3,278.4-218.3c20-10.5,40.3-20.4,60.9-29.5c5-2.2,6.2-4.5,4.7-10c-16.3-57.2,8-115.9,58.2-141.2
|
8
|
+
c44.8-22.6,104-7.6,129.9,32.8c6.9,10.8,8.8,23.1,10.6,35.4c0.6,4.1,1.2,8.4,2.6,12.3c4.1,11.4,12.4,17.9,24.5,18.9
|
9
|
+
c10.5,0.9,21-0.6,31.6-1.1c18.4-0.8,36.5,2.4,54.5,6.2c27.6,5.8,54,14.7,78.9,28.3c33,18.1,55.2,44.7,66.6,80.8
|
10
|
+
c6.3,20,10.2,40.4,13.4,60.9c3.3,21.6,15.9,35.8,35.2,44.6c21.7,9.9,43.8,18.7,67.8,21.5c10.5,1.2,20.9,2.1,31.4,3.2
|
11
|
+
c18.3,1.9,27.8,12.9,25,30.9c-4.5,29-11.2,57.6-22.1,84.8c-19.4,48.3-55.9,77.1-106.3,88.4c-14.5,3.3-29.4,2.5-44.1,1.1
|
12
|
+
C804,585.5,780.7,586.5,759.9,602.1 M725,357.5c4.3,7.8,9.3,15.1,16.1,21c11.6,10.1,23.4,10.3,35.5,0.7
|
13
|
+
c11.2-8.9,17.9-21.1,24.9-33.1c2.7-4.6,2-7.2-2.7-10.1c-23.7-14.2-47.1-28.9-70.6-43.3c-7.1-4.3-13.7-9.4-22.5-13.1
|
14
|
+
C707.4,307.2,712,332.9,725,357.5 M980.8,448.6c1.5,2.1,3,4.3,5.2,7.4c5.8-17.4,9.6-33.7,7.4-50.8c-0.8-6.1-4.2-10.8-9.8-13.9
|
15
|
+
c-5.7-3.1-11.9-4.1-18.1-4.9c-8.8-1.1-17.7-2.1-28.1-3.2C952.2,405.7,966.2,426.8,980.8,448.6z"/>
|
16
|
+
</svg>
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// LOAD everything
|
2
|
+
import "@hotwired/turbo-rails"
|
3
|
+
import {stimulus} from "./stimulus"
|
4
|
+
|
5
|
+
import WebController from "../pages/web"
|
6
|
+
import SiteStimulusController from "../pages/stimulus.js"
|
7
|
+
|
8
|
+
import "../stylesheets/application.scss"
|
9
|
+
console.log("Kotaro is here")
|
10
|
+
console.log(window.location.hash.slice(1))
|
11
|
+
|
12
|
+
const textElement = document.getElementById(window.location.hash.slice(1))
|
13
|
+
if(textElement !== null){
|
14
|
+
textElement.scrollIntoView({behavior: "smooth"})
|
15
|
+
}
|
16
|
+
stimulus.register("web", WebController)
|
17
|
+
stimulus.register("site-stimulus", SiteStimulusController)
|