Compare commits

..

29 Commits

Author SHA1 Message Date
Renovate Bot
0fa00b8521 Update dependency rails to '~> 7.2.0', '>= 7.2.1'
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 5m59s
Build docker image / build-static-assets (pull_request) Successful in 39m21s
Run unit tests / unit_tests (push) Successful in 4m28s
Build docker image / build-static-assets (push) Successful in 1h26m1s
2024-08-31 09:02:52 +00:00
Renovate Bot
4078b50cac Update dependency rspec-rails to v6.1.4
Some checks failed
Run unit tests / unit_tests (push) Successful in 1m44s
Build docker image / build-static-assets (push) Successful in 16m52s
Build docker image / build-static-assets (pull_request) Has been cancelled
Run unit tests / unit_tests (pull_request) Has been cancelled
renovate/artifacts Artifact file update failure
2024-08-29 18:02:30 +00:00
a9bd326df1 Merge pull request 'Update dependency acts-as-taggable-on to v11' (#48) from renovate/acts-as-taggable-on-11.x-lockfile into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 1m5s
Build docker image / build-static-assets (push) Successful in 15m56s
Reviewed-on: #48
2024-08-23 12:09:53 +00:00
Renovate Bot
c2a1aa5186 Update dependency acts-as-taggable-on to v11
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 1m31s
Build docker image / build-static-assets (pull_request) Successful in 16m4s
2024-08-23 10:02:21 +00:00
Renovate Bot
55486887b6 Update dependency redis to v5.3.0
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 10m14s
Build docker image / build-static-assets (pull_request) Successful in 1h31m56s
Run unit tests / unit_tests (push) Successful in 2m43s
Build docker image / build-static-assets (push) Successful in 21m17s
2024-08-21 08:04:18 +00:00
Renovate Bot
372bf7457b Update dependency stimulus-rails to v1.3.4
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 3m54s
Build docker image / build-static-assets (pull_request) Successful in 30m30s
Run unit tests / unit_tests (push) Successful in 1m5s
Build docker image / build-static-assets (push) Successful in 18m7s
2024-08-17 00:03:14 +00:00
Renovate Bot
fe6794ebc6 Update dependency rubytree to v2.1.0
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 4m55s
Build docker image / build-static-assets (pull_request) Successful in 51m4s
Run unit tests / unit_tests (push) Successful in 3m3s
Build docker image / build-static-assets (push) Successful in 1h2m7s
2024-08-12 23:03:46 +00:00
cd4866a476 Merge pull request 'Update docker/build-push-action action to v6' (#44) from renovate/docker-build-push-action-6.x into main
Some checks failed
Run unit tests / unit_tests (push) Successful in 2m20s
Build docker image / build-static-assets (push) Failing after 2h41m8s
Reviewed-on: #44
2024-08-12 11:50:28 +00:00
Renovate Bot
aa59cae9c9 Update docker/build-push-action action to v6
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 6m7s
Build docker image / build-static-assets (pull_request) Successful in 50m42s
2024-08-12 10:02:48 +00:00
812f1171b4 Merge pull request 'Add CI step to build docker image' (#40) from docker into main
Some checks failed
Run unit tests / unit_tests (push) Successful in 9m46s
Build docker image / build-static-assets (push) Failing after 1h10m51s
Reviewed-on: #40
2024-08-12 08:21:37 +00:00
Renovate Bot
01d22f32d2 Update dependency csv to v3.3.0
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 3m28s
Run unit tests / unit_tests (push) Successful in 7m43s
2024-08-11 23:16:01 +00:00
c28295c018 Merge pull request 'Install CSV as a gem instead of from stdlib' (#41) from csv-warning into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 24m28s
Reviewed-on: #41
2024-08-11 23:01:29 +00:00
7e16000833 Install CSV as a gem instead of from stdlib
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 14m23s
2024-08-11 23:09:07 +02:00
44274fddca Install nodejs to povide a javascript runtime environment
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 11m33s
Build docker image / build-static-assets (pull_request) Successful in 58m44s
2024-08-11 23:08:10 +02:00
6b3bea9985 Add CI step to build docker image
Some checks failed
Run unit tests / unit_tests (pull_request) Successful in 11m41s
Build docker image / build-static-assets (pull_request) Has been cancelled
2024-08-11 22:57:03 +02:00
071b721d0a Merge pull request 'Include confirmation status' (#39) from feature/confirmation-status into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 1m54s
Reviewed-on: #39
2024-08-11 17:27:14 +00:00
cb42b86136 Include confirmation status
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 2m39s
2024-08-11 19:24:24 +02:00
10c460aee8 Merge pull request 'remove-acts-as-taggable' (#38) from remove-acts-as-taggable into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 2m45s
Reviewed-on: #38
2024-08-11 17:23:27 +00:00
c177131672 Fix factories
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 2m12s
2024-08-11 18:59:27 +02:00
de93ffb643 Return number of guests per group 2024-08-11 18:56:38 +02:00
cca869a0c4 Display group name in the list of guests
Some checks failed
Run unit tests / unit_tests (pull_request) Failing after 1m8s
2024-08-11 18:25:12 +02:00
b18f526c78 Add rubocop as dev dependency 2024-08-11 17:47:32 +02:00
792f63ffa7 Merge pull request 'groups-structure' (#36) from groups-structure into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 53s
Reviewed-on: #36
2024-08-11 15:29:57 +00:00
cc45b4c16e Define a hierarchy of groups
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 1m35s
2024-08-11 17:26:43 +02:00
3bc7a0c58b Create model and controller 2024-08-11 16:29:10 +02:00
bd4e197cd3 Merge pull request 'Use jsonapi-rails to serialize API responses' (#35) from serialize-users into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 1m27s
Reviewed-on: #35
2024-08-11 14:23:36 +00:00
716b819de2 Use jsonapi-rails to serialize API responses
All checks were successful
Run unit tests / unit_tests (pull_request) Successful in 3m17s
2024-08-11 16:19:54 +02:00
7592479b38 Merge pull request 'Update dependency rspec-rails to v6.1.3' (#33) from renovate/rspec-rails-6.x-lockfile into main
All checks were successful
Run unit tests / unit_tests (push) Successful in 3m10s
Reviewed-on: #33
2024-08-10 18:20:07 +00:00
Renovate Bot
bab0aacadc Update dependency rspec-rails to v6.1.3
Some checks failed
renovate/artifacts Artifact file update failure
Run unit tests / unit_tests (pull_request) Successful in 6m18s
2024-08-10 18:02:38 +00:00
28 changed files with 330 additions and 195 deletions

31
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,31 @@
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
View File

@ -33,6 +33,3 @@
# Ignore master key for decrypting credentials and more.
/config/master.key
/node_modules
/public/packs

View File

@ -1,7 +1,7 @@
# syntax = docker/dockerfile:1
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.2.0
ARG RUBY_VERSION=3.3.4
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
# Rails app lives here
@ -13,6 +13,7 @@ ENV RAILS_ENV="production" \
BUNDLE_PATH="/usr/local/bundle" \
BUNDLE_WITHOUT="development"
RUN apt-get update && apt-get install -y nodejs
# Throw-away build stage to reduce size of final image
FROM base as build

86
Gemfile
View File

@ -1,71 +1,35 @@
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]
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.2.0", ">= 7.2.0"
# 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"
gem 'jsonapi-rails'
gem 'rack-cors'
gem 'react-rails'
gem 'rubytree'
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debug", platforms: %i[ mri windows ]
gem 'rspec-rails', '~> 6.1.0'
gem 'debug', platforms: %i[mri windows]
gem 'factory_bot_rails'
gem 'faker'
gem 'pry'
gem "factory_bot_rails"
gem 'rspec-rails', '~> 6.1.0'
end
group :development do
# Use console on exceptions pages [https://github.com/rails/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"
gem 'rubocop'
gem 'web-console'
end
gem "money"
gem 'acts-as-taggable-on'
gem "rubytree"
gem 'react-rails'

View File

@ -1,29 +1,29 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (7.2.0)
actionpack (= 7.2.0)
activesupport (= 7.2.0)
actioncable (7.2.1)
actionpack (= 7.2.1)
activesupport (= 7.2.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.2.0)
actionpack (= 7.2.0)
activejob (= 7.2.0)
activerecord (= 7.2.0)
activestorage (= 7.2.0)
activesupport (= 7.2.0)
actionmailbox (7.2.1)
actionpack (= 7.2.1)
activejob (= 7.2.1)
activerecord (= 7.2.1)
activestorage (= 7.2.1)
activesupport (= 7.2.1)
mail (>= 2.8.0)
actionmailer (7.2.0)
actionpack (= 7.2.0)
actionview (= 7.2.0)
activejob (= 7.2.0)
activesupport (= 7.2.0)
actionmailer (7.2.1)
actionpack (= 7.2.1)
actionview (= 7.2.1)
activejob (= 7.2.1)
activesupport (= 7.2.1)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (7.2.0)
actionview (= 7.2.0)
activesupport (= 7.2.0)
actionpack (7.2.1)
actionview (= 7.2.1)
activesupport (= 7.2.1)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4, < 3.2)
@ -32,35 +32,35 @@ GEM
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (7.2.0)
actionpack (= 7.2.0)
activerecord (= 7.2.0)
activestorage (= 7.2.0)
activesupport (= 7.2.0)
actiontext (7.2.1)
actionpack (= 7.2.1)
activerecord (= 7.2.1)
activestorage (= 7.2.1)
activesupport (= 7.2.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.2.0)
activesupport (= 7.2.0)
actionview (7.2.1)
activesupport (= 7.2.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (7.2.0)
activesupport (= 7.2.0)
activejob (7.2.1)
activesupport (= 7.2.1)
globalid (>= 0.3.6)
activemodel (7.2.0)
activesupport (= 7.2.0)
activerecord (7.2.0)
activemodel (= 7.2.0)
activesupport (= 7.2.0)
activemodel (7.2.1)
activesupport (= 7.2.1)
activerecord (7.2.1)
activemodel (= 7.2.1)
activesupport (= 7.2.1)
timeout (>= 0.4.0)
activestorage (7.2.0)
actionpack (= 7.2.0)
activejob (= 7.2.0)
activerecord (= 7.2.0)
activesupport (= 7.2.0)
activestorage (7.2.1)
actionpack (= 7.2.1)
activejob (= 7.2.1)
activerecord (= 7.2.1)
activesupport (= 7.2.1)
marcel (~> 1.0)
activesupport (7.2.0)
activesupport (7.2.1)
base64
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
@ -71,8 +71,10 @@ GEM
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
acts-as-taggable-on (5.0.0)
activerecord (>= 4.2.8)
acts-as-taggable-on (11.0.0)
activerecord (>= 7.0, < 8.0)
zeitwerk (>= 2.4, < 3.0)
ast (2.4.2)
babel-source (5.8.35)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
@ -84,9 +86,10 @@ GEM
msgpack (~> 1.2)
builder (3.3.0)
coderay (1.1.3)
concurrent-ruby (1.3.3)
concurrent-ruby (1.3.4)
connection_pool (2.4.1)
crass (1.0.6)
csv (3.3.0)
date (3.3.4)
debug (1.9.2)
irb (~> 1.10)
@ -118,6 +121,18 @@ GEM
actionview (>= 5.0.0)
activesupport (>= 5.0.0)
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)
loofah (2.22.0)
crass (~> 1.0.2)
@ -130,11 +145,11 @@ GEM
marcel (1.0.4)
method_source (1.0.0)
mini_mime (1.1.5)
minitest (5.24.1)
minitest (5.25.1)
money (6.19.0)
i18n (>= 0.6.4, <= 2)
msgpack (1.7.2)
net-imap (0.4.14)
net-imap (0.4.15)
date
net-protocol
net-pop (0.1.2)
@ -156,6 +171,10 @@ GEM
racc (~> 1.4)
nokogiri (1.16.7-x86_64-linux)
racc (~> 1.4)
parallel (1.26.2)
parser (3.3.4.2)
ast (~> 2.4.1)
racc
pg (1.5.7)
pry (0.14.2)
coderay (~> 1.1)
@ -166,6 +185,8 @@ GEM
nio4r (~> 2.0)
racc (1.8.1)
rack (3.1.7)
rack-cors (2.0.2)
rack (>= 2.0.0)
rack-session (2.0.0)
rack (>= 3.0.0)
rack-test (2.1.0)
@ -173,20 +194,20 @@ GEM
rackup (2.1.0)
rack (>= 3)
webrick (~> 1.8)
rails (7.2.0)
actioncable (= 7.2.0)
actionmailbox (= 7.2.0)
actionmailer (= 7.2.0)
actionpack (= 7.2.0)
actiontext (= 7.2.0)
actionview (= 7.2.0)
activejob (= 7.2.0)
activemodel (= 7.2.0)
activerecord (= 7.2.0)
activestorage (= 7.2.0)
activesupport (= 7.2.0)
rails (7.2.1)
actioncable (= 7.2.1)
actionmailbox (= 7.2.1)
actionmailer (= 7.2.1)
actionpack (= 7.2.1)
actiontext (= 7.2.1)
actionview (= 7.2.1)
activejob (= 7.2.1)
activemodel (= 7.2.1)
activerecord (= 7.2.1)
activestorage (= 7.2.1)
activesupport (= 7.2.1)
bundler (>= 1.15.0)
railties (= 7.2.0)
railties (= 7.2.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
@ -194,14 +215,15 @@ GEM
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
railties (7.2.0)
actionpack (= 7.2.0)
activesupport (= 7.2.0)
railties (7.2.1)
actionpack (= 7.2.1)
activesupport (= 7.2.1)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.2.1)
rdoc (6.7.0)
psych (>= 4.0.0)
@ -211,12 +233,14 @@ GEM
execjs
railties (>= 3.2)
tilt
redis (5.2.0)
redis (5.3.0)
redis-client (>= 0.22.0)
redis-client (0.22.2)
connection_pool
regexp_parser (2.9.2)
reline (0.5.9)
io-console (~> 0.5)
rexml (3.2.8)
rspec-core (3.12.3)
rspec-support (~> 3.12.0)
rspec-expectations (3.12.4)
@ -234,7 +258,21 @@ GEM
rspec-mocks (~> 3.12)
rspec-support (~> 3.12)
rspec-support (3.12.2)
rubytree (2.0.3)
rubocop (1.65.1)
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)
securerandom (0.3.1)
sprockets (4.2.1)
@ -244,10 +282,10 @@ GEM
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
stimulus-rails (1.3.3)
stimulus-rails (1.3.4)
railties (>= 6.0.0)
stringio (3.1.1)
thor (1.3.1)
thor (1.3.2)
tilt (2.4.0)
timeout (0.4.1)
turbo-rails (2.0.6)
@ -256,6 +294,7 @@ GEM
railties (>= 6.0.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
useragent (0.16.10)
web-console (4.2.1)
actionview (>= 6.0.0)
@ -279,19 +318,23 @@ PLATFORMS
DEPENDENCIES
acts-as-taggable-on
bootsnap
csv
debug
factory_bot_rails
faker
importmap-rails
jbuilder
jsonapi-rails
money
pg (~> 1.1)
pry
puma (>= 5.0)
rails (~> 7.2.0, >= 7.2.0)
rack-cors
rails (~> 7.2.0, >= 7.2.1)
react-rails
redis (>= 4.0.1)
rspec-rails (~> 6.1.0)
rubocop
rubytree
sprockets-rails
stimulus-rails

View File

@ -1,3 +0,0 @@
//= require react
//= require react_ujs
//= require components

View File

@ -1 +0,0 @@
//= require_tree ./components

View File

@ -1,6 +0,0 @@
//= 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.

View File

@ -0,0 +1,6 @@
class GroupsController < ApplicationController
def index
roots = Group.where(parent_id: nil)
render jsonapi: roots, include: [children: [children: [:children]]]
end
end

View File

@ -6,9 +6,10 @@ class GuestsController < ApplicationController
# GET /guests or /guests.json
def index
@guests = Guest.all
.left_outer_joins(:affinity_groups)
.order('tags.name' => :asc)
.includes(:affinity_groups, :unbreakable_bonds)
.joins(:group)
.order('groups.name' => :asc)
render jsonapi: @guests
end
# GET /guests/1 or /guests/1.json

View File

@ -0,0 +1,2 @@
module GroupsHelper
end

9
app/models/group.rb Normal file
View File

@ -0,0 +1,9 @@
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

View File

@ -1,6 +1,14 @@
class Guest < ApplicationRecord
acts_as_taggable_on :affinity_groups, :unbreakable_bonds
belongs_to :group
enum status: {
considered: 0,
invited: 10,
confirmed: 20,
declined: 30
}
def full_name
"#{first_name} #{last_name}"
end

View File

@ -0,0 +1,11 @@
class SerializableGroup < JSONAPI::Serializable::Resource
type 'group'
attributes :name, :icon
has_many :children
attribute :guest_count do
@object.guests.count
end
end

View File

@ -0,0 +1,17 @@
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

View File

@ -0,0 +1,8 @@
# 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

View File

@ -1,4 +0,0 @@
# frozen_string_literal: true
# To render React components in production, precompile the server rendering manifest:
Rails.application.config.assets.precompile += ["server_rendering.js"]

View File

@ -1,4 +1,5 @@
Rails.application.routes.draw do
resources :groups, only: :index
resources :guests do
post :import, on: :collection
end

View File

@ -0,0 +1,13 @@
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

View File

@ -0,0 +1,5 @@
class AddParentToGroup < ActiveRecord::Migration[7.1]
def change
add_reference :groups, :parent, type: :uuid, index: true, foreign_key: { to_table: :groups }
end
end

View File

@ -0,0 +1,5 @@
class AddGroupToGuest < ActiveRecord::Migration[7.1]
def change
add_reference :guests, :group, null: false, foreign_key: true, type: :uuid
end
end

View File

@ -0,0 +1,5 @@
class AddStatusToGuest < ActiveRecord::Migration[7.1]
def change
add_column :guests, :status, :integer, default: 0
end
end

18
db/schema.rb generated
View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2024_07_24_181853) do
ActiveRecord::Schema[7.1].define(version: 2024_08_11_170021) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -26,6 +26,17 @@ ActiveRecord::Schema[7.1].define(version: 2024_07_24_181853) do
t.datetime "updated_at", null: false
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|
t.string "first_name"
t.string "last_name"
@ -33,6 +44,9 @@ ActiveRecord::Schema[7.1].define(version: 2024_07_24_181853) do
t.string "phone"
t.datetime "created_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
create_table "seats", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@ -82,6 +96,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_07_24_181853) do
t.index ["name"], name: "index_tags_on_name", unique: true
end
add_foreign_key "groups", "groups", column: "parent_id"
add_foreign_key "guests", "groups"
add_foreign_key "seats", "guests"
add_foreign_key "seats", "tables_arrangements", on_delete: :cascade
add_foreign_key "taggings", "tags"

View File

@ -5,6 +5,7 @@ Expense.delete_all
Guest.delete_all
ActsAsTaggableOn::Tagging.delete_all
ActsAsTaggableOn::Tag.delete_all
Group.delete_all
Expense.create!(name: 'Photographer', amount: 3000, pricing_type: 'fixed')
Expense.create!(name: 'Country house', amount: 6000, pricing_type: 'fixed')
@ -21,53 +22,45 @@ Expense.create!(name: 'Transportation', amount: 3000, pricing_type: 'fixed')
Expense.create!(name: 'Invitations', amount: 200, pricing_type: 'fixed')
Expense.create!(name: 'Cake', amount: 500, pricing_type: 'fixed')
samples = {
close_family_a: 10,
close_family_b: 10,
cousins_a: 20,
cousins_b: 15,
relatives_a: 15,
relatives_b: 10,
work_a: 10,
work_b: 10,
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
NUMBER_OF_GUESTS.times do
guest = Guest.create!(first_name: Faker::Name.first_name,
last_name: Faker::Name.last_name,
email: Faker::Internet.email,
phone: Faker::PhoneNumber.cell_phone)
guest.affinity_group_list.add(samples.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!
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|
parent.children.create!(name: "Pam's family", icon: 'pi pi-users').tap do |family|
family.children.create!(name: "Pam's close family", icon: 'pi pi-home')
family.children.create!(name: "Pam's cousins", icon: 'pi pi-home')
family.children.create!(name: "Pam's relatives", icon: 'pi pi-home')
end
parent.children.create!(name: "Pam's friends", icon: 'pi pi-bullseye')
parent.children.create!(name: "Pam's work", icon: 'pi pi-desktop').tap do |work|
work.children.create!(name: "Pam's besties at work", icon: 'pi pi-briefcase')
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
Guest.create!(
first_name: Faker::Name.first_name,
last_name: Faker::Name.last_name,
email: Faker::Internet.email,
phone: Faker::PhoneNumber.cell_phone,
group: groups.sample,
status: Guest.statuses.keys.sample
)
end

6
spec/factories/groups.rb Normal file
View File

@ -0,0 +1,6 @@
FactoryBot.define do
factory :group do
sequence(:name) { |i| "Group #{i}" }
order { 1 }
end
end

View File

@ -1,5 +1,7 @@
FactoryBot.define do
factory :guest do
association :group
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
email { Faker::Internet.email }

View File

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe Group, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end