summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dzaporozhets@gitlab.com>2014-12-04 21:00:44 +0000
committerDmitriy Zaporozhets <dzaporozhets@gitlab.com>2014-12-04 21:00:44 +0000
commit82a8bc44981bd1f6681981cd998081553fd24d01 (patch)
tree0b62aa051190b1a276dd0f83f671ff2be1fc7ea7
parent05d713be1900988bfff9cc5a94c490519add4a62 (diff)
parenta46fe875c6aea206e575e2b083bd31ed36ee1b1e (diff)
downloadgitlab-ce-82a8bc44981bd1f6681981cd998081553fd24d01.tar.gz
Merge branch 'atom-feed-for-user' into 'master'
Atom feed for user This feature allows to subscribe for users activity via atom feed. See merge request !1303
-rw-r--r--CHANGELOG2
-rw-r--r--app/controllers/users_controller.rb7
-rw-r--r--app/views/users/show.atom.builder29
-rw-r--r--app/views/users/show.html.haml10
-rw-r--r--config/routes.rb3
-rw-r--r--spec/features/atom/users_spec.rb43
6 files changed, 90 insertions, 4 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 2c6808f46b9..6c28a573703 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -20,7 +20,7 @@ v 7.6.0
- In the docker directory is a container template based on the Omnibus packages.
- Update Sidekiq to version 2.17.8
-
- -
+ - Atom feed for user activity
v 7.5.2
- Don't log Sidekiq arguments by default
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 0b442f5383a..67af1801bda 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -20,9 +20,14 @@ class UsersController < ApplicationController
# Get user activity feed for projects common for both users
@events = @user.recent_events.
- where(project_id: authorized_projects_ids).limit(20)
+ where(project_id: authorized_projects_ids).limit(30)
@title = @user.name
+
+ respond_to do |format|
+ format.html
+ format.atom { render layout: false }
+ end
end
def determine_layout
diff --git a/app/views/users/show.atom.builder b/app/views/users/show.atom.builder
new file mode 100644
index 00000000000..0d61a9e8097
--- /dev/null
+++ b/app/views/users/show.atom.builder
@@ -0,0 +1,29 @@
+xml.instruct!
+xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
+ xml.title "Activity feed for #{@user.name}"
+ xml.link :href => user_url(@user, :atom), :rel => "self", :type => "application/atom+xml"
+ xml.link :href => user_url(@user), :rel => "alternate", :type => "text/html"
+ xml.id projects_url
+ xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
+
+ @events.each do |event|
+ if event.proper?
+ xml.entry do
+ event_link = event_feed_url(event)
+ event_title = event_feed_title(event)
+ event_summary = event_feed_summary(event)
+
+ xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
+ xml.link :href => event_link
+ xml.title truncate(event_title, :length => 80)
+ xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
+ xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email)
+ xml.author do |author|
+ xml.name event.author_name
+ xml.email event.author_email
+ end
+ xml.summary(:type => "xhtml") { |x| x << event_summary unless event_summary.nil? }
+ end
+ end
+ end
+end
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index cb49c030af2..54f2666ce5d 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -18,7 +18,15 @@
%h4 Groups:
= render 'groups', groups: @groups
%hr
- %h4 User Activity:
+ %h4
+ User Activity:
+
+ - if current_user
+ %span.rss-icon.pull-right
+ = link_to user_path(@user, :atom, { private_token: current_user.private_token }) do
+ %strong
+ %i.fa.fa-rss
+
= render @events
.col-md-4
= render 'profile', user: @user
diff --git a/config/routes.rb b/config/routes.rb
index 723104daf13..f2984069b71 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -137,7 +137,8 @@ Gitlab::Application.routes.draw do
end
end
- match "/u/:username" => "users#show", as: :user, constraints: { username: /.*/ }, via: :get
+ match "/u/:username" => "users#show", as: :user,
+ constraints: {username: /(?:[^.]|\.(?!atom$))+/, format: /atom/}, via: :get
#
# Dashboard Area
diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb
new file mode 100644
index 00000000000..746b6fc1ac9
--- /dev/null
+++ b/spec/features/atom/users_spec.rb
@@ -0,0 +1,43 @@
+require 'spec_helper'
+
+describe "User Feed", feature: true do
+ describe "GET /" do
+ let!(:user) { create(:user) }
+
+ context "user atom feed via private token" do
+ it "should render user atom feed" do
+ visit user_path(user, :atom, private_token: user.private_token)
+ body.should have_selector("feed title")
+ end
+ end
+
+ context 'feed content' do
+ let(:project) { create(:project) }
+ let(:issue) { create(:issue, project: project, author: user, description: '') }
+ let(:note) { create(:note, noteable: issue, author: user, note: 'Bug confirmed', project: project) }
+
+ before do
+ project.team << [user, :master]
+ issue_event(issue, user)
+ note_event(note, user)
+ visit user_path(user, :atom, private_token: user.private_token)
+ end
+
+ it "should have issue opened event" do
+ body.should have_content("#{user.name} opened issue ##{issue.iid}")
+ end
+
+ it "should have issue comment event" do
+ body.should have_content("#{user.name} commented on issue ##{issue.iid}")
+ end
+ end
+ end
+
+ def issue_event(issue, user)
+ EventCreateService.new.open_issue(issue, user)
+ end
+
+ def note_event(note, user)
+ EventCreateService.new.leave_note(note, user)
+ end
+end