summaryrefslogtreecommitdiff
path: root/app/models/event.rb
blob: e20b79e2a8285b1305357a77ca459cbc2505f18e (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
122
123
124
125
126
127
128
class Event < ActiveRecord::Base
  include PushEvent

  default_scope where("author_id IS NOT NULL")

  Created   = 1
  Updated   = 2
  Closed    = 3
  Reopened  = 4
  Pushed    = 5
  Commented = 6
  Merged    = 7

  belongs_to :project
  belongs_to :target, polymorphic: true

  # For Hash only
  serialize :data

  scope :recent, order("created_at DESC")
  scope :code_push, where(action: Pushed)

  def self.determine_action(record)
    if [Issue, MergeRequest].include? record.class
      Event::Created
    elsif record.kind_of? Note
      Event::Commented
    end
  end

  def self.recent_for_user user
    where(project_id: user.projects.map(&:id)).recent
  end

  # Next events currently enabled for system
  #  - push 
  #  - new issue
  #  - merge request
  def allowed?
    push? || issue? || merge_request?
  end

  def push?
    action == self.class::Pushed && valid_push?
  end

  def merged?
    action == self.class::Merged
  end

  def closed?
    action == self.class::Closed
  end

  def reopened?
    action == self.class::Reopened
  end

  def issue? 
    target_type == "Issue"
  end

  def merge_request? 
    target_type == "MergeRequest"
  end

  def new_issue? 
    target_type == "Issue" && 
      action == Created
  end

  def new_merge_request? 
    target_type == "MergeRequest" && 
      action == Created
  end

  def changed_merge_request? 
    target_type == "MergeRequest" && 
      [Closed, Reopened].include?(action)
  end

  def changed_issue? 
    target_type == "Issue" && 
      [Closed, Reopened].include?(action)
  end

  def issue 
    target if target_type == "Issue"
  end

  def merge_request
    target if target_type == "MergeRequest"
  end

  def author 
    @author ||= User.find(author_id)
  end

  def action_name
    if closed?
      "closed"
    elsif merged?
      "merged"
    else 
      "opened"
    end
  end

  delegate :name, :email, to: :author, prefix: true, allow_nil: true
  delegate :title, to: :issue, prefix: true, allow_nil: true
  delegate :title, to: :merge_request, prefix: true, allow_nil: true
end
# == Schema Information
#
# Table name: events
#
#  id          :integer(4)      not null, primary key
#  target_type :string(255)
#  target_id   :integer(4)
#  title       :string(255)
#  data        :text
#  project_id  :integer(4)
#  created_at  :datetime        not null
#  updated_at  :datetime        not null
#  action      :integer(4)
#  author_id   :integer(4)
#