Compare commits
3 Commits
0fa00b8521
...
96c47e4ef8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
96c47e4ef8 | ||
c2fa53c7e9 | |||
978b4c90e1 |
31
.github/workflows/build.yml
vendored
31
.github/workflows/build.yml
vendored
@ -1,31 +0,0 @@
|
|||||||
name: Build docker image
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
pull_request:
|
|
||||||
jobs:
|
|
||||||
build-static-assets:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
|
||||||
tags: bustikiller/wedding-planner:latest
|
|
||||||
cache-from: type=registry,ref=user/app:latest
|
|
||||||
cache-to: type=inline
|
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -33,3 +33,6 @@
|
|||||||
|
|
||||||
# Ignore master key for decrypting credentials and more.
|
# Ignore master key for decrypting credentials and more.
|
||||||
/config/master.key
|
/config/master.key
|
||||||
|
|
||||||
|
/node_modules
|
||||||
|
/public/packs
|
@ -1,7 +1,7 @@
|
|||||||
# syntax = docker/dockerfile:1
|
# syntax = docker/dockerfile:1
|
||||||
|
|
||||||
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
|
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
|
||||||
ARG RUBY_VERSION=3.3.4
|
ARG RUBY_VERSION=3.2.0
|
||||||
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
|
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
|
||||||
|
|
||||||
# Rails app lives here
|
# Rails app lives here
|
||||||
@ -13,7 +13,6 @@ ENV RAILS_ENV="production" \
|
|||||||
BUNDLE_PATH="/usr/local/bundle" \
|
BUNDLE_PATH="/usr/local/bundle" \
|
||||||
BUNDLE_WITHOUT="development"
|
BUNDLE_WITHOUT="development"
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y nodejs
|
|
||||||
|
|
||||||
# Throw-away build stage to reduce size of final image
|
# Throw-away build stage to reduce size of final image
|
||||||
FROM base as build
|
FROM base as build
|
||||||
|
86
Gemfile
86
Gemfile
@ -1,35 +1,71 @@
|
|||||||
source 'https://rubygems.org'
|
source "https://rubygems.org"
|
||||||
|
|
||||||
ruby '3.3.4'
|
ruby "3.3.4"
|
||||||
gem 'acts-as-taggable-on'
|
|
||||||
gem 'bootsnap', require: false
|
|
||||||
gem 'csv'
|
|
||||||
gem 'importmap-rails'
|
|
||||||
gem 'jbuilder'
|
|
||||||
gem 'money'
|
|
||||||
gem 'pg', '~> 1.1'
|
|
||||||
gem 'puma', '>= 5.0'
|
|
||||||
gem 'rails', '~> 7.2.0', '>= 7.2.1'
|
|
||||||
gem 'redis', '>= 4.0.1'
|
|
||||||
gem 'sprockets-rails'
|
|
||||||
gem 'stimulus-rails'
|
|
||||||
gem 'turbo-rails'
|
|
||||||
gem 'tzinfo-data', platforms: %i[windows jruby]
|
|
||||||
|
|
||||||
gem 'jsonapi-rails'
|
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
|
||||||
gem 'rack-cors'
|
gem "rails", "~> 7.2.0", ">= 7.2.0"
|
||||||
gem 'react-rails'
|
|
||||||
gem 'rubytree'
|
# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
|
||||||
|
gem "sprockets-rails"
|
||||||
|
|
||||||
|
# Use postgresql as the database for Active Record
|
||||||
|
gem "pg", "~> 1.1"
|
||||||
|
|
||||||
|
# Use the Puma web server [https://github.com/puma/puma]
|
||||||
|
gem "puma", ">= 5.0"
|
||||||
|
|
||||||
|
# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails]
|
||||||
|
gem "importmap-rails"
|
||||||
|
|
||||||
|
# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev]
|
||||||
|
gem "turbo-rails"
|
||||||
|
|
||||||
|
# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev]
|
||||||
|
gem "stimulus-rails"
|
||||||
|
|
||||||
|
# Build JSON APIs with ease [https://github.com/rails/jbuilder]
|
||||||
|
gem "jbuilder"
|
||||||
|
|
||||||
|
# Use Redis adapter to run Action Cable in production
|
||||||
|
gem "redis", ">= 4.0.1"
|
||||||
|
|
||||||
|
# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]
|
||||||
|
# gem "kredis"
|
||||||
|
|
||||||
|
# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]
|
||||||
|
# gem "bcrypt", "~> 3.1.7"
|
||||||
|
|
||||||
|
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||||
|
gem "tzinfo-data", platforms: %i[ windows jruby ]
|
||||||
|
|
||||||
|
# Reduces boot times through caching; required in config/boot.rb
|
||||||
|
gem "bootsnap", require: false
|
||||||
|
|
||||||
|
# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
|
||||||
|
# gem "image_processing", "~> 1.2"
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'debug', platforms: %i[mri windows]
|
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
|
||||||
gem 'factory_bot_rails'
|
gem "debug", platforms: %i[ mri windows ]
|
||||||
|
gem 'rspec-rails', '~> 6.1.0'
|
||||||
gem 'faker'
|
gem 'faker'
|
||||||
gem 'pry'
|
gem 'pry'
|
||||||
gem 'rspec-rails', '~> 6.1.0'
|
gem "factory_bot_rails"
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'rubocop'
|
# Use console on exceptions pages [https://github.com/rails/web-console]
|
||||||
gem 'web-console'
|
gem "web-console"
|
||||||
|
|
||||||
|
# Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler]
|
||||||
|
# gem "rack-mini-profiler"
|
||||||
|
|
||||||
|
# Speed up commands on slow machines / big apps [https://github.com/rails/spring]
|
||||||
|
# gem "spring"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
gem "money"
|
||||||
|
gem 'acts-as-taggable-on'
|
||||||
|
|
||||||
|
gem "rubytree"
|
||||||
|
gem 'react-rails'
|
169
Gemfile.lock
169
Gemfile.lock
@ -1,29 +1,29 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.2.1)
|
actioncable (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
actionmailbox (7.2.1)
|
actionmailbox (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
activejob (= 7.2.1)
|
activejob (= 7.2.0)
|
||||||
activerecord (= 7.2.1)
|
activerecord (= 7.2.0)
|
||||||
activestorage (= 7.2.1)
|
activestorage (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
mail (>= 2.8.0)
|
mail (>= 2.8.0)
|
||||||
actionmailer (7.2.1)
|
actionmailer (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
actionview (= 7.2.1)
|
actionview (= 7.2.0)
|
||||||
activejob (= 7.2.1)
|
activejob (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
mail (>= 2.8.0)
|
mail (>= 2.8.0)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
actionpack (7.2.1)
|
actionpack (7.2.0)
|
||||||
actionview (= 7.2.1)
|
actionview (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
racc
|
racc
|
||||||
rack (>= 2.2.4, < 3.2)
|
rack (>= 2.2.4, < 3.2)
|
||||||
@ -32,35 +32,35 @@ GEM
|
|||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
useragent (~> 0.16)
|
useragent (~> 0.16)
|
||||||
actiontext (7.2.1)
|
actiontext (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
activerecord (= 7.2.1)
|
activerecord (= 7.2.0)
|
||||||
activestorage (= 7.2.1)
|
activestorage (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.2.1)
|
actionview (7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.11)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
activejob (7.2.1)
|
activejob (7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.2.1)
|
activemodel (7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
activerecord (7.2.1)
|
activerecord (7.2.0)
|
||||||
activemodel (= 7.2.1)
|
activemodel (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
timeout (>= 0.4.0)
|
timeout (>= 0.4.0)
|
||||||
activestorage (7.2.1)
|
activestorage (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
activejob (= 7.2.1)
|
activejob (= 7.2.0)
|
||||||
activerecord (= 7.2.1)
|
activerecord (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
activesupport (7.2.1)
|
activesupport (7.2.0)
|
||||||
base64
|
base64
|
||||||
bigdecimal
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.3.1)
|
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||||
@ -71,10 +71,8 @@ GEM
|
|||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
securerandom (>= 0.3)
|
securerandom (>= 0.3)
|
||||||
tzinfo (~> 2.0, >= 2.0.5)
|
tzinfo (~> 2.0, >= 2.0.5)
|
||||||
acts-as-taggable-on (11.0.0)
|
acts-as-taggable-on (5.0.0)
|
||||||
activerecord (>= 7.0, < 8.0)
|
activerecord (>= 4.2.8)
|
||||||
zeitwerk (>= 2.4, < 3.0)
|
|
||||||
ast (2.4.2)
|
|
||||||
babel-source (5.8.35)
|
babel-source (5.8.35)
|
||||||
babel-transpiler (0.7.0)
|
babel-transpiler (0.7.0)
|
||||||
babel-source (>= 4.0, < 6)
|
babel-source (>= 4.0, < 6)
|
||||||
@ -86,10 +84,9 @@ GEM
|
|||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
builder (3.3.0)
|
builder (3.3.0)
|
||||||
coderay (1.1.3)
|
coderay (1.1.3)
|
||||||
concurrent-ruby (1.3.4)
|
concurrent-ruby (1.3.3)
|
||||||
connection_pool (2.4.1)
|
connection_pool (2.4.1)
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
csv (3.3.0)
|
|
||||||
date (3.3.4)
|
date (3.3.4)
|
||||||
debug (1.9.2)
|
debug (1.9.2)
|
||||||
irb (~> 1.10)
|
irb (~> 1.10)
|
||||||
@ -121,18 +118,6 @@ GEM
|
|||||||
actionview (>= 5.0.0)
|
actionview (>= 5.0.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
json (2.7.2)
|
json (2.7.2)
|
||||||
jsonapi-deserializable (0.2.0)
|
|
||||||
jsonapi-parser (0.1.1)
|
|
||||||
jsonapi-rails (0.4.1)
|
|
||||||
jsonapi-parser (~> 0.1.0)
|
|
||||||
jsonapi-rb (~> 0.5.0)
|
|
||||||
jsonapi-rb (0.5.0)
|
|
||||||
jsonapi-deserializable (~> 0.2.0)
|
|
||||||
jsonapi-serializable (~> 0.3.0)
|
|
||||||
jsonapi-renderer (0.2.2)
|
|
||||||
jsonapi-serializable (0.3.1)
|
|
||||||
jsonapi-renderer (~> 0.2.0)
|
|
||||||
language_server-protocol (3.17.0.3)
|
|
||||||
logger (1.6.0)
|
logger (1.6.0)
|
||||||
loofah (2.22.0)
|
loofah (2.22.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
@ -145,11 +130,11 @@ GEM
|
|||||||
marcel (1.0.4)
|
marcel (1.0.4)
|
||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
minitest (5.25.1)
|
minitest (5.24.1)
|
||||||
money (6.19.0)
|
money (6.19.0)
|
||||||
i18n (>= 0.6.4, <= 2)
|
i18n (>= 0.6.4, <= 2)
|
||||||
msgpack (1.7.2)
|
msgpack (1.7.2)
|
||||||
net-imap (0.4.15)
|
net-imap (0.4.14)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
net-pop (0.1.2)
|
net-pop (0.1.2)
|
||||||
@ -171,10 +156,6 @@ GEM
|
|||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.16.7-x86_64-linux)
|
nokogiri (1.16.7-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
parallel (1.26.2)
|
|
||||||
parser (3.3.4.2)
|
|
||||||
ast (~> 2.4.1)
|
|
||||||
racc
|
|
||||||
pg (1.5.7)
|
pg (1.5.7)
|
||||||
pry (0.14.2)
|
pry (0.14.2)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
@ -185,8 +166,6 @@ GEM
|
|||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
racc (1.8.1)
|
racc (1.8.1)
|
||||||
rack (3.1.7)
|
rack (3.1.7)
|
||||||
rack-cors (2.0.2)
|
|
||||||
rack (>= 2.0.0)
|
|
||||||
rack-session (2.0.0)
|
rack-session (2.0.0)
|
||||||
rack (>= 3.0.0)
|
rack (>= 3.0.0)
|
||||||
rack-test (2.1.0)
|
rack-test (2.1.0)
|
||||||
@ -194,20 +173,20 @@ GEM
|
|||||||
rackup (2.1.0)
|
rackup (2.1.0)
|
||||||
rack (>= 3)
|
rack (>= 3)
|
||||||
webrick (~> 1.8)
|
webrick (~> 1.8)
|
||||||
rails (7.2.1)
|
rails (7.2.0)
|
||||||
actioncable (= 7.2.1)
|
actioncable (= 7.2.0)
|
||||||
actionmailbox (= 7.2.1)
|
actionmailbox (= 7.2.0)
|
||||||
actionmailer (= 7.2.1)
|
actionmailer (= 7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
actiontext (= 7.2.1)
|
actiontext (= 7.2.0)
|
||||||
actionview (= 7.2.1)
|
actionview (= 7.2.0)
|
||||||
activejob (= 7.2.1)
|
activejob (= 7.2.0)
|
||||||
activemodel (= 7.2.1)
|
activemodel (= 7.2.0)
|
||||||
activerecord (= 7.2.1)
|
activerecord (= 7.2.0)
|
||||||
activestorage (= 7.2.1)
|
activestorage (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.2.1)
|
railties (= 7.2.0)
|
||||||
rails-dom-testing (2.2.0)
|
rails-dom-testing (2.2.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
minitest
|
minitest
|
||||||
@ -215,15 +194,14 @@ GEM
|
|||||||
rails-html-sanitizer (1.6.0)
|
rails-html-sanitizer (1.6.0)
|
||||||
loofah (~> 2.21)
|
loofah (~> 2.21)
|
||||||
nokogiri (~> 1.14)
|
nokogiri (~> 1.14)
|
||||||
railties (7.2.1)
|
railties (7.2.0)
|
||||||
actionpack (= 7.2.1)
|
actionpack (= 7.2.0)
|
||||||
activesupport (= 7.2.1)
|
activesupport (= 7.2.0)
|
||||||
irb (~> 1.13)
|
irb (~> 1.13)
|
||||||
rackup (>= 1.0.0)
|
rackup (>= 1.0.0)
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0, >= 1.2.2)
|
thor (~> 1.0, >= 1.2.2)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
rainbow (3.1.1)
|
|
||||||
rake (13.2.1)
|
rake (13.2.1)
|
||||||
rdoc (6.7.0)
|
rdoc (6.7.0)
|
||||||
psych (>= 4.0.0)
|
psych (>= 4.0.0)
|
||||||
@ -233,14 +211,12 @@ GEM
|
|||||||
execjs
|
execjs
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
tilt
|
tilt
|
||||||
redis (5.3.0)
|
redis (5.2.0)
|
||||||
redis-client (>= 0.22.0)
|
redis-client (>= 0.22.0)
|
||||||
redis-client (0.22.2)
|
redis-client (0.22.2)
|
||||||
connection_pool
|
connection_pool
|
||||||
regexp_parser (2.9.2)
|
|
||||||
reline (0.5.9)
|
reline (0.5.9)
|
||||||
io-console (~> 0.5)
|
io-console (~> 0.5)
|
||||||
rexml (3.2.8)
|
|
||||||
rspec-core (3.12.3)
|
rspec-core (3.12.3)
|
||||||
rspec-support (~> 3.12.0)
|
rspec-support (~> 3.12.0)
|
||||||
rspec-expectations (3.12.4)
|
rspec-expectations (3.12.4)
|
||||||
@ -258,21 +234,7 @@ GEM
|
|||||||
rspec-mocks (~> 3.12)
|
rspec-mocks (~> 3.12)
|
||||||
rspec-support (~> 3.12)
|
rspec-support (~> 3.12)
|
||||||
rspec-support (3.12.2)
|
rspec-support (3.12.2)
|
||||||
rubocop (1.65.1)
|
rubytree (2.0.3)
|
||||||
json (~> 2.3)
|
|
||||||
language_server-protocol (>= 3.17.0)
|
|
||||||
parallel (~> 1.10)
|
|
||||||
parser (>= 3.3.0.2)
|
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
|
||||||
regexp_parser (>= 2.4, < 3.0)
|
|
||||||
rexml (>= 3.2.5, < 4.0)
|
|
||||||
rubocop-ast (>= 1.31.1, < 2.0)
|
|
||||||
ruby-progressbar (~> 1.7)
|
|
||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
|
||||||
rubocop-ast (1.32.0)
|
|
||||||
parser (>= 3.3.1.0)
|
|
||||||
ruby-progressbar (1.13.0)
|
|
||||||
rubytree (2.1.0)
|
|
||||||
json (~> 2.0, > 2.3.1)
|
json (~> 2.0, > 2.3.1)
|
||||||
securerandom (0.3.1)
|
securerandom (0.3.1)
|
||||||
sprockets (4.2.1)
|
sprockets (4.2.1)
|
||||||
@ -282,10 +244,10 @@ GEM
|
|||||||
actionpack (>= 6.1)
|
actionpack (>= 6.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
stimulus-rails (1.3.4)
|
stimulus-rails (1.3.3)
|
||||||
railties (>= 6.0.0)
|
railties (>= 6.0.0)
|
||||||
stringio (3.1.1)
|
stringio (3.1.1)
|
||||||
thor (1.3.2)
|
thor (1.3.1)
|
||||||
tilt (2.4.0)
|
tilt (2.4.0)
|
||||||
timeout (0.4.1)
|
timeout (0.4.1)
|
||||||
turbo-rails (2.0.6)
|
turbo-rails (2.0.6)
|
||||||
@ -294,7 +256,6 @@ GEM
|
|||||||
railties (>= 6.0.0)
|
railties (>= 6.0.0)
|
||||||
tzinfo (2.0.6)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
unicode-display_width (2.5.0)
|
|
||||||
useragent (0.16.10)
|
useragent (0.16.10)
|
||||||
web-console (4.2.1)
|
web-console (4.2.1)
|
||||||
actionview (>= 6.0.0)
|
actionview (>= 6.0.0)
|
||||||
@ -318,23 +279,19 @@ PLATFORMS
|
|||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
acts-as-taggable-on
|
acts-as-taggable-on
|
||||||
bootsnap
|
bootsnap
|
||||||
csv
|
|
||||||
debug
|
debug
|
||||||
factory_bot_rails
|
factory_bot_rails
|
||||||
faker
|
faker
|
||||||
importmap-rails
|
importmap-rails
|
||||||
jbuilder
|
jbuilder
|
||||||
jsonapi-rails
|
|
||||||
money
|
money
|
||||||
pg (~> 1.1)
|
pg (~> 1.1)
|
||||||
pry
|
pry
|
||||||
puma (>= 5.0)
|
puma (>= 5.0)
|
||||||
rack-cors
|
rails (~> 7.2.0, >= 7.2.0)
|
||||||
rails (~> 7.2.0, >= 7.2.1)
|
|
||||||
react-rails
|
react-rails
|
||||||
redis (>= 4.0.1)
|
redis (>= 4.0.1)
|
||||||
rspec-rails (~> 6.1.0)
|
rspec-rails (~> 6.1.0)
|
||||||
rubocop
|
|
||||||
rubytree
|
rubytree
|
||||||
sprockets-rails
|
sprockets-rails
|
||||||
stimulus-rails
|
stimulus-rails
|
||||||
|
3
app/assets/javascripts/application.js
Normal file
3
app/assets/javascripts/application.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
//= require react
|
||||||
|
//= require react_ujs
|
||||||
|
//= require components
|
1
app/assets/javascripts/components.js
Normal file
1
app/assets/javascripts/components.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
//= require_tree ./components
|
0
app/assets/javascripts/components/.keep
Normal file
0
app/assets/javascripts/components/.keep
Normal file
6
app/assets/javascripts/server_rendering.js
Normal file
6
app/assets/javascripts/server_rendering.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//= require react-server
|
||||||
|
//= require react_ujs
|
||||||
|
//= require ./components
|
||||||
|
//
|
||||||
|
// By default, this file is loaded for server-side rendering.
|
||||||
|
// It should require your components and any dependencies.
|
@ -1,6 +0,0 @@
|
|||||||
class GroupsController < ApplicationController
|
|
||||||
def index
|
|
||||||
roots = Group.where(parent_id: nil)
|
|
||||||
render jsonapi: roots, include: [children: [children: [:children]]]
|
|
||||||
end
|
|
||||||
end
|
|
@ -6,10 +6,9 @@ class GuestsController < ApplicationController
|
|||||||
# GET /guests or /guests.json
|
# GET /guests or /guests.json
|
||||||
def index
|
def index
|
||||||
@guests = Guest.all
|
@guests = Guest.all
|
||||||
.joins(:group)
|
.left_outer_joins(:affinity_groups)
|
||||||
.order('groups.name' => :asc)
|
.order('tags.name' => :asc)
|
||||||
|
.includes(:affinity_groups, :unbreakable_bonds)
|
||||||
render jsonapi: @guests
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# GET /guests/1 or /guests/1.json
|
# GET /guests/1 or /guests/1.json
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
module GroupsHelper
|
|
||||||
end
|
|
@ -1,9 +0,0 @@
|
|||||||
class Group < ApplicationRecord
|
|
||||||
validates :name, uniqueness: true
|
|
||||||
validates :name, :order, presence: true
|
|
||||||
|
|
||||||
has_many :children, class_name: 'Group', foreign_key: 'parent_id'
|
|
||||||
belongs_to :parent, class_name: 'Group', optional: true
|
|
||||||
|
|
||||||
has_many :guests
|
|
||||||
end
|
|
@ -1,13 +1,5 @@
|
|||||||
class Guest < ApplicationRecord
|
class Guest < ApplicationRecord
|
||||||
acts_as_taggable_on :affinity_groups, :unbreakable_bonds
|
acts_as_taggable_on :affinity_groups, :unbreakable_bonds
|
||||||
belongs_to :group
|
|
||||||
|
|
||||||
enum status: {
|
|
||||||
considered: 0,
|
|
||||||
invited: 10,
|
|
||||||
confirmed: 20,
|
|
||||||
declined: 30
|
|
||||||
}
|
|
||||||
|
|
||||||
def full_name
|
def full_name
|
||||||
"#{first_name} #{last_name}"
|
"#{first_name} #{last_name}"
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
class SerializableGroup < JSONAPI::Serializable::Resource
|
|
||||||
type 'group'
|
|
||||||
|
|
||||||
attributes :name, :icon
|
|
||||||
|
|
||||||
has_many :children
|
|
||||||
|
|
||||||
attribute :guest_count do
|
|
||||||
@object.guests.count
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,17 +0,0 @@
|
|||||||
class SerializableGuest < JSONAPI::Serializable::Resource
|
|
||||||
type 'guest'
|
|
||||||
|
|
||||||
attributes :id, :email, :group_id, :status
|
|
||||||
|
|
||||||
attribute :name do
|
|
||||||
"#{@object.first_name} #{@object.last_name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
attribute :group_name do
|
|
||||||
@object.group.name
|
|
||||||
end
|
|
||||||
|
|
||||||
attribute :status do
|
|
||||||
@object.status.capitalize
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,8 +0,0 @@
|
|||||||
# config/initializers/cors.rb
|
|
||||||
|
|
||||||
Rails.application.config.middleware.insert_before 0, Rack::Cors do
|
|
||||||
allow do
|
|
||||||
origins '*'
|
|
||||||
resource '*', headers: :any, methods: [:get, :post, :patch, :put, :delete]
|
|
||||||
end
|
|
||||||
end
|
|
4
config/initializers/react_server_rendering.rb
Normal file
4
config/initializers/react_server_rendering.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# To render React components in production, precompile the server rendering manifest:
|
||||||
|
Rails.application.config.assets.precompile += ["server_rendering.js"]
|
@ -1,5 +1,4 @@
|
|||||||
Rails.application.routes.draw do
|
Rails.application.routes.draw do
|
||||||
resources :groups, only: :index
|
|
||||||
resources :guests do
|
resources :guests do
|
||||||
post :import, on: :collection
|
post :import, on: :collection
|
||||||
end
|
end
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
class CreateGroups < ActiveRecord::Migration[7.1]
|
|
||||||
def change
|
|
||||||
create_table :groups, id: :uuid do |t|
|
|
||||||
t.string :name, null: false
|
|
||||||
t.string :icon
|
|
||||||
t.integer :order, null: false, default: 1
|
|
||||||
|
|
||||||
t.timestamps
|
|
||||||
end
|
|
||||||
|
|
||||||
add_index :groups, :name, unique: true
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,5 +0,0 @@
|
|||||||
class AddParentToGroup < ActiveRecord::Migration[7.1]
|
|
||||||
def change
|
|
||||||
add_reference :groups, :parent, type: :uuid, index: true, foreign_key: { to_table: :groups }
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,5 +0,0 @@
|
|||||||
class AddGroupToGuest < ActiveRecord::Migration[7.1]
|
|
||||||
def change
|
|
||||||
add_reference :guests, :group, null: false, foreign_key: true, type: :uuid
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,5 +0,0 @@
|
|||||||
class AddStatusToGuest < ActiveRecord::Migration[7.1]
|
|
||||||
def change
|
|
||||||
add_column :guests, :status, :integer, default: 0
|
|
||||||
end
|
|
||||||
end
|
|
18
db/schema.rb
generated
18
db/schema.rb
generated
@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.1].define(version: 2024_08_11_170021) do
|
ActiveRecord::Schema[7.1].define(version: 2024_07_24_181853) do
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
|
||||||
@ -26,17 +26,6 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_11_170021) do
|
|||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "groups", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
|
||||||
t.string "name", null: false
|
|
||||||
t.string "icon"
|
|
||||||
t.integer "order", default: 1, null: false
|
|
||||||
t.datetime "created_at", null: false
|
|
||||||
t.datetime "updated_at", null: false
|
|
||||||
t.uuid "parent_id"
|
|
||||||
t.index ["name"], name: "index_groups_on_name", unique: true
|
|
||||||
t.index ["parent_id"], name: "index_groups_on_parent_id"
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table "guests", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
create_table "guests", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||||
t.string "first_name"
|
t.string "first_name"
|
||||||
t.string "last_name"
|
t.string "last_name"
|
||||||
@ -44,9 +33,6 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_11_170021) do
|
|||||||
t.string "phone"
|
t.string "phone"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
t.uuid "group_id", null: false
|
|
||||||
t.integer "status", default: 0
|
|
||||||
t.index ["group_id"], name: "index_guests_on_group_id"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "seats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
create_table "seats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||||
@ -96,8 +82,6 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_11_170021) do
|
|||||||
t.index ["name"], name: "index_tags_on_name", unique: true
|
t.index ["name"], name: "index_tags_on_name", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
add_foreign_key "groups", "groups", column: "parent_id"
|
|
||||||
add_foreign_key "guests", "groups"
|
|
||||||
add_foreign_key "seats", "guests"
|
add_foreign_key "seats", "guests"
|
||||||
add_foreign_key "seats", "tables_arrangements", on_delete: :cascade
|
add_foreign_key "seats", "tables_arrangements", on_delete: :cascade
|
||||||
add_foreign_key "taggings", "tags"
|
add_foreign_key "taggings", "tags"
|
||||||
|
83
db/seeds.rb
83
db/seeds.rb
@ -5,7 +5,6 @@ Expense.delete_all
|
|||||||
Guest.delete_all
|
Guest.delete_all
|
||||||
ActsAsTaggableOn::Tagging.delete_all
|
ActsAsTaggableOn::Tagging.delete_all
|
||||||
ActsAsTaggableOn::Tag.delete_all
|
ActsAsTaggableOn::Tag.delete_all
|
||||||
Group.delete_all
|
|
||||||
|
|
||||||
Expense.create!(name: 'Photographer', amount: 3000, pricing_type: 'fixed')
|
Expense.create!(name: 'Photographer', amount: 3000, pricing_type: 'fixed')
|
||||||
Expense.create!(name: 'Country house', amount: 6000, pricing_type: 'fixed')
|
Expense.create!(name: 'Country house', amount: 6000, pricing_type: 'fixed')
|
||||||
@ -22,45 +21,53 @@ Expense.create!(name: 'Transportation', amount: 3000, pricing_type: 'fixed')
|
|||||||
Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed')
|
Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed')
|
||||||
Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed')
|
Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed')
|
||||||
|
|
||||||
Group.create!(name: "Jim's guests", icon: 'pi pi-heart').tap do |parent|
|
|
||||||
parent.children.create!(name: "Jim's family", icon: 'pi pi-users').tap do |family|
|
|
||||||
family.children.create!(name: "Jim's close family", icon: 'pi pi-home')
|
|
||||||
family.children.create!(name: "Jim's cousins", icon: 'pi pi-home')
|
|
||||||
family.children.create!(name: "Jim's relatives", icon: 'pi pi-home')
|
|
||||||
end
|
|
||||||
parent.children.create!(name: "Jim's friends", icon: 'pi pi-bullseye')
|
|
||||||
parent.children.create!(name: "Jim's work", icon: 'pi pi-desktop').tap do |work|
|
|
||||||
work.children.create!(name: "Jim's besties at work", icon: 'pi pi-briefcase')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Group.create!(name: "Pam's guests", icon: 'pi pi-heart-fill').tap do |parent|
|
samples = {
|
||||||
parent.children.create!(name: "Pam's family", icon: 'pi pi-users').tap do |family|
|
close_family_a: 10,
|
||||||
family.children.create!(name: "Pam's close family", icon: 'pi pi-home')
|
close_family_b: 10,
|
||||||
family.children.create!(name: "Pam's cousins", icon: 'pi pi-home')
|
cousins_a: 20,
|
||||||
family.children.create!(name: "Pam's relatives", icon: 'pi pi-home')
|
cousins_b: 15,
|
||||||
end
|
relatives_a: 15,
|
||||||
parent.children.create!(name: "Pam's friends", icon: 'pi pi-bullseye')
|
relatives_b: 10,
|
||||||
parent.children.create!(name: "Pam's work", icon: 'pi pi-desktop').tap do |work|
|
work_a: 10,
|
||||||
work.children.create!(name: "Pam's besties at work", icon: 'pi pi-briefcase')
|
work_b: 10,
|
||||||
end
|
besties_work_a: 5,
|
||||||
|
besties_work_b: 5,
|
||||||
|
college_friends_a: 10,
|
||||||
|
college_friends_b: 10,
|
||||||
|
high_school_friends_a: 10,
|
||||||
|
high_school_friends_b: 10,
|
||||||
|
childhood_friends_a: 10,
|
||||||
|
childhood_friends_b: 10,
|
||||||
|
basket_team_a: 10,
|
||||||
|
football_team_a: 15,
|
||||||
|
dance_club: 10
|
||||||
|
}.each_with_object([]) do |(affinity_group, count), acc|
|
||||||
|
count.times { acc << affinity_group }
|
||||||
end
|
end
|
||||||
|
|
||||||
Group.create!(name: 'Common guests', icon: 'pi pi-users').tap do |parent|
|
|
||||||
parent.children.create!(name: 'College friends', icon: 'pi pi-calculator')
|
|
||||||
parent.children.create!(name: 'High school friends', icon: 'pi pi-crown')
|
|
||||||
parent.children.create!(name: 'Childhood friends', icon: 'pi pi-envelope')
|
|
||||||
end
|
|
||||||
|
|
||||||
groups = Group.all
|
|
||||||
|
|
||||||
NUMBER_OF_GUESTS.times do
|
NUMBER_OF_GUESTS.times do
|
||||||
Guest.create!(
|
guest = Guest.create!(first_name: Faker::Name.first_name,
|
||||||
first_name: Faker::Name.first_name,
|
last_name: Faker::Name.last_name,
|
||||||
last_name: Faker::Name.last_name,
|
email: Faker::Internet.email,
|
||||||
email: Faker::Internet.email,
|
phone: Faker::PhoneNumber.cell_phone)
|
||||||
phone: Faker::PhoneNumber.cell_phone,
|
|
||||||
group: groups.sample,
|
guest.affinity_group_list.add(samples.sample)
|
||||||
status: Guest.statuses.keys.sample
|
guest.save!
|
||||||
)
|
end
|
||||||
|
|
||||||
|
# Add unbreakable bonds
|
||||||
|
Guest.affinity_group_counts.each do |group|
|
||||||
|
couples = (group.taggings_count / 4).floor
|
||||||
|
|
||||||
|
guests_involved = Guest.tagged_with(group.name).limit(couples * 2)
|
||||||
|
guests_involved.each_slice(2) do |a, b|
|
||||||
|
bond_name = "#{a.full_name} & #{b.full_name}"
|
||||||
|
|
||||||
|
a.unbreakable_bond_list.add(bond_name)
|
||||||
|
b.unbreakable_bond_list.add(bond_name)
|
||||||
|
|
||||||
|
a.save!
|
||||||
|
b.save!
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
FactoryBot.define do
|
|
||||||
factory :group do
|
|
||||||
sequence(:name) { |i| "Group #{i}" }
|
|
||||||
order { 1 }
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,7 +1,5 @@
|
|||||||
FactoryBot.define do
|
FactoryBot.define do
|
||||||
factory :guest do
|
factory :guest do
|
||||||
association :group
|
|
||||||
|
|
||||||
first_name { Faker::Name.first_name }
|
first_name { Faker::Name.first_name }
|
||||||
last_name { Faker::Name.last_name }
|
last_name { Faker::Name.last_name }
|
||||||
email { Faker::Internet.email }
|
email { Faker::Internet.email }
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe Group, type: :model do
|
|
||||||
pending "add some examples to (or delete) #{__FILE__}"
|
|
||||||
end
|
|
Loading…
x
Reference in New Issue
Block a user