class SchoolsController < ApplicationController before_action :authenticate_user! before_action :set_discord_roles, only: %i[ discord_configuration discord_server_roles discord_sync_roles ] layout "school" # Enforce authorization with Pundit in all school administration routes. after_action :verify_authorized # GET /school/customize def customize authorize current_school end # POST /school/images def images authorize current_school form = Schools::ImagesForm.new(current_school) if form.validate(params) form.save image_details = Schools::CustomizePresenter.new(view_context).school_images image_details[:error] = nil render json: image_details else render json: { error: form.errors.full_messages.join(", ") } end end # GET /school/admins def admins authorize current_school end # GET /school/standing def standing authorize current_school @presenter = Schools::StandingPresenter.new(view_context, current_school) end # PATCH /school/toggle_standing def toggle_standing authorize current_school standing_enabled = params[:enable_standing] == "true" Standing.transaction do current_school.update!( configuration: current_school.configuration.merge( "enable_standing" => standing_enabled ) ) if standing_enabled && !current_school.standings.exists? Standing.create!( name: I18n.t("schools.standing.toggle_standing.default_standing_name"), color: "#4338ca", description: I18n.t( "schools.standing.toggle_standing.default_standing_description" ), school: current_school, default: true ) end end flash[:success] = I18n.t( "schools.standing.toggle_standing.school_standing_toggle_success.#{standing_enabled == true ? "_yes" : "_no"}" ) redirect_to standing_school_path end # GET /school/code_of_conduct def code_of_conduct authorize current_school @code_of_conduct = SchoolString::CodeOfConduct.for(current_school) end # PATCH /school/code_of_conduct def update_code_of_conduct authorize current_school value = params[:code_of_conduct_editor].strip school_string = current_school.school_strings.find_by(key: "code_of_conduct") if school_string.present? && value.present? school_string.update!(value: value) elsif value.present? current_school.school_strings.create!( key: "code_of_conduct", value: value ) else school_string&.destroy end flash[:success] = I18n.t("schools.standing.save_coc_success") redirect_to standing_school_path end # GET /school/discord def discord_configuration authorize current_school end # GET /school/discord_server_roles def discord_server_roles authorize current_school end # PATCH /school/discord_credentials def discord_credentials authorize current_school form = Schools::DiscordConfigurationForm.new(Reform::OpenForm.new) form.current_school = current_school if form.validate(params) form.save flash[:success] = t(".discord_config_stored") else flash[:error] = form.errors.full_messages.join(", ") end redirect_to discord_configuration_school_path end # POST /school/discord_sync_roles def discord_sync_roles authorize current_school @sync_service = Discord::SyncRolesService.new(school: current_school) if @sync_service.deleted_roles? && params[:confirmed].blank? flash.now[:warn] = t(".sync_service_result.warn") return else @sync_service.save flash[:success] = t(".sync_service_result.success") end redirect_to discord_server_roles_school_path rescue Discord::SyncRolesService::SyncError flash[:error] = t(".sync_service_result.warn") redirect_to discord_server_roles_school_path end # POST /school/update_default_discord_roles def update_default_discord_roles authorize current_school roles = current_school.discord_roles roles.where(id: params[:default_role_ids]).update_all(default: true) # rubocop:disable Rails/SkipsModelValidations roles .where.not(id: params[:default_role_ids]) .where(default: true) .update_all(default: false) # rubocop:disable Rails/SkipsModelValidations flash[:success] = t(".updated_default_roles") redirect_to discord_server_roles_school_path end # GET /school/ def school_router authorize current_school render html: "", layout: "school_router" end private def set_discord_roles @discord_config = Schools::Configuration::Discord.new(current_school) @discord_roles = transform_discord_roles @school_logo_url = if current_school.icon_on_light_bg.attached? view_context.rails_public_blob_url(current_school.icon_variant(:thumb)) else "/favicon.png" end end def transform_discord_roles db_roles = current_school.discord_roles.includes(:users).order(position: :desc) default_role_ids = current_school.default_discord_role_ids || [] db_roles.map do |role| OpenStruct.new( { id: role.id, name: role.name, color_hex: role.color_hex, is_default: role.discord_id.in?(default_role_ids), member_count: role.users.size } ) end end end