diff options
author | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2014-12-04 21:00:44 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2014-12-04 21:00:44 +0000 |
commit | 82a8bc44981bd1f6681981cd998081553fd24d01 (patch) | |
tree | 0b62aa051190b1a276dd0f83f671ff2be1fc7ea7 | |
parent | 05d713be1900988bfff9cc5a94c490519add4a62 (diff) | |
parent | a46fe875c6aea206e575e2b083bd31ed36ee1b1e (diff) | |
download | gitlab-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-- | CHANGELOG | 2 | ||||
-rw-r--r-- | app/controllers/users_controller.rb | 7 | ||||
-rw-r--r-- | app/views/users/show.atom.builder | 29 | ||||
-rw-r--r-- | app/views/users/show.html.haml | 10 | ||||
-rw-r--r-- | config/routes.rb | 3 | ||||
-rw-r--r-- | spec/features/atom/users_spec.rb | 43 |
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 |