Skip to content

Commit 57b1ee3

Browse files
author
Matt Swanson
committed
dont allow duplicate feeds, closes stringer-rss#17
1 parent fbe10e6 commit 57b1ee3

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

app/commands/feeds/import_from_opml.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
class ImportFromOpml
55
ONE_DAY = 24 * 60 * 60
66

7-
def self.import(opml_contents, should_overwrite = false)
7+
def self.import(opml_contents)
88
feeds = OpmlParser.new.parse_feeds(opml_contents)
99

10-
Feed.delete_all if should_overwrite
11-
1210
feeds.each do |feed|
1311
Feed.create(name: feed[:name],
1412
url: feed[:url],

app/controllers/feeds_controller.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ class Stringer < Sinatra::Base
2020
end
2121

2222
post "/feeds" do
23-
feed = AddNewFeed.add(params[:feed_url])
23+
@feed_url = params[:feed_url]
24+
feed = AddNewFeed.add(@feed_url)
2425

25-
if feed
26+
if feed and feed.valid?
2627
FetchFeeds.enqueue([feed])
2728

2829
flash[:success] = "We've added your new feed. Check back in a bit."
2930
redirect to("/")
31+
elsif feed
32+
flash.now[:error] = "You are already subscribed to this feed..."
33+
erb :'feeds/add'
3034
else
3135
flash.now[:error] = "We couldn't find that feed. Try again."
3236
erb :'feeds/add'
@@ -38,7 +42,7 @@ class Stringer < Sinatra::Base
3842
end
3943

4044
post "/feeds/import" do
41-
ImportFromOpml.import(params["opml_file"][:tempfile].read, true)
45+
ImportFromOpml.import(params["opml_file"][:tempfile].read)
4246

4347
redirect to("/setup/tutorial")
4448
end

app/models/feed.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
class Feed < ActiveRecord::Base
22
has_many :stories, order: "published desc", dependent: :delete_all
33

4+
validates_uniqueness_of :url
5+
46
STATUS = { green: 0, yellow: 1, red: 2 }
57

68
def status

app/views/feeds/add.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<hr />
1010
<form id="add-feed-setup" method="POST" action="/feeds">
1111
<div class="control-group">
12-
<input name="feed_url" id="feed-url" type="text" autofocus="autofocus" />
12+
<input name="feed_url" id="feed-url" type="text" autofocus="autofocus" value="<%= @feed_url %>"/>
1313
<i class="icon-rss field-icon"></i>
1414
<label id="feed_url-label" class="field-label" for="feed_url"><%= t('feeds.add.fields.feed_url') %></label>
1515
</div>

spec/controllers/feeds_controller_spec.rb

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,23 @@
3535
end
3636

3737
describe "GET /feeds/new" do
38+
it "displays a form and submit button" do
39+
get "/feeds/new"
40+
41+
page = last_response.body
42+
page.should have_tag("form#add-feed-setup")
43+
page.should have_tag("input#submit")
44+
end
45+
end
46+
47+
describe "POST /feeds" do
3848
context "when the feed url is valid" do
3949
let(:feed_url) { "http://example.com/" }
40-
let(:feed) { stub }
50+
let(:valid_feed) { stub(valid?: true) }
4151

4252
it "adds the feed and queues it to be fetched" do
43-
AddNewFeed.should_receive(:add).with(feed_url).and_return(feed)
44-
FetchFeeds.should_receive(:enqueue).with([feed])
53+
AddNewFeed.should_receive(:add).with(feed_url).and_return(valid_feed)
54+
FetchFeeds.should_receive(:enqueue).with([valid_feed])
4555

4656
post "/feeds", feed_url: feed_url
4757

@@ -51,10 +61,24 @@
5161
end
5262

5363
context "when the feed url is invalid" do
54-
let(:feed_url) { "http://not-a-feed.com/" }
64+
let(:feed_url) { "http://not-a-valid-feed.com/" }
65+
66+
it "adds the feed and queues it to be fetched" do
67+
AddNewFeed.should_receive(:add).with(feed_url).and_return(false)
68+
69+
post "/feeds", feed_url: feed_url
70+
71+
page = last_response.body
72+
page.should have_tag(".error")
73+
end
74+
end
75+
76+
context "when the feed url is one we already subscribe to" do
77+
let(:feed_url) { "http://example.com/" }
78+
let(:invalid_feed) { stub(valid?: false) }
5579

5680
it "adds the feed and queues it to be fetched" do
57-
AddNewFeed.should_receive(:add).with(feed_url).and_return(nil)
81+
AddNewFeed.should_receive(:add).with(feed_url).and_return(invalid_feed)
5882

5983
post "/feeds", feed_url: feed_url
6084

@@ -74,7 +98,7 @@
7498
end
7599
end
76100

77-
describe "POST /import" do
101+
describe "POST /feeds/import" do
78102
let(:opml_file) { Rack::Test::UploadedFile.new("spec/sample_data/subscriptions.xml", "application/xml") }
79103

80104
it "parse OPML and starts fetching" do

0 commit comments

Comments
 (0)