From b2d948594aa4026eab0cb55b615c4be852773b1b Mon Sep 17 00:00:00 2001 From: Jeffrey Hardy Date: Wed, 18 Sep 2024 17:25:09 -0400 Subject: [PATCH] Extract Project::Accessible --- .../projects/accesses_controller.rb | 10 ++++---- app/models/project.rb | 9 ++------ app/models/project/accessible.rb | 23 +++++++++++++++++++ 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 app/models/project/accessible.rb diff --git a/app/controllers/projects/accesses_controller.rb b/app/controllers/projects/accesses_controller.rb index fed94ea59..19d43b778 100644 --- a/app/controllers/projects/accesses_controller.rb +++ b/app/controllers/projects/accesses_controller.rb @@ -6,14 +6,12 @@ class Projects::AccessesController < ApplicationController end def update - update_access - redirect_to project_access_url(@project) + @project.update_access [ Current.user, *find_users ] + redirect_to edit_project_access_url(@project) end private - def update_access - users = Current.account.users.active.find([ Current.user.id, *params[:user_ids] ]) - users.each { |user| @project.accesses.create_or_find_by!(user: user) } - @project.accesses.where.not(user: users).destroy_all + def find_users + Current.account.users.active.where(id: params[:user_ids]) end end diff --git a/app/models/project.rb b/app/models/project.rb index deb6b4d31..dc90aa588 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,13 +1,8 @@ class Project < ApplicationRecord + include Accessible + belongs_to :account belongs_to :creator, class_name: "User", default: -> { Current.user } - has_many :accesses, dependent: :destroy - has_many :users, through: :accesses - has_many :bubbles, dependent: :destroy - - after_create do - accesses.create!(user: creator) - end end diff --git a/app/models/project/accessible.rb b/app/models/project/accessible.rb new file mode 100644 index 000000000..394edae35 --- /dev/null +++ b/app/models/project/accessible.rb @@ -0,0 +1,23 @@ +module Project::Accessible + extend ActiveSupport::Concern + + included do + has_many :accesses, dependent: :destroy + has_many :users, through: :accesses + + after_create -> { grant_access(creator) } + end + + def update_access(users) + transaction do + grant_access(users) + accesses.where.not(user: Array(users)).delete_all + end + end + + def grant_access(users) + Array(users).each do |user| + accesses.create_or_find_by!(user: user) + end + end +end