From 7904616caf82dd68ed75e0e867f2e82b403f15ad Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Fri, 10 Oct 2025 22:33:27 +0200 Subject: [PATCH] Make Alchemy's signup page work with Solidus' user controller Solidus ships an admin users controller within the core backend distribution, while Alchemy does this within the auth extension `alchemy-devise`. So when using `alchemy-devise` with `solidus-backend`, Solidus` admin users controller takes over, and we need to make sure our non-users has the right abilites to create a first admin user, and that that admin user then has admin rights, too. --- .../spree_admin_users_controller_patch.rb | 24 +++++++++++++++++++ .../solidus/alchemy_devise_ability_patch.rb | 22 +++++++++++++++++ config/initializers/spree.rb | 1 + lib/alchemy/solidus/engine.rb | 3 +++ 4 files changed, 50 insertions(+) create mode 100644 app/patches/controllers/alchemy/solidus/spree_admin_users_controller_patch.rb create mode 100644 app/patches/models/alchemy/solidus/alchemy_devise_ability_patch.rb diff --git a/app/patches/controllers/alchemy/solidus/spree_admin_users_controller_patch.rb b/app/patches/controllers/alchemy/solidus/spree_admin_users_controller_patch.rb new file mode 100644 index 00000000..834fd933 --- /dev/null +++ b/app/patches/controllers/alchemy/solidus/spree_admin_users_controller_patch.rb @@ -0,0 +1,24 @@ +# /home/anselm/code/alchemy-solidus/app/patches/controllers/alchemy/solidus/spree_admin_users_controller_patch.rb + +module Alchemy + module Solidus + module SpreeAdminUsersControllerPatch + def self.prepended(base) + base.after_action :assign_admin_roles_to_first_user, only: :create + end + + private + + def assign_admin_roles_to_first_user + if Spree.user_class.count == 1 + user = Spree.user_class.last + user.spree_roles = [Spree::Role.find_or_create_by(name: "admin")] + user.alchemy_roles = ["admin"] + user.save + end + end + end + end +end + +::Spree::Admin::UsersController.prepend(Alchemy::Solidus::SpreeAdminUsersControllerPatch) diff --git a/app/patches/models/alchemy/solidus/alchemy_devise_ability_patch.rb b/app/patches/models/alchemy/solidus/alchemy_devise_ability_patch.rb new file mode 100644 index 00000000..4e9fea37 --- /dev/null +++ b/app/patches/models/alchemy/solidus/alchemy_devise_ability_patch.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Alchemy + module Solidus + module AlchemyDeviseAbilityPatch + def initialize(user) + super + + # Without these abilities, Alchemy's signup page does not work with Solidus' UsersController. + if Alchemy::User.count == 0 + can :admin, Alchemy::User + can :update_password, Alchemy::User + can :update_email, Alchemy::User + end + end + + if defined?(::Alchemy::Devise::Ability) + ::Alchemy::Devise::Ability.prepend self + end + end + end +end diff --git a/config/initializers/spree.rb b/config/initializers/spree.rb index 02018905..13e026b8 100644 --- a/config/initializers/spree.rb +++ b/config/initializers/spree.rb @@ -1,5 +1,6 @@ if defined?(Alchemy::Devise::Engine) Spree.user_class = "Alchemy::User" + Spree::PermittedAttributes.user_attributes << :login end Rails.application.config.after_initialize do diff --git a/lib/alchemy/solidus/engine.rb b/lib/alchemy/solidus/engine.rb index 76c2812d..64e31aa8 100644 --- a/lib/alchemy/solidus/engine.rb +++ b/lib/alchemy/solidus/engine.rb @@ -32,6 +32,9 @@ class Engine < ::Rails::Engine config.to_prepare do Alchemy.register_ability ::Spree::Ability ::Spree::Ability.register_ability ::Alchemy::Permissions + Alchemy.registered_abilities.reject { _1 == Spree::Ability }.each do |ability| + ::Spree::Ability.register_ability ability + end if SolidusSupport.frontend_available? # Allows to render Alchemy content within Solidus' controller views