From d1a351ffec951c8fb5d57580944539e99886a070 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 10:20:00 +0100 Subject: [PATCH 1/6] Define a new column to store the digest of the list of guests included in a simulation --- app/models/tables_arrangement.rb | 13 +++++++------ ...d_guests_digest_column_to_tables_arrangements.rb | 5 +++++ db/schema.rb | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb diff --git a/app/models/tables_arrangement.rb b/app/models/tables_arrangement.rb index adece9a..1fff7b0 100644 --- a/app/models/tables_arrangement.rb +++ b/app/models/tables_arrangement.rb @@ -6,12 +6,13 @@ # # Table name: tables_arrangements # -# id :uuid not null, primary key -# discomfort :integer -# name :string not null -# created_at :datetime not null -# updated_at :datetime not null -# wedding_id :uuid not null +# id :uuid not null, primary key +# discomfort :integer +# guests_digest :uuid not null +# name :string not null +# created_at :datetime not null +# updated_at :datetime not null +# wedding_id :uuid not null # # Indexes # diff --git a/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb b/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb new file mode 100644 index 0000000..1d46d5c --- /dev/null +++ b/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb @@ -0,0 +1,5 @@ +class AddGuestsDigestColumnToTablesArrangements < ActiveRecord::Migration[8.0] + def change + add_column :tables_arrangements, :guests_digest, :uuid, null: false, default: 'gen_random_uuid()' + end +end diff --git a/db/schema.rb b/db/schema.rb index 10ab0cd..754cb1b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2024_12_16_231415) do +ActiveRecord::Schema[8.0].define(version: 2025_01_26_091823) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -206,6 +206,7 @@ ActiveRecord::Schema[8.0].define(version: 2024_12_16_231415) do t.datetime "updated_at", null: false t.string "name", null: false t.uuid "wedding_id", null: false + t.uuid "guests_digest", default: -> { "gen_random_uuid()" }, null: false t.index ["wedding_id"], name: "index_tables_arrangements_on_wedding_id" end -- 2.47.1 From cf0a7b71ca129a152ac50ef2abede1a6bf05c0f4 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 12:16:53 +0100 Subject: [PATCH 2/6] Store the digest along with the calculated discomfort --- app/models/wedding.rb | 2 ++ app/services/tables/distribution.rb | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/models/wedding.rb b/app/models/wedding.rb index 83525b5..5f0dabf 100644 --- a/app/models/wedding.rb +++ b/app/models/wedding.rb @@ -19,4 +19,6 @@ class Wedding < ApplicationRecord SLUG_REGEX = /[a-z\d-]+/ validates :slug, presence: true, uniqueness: true, format: { with: /\A#{SLUG_REGEX}\z/ } + + has_many :guests, dependent: :delete_all end diff --git a/app/services/tables/distribution.rb b/app/services/tables/distribution.rb index 87dccb0..6a12d70 100644 --- a/app/services/tables/distribution.rb +++ b/app/services/tables/distribution.rb @@ -6,7 +6,13 @@ require_relative '../../extensions/tree_node_extension' module Tables class Distribution - attr_accessor :tables, :min_per_table, :max_per_table + class << self + def digest(wedding) + Digest::UUID.uuid_v5(wedding.id, wedding.guests.potential.order(:id).pluck(:id).join) + end + end + + attr_accessor :tables, :min_per_table, :max_per_table, :hierarchy def initialize(min_per_table:, max_per_table:) @min_per_table = min_per_table @@ -54,7 +60,10 @@ module Tables Seat.insert_all!(records_to_store) - arrangement.update!(discomfort:) + arrangement.update!( + discomfort:, + guests_digest: self.class.digest(tables.first.first.wedding) + ) end end -- 2.47.1 From 67138fd01765dd6a972672ba9297c0a2a468fb9f Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 12:19:34 +0100 Subject: [PATCH 3/6] Rename column --- app/models/tables_arrangement.rb | 14 +++++++------- app/services/tables/distribution.rb | 2 +- ..._guests_digest_column_to_tables_arrangements.rb | 2 +- db/schema.rb | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/models/tables_arrangement.rb b/app/models/tables_arrangement.rb index 1fff7b0..a461555 100644 --- a/app/models/tables_arrangement.rb +++ b/app/models/tables_arrangement.rb @@ -6,13 +6,13 @@ # # Table name: tables_arrangements # -# id :uuid not null, primary key -# discomfort :integer -# guests_digest :uuid not null -# name :string not null -# created_at :datetime not null -# updated_at :datetime not null -# wedding_id :uuid not null +# id :uuid not null, primary key +# digest :uuid not null +# discomfort :integer +# name :string not null +# created_at :datetime not null +# updated_at :datetime not null +# wedding_id :uuid not null # # Indexes # diff --git a/app/services/tables/distribution.rb b/app/services/tables/distribution.rb index 6a12d70..cc51308 100644 --- a/app/services/tables/distribution.rb +++ b/app/services/tables/distribution.rb @@ -62,7 +62,7 @@ module Tables arrangement.update!( discomfort:, - guests_digest: self.class.digest(tables.first.first.wedding) + digest: self.class.digest(tables.first.first.wedding) ) end end diff --git a/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb b/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb index 1d46d5c..34a500b 100644 --- a/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb +++ b/db/migrate/20250126091823_add_guests_digest_column_to_tables_arrangements.rb @@ -1,5 +1,5 @@ class AddGuestsDigestColumnToTablesArrangements < ActiveRecord::Migration[8.0] def change - add_column :tables_arrangements, :guests_digest, :uuid, null: false, default: 'gen_random_uuid()' + add_column :tables_arrangements, :digest, :uuid, null: false, default: 'gen_random_uuid()' end end diff --git a/db/schema.rb b/db/schema.rb index 754cb1b..5b61f3f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -206,7 +206,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_01_26_091823) do t.datetime "updated_at", null: false t.string "name", null: false t.uuid "wedding_id", null: false - t.uuid "guests_digest", default: -> { "gen_random_uuid()" }, null: false + t.uuid "digest", default: -> { "gen_random_uuid()" }, null: false t.index ["wedding_id"], name: "index_tables_arrangements_on_wedding_id" end -- 2.47.1 From cf589edda048ea204007604337a67faee171f301 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 12:39:25 +0100 Subject: [PATCH 4/6] Mark unexpired distributions as valid --- app/controllers/tables_arrangements_controller.rb | 9 ++++++++- spec/requests/tables_arrangements_spec.rb | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/tables_arrangements_controller.rb b/app/controllers/tables_arrangements_controller.rb index c09d453..356343d 100644 --- a/app/controllers/tables_arrangements_controller.rb +++ b/app/controllers/tables_arrangements_controller.rb @@ -4,7 +4,14 @@ class TablesArrangementsController < ApplicationController def index - render json: TablesArrangement.order(discomfort: :asc).limit(3).as_json(only: %i[id name discomfort]) + current_digest = Tables::Distribution.digest(current_tenant) + + render json: TablesArrangement + .order(discomfort: :asc) + .select(:id, :name, :discomfort) + .select("digest = '#{current_digest}'::uuid as valid") + .limit(3) + .as_json(only: %i[id name discomfort valid]) end def show diff --git a/spec/requests/tables_arrangements_spec.rb b/spec/requests/tables_arrangements_spec.rb index 4e87cb2..98fe74f 100644 --- a/spec/requests/tables_arrangements_spec.rb +++ b/spec/requests/tables_arrangements_spec.rb @@ -18,7 +18,8 @@ RSpec.describe 'tables_arrangements' do properties: { id: { type: :string, format: :uuid }, name: { type: :string }, - discomfort: { type: :integer } + discomfort: { type: :integer }, + valid: { type: :boolean } } } xit -- 2.47.1 From 707f05d81c8c68ab916acc2f6fd54a798813a982 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 12:40:52 +0100 Subject: [PATCH 5/6] Remove automatic creation and deletion of simulations --- app/models/guest.rb | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/models/guest.rb b/app/models/guest.rb index ad0542f..d080679 100644 --- a/app/models/guest.rb +++ b/app/models/guest.rb @@ -41,16 +41,5 @@ class Guest < ApplicationRecord scope :potential, -> { where.not(status: %i[declined considered]) } - after_destroy :recalculate_simulations - after_save :recalculate_simulations, if: :saved_change_to_status? - has_many :seats, dependent: :delete_all - - private - - def recalculate_simulations - TablesArrangement.delete_all - - ActiveJob.perform_all_later(50.times.map { TableSimulatorJob.new(wedding_id) }) - end end -- 2.47.1 From 998c0f43f3ef3dcd08eb8b6fdc514506a223daae Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 26 Jan 2025 13:36:25 +0100 Subject: [PATCH 6/6] Define a new endpoint to create simulations --- app/controllers/tables_arrangements_controller.rb | 9 ++++++++- config/routes.rb | 2 +- spec/requests/tables_arrangements_spec.rb | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/controllers/tables_arrangements_controller.rb b/app/controllers/tables_arrangements_controller.rb index 356343d..45cf633 100644 --- a/app/controllers/tables_arrangements_controller.rb +++ b/app/controllers/tables_arrangements_controller.rb @@ -7,10 +7,11 @@ class TablesArrangementsController < ApplicationController current_digest = Tables::Distribution.digest(current_tenant) render json: TablesArrangement + .order(valid: :desc) .order(discomfort: :asc) .select(:id, :name, :discomfort) .select("digest = '#{current_digest}'::uuid as valid") - .limit(3) + .limit(20) .as_json(only: %i[id name discomfort valid]) end @@ -23,6 +24,12 @@ class TablesArrangementsController < ApplicationController .then { |result| render json: { id: params[:id], tables: result } } end + def create + TableSimulatorJob.perform_later(current_tenant.id) + + render json: {}, status: :created + end + private def format(number:, guests:) diff --git a/config/routes.rb b/config/routes.rb index f53e7f1..39d0460 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -37,7 +37,7 @@ Rails.application.routes.draw do resources :expenses, only: %i[index create update destroy] do get :summary, on: :collection end - resources :tables_arrangements, only: %i[index show] + resources :tables_arrangements, only: %i[index show create] resources :summary, only: :index root to: redirect("/%{slug}") diff --git a/spec/requests/tables_arrangements_spec.rb b/spec/requests/tables_arrangements_spec.rb index 98fe74f..3cc11c1 100644 --- a/spec/requests/tables_arrangements_spec.rb +++ b/spec/requests/tables_arrangements_spec.rb @@ -26,6 +26,19 @@ RSpec.describe 'tables_arrangements' do end regular_api_responses end + + post('create tables arrangement') do + tags 'Tables Arrangements' + produces 'application/json' + parameter Swagger::Schema::SLUG + response(201, 'successful') do + schema type: :object, + required: [], + properties: {} + xit + end + regular_api_responses + end end path '/{slug}/tables_arrangements/{id}' do -- 2.47.1