summaryrefslogtreecommitdiff
path: root/app/services/static_site_editor/config_service.rb
blob: 987ee07197646dd8cea9db9c654b2d9544562392 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true

module StaticSiteEditor
  class ConfigService < ::BaseContainerService
    ValidationError = Class.new(StandardError)

    def execute
      @project = container
      check_access!

      ServiceResponse.success(payload: data)
    rescue ValidationError => e
      ServiceResponse.error(message: e.message)
    end

    private

    attr_reader :project

    def check_access!
      unless can?(current_user, :download_code, project)
        raise ValidationError, 'Insufficient permissions to read configuration'
      end
    end

    def data
      check_for_duplicate_keys!
      generated_data.merge(file_data)
    end

    def generated_data
      @generated_data ||= Gitlab::StaticSiteEditor::Config::GeneratedConfig.new(
        project.repository,
        params.fetch(:ref),
        params.fetch(:path),
        params[:return_url]
      ).data
    end

    def file_data
      @file_data ||= Gitlab::StaticSiteEditor::Config::FileConfig.new.data
    end

    def check_for_duplicate_keys!
      duplicate_keys = generated_data.keys & file_data.keys
      raise ValidationError.new("Duplicate key(s) '#{duplicate_keys}' found.") if duplicate_keys.present?
    end
  end
end