You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
7.0 KiB
213 lines
7.0 KiB
class MergeRequestsController < ApplicationController |
|
before_action :find_resource, exclude: %i[create new] |
|
before_action :authenticate_user! |
|
before_action :authenticate_scope! |
|
before_action :set_organisations_answer_options, only: %i[merging_organisations absorbing_organisation update_merging_organisations remove_merging_organisation update] |
|
|
|
def absorbing_organisation; end |
|
def merge_date; end |
|
def existing_absorbing_organisation; end |
|
def helpdesk_ticket; end |
|
def merge_start_confirmation; end |
|
def user_outcomes; end |
|
def relationship_outcomes; end |
|
def scheme_outcomes; end |
|
def logs_outcomes; end |
|
|
|
def create |
|
ActiveRecord::Base.transaction do |
|
@merge_request = MergeRequest.create!(merge_request_params.merge(status: :incomplete, requester: current_user)) |
|
end |
|
redirect_to absorbing_organisation_merge_request_path(@merge_request) |
|
rescue ActiveRecord::RecordInvalid |
|
render_not_found |
|
end |
|
|
|
def update |
|
validate_response |
|
|
|
if @merge_request.errors.blank? && @merge_request.update(merge_request_params) |
|
add_merging_organsations if page == "merging_organisations" |
|
remove_absorbing_org_from_merging_organisations if page == "absorbing_organisation" && @merge_request.absorbing_organisation_id.present? |
|
|
|
redirect_to next_page_path |
|
else |
|
render previous_template, status: :unprocessable_entity |
|
end |
|
end |
|
|
|
def update_merging_organisations |
|
@new_merging_org_ids = params["merge_request"]["new_merging_org_ids"].split(" ") |
|
merge_request_organisation = MergeRequestOrganisation.new(merge_request_organisation_params) |
|
if merge_request_organisation.valid? |
|
@new_merging_org_ids.push(merge_request_organisation_params[:merging_organisation_id]) |
|
render :merging_organisations |
|
else |
|
render :merging_organisations, status: :unprocessable_entity |
|
end |
|
end |
|
|
|
def remove_merging_organisation |
|
@new_merging_org_ids = params["merge_request"]["new_merging_org_ids"] || [] |
|
org_id_to_remove = merge_request_organisation_params[:merging_organisation_id] |
|
@new_merging_org_ids.delete(org_id_to_remove) |
|
MergeRequestOrganisation.find_by(merge_request_organisation_params)&.destroy! |
|
render :merging_organisations |
|
end |
|
|
|
def delete |
|
@merge_request.discard! |
|
flash[:notice] = "The merge request has been deleted." |
|
redirect_to organisations_path(tab: "merge-requests") |
|
end |
|
|
|
def merging_organisations |
|
@new_merging_org_ids = [] |
|
end |
|
|
|
def start_merge |
|
if @merge_request.status == "ready_to_merge" |
|
@merge_request.start_merge! |
|
ProcessMergeRequestJob.perform_later(merge_request: @merge_request) |
|
end |
|
|
|
redirect_to merge_request_path(@merge_request) |
|
end |
|
|
|
private |
|
|
|
def page |
|
params.dig(:merge_request, :page) |
|
end |
|
|
|
def next_page_path |
|
return merge_request_path if is_referrer_type?("check_answers") |
|
|
|
case page |
|
when "absorbing_organisation" |
|
merging_organisations_merge_request_path(@merge_request) |
|
when "merging_organisations" |
|
merge_date_merge_request_path(@merge_request) |
|
when "merge_date" |
|
existing_absorbing_organisation_merge_request_path(@merge_request) |
|
when "existing_absorbing_organisation" |
|
helpdesk_ticket_merge_request_path(@merge_request) |
|
when "helpdesk_ticket" |
|
merge_request_path(@merge_request) |
|
end |
|
end |
|
|
|
def previous_template |
|
page |
|
end |
|
|
|
def set_organisations_answer_options |
|
answer_options = { "" => "Select an option" } |
|
|
|
if current_user.support? |
|
Organisation.all.pluck(:id, :name).each do |organisation| |
|
answer_options[organisation[0]] = organisation[1] |
|
end |
|
end |
|
|
|
@answer_options = answer_options |
|
end |
|
|
|
def merge_request_params |
|
merge_params = params.fetch(:merge_request, {}).permit( |
|
:requesting_organisation_id, |
|
:has_helpdesk_ticket, |
|
:helpdesk_ticket, |
|
:status, |
|
:absorbing_organisation_id, |
|
:merge_date, |
|
:existing_absorbing_organisation, |
|
) |
|
|
|
merge_params[:requesting_organisation_id] = current_user.organisation.id |
|
merge_params[:helpdesk_ticket] = nil if merge_params[:has_helpdesk_ticket] == "false" |
|
|
|
merge_params |
|
end |
|
|
|
def validate_response |
|
case page |
|
when "absorbing_organisation" |
|
if merge_request_params[:absorbing_organisation_id].blank? |
|
@merge_request.errors.add(:absorbing_organisation_id, :blank) |
|
end |
|
when "merge_date" |
|
day = merge_request_params["merge_date(3i)"] |
|
month = merge_request_params["merge_date(2i)"] |
|
year = merge_request_params["merge_date(1i)"] |
|
|
|
return @merge_request.errors.add(:merge_date, :blank) if [day, month, year].all?(&:blank?) |
|
|
|
if [day, month, year].none?(&:blank?) && Date.valid_date?(year.to_i, month.to_i, day.to_i) |
|
merge_request_params["merge_date"] = Time.zone.local(year.to_i, month.to_i, day.to_i) |
|
@merge_request.errors.add(:merge_date, :more_than_year_from_today) if Time.zone.local(year.to_i, month.to_i, day.to_i) - 1.year > Time.zone.today |
|
else |
|
@merge_request.errors.add(:merge_date, :invalid) |
|
end |
|
when "existing_absorbing_organisation" |
|
if merge_request_params[:existing_absorbing_organisation].nil? |
|
@merge_request.errors.add(:existing_absorbing_organisation, :blank) |
|
end |
|
when "helpdesk_ticket" |
|
@merge_request.has_helpdesk_ticket = merge_request_params[:has_helpdesk_ticket] |
|
@merge_request.helpdesk_ticket = merge_request_params[:helpdesk_ticket] |
|
if merge_request_params[:has_helpdesk_ticket].blank? |
|
@merge_request.errors.add(:has_helpdesk_ticket, :blank) |
|
elsif merge_request_params[:has_helpdesk_ticket] == "true" && merge_request_params[:helpdesk_ticket].blank? |
|
@merge_request.errors.add(:helpdesk_ticket, :blank) |
|
end |
|
end |
|
end |
|
|
|
def merge_request_organisation_params |
|
{ |
|
merge_request: @merge_request, |
|
merging_organisation_id: params.dig(:merge_request, :merging_organisation), |
|
} |
|
end |
|
|
|
def find_resource |
|
return if params[:id].blank? |
|
|
|
@merge_request = MergeRequest.find(params[:id]) |
|
end |
|
|
|
def authenticate_scope! |
|
unless current_user.support? |
|
render_not_found |
|
end |
|
end |
|
|
|
def is_referrer_type?(referrer_type) |
|
from_referrer_query("referrer") == referrer_type |
|
end |
|
|
|
def from_referrer_query(query_param) |
|
referrer = request.headers["HTTP_REFERER"] |
|
return unless referrer |
|
|
|
query_params = URI.parse(referrer).query |
|
return unless query_params |
|
|
|
parsed_params = CGI.parse(query_params) |
|
parsed_params[query_param]&.first |
|
end |
|
|
|
def add_merging_organsations |
|
new_merging_org_ids = params["merge_request"]["new_merging_org_ids"].split(" ") |
|
new_merging_org_ids.each do |org_id| |
|
MergeRequestOrganisation.create!(merge_request: @merge_request, merging_organisation_id: org_id) |
|
end |
|
end |
|
|
|
def remove_absorbing_org_from_merging_organisations |
|
if @merge_request.merge_request_organisations.where(merging_organisation_id: @merge_request.absorbing_organisation_id).exists? |
|
MergeRequestOrganisation.find_by(merge_request: @merge_request, merging_organisation_id: @merge_request.absorbing_organisation_id).destroy! |
|
end |
|
end |
|
end
|
|
|