Skip to content

Commit 4ab1e07

Browse files
committed
Merge branch '14707-allow-activity-feed-to-be-accessible-through-api' into 'master'
Introduce an Events API Closes #14707 See merge request !11755
2 parents 34f925f + 3c15f0e commit 4ab1e07

File tree

15 files changed

+721
-443
lines changed

15 files changed

+721
-443
lines changed

app/finders/events_finder.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
class EventsFinder
2+
attr_reader :source, :params, :current_user
3+
4+
# Used to filter Events
5+
#
6+
# Arguments:
7+
# source - which user or project to looks for events on
8+
# current_user - only return events for projects visible to this user
9+
# params:
10+
# action: string
11+
# target_type: string
12+
# before: datetime
13+
# after: datetime
14+
#
15+
def initialize(params = {})
16+
@source = params.delete(:source)
17+
@current_user = params.delete(:current_user)
18+
@params = params
19+
end
20+
21+
def execute
22+
events = source.events
23+
24+
events = by_current_user_access(events)
25+
events = by_action(events)
26+
events = by_target_type(events)
27+
events = by_created_at_before(events)
28+
events = by_created_at_after(events)
29+
30+
events
31+
end
32+
33+
private
34+
35+
def by_current_user_access(events)
36+
events.merge(ProjectsFinder.new(current_user: current_user).execute).references(:project)
37+
end
38+
39+
def by_action(events)
40+
return events unless Event::ACTIONS[params[:action]]
41+
42+
events.where(action: Event::ACTIONS[params[:action]])
43+
end
44+
45+
def by_target_type(events)
46+
return events unless Event::TARGET_TYPES[params[:target_type]]
47+
48+
events.where(target_type: Event::TARGET_TYPES[params[:target_type]])
49+
end
50+
51+
def by_created_at_before(events)
52+
return events unless params[:before]
53+
54+
events.where('events.created_at < ?', params[:before].beginning_of_day)
55+
end
56+
57+
def by_created_at_after(events)
58+
return events unless params[:after]
59+
60+
events.where('events.created_at > ?', params[:after].end_of_day)
61+
end
62+
end

app/models/event.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,30 @@ class Event < ActiveRecord::Base
1414
DESTROYED = 10
1515
EXPIRED = 11 # User left project due to expiry
1616

17+
ACTIONS = HashWithIndifferentAccess.new(
18+
created: CREATED,
19+
updated: UPDATED,
20+
closed: CLOSED,
21+
reopened: REOPENED,
22+
pushed: PUSHED,
23+
commented: COMMENTED,
24+
merged: MERGED,
25+
joined: JOINED,
26+
left: LEFT,
27+
destroyed: DESTROYED,
28+
expired: EXPIRED
29+
).freeze
30+
31+
TARGET_TYPES = HashWithIndifferentAccess.new(
32+
issue: Issue,
33+
milestone: Milestone,
34+
merge_request: MergeRequest,
35+
note: Note,
36+
project: Project,
37+
snippet: Snippet,
38+
user: User
39+
).freeze
40+
1741
RESET_PROJECT_ACTIVITY_INTERVAL = 1.hour
1842

1943
delegate :name, :email, :public_email, :username, to: :author, prefix: true, allow_nil: true
@@ -55,6 +79,14 @@ def contributions
5579
def limit_recent(limit = 20, offset = nil)
5680
recent.limit(limit).offset(offset)
5781
end
82+
83+
def actions
84+
ACTIONS.keys
85+
end
86+
87+
def target_types
88+
TARGET_TYPES.keys
89+
end
5890
end
5991

6092
def visible_to_user?(user = nil)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
title: Introduce an Events API
3+
merge_request: 11755
4+
author:

doc/api/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ following locations:
1616
- [Deployments](deployments.md)
1717
- [Deploy Keys](deploy_keys.md)
1818
- [Environments](environments.md)
19+
- [Events](events.md)
1920
- [Gitignores templates](templates/gitignores.md)
2021
- [GitLab CI Config templates](templates/gitlab_ci_ymls.md)
2122
- [Groups](groups.md)

0 commit comments

Comments
 (0)