summaryrefslogtreecommitdiff
path: root/app/models/project_services/buildbox_service.rb
blob: b0f8e28c97f06d0a7be7554954f66d603c887514 (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# == Schema Information
#
# Table name: services
#
#  id         :integer          not null, primary key
#  type       :string(255)
#  title      :string(255)
#  project_id :integer          not null
#  created_at :datetime
#  updated_at :datetime
#  active     :boolean          default(FALSE), not null
#  properties :text
#

class BuildboxService < CiService
  prop_accessor :project_url, :token

  validates :project_url, presence: true, if: :activated?
  validates :token, presence: true, if: :activated?

  after_save :compose_service_hook, if: :activated?

  def webhook_url
    "#{buildbox_endpoint('webhook')}/deliver/#{webhook_token}"
  end

  def compose_service_hook
    hook = service_hook || build_service_hook
    hook.url = webhook_url
    hook.save
  end

  def execute(data)
    service_hook.execute(data)
  end

  def commit_status(sha)
    response = HTTParty.get(commit_status_path(sha), verify: false)

    if response.code == 200 && response['status']
      response['status']
    else
      :error
    end
  end

  def commit_status_path(sha)
    "#{buildbox_endpoint('gitlab')}/status/#{status_token}.json?commit=#{sha}"
  end

  def build_page(sha)
    "#{project_url}/builds?commit=#{sha}"
  end

  def builds_path
    "#{project_url}/builds?branch=#{project.default_branch}"
  end

  def status_img_path
    "#{buildbox_endpoint('badge')}/#{status_token}.svg"
  end

  def title
    'Buildbox'
  end

  def description
    'Continuous integration and deployments'
  end

  def to_param
    'buildbox'
  end

  def fields
    [
      { type: 'text',
        name: 'token',
        placeholder: 'Buildbox project GitLab token' },

      { type: 'text',
        name: 'project_url',
        placeholder: 'https://buildbox.io/example/project' }
    ]
  end

  private

  def webhook_token
    token_parts.first
  end

  def status_token
    token_parts.second
  end

  def token_parts
    if token.present?
      token.split(':')
    else
      []
    end
  end

  def buildbox_endpoint(subdomain = nil)
    endpoint = 'https://buildbox.io'

    if subdomain.present?
      uri = Addressable::URI.parse(endpoint)
      new_endpoint = "#{uri.scheme || 'http'}://#{subdomain}.#{uri.host}"

      if uri.port.present?
        "#{new_endpoint}:#{uri.port}"
      else
        new_endpoint
      end
    else
      endpoint
    end
  end
end