Commit 0b615eb0e2b5cca7685360c0cae72484741d672e
1 parent
7339464e
Exists in
spb-stable
and in
2 other branches
Filter out old notes in NotesFinder
Showing
2 changed files
with
14 additions
and
1 deletions
Show diff stats
app/finders/notes_finder.rb
1 | 1 | class NotesFinder |
2 | + FETCH_OVERLAP = 5.seconds | |
3 | + | |
2 | 4 | def execute(project, current_user, params) |
3 | 5 | target_type = params[:target_type] |
4 | 6 | target_id = params[:target_id] |
7 | + last_fetched_at = params.fetch(:last_fetched_at) | |
5 | 8 | |
6 | - case target_type | |
9 | + notes = case target_type | |
7 | 10 | when "commit" |
8 | 11 | project.notes.for_commit_id(target_id).not_inline.fresh |
9 | 12 | when "issue" |
... | ... | @@ -15,5 +18,8 @@ class NotesFinder |
15 | 18 | else |
16 | 19 | raise 'invalid target_type' |
17 | 20 | end |
21 | + | |
22 | + # Use overlapping intervals to avoid worrying about race conditions | |
23 | + notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP) | |
18 | 24 | end |
19 | 25 | end | ... | ... |
spec/finders/notes_finder_spec.rb
... | ... | @@ -27,5 +27,12 @@ describe NotesFinder do |
27 | 27 | params = { target_id: commit.id, target_type: 'invalid' } |
28 | 28 | expect { NotesFinder.new.execute(project, user, params) }.to raise_error('invalid target_type') |
29 | 29 | end |
30 | + | |
31 | + it 'filters out old notes' do | |
32 | + note2.update_attribute(:updated_at, 2.hours.ago) | |
33 | + params = { target_id: commit.id, target_type: 'commit', last_fetched_at: 1.hour.ago } | |
34 | + notes = NotesFinder.new.execute(project, user, params) | |
35 | + notes.should eq([note1]) | |
36 | + end | |
30 | 37 | end |
31 | 38 | end | ... | ... |