From f7bd62547e7ef993ec9229de5cf329eff3ee0c97 Mon Sep 17 00:00:00 2001 From: Luka Murn Date: Thu, 9 Feb 2017 14:33:12 +0100 Subject: [PATCH] Refactor teams settings into its own controllers --- .../{preferences.js => preferences/index.js} | 0 .../datatable.js} | 0 .../settings/{teams.js => teams/index.js} | 0 .../users/settings/{team.js => teams/show.js} | 0 .../users/settings/teams_controller.rb | 161 +++++++++ .../users/settings/user_teams_controller.rb | 156 +++++++++ app/controllers/users/settings_controller.rb | 310 +----------------- app/helpers/user_settings_helper.rb | 3 +- app/views/users/settings/_navigation.html.erb | 2 +- .../account/preferences/index.html.erb | 2 +- .../settings/teams/_breadcrumbs.html.erb | 6 +- .../{teams.html.erb => teams/index.html.erb} | 6 +- .../{new_team.html.erb => teams/new.html.erb} | 0 .../{team.html.erb => teams/show.html.erb} | 4 +- .../_destroy_user_team_modal.html.erb | 2 +- .../_destroy_user_team_modal_body.html.erb | 10 +- .../_leave_user_team_modal.html.erb | 2 +- .../_leave_user_team_modal_body.html.erb | 10 +- config/initializers/assets.rb | 8 +- config/locales/en.yml | 31 +- config/routes.rb | 68 ++-- 21 files changed, 397 insertions(+), 384 deletions(-) rename app/assets/javascripts/users/settings/account/{preferences.js => preferences/index.js} (100%) rename app/assets/javascripts/users/settings/{teams_datatable.js => teams/datatable.js} (100%) rename app/assets/javascripts/users/settings/{teams.js => teams/index.js} (100%) rename app/assets/javascripts/users/settings/{team.js => teams/show.js} (100%) create mode 100644 app/controllers/users/settings/teams_controller.rb create mode 100644 app/controllers/users/settings/user_teams_controller.rb rename app/views/users/settings/{teams.html.erb => teams/index.html.erb} (88%) rename app/views/users/settings/{new_team.html.erb => teams/new.html.erb} (100%) rename app/views/users/settings/{team.html.erb => teams/show.html.erb} (97%) rename app/views/users/settings/{teams => user_teams}/_destroy_user_team_modal.html.erb (88%) rename app/views/users/settings/{teams => user_teams}/_destroy_user_team_modal_body.html.erb (66%) rename app/views/users/settings/{teams => user_teams}/_leave_user_team_modal.html.erb (88%) rename app/views/users/settings/{teams => user_teams}/_leave_user_team_modal_body.html.erb (53%) diff --git a/app/assets/javascripts/users/settings/account/preferences.js b/app/assets/javascripts/users/settings/account/preferences/index.js similarity index 100% rename from app/assets/javascripts/users/settings/account/preferences.js rename to app/assets/javascripts/users/settings/account/preferences/index.js diff --git a/app/assets/javascripts/users/settings/teams_datatable.js b/app/assets/javascripts/users/settings/teams/datatable.js similarity index 100% rename from app/assets/javascripts/users/settings/teams_datatable.js rename to app/assets/javascripts/users/settings/teams/datatable.js diff --git a/app/assets/javascripts/users/settings/teams.js b/app/assets/javascripts/users/settings/teams/index.js similarity index 100% rename from app/assets/javascripts/users/settings/teams.js rename to app/assets/javascripts/users/settings/teams/index.js diff --git a/app/assets/javascripts/users/settings/team.js b/app/assets/javascripts/users/settings/teams/show.js similarity index 100% rename from app/assets/javascripts/users/settings/team.js rename to app/assets/javascripts/users/settings/teams/show.js diff --git a/app/controllers/users/settings/teams_controller.rb b/app/controllers/users/settings/teams_controller.rb new file mode 100644 index 000000000..18539e04b --- /dev/null +++ b/app/controllers/users/settings/teams_controller.rb @@ -0,0 +1,161 @@ +module Users + module Settings + class TeamsController < ApplicationController + before_action :load_user, only: [ + :index, + :datatable, + :new, + :create, + :show, + :users_datatable + ] + + before_action :load_team, only: [ + :show, + :users_datatable, + :name_html, + :description_html, + :update, + :destroy + ] + + def index + @user_teams = + @user + .user_teams + .includes(team: :users) + .order(created_at: :asc) + @member_of = @user_teams.count + end + + def datatable + respond_to do |format| + format.json do + render json: ::TeamsDatatable.new(view_context, @user) + end + end + end + + def new + @new_team = Team.new + end + + def create + @new_team = Team.new(create_params) + @new_team.created_by = @user + + if @new_team.save + # Okay, team is created, now + # add the current user as admin + UserTeam.create( + user: @user, + team: @new_team, + role: 2 + ) + + # Redirect to new team page + redirect_to action: :show, id: @new_team.id + else + render :new + end + end + + def show + @user_team = UserTeam.find_by(user: @user, team: @team) + end + + def users_datatable + respond_to do |format| + format.json do + render json: ::TeamUsersDatatable.new(view_context, @team, @user) + end + end + end + + def name_html + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: 'users/settings/teams/name_modal_body.html.erb', + locals: { team: @team } + ) + } + end + end + end + + def description_html + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: 'users/settings/teams/description_modal_body.html.erb', + locals: { team: @team } + ) + } + end + end + end + + def update + respond_to do |format| + if @team.update(update_params) + @team.update(last_modified_by: current_user) + format.json do + render json: { + status: :ok, + description_label: render_to_string( + partial: 'users/settings/teams/description_label.html.erb', + locals: { team: @team } + ) + } + end + else + format.json do + render json: @team.errors, + status: :unprocessable_entity + end + end + end + end + + def destroy + @team.destroy + + flash[:notice] = I18n.t( + 'users.settings.teams.edit.modal_destroy_team.flash_success', + team: @team.name + ) + + # Redirect back to all teams page + redirect_to action: :index + end + + private + + def load_user + @user = current_user + end + + def load_team + @team = Team.find_by_id(params[:id]) + render_403 unless is_admin_of_team(@team) + end + + def create_params + params.require(:team).permit( + :name, + :description + ) + end + + def update_params + params.require(:team).permit( + :name, + :description + ) + end + end + end +end diff --git a/app/controllers/users/settings/user_teams_controller.rb b/app/controllers/users/settings/user_teams_controller.rb new file mode 100644 index 000000000..03c8eb1f8 --- /dev/null +++ b/app/controllers/users/settings/user_teams_controller.rb @@ -0,0 +1,156 @@ +module Users + module Settings + class UserTeamsController < ApplicationController + before_action :load_user, only: :destroy + + before_action :load_user_team, only: [ + :update, + :leave_html, + :destroy_html, + :destroy + ] + + def update + respond_to do |format| + if @user_team.update(update_user_team_params) + format.json do + render json: { + status: :ok + } + end + else + format.json do + render json: @user_team.errors, + status: :unprocessable_entity + end + end + end + end + + def leave_html + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: + 'users/settings/user_teams/leave_user_team_modal_body.html.erb', + locals: { user_team: @user_team } + ), + heading: I18n.t( + 'users.settings.user_teams.leave_uo_heading', + team: escape_input(@user_team.team.name) + ) + } + end + end + end + + def destroy_html + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: 'users/settings/user_teams/' \ + 'destroy_user_team_modal_body.html.erb', + locals: { user_team: @user_team } + ), + heading: I18n.t( + 'users.settings.user_teams.destroy_uo_heading', + user: escape_input(@user_team.user.full_name), + team: escape_input(@user_team.team.name) + ) + } + end + end + end + + def destroy + respond_to do |format| + # If user is last administrator of team, + # he/she cannot be deleted from it. + invalid = + @user_team.admin? && + @user_team + .team + .user_teams + .where(role: 2) + .count <= 1 + + unless invalid + begin + UserTeam.transaction do + # If user leaves on his/her own accord, + # new owner for projects is the first + # administrator of team + if params[:leave] + new_owner = + @user_team + .team + .user_teams + .where(role: 2) + .where.not(id: @user_team.id) + .first + .user + else + # Otherwise, the new owner for projects is + # the current user (= an administrator removing + # the user from the team) + new_owner = current_user + end + reset_user_current_team(@user_team) + @user_team.destroy(new_owner) + end + rescue Exception + invalid = true + end + end + + if !invalid + if params[:leave] + flash[:notice] = I18n.t( + 'users.settings.user_teams.leave_flash', + team: @user_team.team.name + ) + flash.keep(:notice) + end + generate_notification(@user_team.user, + @user_team.user, + @user_team.team, + false, + false) + format.json { render json: { status: :ok } } + else + format.json do + render json: @user_team.errors, + status: :unprocessable_entity + end + end + end + end + + private + + def load_user + @user = current_user + end + + def load_user_team + @user_team = UserTeam.find_by_id(params[:id]) + @team = @user_team.team + # Don't allow the user to modify UserTeam-s if he's not admin, + # unless he/she is modifying his/her UserTeam + if current_user != @user_team.user && + !is_admin_of_team(@user_team.team) + render_403 + end + end + + def reset_user_current_team(user_team) + ids = user_team.user.teams_ids + ids -= [user_team.team.id] + user_team.user.current_team_id = ids.first + user_team.user.save + end + end + end +end diff --git a/app/controllers/users/settings_controller.rb b/app/controllers/users/settings_controller.rb index a76dd8e9b..00083b3ff 100644 --- a/app/controllers/users/settings_controller.rb +++ b/app/controllers/users/settings_controller.rb @@ -4,265 +4,9 @@ class Users::SettingsController < ApplicationController include InputSanitizeHelper before_action :load_user, only: [ - :teams, - :team, - :create_team, - :teams_datatable, - :team_users_datatable, - :user_current_team, - :destroy_user_team + :user_current_team ] - before_action :check_team_permission, only: [ - :team, - :update_team, - :destroy_team, - :team_name, - :team_description, - :team_users_datatable - ] - - before_action :check_user_team_permission, only: [ - :update_user_team, - :leave_user_team_html, - :destroy_user_team_html, - :destroy_user_team - ] - - def teams - @user_teams = - @user - .user_teams - .includes(team: :users) - .order(created_at: :asc) - @member_of = @user_teams.count - end - - def team - @user_team = UserTeam.find_by(user: @user, team: @team) - end - - def update_team - respond_to do |format| - if @team.update(update_team_params) - @team.update(last_modified_by: current_user) - format.json { - render json: { - status: :ok, - description_label: render_to_string( - partial: "users/settings/teams/description_label.html.erb", - locals: { team: @team } - ) - } - } - else - format.json { - render json: @team.errors, - status: :unprocessable_entity - } - end - end - end - - def team_name - respond_to do |format| - format.json { - render json: { - html: render_to_string({ - partial: "users/settings/teams/name_modal_body.html.erb", - locals: { team: @team } - }) - } - } - end - end - - def team_description - respond_to do |format| - format.json { - render json: { - html: render_to_string({ - partial: "users/settings/teams/description_modal_body.html.erb", - locals: { team: @team } - }) - } - } - end - end - - def teams_datatable - respond_to do |format| - format.json do - render json: ::TeamsDatatable.new(view_context, @user) - end - end - end - - def team_users_datatable - respond_to do |format| - format.json { - render json: ::TeamUsersDatatable.new(view_context, @team, @user) - } - end - end - - def new_team - @new_team = Team.new - end - - def create_team - @new_team = Team.new(create_team_params) - @new_team.created_by = @user - - if @new_team.save - # Okay, team is created, now - # add the current user as admin - UserTeam.create( - user: @user, - team: @new_team, - role: 2 - ) - - # Redirect to new team page - redirect_to action: :team, team_id: @new_team.id - else - render :new_team - end - end - - def destroy_team - @team.destroy - - flash[:notice] = I18n.t( - "users.settings.teams.edit.modal_destroy_team.flash_success", - team: @team.name - ) - - # Redirect back to all teams page - redirect_to action: :teams - end - - def update_user_team - respond_to do |format| - if @user_team.update(update_user_team_params) - format.json { - render json: { - status: :ok - } - } - else - format.json { - render json: @user_team.errors, - status: :unprocessable_entity - } - end - end - end - - def leave_user_team_html - respond_to do |format| - format.json do - render json: { - html: render_to_string( - partial: 'users/settings/teams/leave_user_team_modal_body.html.erb', - locals: { user_team: @user_team } - ), - heading: I18n.t( - 'users.settings.teams.index.leave_uo_heading', - team: escape_input(@user_team.team.name) - ) - } - end - end - end - - def destroy_user_team_html - respond_to do |format| - format.json do - render json: { - html: render_to_string( - partial: 'users/settings/teams/' \ - 'destroy_user_team_modal_body.html.erb', - locals: { user_team: @user_team } - ), - heading: I18n.t( - 'users.settings.teams.edit.destroy_uo_heading', - user: escape_input(@user_team.user.full_name), - team: escape_input(@user_team.team.name) - ) - } - end - end - end - - def destroy_user_team - respond_to do |format| - # If user is last administrator of team, - # he/she cannot be deleted from it. - invalid = - @user_team.admin? && - @user_team - .team - .user_teams - .where(role: 2) - .count <= 1 - - if !invalid then - begin - UserTeam.transaction do - # If user leaves on his/her own accord, - # new owner for projects is the first - # administrator of team - if params[:leave] - new_owner = - @user_team - .team - .user_teams - .where(role: 2) - .where.not(id: @user_team.id) - .first - .user - else - # Otherwise, the new owner for projects is - # the current user (= an administrator removing - # the user from the team) - new_owner = current_user - end - reset_user_current_team(@user_team) - @user_team.destroy(new_owner) - end - rescue Exception - invalid = true - end - end - - if !invalid - if params[:leave] then - flash[:notice] = I18n.t( - 'users.settings.teams.index.leave_flash', - team: @user_team.team.name - ) - flash.keep(:notice) - end - generate_notification(@user_team.user, - @user_team.user, - @user_team.team, - false, - false) - format.json { - render json: { - status: :ok - } - } - else - format.json { - render json: @user_team.errors, - status: :unprocessable_entity - } - end - end - end - def user_current_team team_id = params[:user][:current_team_id].to_i if @user.teams_ids.include?(team_id) @@ -284,56 +28,4 @@ class Users::SettingsController < ApplicationController def load_user @user = current_user end - - def check_team_permission - @team = Team.find_by_id(params[:team_id]) - unless is_admin_of_team(@team) - render_403 - end - end - - def check_user_team_permission - @user_team = UserTeam.find_by_id(params[:user_team_id]) - @team = @user_team.team - # Don't allow the user to modify UserTeam-s if he's not admin, - # unless he/she is modifying his/her UserTeam - if current_user != @user_team.user && - !is_admin_of_team(@user_team.team) - render_403 - end - end - - def create_team_params - params.require(:team).permit( - :name, - :description - ) - end - - def update_team_params - params.require(:team).permit( - :name, - :description - ) - end - - def create_user_params - params.require(:user).permit( - :full_name, - :email - ) - end - - def update_user_team_params - params.require(:user_team).permit( - :role - ) - end - - def reset_user_current_team(user_team) - ids = user_team.user.teams_ids - ids -= [user_team.team.id] - user_team.user.current_team_id = ids.first - user_team.user.save - end end diff --git a/app/helpers/user_settings_helper.rb b/app/helpers/user_settings_helper.rb index d1196a3c8..2de267709 100644 --- a/app/helpers/user_settings_helper.rb +++ b/app/helpers/user_settings_helper.rb @@ -13,6 +13,7 @@ module UserSettingsHelper end def on_settings_team_page? - action_name.in?(%w(teams team new_team create_team)) + controller_name == 'teams' && + action_name.in?(%w(index new create show)) end end diff --git a/app/views/users/settings/_navigation.html.erb b/app/views/users/settings/_navigation.html.erb index 7a3a91a87..a5f481cd3 100644 --- a/app/views/users/settings/_navigation.html.erb +++ b/app/views/users/settings/_navigation.html.erb @@ -1,7 +1,7 @@