Skip to content

Commit

Permalink
Adding Atom feed
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas-C committed Aug 9, 2015
1 parent eee2fa5 commit 2ef6f8b
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 3 deletions.
5 changes: 4 additions & 1 deletion app/controllers/api/v1/places_controller.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
class Api::V1::PlacesController < Api::V1::BaseController
def index
render json: Place.displayable
respond_to do |format|
format.json { render json: Place.displayable }
format.atom { @places_items = Place.displayable.order('updated_at DESC') }
end
end

def show
Expand Down
37 changes: 37 additions & 0 deletions app/views/api/v1/places/index.atom.builder
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
def place_to_html_description(place)
def format_entry(name, value)
i18n_name = I18n.t("simple_form.labels.place.#{name}")
displayed_value = (name == 'kind' ? I18n.t("kinds.codes.#{value}") : value)
"<b>#{i18n_name} :</b> #{displayed_value}"
end
text_entries = place.attributes
.slice('kind', 'street', 'zip_code', 'city', 'description', 'owner_name')
.reject { |k, v| v.nil? }
.map { |name, value| format_entry(name, value) }
twitname = place.twitter_name
twitter_entry = format_entry('twitter_name', "<a href='https://twitter.com/#{twitname}'>@#{twitname}</a>") unless !twitname
url_entry = format_entry('url', "<a href='#{place.url}'>#{place.url}</a>") unless !place.url
logo_img = "<img src='#{place.logo_url}' alt='#{place.name} logo'>" unless !place.logo_url
direct_link = "<a href='/#/place/#{place.id}'>#{I18n.t 'feed.link_to_map_marker'}</a>"
[
logo_img,
*text_entries,
url_entry,
twitter_entry,
direct_link,
].compact.join '<br>'
end

atom_feed language: (I18n.locale == :fr ? 'fr-FR' : 'en-US') do |feed|
feed.title I18n.t 'feed.title'
feed.updated @places_items.first.updated_at unless @places_items.empty?
@places_items.each do |place_item|
feed.entry( place_item ) do |entry|
entry.title place_item.name
entry.content place_to_html_description(place_item), type: 'html'
entry.author do |author|
author.name place_item.owner_name
end
end
end
end
1 change: 1 addition & 0 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ places_count = Place.displayable.count

<%= stylesheet_link_tag 'application' %>
<%= csrf_meta_tags %>
<%= auto_discovery_link_tag :atom, "/feed" %>
</head>

<body>
Expand Down
3 changes: 3 additions & 0 deletions config/locales/app.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,6 @@ en:
owner_email: Your email
place_update:
<<: *place
feed:
title: Last added places
link_to_map_marker: Link to map marker
3 changes: 3 additions & 0 deletions config/locales/app.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,6 @@ fr:
owner_email: Votre adresse email
place_update:
<<: *place
feed:
title: Derniers lieux ajoutés
link_to_map_marker: Lien vers le marqueur sur la carte
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@
end
end

get '/feed', to: 'api/v1/places#index', defaults: { format: 'atom' }
get '*path', to: 'places#index'
end
2 changes: 1 addition & 1 deletion spec/factories/places.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FactoryGirl.define do
factory :place do
name 'Craftsmen Angers'
sequence(:name) { |n| 'Craftsmen Angers #{n}' }
kind Kind.codes.first
state :pending
url 'http://craftsmen.io'
Expand Down
32 changes: 32 additions & 0 deletions spec/features/a_user_can_subscribe_to_the_place_feed_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'rails_helper'

feature 'A user view the places Atom feed' do
scenario 'there is a link to the map marker in the feed item description' do
create(:place, :active)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/content').text).to include(t('feed.link_to_map_marker'))
end

scenario 'when several places exist, they have different "updated" times' do
create(:place, :active, updated_at: 3.days.ago)
create(:place, :active)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/updated').text).to_not eq(find(:xpath, '//feed/entry[2]/updated').text)
end

scenario 'when several places exist, they are ordered chronologically' do
create(:place, :active, name: 'Newest place')
create(:place, :active, name: 'Another place', updated_at: 3.days.ago)
create(:place, :active, name: 'Oldest place', updated_at: 3.months.ago)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/title').text).to eq('Newest place')
expect(find(:xpath, '//feed/entry[2]/title').text).to eq('Another place')
expect(find(:xpath, '//feed/entry[3]/title').text).to eq('Oldest place')
end
end
2 changes: 1 addition & 1 deletion spec/fixtures/csv/valid.csv
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
name;kind;street;zip_code;city;url;latitude;longitude;twitter_name;logo_url;description;owner_name;owner_email
Craftsmen;company;25 rue Lenepveu;49000;Angers;http://craftsmen.io;47.472041;-0.551269;craftsmenhq;;;;
Craftsmen Angers;company;25 rue Lenepveu;49100;Angers;http://craftsmen.io;47.472041;-0.551269;craftsmenhq;https://pbs.twimg.com/profile_images/425256684244566016/N0wcdLyQ_400x400.jpeg;Webdesign studio;Sébastien Charrier;sebastien@craftsmen.io

0 comments on commit 2ef6f8b

Please sign in to comment.