summaryrefslogtreecommitdiff
path: root/app/services/protected_branches/base_service.rb
blob: bdd175e8552b736e356cab24996fb5b3ce66644d (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
module ProtectedBranches
  class BaseService < ::BaseService
    def initialize(project, current_user, params = {})
      super(project, current_user, params)
      @allowed_to_push = params[:allowed_to_push]
      @allowed_to_merge = params[:allowed_to_merge]
    end

    def set_access_levels!
      translate_api_params!
      set_merge_access_levels!
      set_push_access_levels!
    end

    private

    def set_merge_access_levels!
      case @allowed_to_merge
      when 'masters'
        @protected_branch.merge_access_level.masters!
      when 'developers'
        @protected_branch.merge_access_level.developers!
      end
    end

    def set_push_access_levels!
      case @allowed_to_push
      when 'masters'
        @protected_branch.push_access_level.masters!
      when 'developers'
        @protected_branch.push_access_level.developers!
      when 'no_one'
        @protected_branch.push_access_level.no_one!
      end
    end

    # The `branches` API still uses `developers_can_push` and `developers_can_merge`,
    # which need to be translated to `allowed_to_push` and `allowed_to_merge`,
    # respectively.
    def translate_api_params!
      @allowed_to_push ||=
        case to_boolean(params[:developers_can_push])
        when true
          'developers'
        when false
          'masters'
        end

      @allowed_to_merge ||=
        case to_boolean(params[:developers_can_merge])
        when true
          'developers'
        when false
          'masters'
        end
    end

    protected

    def to_boolean(value)
      return true if value =~ /^(true|t|yes|y|1|on)$/i
      return false if value =~ /^(false|f|no|n|0|off)$/i

      nil
    end
  end
end