Compare commits

...

4 commits

Author SHA1 Message Date
43dee1ecd9 Move ActiveJob config to initializer (#56)
Reviewed-on: #56
2025-01-23 13:17:48 -05:00
d5bc6c718e Setup solid_cable (#55)
Reviewed-on: #55
2025-01-17 00:28:06 -05:00
55a07d49d2 Upgrade schemas to Rails 8.1 (#54)
Reviewed-on: #54
2025-01-17 00:14:22 -05:00
5b5d1f32b7 Try out new Rails rate limiting (#53)
Reviewed-on: #53
2025-01-16 22:19:35 -05:00
14 changed files with 211 additions and 133 deletions

View file

@ -20,6 +20,7 @@ gem "jbuilder"
# Use Redis adapter to run Action Cable in production # Use Redis adapter to run Action Cable in production
# gem "redis", ">= 4.0.1" # gem "redis", ">= 4.0.1"
gem "solid_cable"
gem "solid_cache" gem "solid_cache"
gem "solid_queue" gem "solid_queue"

View file

@ -259,6 +259,11 @@ GEM
rexml (~> 3.2, >= 3.2.5) rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0) rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0) websocket (~> 1.0)
solid_cable (3.0.5)
actioncable (>= 7.2)
activejob (>= 7.2)
activerecord (>= 7.2)
railties (>= 7.2)
solid_cache (1.0.6) solid_cache (1.0.6)
activejob (>= 7.2) activejob (>= 7.2)
activerecord (>= 7.2) activerecord (>= 7.2)
@ -327,6 +332,7 @@ DEPENDENCIES
rails! rails!
rubocop-rails-omakase rubocop-rails-omakase
selenium-webdriver selenium-webdriver
solid_cable
solid_cache solid_cache
solid_queue solid_queue
sqlite3 (>= 1.4) sqlite3 (>= 1.4)

View file

@ -1,5 +1,6 @@
class SessionsController < ApplicationController class SessionsController < ApplicationController
require_unregistered_user only: %i[new create] require_unregistered_user only: %i[new create]
rate_limit to: 5, within: 1.minute, only: :create, with: -> { redirect_to new_session_url, alert: "Cannot currently login" }
# GET /sessions/new # GET /sessions/new
def new def new
@session = Session.new @session = Session.new

View file

@ -1,10 +1,22 @@
# Async adapter only works within the same process, so for manually triggering cable updates from a console,
# and seeing results in the browser, you must do so from the web console (running inside the dev process),
# not a terminal started via bin/rails console! Add "console" to any action or any ERB template view
# to make the web console appear.
development: development:
adapter: async adapter: solid_cable
connects_to:
database:
writing: cable
polling_interval: 0.1.seconds
message_retention: 1.day
test: test:
adapter: test adapter: test
production: production:
adapter: redis adapter: solid_cable
url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> connects_to:
channel_prefix: family_budget_production database:
writing: cable
polling_interval: 0.1.seconds
message_retention: 1.day

View file

@ -21,6 +21,10 @@ development:
<<: *default <<: *default
database: storage/development_queue.sqlite3 database: storage/development_queue.sqlite3
migrations_paths: db/queue_migrate migrations_paths: db/queue_migrate
cable:
<<: *default
database: storage/development_cable.sqlite3
migrations_paths: db/cable_migrate
# Warning: The database defined as "test" will be erased and # Warning: The database defined as "test" will be erased and
@ -42,3 +46,7 @@ production:
<<: *default <<: *default
database: storage/production_queue.sqlite3 database: storage/production_queue.sqlite3
migrations_paths: db/queue_migrate migrations_paths: db/queue_migrate
cable:
<<: *default
database: storage/production_cable.sqlite3
migrations_paths: db/cable_migrate

View file

@ -72,6 +72,4 @@ Rails.application.configure do
# Apply autocorrection by RuboCop to files generated by `bin/rails generate`. # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
# config.generators.apply_rubocop_autocorrect_after_generate! # config.generators.apply_rubocop_autocorrect_after_generate!
# Use a real queuing backend for Active Job (and separate queues per environment).
config.active_job.queue_adapter = :solid_queue
end end

View file

@ -86,10 +86,4 @@ Rails.application.configure do
# #
# Skip DNS rebinding protection for the default health check endpoint. # Skip DNS rebinding protection for the default health check endpoint.
# config.host_authorization = { exclude: ->(request) { request.path == "/up" } } # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
# Use a real queuing backend for Active Job (and separate queues per environment).
config.active_job.queue_adapter = :solid_queue
config.solid_queue.connects_to = { database: { writing: :queue } }
# config.active_job.queue_name_prefix = "family_budget_production"
end end

View file

@ -0,0 +1,3 @@
# Use a real queuing backend for Active Job (and separate queues per environment).
Rails.application.config.active_job.queue_adapter = :solid_queue
Rails.application.config.solid_queue.connects_to = { database: { writing: :queue } }

10
config/recurring.yml Normal file
View file

@ -0,0 +1,10 @@
# production:
# periodic_cleanup:
# class: CleanSoftDeletedRecordsJob
# queue: background
# args: [ 1000, { batch_size: 500 } ]
# schedule: every hour
# periodic_command:
# command: "SoftDeletedRecord.due.delete_all"
# priority: 2
# schedule: at 5am every day

23
db/cable_schema.rb Normal file
View file

@ -0,0 +1,23 @@
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 1) do
create_table "solid_cable_messages", force: :cascade do |t|
t.binary "channel", limit: 1024, null: false
t.integer "channel_hash", limit: 8, null: false
t.datetime "created_at", null: false
t.binary "payload", limit: 536870912, null: false
t.index ["channel"], name: "index_solid_cable_messages_on_channel"
t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash"
t.index ["created_at"], name: "index_solid_cable_messages_on_created_at"
end
end

View file

@ -1,12 +1,22 @@
# frozen_string_literal: true # This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 1) do ActiveRecord::Schema[8.1].define(version: 1) do
create_table "solid_cache_entries", force: :cascade do |t| create_table "solid_cache_entries", force: :cascade do |t|
t.binary "key", limit: 1024, null: false
t.binary "value", limit: 536870912, null: false
t.datetime "created_at", null: false
t.integer "key_hash", limit: 8, null: false
t.integer "byte_size", limit: 4, null: false t.integer "byte_size", limit: 4, null: false
t.datetime "created_at", null: false
t.binary "key", limit: 1024, null: false
t.integer "key_hash", limit: 8, null: false
t.binary "value", limit: 536870912, null: false
t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size"
t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size"
t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true

View file

@ -1,123 +1,135 @@
ActiveRecord::Schema[7.1].define(version: 2024_09_04_193154) do # This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2024_09_04_193154) do
create_table "solid_queue_blocked_executions", force: :cascade do |t| create_table "solid_queue_blocked_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.string "concurrency_key", null: false t.string "concurrency_key", null: false
t.datetime "expires_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release" t.datetime "expires_at", null: false
t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance" t.bigint "job_id", null: false
t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release"
t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance"
t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
end end
create_table "solid_queue_claimed_executions", force: :cascade do |t| create_table "solid_queue_claimed_executions", force: :cascade do |t|
t.datetime "created_at", null: false
t.bigint "job_id", null: false t.bigint "job_id", null: false
t.bigint "process_id" t.bigint "process_id"
t.datetime "created_at", null: false t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
end end
create_table "solid_queue_failed_executions", force: :cascade do |t| create_table "solid_queue_failed_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.text "error"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true t.text "error"
t.bigint "job_id", null: false
t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true
end end
create_table "solid_queue_jobs", force: :cascade do |t| create_table "solid_queue_jobs", force: :cascade do |t|
t.string "queue_name", null: false
t.string "class_name", null: false
t.text "arguments"
t.integer "priority", default: 0, null: false
t.string "active_job_id" t.string "active_job_id"
t.datetime "scheduled_at" t.text "arguments"
t.datetime "finished_at" t.string "class_name", null: false
t.string "concurrency_key" t.string "concurrency_key"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "finished_at"
t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.datetime "scheduled_at"
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id" t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id"
t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name" t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name"
t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at" t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at"
t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering" t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering"
t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting" t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting"
end end
create_table "solid_queue_pauses", force: :cascade do |t| create_table "solid_queue_pauses", force: :cascade do |t|
t.string "queue_name", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true t.string "queue_name", null: false
t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true
end end
create_table "solid_queue_processes", force: :cascade do |t| create_table "solid_queue_processes", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "hostname"
t.string "kind", null: false t.string "kind", null: false
t.datetime "last_heartbeat_at", null: false t.datetime "last_heartbeat_at", null: false
t.bigint "supervisor_id"
t.integer "pid", null: false
t.string "hostname"
t.text "metadata" t.text "metadata"
t.datetime "created_at", null: false
t.string "name", null: false t.string "name", null: false
t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at" t.integer "pid", null: false
t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true t.bigint "supervisor_id"
t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id" t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at"
t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id"
end end
create_table "solid_queue_ready_executions", force: :cascade do |t| create_table "solid_queue_ready_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true t.bigint "job_id", null: false
t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all" t.integer "priority", default: 0, null: false
t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue" t.string "queue_name", null: false
t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true
t.index ["priority", "job_id"], name: "index_solid_queue_poll_all"
t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue"
end end
create_table "solid_queue_recurring_executions", force: :cascade do |t| create_table "solid_queue_recurring_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.string "task_key", null: false
t.datetime "run_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true t.bigint "job_id", null: false
t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true t.datetime "run_at", null: false
t.string "task_key", null: false
t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
end end
create_table "solid_queue_recurring_tasks", force: :cascade do |t| create_table "solid_queue_recurring_tasks", force: :cascade do |t|
t.string "key", null: false
t.string "schedule", null: false
t.string "command", limit: 2048
t.string "class_name"
t.text "arguments" t.text "arguments"
t.string "queue_name" t.string "class_name"
t.integer "priority", default: 0 t.string "command", limit: 2048
t.boolean "static", default: true, null: false
t.text "description"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.text "description"
t.string "key", null: false
t.integer "priority", default: 0
t.string "queue_name"
t.string "schedule", null: false
t.boolean "static", default: true, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static" t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
end end
create_table "solid_queue_scheduled_executions", force: :cascade do |t| create_table "solid_queue_scheduled_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.datetime "scheduled_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true t.bigint "job_id", null: false
t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all" t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.datetime "scheduled_at", null: false
t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all"
end end
create_table "solid_queue_semaphores", force: :cascade do |t| create_table "solid_queue_semaphores", force: :cascade do |t|
t.string "key", null: false
t.integer "value", default: 1, null: false
t.datetime "expires_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "expires_at", null: false
t.string "key", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at" t.integer "value", default: 1, null: false
t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value" t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at"
t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value"
t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true
end end
add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade

96
db/schema.rb generated
View file

@ -10,78 +10,78 @@
# #
# 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[8.0].define(version: 2024_09_09_011044) do ActiveRecord::Schema[8.1].define(version: 2024_09_09_011044) do
create_table "credit_card_bills", force: :cascade do |t| create_table "credit_card_bills", force: :cascade do |t|
t.string "description"
t.decimal "amount" t.decimal "amount"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.string "description"
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
end end
create_table "expenses", force: :cascade do |t| create_table "expenses", force: :cascade do |t|
t.datetime "created_at", null: false
t.boolean "credit_card", default: false, null: false
t.string "description", default: "", null: false t.string "description", default: "", null: false
t.boolean "estimated", default: false, null: false
t.decimal "payment", precision: 8, scale: 2, default: "0.0", null: false t.decimal "payment", precision: 8, scale: 2, default: "0.0", null: false
t.integer "period", default: 0, null: false t.integer "period", default: 0, null: false
t.boolean "credit_card", default: false, null: false
t.boolean "estimated", default: false, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
end end
create_table "incomes", force: :cascade do |t| create_table "incomes", force: :cascade do |t|
t.decimal "amount", precision: 9, scale: 2, default: "0.0", null: false
t.datetime "created_at", null: false
t.string "description", default: "", null: false t.string "description", default: "", null: false
t.boolean "included", default: true, null: false t.boolean "included", default: true, null: false
t.decimal "amount", precision: 9, scale: 2, default: "0.0", null: false
t.integer "member_id", null: false t.integer "member_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["member_id"], name: "index_incomes_on_member_id" t.index ["member_id"], name: "index_incomes_on_member_id"
end end
create_table "members", force: :cascade do |t| create_table "members", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "name", default: "", null: false t.string "name", default: "", null: false
t.boolean "pays", default: true, null: false t.boolean "pays", default: true, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
end end
create_table "solid_queue_blocked_executions", force: :cascade do |t| create_table "solid_queue_blocked_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.string "concurrency_key", null: false t.string "concurrency_key", null: false
t.datetime "expires_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "expires_at", null: false
t.integer "job_id", null: false
t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release"
t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance"
t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
end end
create_table "solid_queue_claimed_executions", force: :cascade do |t| create_table "solid_queue_claimed_executions", force: :cascade do |t|
t.datetime "created_at", null: false
t.integer "job_id", null: false t.integer "job_id", null: false
t.bigint "process_id" t.bigint "process_id"
t.datetime "created_at", null: false
t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
end end
create_table "solid_queue_failed_executions", force: :cascade do |t| create_table "solid_queue_failed_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.text "error"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.text "error"
t.integer "job_id", null: false
t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true
end end
create_table "solid_queue_jobs", force: :cascade do |t| create_table "solid_queue_jobs", force: :cascade do |t|
t.string "queue_name", null: false
t.string "class_name", null: false
t.text "arguments"
t.integer "priority", default: 0, null: false
t.string "active_job_id" t.string "active_job_id"
t.datetime "scheduled_at" t.text "arguments"
t.datetime "finished_at" t.string "class_name", null: false
t.string "concurrency_key" t.string "concurrency_key"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "finished_at"
t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.datetime "scheduled_at"
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id" t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id"
t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name" t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name"
@ -91,85 +91,85 @@ ActiveRecord::Schema[8.0].define(version: 2024_09_09_011044) do
end end
create_table "solid_queue_pauses", force: :cascade do |t| create_table "solid_queue_pauses", force: :cascade do |t|
t.string "queue_name", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.string "queue_name", null: false
t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true
end end
create_table "solid_queue_processes", force: :cascade do |t| create_table "solid_queue_processes", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "hostname"
t.string "kind", null: false t.string "kind", null: false
t.datetime "last_heartbeat_at", null: false t.datetime "last_heartbeat_at", null: false
t.bigint "supervisor_id"
t.integer "pid", null: false
t.string "hostname"
t.text "metadata" t.text "metadata"
t.datetime "created_at", null: false
t.string "name", null: false t.string "name", null: false
t.integer "pid", null: false
t.bigint "supervisor_id"
t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at" t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at"
t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id" t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id"
end end
create_table "solid_queue_ready_executions", force: :cascade do |t| create_table "solid_queue_ready_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.integer "job_id", null: false
t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true
t.index ["priority", "job_id"], name: "index_solid_queue_poll_all" t.index ["priority", "job_id"], name: "index_solid_queue_poll_all"
t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue"
end end
create_table "solid_queue_recurring_executions", force: :cascade do |t| create_table "solid_queue_recurring_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.string "task_key", null: false
t.datetime "run_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.integer "job_id", null: false
t.datetime "run_at", null: false
t.string "task_key", null: false
t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
end end
create_table "solid_queue_recurring_tasks", force: :cascade do |t| create_table "solid_queue_recurring_tasks", force: :cascade do |t|
t.string "key", null: false
t.string "schedule", null: false
t.string "command", limit: 2048
t.string "class_name"
t.text "arguments" t.text "arguments"
t.string "queue_name" t.string "class_name"
t.integer "priority", default: 0 t.string "command", limit: 2048
t.boolean "static", default: true, null: false
t.text "description"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.text "description"
t.string "key", null: false
t.integer "priority", default: 0
t.string "queue_name"
t.string "schedule", null: false
t.boolean "static", default: true, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true
t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static" t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static"
end end
create_table "solid_queue_scheduled_executions", force: :cascade do |t| create_table "solid_queue_scheduled_executions", force: :cascade do |t|
t.integer "job_id", null: false
t.string "queue_name", null: false
t.integer "priority", default: 0, null: false
t.datetime "scheduled_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.integer "job_id", null: false
t.integer "priority", default: 0, null: false
t.string "queue_name", null: false
t.datetime "scheduled_at", null: false
t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all"
end end
create_table "solid_queue_semaphores", force: :cascade do |t| create_table "solid_queue_semaphores", force: :cascade do |t|
t.string "key", null: false
t.integer "value", default: 1, null: false
t.datetime "expires_at", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "expires_at", null: false
t.string "key", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.integer "value", default: 1, null: false
t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at" t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at"
t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value"
t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true
end end
create_table "users", force: :cascade do |t| create_table "users", force: :cascade do |t|
t.datetime "created_at", null: false
t.string "email" t.string "email"
t.string "password_digest" t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true t.index ["email"], name: "index_users_on_email", unique: true
end end