app.rb
3.09 KB
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
class App
include Mongoid::Document
include Mongoid::Timestamps
field :name, :type => String
field :api_key
field :github_url
field :resolve_errs_on_deploy, :type => Boolean, :default => false
field :notify_all_users, :type => Boolean, :default => false
field :notify_on_errs, :type => Boolean, :default => true
field :notify_on_deploys, :type => Boolean, :default => true
field :email_at_notices, :type => Array, :default => Errbit::Config.email_at_notices
# Some legacy apps may have sting as key instead of BSON::ObjectID
identity :type => String
# There seems to be a Mongoid bug making it impossible to use String identity with references_many feature:
# https://github.com/mongoid/mongoid/issues/703
# Using 32 character string as a workaround.
before_create do |r|
r.id = ActiveSupport::SecureRandom.hex
end
embeds_many :watchers
embeds_many :deploys
embeds_one :issue_tracker
has_many :errs, :inverse_of => :app, :dependent => :destroy
before_validation :generate_api_key, :on => :create
before_save :normalize_github_url
validates_presence_of :name, :api_key
validates_uniqueness_of :name, :allow_blank => true
validates_uniqueness_of :api_key, :allow_blank => true
validates_associated :watchers
validate :check_issue_tracker
accepts_nested_attributes_for :watchers, :allow_destroy => true,
:reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? }
accepts_nested_attributes_for :issue_tracker, :allow_destroy => true,
:reject_if => proc { |attrs| !%w(none lighthouseapp redmine pivotal fogbugz mingle).include?(attrs[:issue_tracker_type]) }
def self.find_by_id!(app_id)
find app_id
end
def self.find_by_api_key!(key)
where(:api_key => key).first || raise(Mongoid::Errors::DocumentNotFound.new(self,key))
end
def last_deploy_at
deploys.last && deploys.last.created_at
end
# Legacy apps don't have notify_on_errs and notify_on_deploys params
def notify_on_errs
!(self[:notify_on_errs] == false)
end
alias :notify_on_errs? :notify_on_errs
def notify_on_deploys
!(self[:notify_on_deploys] == false)
end
alias :notify_on_deploys? :notify_on_deploys
def github_url?
self.github_url.present?
end
def github_url_to_file(file)
"#{self.github_url}/blob/master#{file}"
end
def issue_tracker_configured?
issue_tracker && issue_tracker.issue_tracker_type != "none" && !issue_tracker.project_id.blank?
end
def notification_recipients
notify_all_users ? User.all.map(&:email) : watchers.map(&:address)
end
protected
def generate_api_key
self.api_key ||= ActiveSupport::SecureRandom.hex
end
def check_issue_tracker
if issue_tracker.present?
issue_tracker.valid?
issue_tracker.errors.full_messages.each do |error|
errors[:base] << error
end if issue_tracker.errors
end
end
def normalize_github_url
return if self.github_url.blank?
self.github_url.gsub!(%r{^http://|git@}, 'https://')
self.github_url.gsub!(/github\.com:/, 'github.com/')
self.github_url.gsub!(/\.git$/, '')
end
end