Read about our upcoming Code of Conduct on this issue

This instance was upgraded to Heptapod 0.28.0 today

fogbugz_controller.rb 2.64 KB
Newer Older
Jared Szechy's avatar
Jared Szechy committed
1
2
3
4
5
6
7
8
9
10
11
12
13
class Import::FogbugzController < Import::BaseController
  before_action :verify_fogbugz_import_enabled
  before_action :user_map, only: [:new_user_map, :create_user_map]

  rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized

  def new
  end

  def callback
    begin
      res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys)
    rescue
14
15
      # If the URI is invalid various errors can occur
      return redirect_to new_import_fogbugz_path, alert: 'Could not connect to FogBugz, check your URL'
Jared Szechy's avatar
Jared Szechy committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    end
    session[:fogbugz_token] = res.get_token
    session[:fogbugz_uri] = params[:uri]

    redirect_to new_user_map_import_fogbugz_path
  end

  def new_user_map
  end

  def create_user_map
    user_map = params[:users]

    unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? }
      flash.now[:alert] = 'All users must have a name.'

Douwe Maan's avatar
Douwe Maan committed
32
      return render 'new_user_map'
Jared Szechy's avatar
Jared Szechy committed
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    end

    session[:fogbugz_user_map] = user_map

    flash[:notice] = 'The user map has been saved. Continue by selecting the projects you want to import.'

    redirect_to status_import_fogbugz_path
  end

  def status
    unless client.valid?
      return redirect_to new_import_fogbugz_path
    end

    @repos = client.repos

49
    @already_added_projects = find_already_added_projects('fogbugz')
Jared Szechy's avatar
Jared Szechy committed
50
51
52
53
54
55
    already_added_projects_names = @already_added_projects.pluck(:import_source)

    @repos.reject! { |repo| already_added_projects_names.include? repo.name }
  end

  def jobs
56
    render json: find_jobs('fogbugz')
Jared Szechy's avatar
Jared Szechy committed
57
58
59
  end

  def create
60
    repo = client.repo(params[:repo_id])
Jared Szechy's avatar
Jared Szechy committed
61
62
63
    fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] }
    umap = session[:fogbugz_user_map] || client.user_map

64
65
66
67
68
69
70
    project = Gitlab::FogbugzImport::ProjectCreator.new(repo, fb_session, current_user.namespace, current_user, umap).execute

    if project.persisted?
      render json: ProjectSerializer.new.represent(project)
    else
      render json: { errors: project.errors.full_messages }, status: :unprocessable_entity
    end
Jared Szechy's avatar
Jared Szechy committed
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  end

  private

  def client
    @client ||= Gitlab::FogbugzImport::Client.new(token: session[:fogbugz_token], uri: session[:fogbugz_uri])
  end

  def user_map
    @user_map ||= begin
      user_map = client.user_map

      stored_user_map = session[:fogbugz_user_map]
      user_map.update(stored_user_map) if stored_user_map

      user_map
    end
  end

  def fogbugz_unauthorized(exception)
91
    redirect_to new_import_fogbugz_path, alert: exception.message
Jared Szechy's avatar
Jared Szechy committed
92
93
94
95
96
97
98
  end

  def import_params
    params.permit(:uri, :email, :password)
  end

  def verify_fogbugz_import_enabled
99
    render_404 unless fogbugz_import_enabled?
Jared Szechy's avatar
Jared Szechy committed
100
101
  end
end