From 0c667795a722845381753a3fc19d9af7ea4cf68b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 14:43:42 -0600 Subject: [PATCH 1/7] 0.11.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c88d07d..cab3663 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "postcss-preset-env": "^7.8.3", "tailwindcss": "^3.4.0" }, - "version": "0.10.0", + "version": "0.11.0", "scripts": { "build:css:tailwind": "bun ./node_modules/tailwindcss/lib/cli.js --postcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css", "build:css": "bun run build:css:tailwind" From 045df94c297d69f14ad54819cfc76dc959b3d15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 15:15:27 -0600 Subject: [PATCH 2/7] Upgrade Devise to 5.0, remove workarounds --- Gemfile | 2 +- Gemfile.lock | 71 +++++++++++++++++++---------------- config/initializers/devise.rb | 7 ---- spec/spec_helper.rb | 5 --- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/Gemfile b/Gemfile index 5debb5f..7a6cf1b 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ gem 'dotenv-rails' # Authentication gem 'warden' -gem 'devise', '~> 4.9.0' +gem 'devise', '~> 5.0' gem 'devise_ldap_authenticatable' gem 'net-ldap' diff --git a/Gemfile.lock b/Gemfile.lock index 7111c12..3d3a017 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -96,12 +96,12 @@ GEM aws-sigv4 (1.11.0) aws-eventstream (~> 1, >= 1.0.2) backport (1.2.0) - base64 (0.2.0) - bcrypt (3.1.20) + base64 (0.3.0) + bcrypt (3.1.22) bech32 (1.5.0) thor (>= 1.1.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + benchmark (0.5.0) + bigdecimal (4.1.2) bindex (0.8.1) bip-schnorr (0.7.0) ecdsa_ext (~> 0.5.0) @@ -119,11 +119,11 @@ GEM logger (~> 1.5) chunky_png (1.4.0) concurrent-ruby (1.3.4) - connection_pool (2.5.2) + connection_pool (3.0.2) crack (1.0.0) bigdecimal rexml - crass (1.0.6) + crass (1.0.7) cssbundling-rails (1.4.3) railties (>= 6.0.0) database_cleaner (2.1.0) @@ -132,11 +132,11 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date (3.4.1) - devise (4.9.4) + date (3.5.1) + devise (5.0.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0) + railties (>= 7.0) responders warden (~> 1.2.3) devise_ldap_authenticatable (0.8.7) @@ -154,10 +154,11 @@ GEM railties (>= 6.1) down (5.4.2) addressable (~> 2.8) - drb (2.2.1) + drb (2.2.3) ecdsa (1.2.0) ecdsa_ext (0.5.1) ecdsa (~> 1.2.0) + erb (6.0.7) erubi (1.13.1) et-orbi (1.2.11) tzinfo @@ -204,7 +205,7 @@ GEM gpgme (2.0.24) mini_portile2 (~> 2.7) hashdiff (1.1.2) - i18n (1.14.7) + i18n (1.15.2) concurrent-ruby (~> 1.0) image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) @@ -213,9 +214,10 @@ GEM actionpack (>= 6.0.0) activesupport (>= 6.0.0) railties (>= 6.0.0) - io-console (0.8.0) - irb (1.15.2) + io-console (0.9.2) + irb (1.18.0) pp (>= 0.6.0) + prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) jaro_winkler (1.6.0) @@ -247,7 +249,7 @@ GEM lnurl (1.1.1) bech32 (~> 1.1) logger (1.7.0) - loofah (2.24.0) + loofah (2.25.2) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -264,8 +266,8 @@ GEM method_source (1.1.0) mini_magick (4.13.2) mini_mime (1.1.5) - mini_portile2 (2.8.8) - minitest (5.25.5) + mini_portile2 (2.8.9) + minitest (5.27.0) mission_control-jobs (1.0.2) actioncable (>= 7.1) actionpack (>= 7.1) @@ -313,7 +315,7 @@ GEM ast (~> 2.4.1) racc pg (1.5.9) - pp (0.6.2) + pp (0.6.4) prettyprint prettyprint (0.2.0) prism (1.4.0) @@ -322,7 +324,7 @@ GEM activesupport (>= 7.0.0) rack railties (>= 7.0.0) - psych (5.2.3) + psych (5.4.0) date stringio public_suffix (6.0.1) @@ -330,7 +332,7 @@ GEM nio4r (~> 2.0) raabro (1.4.0) racc (1.8.1) - rack (2.2.13) + rack (2.2.23) rack-protection (3.2.0) base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) @@ -359,12 +361,12 @@ GEM actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) activesupport (>= 5.0.1.rc1) - rails-dom-testing (2.2.0) + rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.2) - loofah (~> 2.21) + rails-html-sanitizer (1.7.1) + loofah (~> 2.25, >= 2.25.2) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rails-settings-cached (2.8.3) activerecord (>= 5.0.0) @@ -378,24 +380,26 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.2.1) + rake (13.4.2) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) rbs (3.9.2) logger - rdoc (6.13.1) + rdoc (7.2.0) + erb psych (>= 4.0.0) + tsort redis (5.4.0) redis-client (>= 0.22.0) redis-client (0.24.0) connection_pool regexp_parser (2.10.0) - reline (0.6.1) + reline (0.7.0) io-console (~> 0.5) - responders (3.1.1) - actionpack (>= 5.2) - railties (>= 5.2) + responders (3.2.0) + actionpack (>= 7.0) + railties (>= 7.0) reverse_markdown (3.0.0) nokogiri rexml (3.4.1) @@ -480,10 +484,11 @@ GEM sqlite3 (2.6.0-x86_64-linux-gnu) stimulus-rails (1.3.4) railties (>= 6.0.0) - stringio (3.1.7) + stringio (3.2.0) thor (1.3.2) tilt (2.6.0) timeout (0.4.3) + tsort (0.2.0) turbo-rails (2.0.13) actionpack (>= 7.1.0) railties (>= 7.1.0) @@ -492,7 +497,7 @@ GEM unicode-display_width (3.1.4) unicode-emoji (~> 4.0, >= 4.0.4) unicode-emoji (4.0.4) - uri (1.0.3) + uri (1.1.1) useragent (0.16.11) view_component (3.22.0) activesupport (>= 5.2.0, < 8.1) @@ -509,7 +514,7 @@ GEM addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.9.1) + webrick (1.9.2) websocket-driver (0.7.7) base64 websocket-extensions (>= 0.1.0) @@ -520,7 +525,7 @@ GEM yard-solargraph (0.1.0) yard (~> 0.9) zbase32 (0.1.1) - zeitwerk (2.7.2) + zeitwerk (2.8.3) PLATFORMS arm64-darwin-22 @@ -534,7 +539,7 @@ DEPENDENCIES capybara cssbundling-rails database_cleaner - devise (~> 4.9.0) + devise (~> 5.0) devise_ldap_authenticatable discourse_api dotenv-rails diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index cbe8112..f87b296 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -324,10 +324,3 @@ Devise.setup do |config| # changed. Defaults to true, so a user is signed in automatically after changing a password. # config.sign_in_after_change_password = true end - -# https://github.com/heartcombo/devise/issues/5644 -class Devise::SecretKeyFinder - def find - @application.secret_key_base - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6a9a6c5..ce33d66 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,11 +14,6 @@ # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration RSpec.configure do |config| - # TODO Remove when Devise fixes https://github.com/heartcombo/devise/issues/5705 - config.before(:each, type: :controller) do - Rails.application.reload_routes_unless_loaded - end - # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest # assertions if you prefer. From 8a8d407bcc38b530862642d906feaa0f61e165f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 15:17:14 -0600 Subject: [PATCH 3/7] Add missing whitespace between Devise (sign-in) errors and forms --- app/views/devise/shared/_error_messages.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/devise/shared/_error_messages.html.erb b/app/views/devise/shared/_error_messages.html.erb index 9e4c6b5..6dd7b3b 100644 --- a/app/views/devise/shared/_error_messages.html.erb +++ b/app/views/devise/shared/_error_messages.html.erb @@ -1,5 +1,5 @@ <% if resource.errors.any? %> -
+
    <% resource.errors.full_messages.each do |message| %>
  • <%= message %>
  • From c79c421b89ffebf5f7590c2ea4e53b643b89be22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 16:37:01 -0600 Subject: [PATCH 4/7] Fix Devise Turbo Stream responses for flash messages Wire Users::DeviseController as Devise parent controller with the Turbo-aware responder, so failed form submissions (login, password reset) render correctly as HTML with 422 status instead of unprocessable turbo-stream content that Turbo silently drops. Also fixes a NameError in the responder (rendering_options -> error_rendering_options) and removes the dead TurboController. --- app/controllers/turbo_controller.rb | 18 ------------------ app/controllers/users/devise_controller.rb | 2 +- config/initializers/devise.rb | 8 ++++++++ 3 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 app/controllers/turbo_controller.rb diff --git a/app/controllers/turbo_controller.rb b/app/controllers/turbo_controller.rb deleted file mode 100644 index 600e9d2..0000000 --- a/app/controllers/turbo_controller.rb +++ /dev/null @@ -1,18 +0,0 @@ -class TurboController < ApplicationController - class Responder < ActionController::Responder - def to_turbo_stream - controller.render(options.merge(formats: :html)) - rescue ActionView::MissingTemplate => error - if get? - raise error - elsif has_errors? && default_action - render rendering_options.merge(formats: :html, status: :unprocessable_entity) - else - redirect_to navigation_location - end - end - end - - self.responder = Responder - respond_to :html, :turbo_stream -end diff --git a/app/controllers/users/devise_controller.rb b/app/controllers/users/devise_controller.rb index c3aafd5..13b058d 100644 --- a/app/controllers/users/devise_controller.rb +++ b/app/controllers/users/devise_controller.rb @@ -6,7 +6,7 @@ class Users::DeviseController < ApplicationController if get? raise error elsif has_errors? && default_action - render rendering_options.merge(formats: :html, status: :unprocessable_entity) + render error_rendering_options.merge(formats: :html, status: :unprocessable_entity) else redirect_to navigation_location end diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index f87b296..c4931b1 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -6,6 +6,7 @@ require 'securerandom' # Many of these configuration options can be set straight in your model. Devise.setup do |config| # Hotwire/Turbo + config.parent_controller = 'Users::DeviseController' config.responder.error_status = :unprocessable_entity config.responder.redirect_status = :see_other @@ -324,3 +325,10 @@ Devise.setup do |config| # changed. Defaults to true, so a user is signed in automatically after changing a password. # config.sign_in_after_change_password = true end + +# Turbo-aware responder for Devise controllers +ActiveSupport.on_load(:devise_controller) do + self.responder = Users::DeviseController::Responder + Users::DeviseController::Responder.error_status = :unprocessable_entity + Users::DeviseController::Responder.redirect_status = :see_other +end From 6cc35f07eb16aa88a39d84f56305712908bb157a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 17:01:36 -0600 Subject: [PATCH 5/7] Remove more obsolete Devise code The initializer was a no-op override after our Devise upgrade --- AGENTS.md | 1 - config/initializers/devise_rails8_patch.rb | 11 ----------- 2 files changed, 12 deletions(-) delete mode 100644 config/initializers/devise_rails8_patch.rb diff --git a/AGENTS.md b/AGENTS.md index b7a02f3..13e4939 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -63,7 +63,6 @@ Warden `Test::Helpers`, DatabaseCleaner (transactional fixtures **off**), ViewCo and assert on DB rows / `enqueued_jobs`. - **Request/component/mailer/job/model/helper** specs in matching `spec/` subdirs. Fixtures live in `spec/fixtures/`; factories in `spec/factories/`. -- `spec_helper.rb` reloads routes before each `type: :controller` spec (Devise + Rails 8 workaround). ## Notes & gotchas diff --git a/config/initializers/devise_rails8_patch.rb b/config/initializers/devise_rails8_patch.rb deleted file mode 100644 index b84a0ee..0000000 --- a/config/initializers/devise_rails8_patch.rb +++ /dev/null @@ -1,11 +0,0 @@ -# See https://alvincrespo.hashnode.dev/rails-8s-lazy-route-loading-devise -# TODO remove when Devise is fixed -require 'devise' -Devise # make sure it's already loaded - -module Devise - def self.mappings - Rails.application.try(:reload_routes_unless_loaded) - @@mappings - end -end From 7a63c87b03c927d667b035181322afe0363c990c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 17:02:20 -0600 Subject: [PATCH 6/7] Fix deprecation warning --- app/models/lndhub_user.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/lndhub_user.rb b/app/models/lndhub_user.rb index 9fa899c..5f8226f 100644 --- a/app/models/lndhub_user.rb +++ b/app/models/lndhub_user.rb @@ -10,18 +10,18 @@ class LndhubUser < LndhubBase foreign_key: "login" def balance - accounts.current.first.ledgers.sum("account_ledgers.amount").to_i.abs + accounts.current.order(:id).first.ledgers.sum("account_ledgers.amount").to_i.abs end def sum_outgoing - accounts.outgoing.first.ledgers.sum("account_ledgers.amount").to_i.abs + accounts.outgoing.order(:id).first.ledgers.sum("account_ledgers.amount").to_i.abs end def sum_incoming - accounts.incoming.first.ledgers.sum("account_ledgers.amount").to_i.abs + accounts.incoming.order(:id).first.ledgers.sum("account_ledgers.amount").to_i.abs end def sum_fees - accounts.fees.first.ledgers.sum("account_ledgers.amount").to_i.abs + accounts.fees.order(:id).first.ledgers.sum("account_ledgers.amount").to_i.abs end end From 5ebf49609626a1082516bff33e3227ba54ad2548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Mon, 10 Aug 2026 17:02:37 -0600 Subject: [PATCH 7/7] Upgrade Rails to 8.1 --- Gemfile | 8 +- Gemfile.lock | 220 +++++++++++++++++++++--------------------- config/application.rb | 2 +- db/queue_schema.rb | 80 +++++++-------- db/schema.rb | 112 ++++++++++----------- 5 files changed, 213 insertions(+), 209 deletions(-) diff --git a/Gemfile b/Gemfile index 7a6cf1b..5ec961f 100644 --- a/Gemfile +++ b/Gemfile @@ -2,9 +2,9 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 8.0' +gem 'rails', '~> 8.1' # Use Puma as the app server -gem 'puma', '~> 6.6' +gem 'puma', '~> 8.0' # View components gem "view_component" # Asset bundler @@ -18,7 +18,7 @@ gem "turbo-rails" # Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] gem "stimulus-rails" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.7' +gem 'jbuilder', '~> 2.15' # Use Active Model has_secure_password gem 'bcrypt', '~> 3.1' @@ -73,7 +73,7 @@ end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. - gem 'web-console', '~> 4.2' + gem 'web-console', '~> 4.3' gem 'listen', '~> 3.2' gem 'letter_opener' gem 'letter_opener_web' diff --git a/Gemfile.lock b/Gemfile.lock index 3d3a017..07a76dc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,29 +3,31 @@ GEM specs: aasm (5.5.0) concurrent-ruby (~> 1.0) - actioncable (8.0.2) - actionpack (= 8.0.2) - activesupport (= 8.0.2) + action_text-trix (2.1.19) + railties + actioncable (8.1.3.1) + actionpack (= 8.1.3.1) + activesupport (= 8.1.3.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.2) - actionpack (= 8.0.2) - activejob (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + actionmailbox (8.1.3.1) + actionpack (= 8.1.3.1) + activejob (= 8.1.3.1) + activerecord (= 8.1.3.1) + activestorage (= 8.1.3.1) + activesupport (= 8.1.3.1) mail (>= 2.8.0) - actionmailer (8.0.2) - actionpack (= 8.0.2) - actionview (= 8.0.2) - activejob (= 8.0.2) - activesupport (= 8.0.2) + actionmailer (8.1.3.1) + actionpack (= 8.1.3.1) + actionview (= 8.1.3.1) + activejob (= 8.1.3.1) + activesupport (= 8.1.3.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.2) - actionview (= 8.0.2) - activesupport (= 8.0.2) + actionpack (8.1.3.1) + actionview (= 8.1.3.1) + activesupport (= 8.1.3.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -33,42 +35,43 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.2) - actionpack (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + actiontext (8.1.3.1) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.3.1) + activerecord (= 8.1.3.1) + activestorage (= 8.1.3.1) + activesupport (= 8.1.3.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.2) - activesupport (= 8.0.2) + actionview (8.1.3.1) + activesupport (= 8.1.3.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.2) - activesupport (= 8.0.2) + activejob (8.1.3.1) + activesupport (= 8.1.3.1) globalid (>= 0.3.6) - activemodel (8.0.2) - activesupport (= 8.0.2) - activerecord (8.0.2) - activemodel (= 8.0.2) - activesupport (= 8.0.2) + activemodel (8.1.3.1) + activesupport (= 8.1.3.1) + activerecord (8.1.3.1) + activemodel (= 8.1.3.1) + activesupport (= 8.1.3.1) timeout (>= 0.4.0) - activestorage (8.0.2) - actionpack (= 8.0.2) - activejob (= 8.0.2) - activerecord (= 8.0.2) - activesupport (= 8.0.2) + activestorage (8.1.3.1) + actionpack (= 8.1.3.1) + activejob (= 8.1.3.1) + activerecord (= 8.1.3.1) + activesupport (= 8.1.3.1) marcel (~> 1.0) - activesupport (8.0.2) + activesupport (8.1.3.1) base64 - benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json logger (>= 1.4.2) minitest (>= 5.1) securerandom (>= 0.3) @@ -118,7 +121,7 @@ GEM childprocess (5.1.0) logger (~> 1.5) chunky_png (1.4.0) - concurrent-ruby (1.3.4) + concurrent-ruby (1.3.8) connection_pool (3.0.2) crack (1.0.0) bigdecimal @@ -142,7 +145,7 @@ GEM devise_ldap_authenticatable (0.8.7) devise (>= 3.4.1) net-ldap (>= 0.16.0) - diff-lcs (1.6.1) + diff-lcs (1.6.2) discourse_api (2.0.1) faraday (~> 2.7) faraday-follow_redirects @@ -160,7 +163,7 @@ GEM ecdsa (~> 1.2.0) erb (6.0.7) erubi (1.13.1) - et-orbi (1.2.11) + et-orbi (1.4.1) tzinfo event_emitter (0.2.6) eventmachine (1.2.7) @@ -197,10 +200,10 @@ GEM rack-protection (>= 1.5.3, < 5.0.0) rack-session (>= 1.0.2, < 3.0.0) sanitize (< 8) - fugit (1.11.1) - et-orbi (~> 1, >= 1.2.11) + fugit (1.13.0) + et-orbi (~> 1.4) raabro (~> 1.4) - globalid (1.2.1) + globalid (1.4.0) activesupport (>= 6.1) gpgme (2.0.24) mini_portile2 (~> 2.7) @@ -210,7 +213,7 @@ GEM image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) - importmap-rails (2.1.0) + importmap-rails (2.2.3) actionpack (>= 6.0.0) activesupport (>= 6.0.0) railties (>= 6.0.0) @@ -221,11 +224,11 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) jaro_winkler (1.6.0) - jbuilder (2.13.0) - actionview (>= 5.0.0) - activesupport (>= 5.0.0) + jbuilder (2.15.1) + actionview (>= 7.0.0) + activesupport (>= 7.0.0) jmespath (1.6.2) - json (2.11.3) + json (2.21.2) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) @@ -252,7 +255,8 @@ GEM loofah (2.25.2) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.8.1) + mail (2.9.1) + logger mini_mime (>= 0.1.1) net-imap net-pop @@ -261,14 +265,15 @@ GEM faraday (~> 2.9.0) faraday-follow_redirects (= 0.3.0) nokogiri (~> 1.16.0) - marcel (1.0.4) + marcel (1.2.1) matrix (0.4.2) - method_source (1.1.0) mini_magick (4.13.2) mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (5.27.0) - mission_control-jobs (1.0.2) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + mission_control-jobs (1.1.0) actioncable (>= 7.1) actionpack (>= 7.1) activejob (>= 7.1) @@ -281,7 +286,7 @@ GEM multipart-post (2.4.1) net-http (0.6.0) uri - net-imap (0.5.7) + net-imap (0.6.6) date net-protocol net-ldap (0.19.0) @@ -291,7 +296,7 @@ GEM timeout net-smtp (0.5.1) net-protocol - nio4r (2.7.4) + nio4r (2.7.5) nokogiri (1.16.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -318,19 +323,18 @@ GEM pp (0.6.4) prettyprint prettyprint (0.2.0) - prism (1.4.0) - propshaft (1.1.0) + prism (1.9.0) + propshaft (1.3.2) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - railties (>= 7.0.0) psych (5.4.0) date stringio public_suffix (6.0.1) - puma (6.6.0) + puma (8.0.2) nio4r (~> 2.0) - raabro (1.4.0) + raabro (1.5.0) racc (1.8.1) rack (2.2.23) rack-protection (3.2.0) @@ -343,20 +347,20 @@ GEM rackup (1.0.1) rack (< 3) webrick - rails (8.0.2) - actioncable (= 8.0.2) - actionmailbox (= 8.0.2) - actionmailer (= 8.0.2) - actionpack (= 8.0.2) - actiontext (= 8.0.2) - actionview (= 8.0.2) - activejob (= 8.0.2) - activemodel (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + rails (8.1.3.1) + actioncable (= 8.1.3.1) + actionmailbox (= 8.1.3.1) + actionmailer (= 8.1.3.1) + actionpack (= 8.1.3.1) + actiontext (= 8.1.3.1) + actionview (= 8.1.3.1) + activejob (= 8.1.3.1) + activemodel (= 8.1.3.1) + activerecord (= 8.1.3.1) + activestorage (= 8.1.3.1) + activesupport (= 8.1.3.1) bundler (>= 1.15.0) - railties (= 8.0.2) + railties (= 8.1.3.1) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -371,13 +375,14 @@ GEM rails-settings-cached (2.8.3) activerecord (>= 5.0.0) railties (>= 5.0.0) - railties (8.0.2) - actionpack (= 8.0.2) - activesupport (= 8.0.2) + railties (8.1.3.1) + actionpack (= 8.1.3.1) + activesupport (= 8.1.3.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.4.2) @@ -407,23 +412,23 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 1.0) rqrcode_core (1.2.0) - rspec-core (3.13.3) + rspec-core (3.13.6) rspec-support (~> 3.13.0) - rspec-expectations (3.13.3) + rspec-expectations (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.2) + rspec-mocks (3.13.8) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (7.1.1) - actionpack (>= 7.0) - activesupport (>= 7.0) - railties (>= 7.0) - rspec-core (~> 3.13) - rspec-expectations (~> 3.13) - rspec-mocks (~> 3.13) - rspec-support (~> 3.13) - rspec-support (3.13.2) + rspec-rails (8.0.4) + actionpack (>= 7.2) + activesupport (>= 7.2) + railties (>= 7.2) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) + rspec-support (3.13.7) rubocop (1.75.3) json (~> 2.3) language_server-protocol (~> 3.17.0.2) @@ -471,13 +476,13 @@ GEM tilt (~> 2.0) yard (~> 0.9, >= 0.9.24) yard-solargraph (~> 0.1) - solid_queue (1.1.5) + solid_queue (1.6.0) activejob (>= 7.1) activerecord (>= 7.1) concurrent-ruby (>= 1.3.1) - fugit (~> 1.11.0) + fugit (~> 1.11) railties (>= 7.1) - thor (~> 1.3.1) + thor (>= 1.3.1) sqlite3 (2.6.0) mini_portile2 (~> 2.8.0) sqlite3 (2.6.0-arm64-darwin) @@ -485,11 +490,11 @@ GEM stimulus-rails (1.3.4) railties (>= 6.0.0) stringio (3.2.0) - thor (1.3.2) + thor (1.5.0) tilt (2.6.0) - timeout (0.4.3) + timeout (0.6.1) tsort (0.2.0) - turbo-rails (2.0.13) + turbo-rails (2.0.23) actionpack (>= 7.1.0) railties (>= 7.1.0) tzinfo (2.0.6) @@ -499,23 +504,22 @@ GEM unicode-emoji (4.0.4) uri (1.1.1) useragent (0.16.11) - view_component (3.22.0) - activesupport (>= 5.2.0, < 8.1) - concurrent-ruby (= 1.3.4) - method_source (~> 1.0) + view_component (4.12.0) + actionview (>= 7.1.0) + activesupport (>= 7.1.0) + concurrent-ruby (~> 1) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.1) - actionview (>= 6.0.0) - activemodel (>= 6.0.0) + web-console (4.3.0) + actionview (>= 8.0.0) bindex (>= 0.4.0) - railties (>= 6.0.0) + railties (>= 8.0.0) webmock (3.25.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.9.2) - websocket-driver (0.7.7) + websocket-driver (0.8.2) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -553,7 +557,7 @@ DEPENDENCIES gpgme (~> 2.0.24) image_processing (~> 1.12.2) importmap-rails - jbuilder (~> 2.7) + jbuilder (~> 2.15) kramdown letter_opener letter_opener_web @@ -566,8 +570,8 @@ DEPENDENCIES pagy (~> 6.0, >= 6.0.2) pg (~> 1.5) propshaft - puma (~> 6.6) - rails (~> 8.0) + puma (~> 8.0) + rails (~> 8.1) rails-controller-testing rails-settings-cached (~> 2.8.3) redis (~> 5.4) @@ -583,7 +587,7 @@ DEPENDENCIES tzinfo-data view_component warden - web-console (~> 4.2) + web-console (~> 4.3) webmock zbase32 (~> 0.1.1) diff --git a/config/application.rb b/config/application.rb index 023e0e8..944e021 100644 --- a/config/application.rb +++ b/config/application.rb @@ -21,7 +21,7 @@ Bundler.require(*Rails.groups) module Akkounts class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 8.0 + config.load_defaults 8.1 # Please, add to the `ignore` list any other `lib` subdirectories that do # not contain `.rb` files, or that should not be reloaded or eager loaded. diff --git a/db/queue_schema.rb b/db/queue_schema.rb index 4b2cdcd..f56798c 100644 --- a/db/queue_schema.rb +++ b/db/queue_schema.rb @@ -10,44 +10,44 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 1) do +ActiveRecord::Schema[8.1].define(version: 1) do 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.datetime "expires_at", null: false t.datetime "created_at", null: false + t.datetime "expires_at", null: false + t.bigint "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 ["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 create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.datetime "created_at", null: false t.bigint "job_id", null: false 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 ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" end 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.text "error" + t.bigint "job_id", null: false t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true end 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.datetime "scheduled_at" - t.datetime "finished_at" + t.text "arguments" + t.string "class_name", null: false t.string "concurrency_key" 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.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" @@ -57,76 +57,76 @@ ActiveRecord::Schema[8.0].define(version: 1) do end create_table "solid_queue_pauses", force: :cascade do |t| - t.string "queue_name", 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 end create_table "solid_queue_processes", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "hostname" t.string "kind", 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.datetime "created_at", 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 ["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 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.bigint "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 ["priority", "job_id"], name: "index_solid_queue_poll_all" t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" end 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.bigint "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 ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true end 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.string "queue_name" - t.integer "priority", default: 0 - t.boolean "static", default: true, null: false - t.text "description" + t.string "class_name" + t.string "command", limit: 2048 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.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static" end 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.bigint "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 ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" end 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 "expires_at", null: false + t.string "key", 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 ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true diff --git a/db/schema.rb b/db/schema.rb index 087e218..15e3cda 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,26 +10,26 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_05_28_092931) do +ActiveRecord::Schema[8.1].define(version: 2025_05_28_092931) do create_table "active_storage_attachments", force: :cascade do |t| - t.string "name", null: false - t.string "record_type", null: false - t.bigint "record_id", null: false t.bigint "blob_id", null: false t.datetime "created_at", null: false + t.string "name", null: false + t.bigint "record_id", null: false + t.string "record_type", null: false t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true end create_table "active_storage_blobs", force: :cascade do |t| - t.string "key", null: false - t.string "filename", null: false - t.string "content_type" - t.text "metadata" - t.string "service_name", null: false t.bigint "byte_size", null: false t.string "checksum" + t.string "content_type" t.datetime "created_at", null: false + t.string "filename", null: false + t.string "key", null: false + t.text "metadata" + t.string "service_name", null: false t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true end @@ -40,77 +40,77 @@ ActiveRecord::Schema[8.0].define(version: 2025_05_28_092931) do end create_table "app_catalog_web_apps", force: :cascade do |t| - t.string "url" - t.string "name" - t.text "metadata" t.datetime "created_at", null: false + t.text "metadata" + t.string "name" t.datetime "updated_at", null: false + t.string "url" end create_table "donations", force: :cascade do |t| - t.integer "user_id" t.integer "amount_sats" - t.integer "fiat_amount" - t.string "public_name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.datetime "paid_at", precision: nil - t.string "fiat_currency", default: "USD" - t.string "donation_method" - t.string "payment_method" t.string "btcpay_invoice_id" + t.datetime "created_at", null: false + t.string "donation_method" + t.integer "fiat_amount" + t.string "fiat_currency", default: "USD" + t.datetime "paid_at", precision: nil + t.string "payment_method" t.string "payment_status" + t.string "public_name" + t.datetime "updated_at", null: false + t.integer "user_id" t.index ["payment_status"], name: "index_donations_on_payment_status" t.index ["user_id"], name: "index_donations_on_user_id" end create_table "editable_contents", force: :cascade do |t| + t.text "content" t.string "context" + t.datetime "created_at", null: false t.string "key" t.string "lang", default: "en" - t.text "content" t.boolean "rich_text", default: false - t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "flipper_features", force: :cascade do |t| - t.string "key", null: false t.datetime "created_at", null: false + t.string "key", null: false t.datetime "updated_at", null: false t.index ["key"], name: "index_flipper_features_on_key", unique: true end create_table "flipper_gates", force: :cascade do |t| + t.datetime "created_at", null: false t.string "feature_key", null: false t.string "key", null: false - t.text "value" - t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.text "value" t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true end create_table "invitations", force: :cascade do |t| - t.string "token" - t.integer "user_id" - t.integer "invited_user_id" - t.datetime "used_at", precision: nil t.datetime "created_at", null: false + t.integer "invited_user_id" + t.string "token" t.datetime "updated_at", null: false + t.datetime "used_at", precision: nil + t.integer "user_id" t.index ["invited_user_id"], name: "index_invitations_on_invited_user_id" t.index ["user_id"], name: "index_invitations_on_user_id" end create_table "remote_storage_authorizations", force: :cascade do |t| - t.integer "user_id", null: false - t.string "token" - t.text "permissions", default: "--- []\n" - t.string "client_id" - t.string "redirect_uri" t.string "app_name" - t.datetime "expire_at" + t.string "client_id" t.datetime "created_at", null: false + t.datetime "expire_at" + t.text "permissions", default: "--- []\n" + t.string "redirect_uri" + t.string "token" t.datetime "updated_at", null: false + t.integer "user_id", null: false t.integer "web_app_id" t.index ["permissions"], name: "index_remote_storage_authorizations_on_permissions" t.index ["user_id"], name: "index_remote_storage_authorizations_on_user_id" @@ -118,45 +118,45 @@ ActiveRecord::Schema[8.0].define(version: 2025_05_28_092931) do end create_table "settings", force: :cascade do |t| - t.string "var", null: false - t.text "value" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.text "value" + t.string "var", null: false t.index ["var"], name: "index_settings_on_var", unique: true end create_table "users", force: :cascade do |t| t.string "cn" - t.string "ou" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "email", default: "", null: false - t.string "reset_password_token" - t.datetime "reset_password_sent_at", precision: nil + t.datetime "confirmation_sent_at", precision: nil t.string "confirmation_token" t.datetime "confirmed_at", precision: nil - t.datetime "confirmation_sent_at", precision: nil - t.string "unconfirmed_email" + t.datetime "created_at", null: false + t.string "email", default: "", null: false + t.text "lndhub_password" + t.string "lndhub_username" + t.bigint "mastodon_id" + t.string "ou" + t.string "pgp_fpr" + t.text "preferences" t.datetime "remember_created_at" t.string "remember_token" - t.text "preferences" - t.string "pgp_fpr" - t.string "lndhub_username" - t.text "lndhub_password" - t.bigint "mastodon_id" + t.datetime "reset_password_sent_at", precision: nil + t.string "reset_password_token" + t.string "unconfirmed_email" + t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end create_table "zaps", force: :cascade do |t| - t.integer "user_id", null: false - t.json "request" - t.json "receipt" - t.text "payment_request" t.bigint "amount" t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.text "payment_request" + t.json "receipt" + t.json "request" t.datetime "settled_at" + t.datetime "updated_at", null: false + t.integer "user_id", null: false t.index ["user_id"], name: "index_zaps_on_user_id" end