event.rb 2.7 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1
class Event < ActiveRecord::Base
2 3
  include PushEvent

4 5
  default_scope where("author_id IS NOT NULL")

6 7 8 9 10 11
  Created   = 1
  Updated   = 2
  Closed    = 3
  Reopened  = 4
  Pushed    = 5
  Commented = 6
12
  Merged    = 7
A
Alex Denisov 已提交
13
  Joined    = 8 # User joined project
A
Alex Denisov 已提交
14
  Left      = 9 # User left project
15

D
Dmitriy Zaporozhets 已提交
16
  belongs_to :project
17
  belongs_to :target, polymorphic: true
18

R
randx 已提交
19 20
  # For Hash only
  serialize :data
21

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

25 26 27 28 29 30 31
  def self.determine_action(record)
    if [Issue, MergeRequest].include? record.class
      Event::Created
    elsif record.kind_of? Note
      Event::Commented
    end
  end
32

D
Dmitriy Zaporozhets 已提交
33
  def self.recent_for_user user
34
    where(project_id: user.projects.map(&:id)).recent
D
Dmitriy Zaporozhets 已提交
35 36
  end

37 38 39 40
  # Next events currently enabled for system
  #  - push 
  #  - new issue
  #  - merge request
D
Dmitriy Zaporozhets 已提交
41
  def allowed?
A
Alex Denisov 已提交
42
    push? || issue? || merge_request? || membership_changed?
D
Dmitriy Zaporozhets 已提交
43 44
  end

45
  def push?
46
    action == self.class::Pushed && valid_push?
47 48
  end

49 50 51 52
  def merged?
    action == self.class::Merged
  end

53 54 55 56 57 58 59 60
  def closed?
    action == self.class::Closed
  end

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

61 62
  def issue? 
    target_type == "Issue"
63 64
  end

65 66
  def merge_request? 
    target_type == "MergeRequest"
67 68
  end

69 70 71 72 73 74 75 76 77 78
  def new_issue? 
    target_type == "Issue" && 
      action == Created
  end

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

79 80 81 82 83 84 85 86 87 88
  def changed_merge_request? 
    target_type == "MergeRequest" && 
      [Closed, Reopened].include?(action)
  end

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

A
Alex Denisov 已提交
89
  def joined?
A
Alex Denisov 已提交
90 91 92 93 94 95 96 97 98
    action == Joined
  end

  def left?
    action == Left
  end

  def membership_changed?
    joined? || left?
A
Alex Denisov 已提交
99 100
  end

101 102 103 104 105 106 107 108 109
  def issue 
    target if target_type == "Issue"
  end

  def merge_request
    target if target_type == "MergeRequest"
  end

  def author 
110
    @author ||= User.find(author_id)
111
  end
112 113 114 115 116 117

  def action_name
    if closed?
      "closed"
    elsif merged?
      "merged"
A
Alex Denisov 已提交
118 119
    elsif joined?
      'joined'
A
Alex Denisov 已提交
120 121
    elsif left?
      'left'
122 123
    else 
      "opened"
124 125 126
    end
  end

127 128 129
  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
D
Dmitriy Zaporozhets 已提交
130 131 132 133 134
end
# == Schema Information
#
# Table name: events
#
R
randx 已提交
135
#  id          :integer(4)      not null, primary key
136
#  target_type :string(255)
R
randx 已提交
137
#  target_id   :integer(4)
138 139
#  title       :string(255)
#  data        :text
R
randx 已提交
140
#  project_id  :integer(4)
141 142
#  created_at  :datetime        not null
#  updated_at  :datetime        not null
R
randx 已提交
143 144
#  action      :integer(4)
#  author_id   :integer(4)
D
Dmitriy Zaporozhets 已提交
145
#
146