docbrown/app/controllers/organizations_controller.rb
Joshua Wehner 6fe9d7d7a6
Allow org admins to add members as co-authors (#20008)
* Basics might be working?

* Stop propagating button clicks in autocomplete pills

* Better blank slate

* Better location to stop propagation

* Remove author_id from org co-authors

* Move UserStore and try testing it

* Remove extraneous comments

* OH... that's what that does!

* Very basic testing

* Re-organize javascripts

* Rename & re-org for testing

* Cleanup

* More tests

* Remove unnecessary nesting

* Coninuing to try to bump coverage

* Include /packs/ in code coverage metric

* Try tweaking jest coverage more?

We probably can't collect coverage from all of packs/* (because coverage is too low) but maybe we can try to opt-in for newer areas as we go?

* Relocate JS tests, for build & coverage

* User ID exception on search, not fetch

* Remove commented-out console.log

---------

Co-authored-by: Mac Siri <krairit.siri@gmail.com>
2023-09-15 08:12:41 -04:00

160 lines
4.2 KiB
Ruby

class OrganizationsController < ApplicationController
after_action :verify_authorized
skip_after_action :verify_authorized, only: :members
ORGANIZATIONS_PERMITTED_PARAMS = %i[
id
name
summary
tag_line
slug
url
proof
profile_image
location
company_size
tech_stack
email
story
bg_color_hex
text_color_hex
twitter_username
github_username
cta_button_text
cta_button_url
cta_body_markdown
].freeze
def create
rate_limit!(:organization_creation)
@tab = "organization"
@user = current_user
unless valid_image?
render template: "users/edit"
return
end
@organization = Organization.new(organization_params)
authorize @organization
if @organization.save
rate_limiter.track_limit_by_action(:organization_creation)
@organization_membership = OrganizationMembership.create!(organization_id: @organization.id,
user_id: current_user.id, type_of_user: "admin")
flash[:settings_notice] = I18n.t("organizations_controller.created")
redirect_to "/settings/organization/#{@organization.id}"
else
render template: "users/edit"
end
end
def update
@user = current_user
@tab = "organization"
set_organization
unless valid_image?
render template: "users/edit"
return
end
if @organization.update(organization_params.merge(profile_updated_at: Time.current))
@organization.users.touch_all(:organization_info_updated_at)
flash[:settings_notice] = I18n.t("organizations_controller.updated")
redirect_to "/settings/organization"
else
@org_organization_memberships = @organization.organization_memberships.includes(:user)
@organization_membership = OrganizationMembership.find_by(user_id: current_user.id,
organization_id: @organization.id)
render template: "users/edit"
end
end
def destroy
organization = Organization.find_by(id: params[:id])
authorize organization
Organizations::DeleteWorker.perform_async(organization.id, current_user.id, true)
flash[:settings_notice] =
I18n.t("organizations_controller.deletion_scheduled", organization_name: organization.name)
redirect_to user_settings_path(:organization)
rescue Pundit::NotAuthorizedError
flash[:error] = I18n.t("organizations_controller.not_deleted")
redirect_to user_settings_path(:organization, id: organization.id)
end
def generate_new_secret
set_organization
@organization.secret = @organization.generated_random_secret
@organization.save
flash[:settings_notice] = I18n.t("organizations_controller.secret_updated")
redirect_to user_settings_path(:organization)
end
def members
@organization = Organization.find_by(slug: params[:slug])
@members = @organization.users
respond_to do |format|
format.json { render json: @members.to_json(only: %i[id name username]) }
format.html
end
end
private
def permitted_params
ORGANIZATIONS_PERMITTED_PARAMS
end
def organization_params
params.require(:organization).permit(permitted_params)
.transform_values do |value|
if value.instance_of?(String)
ActionController::Base.helpers.strip_tags(value)
else
value
end
end
end
def set_organization
@organization = Organization.find_by(id: organization_params[:id])
not_found unless @organization
authorize @organization
end
def valid_image?
image = params.dig("organization", "profile_image")
return true unless image
if action_name == "create"
@organization = Organization.new(organization_params.except(:profile_image))
authorize @organization
end
return true if valid_image_file?(image) && valid_filename?(image)
false
end
def valid_image_file?(image)
return true if file?(image)
@organization.errors.add(:profile_image, is_not_file_message)
false
end
def valid_filename?(image)
return true unless long_filename?(image)
@organization.errors.add(:profile_image, filename_too_long_message)
false
end
end