Browse Source

Allow reference for time-based activity endpoints

Maarten van den Berg 6 years ago
parent
commit
589cf27399
2 changed files with 25 additions and 6 deletions
  1. 19 3
      app/controllers/api/groups_controller.rb
  2. 6 3
      app/models/group.rb

+ 19 - 3
app/controllers/api/groups_controller.rb

@@ -26,19 +26,25 @@ class Api::GroupsController < ApiController
26 26
 
27 27
   # GET /api/groups/1/current_activities
28 28
   def current_activities
29
-    @activities = @group.current_activities
29
+    reference = try_parse_datetime params[:reference]
30
+    @activities = @group.current_activities reference
31
+
30 32
     render 'api/activities/index'
31 33
   end
32 34
 
33 35
   # GET /api/groups/1/upcoming_activities
34 36
   def upcoming_activities
35
-    @activities = @group.upcoming_activities
37
+    reference = try_parse_datetime params[:reference]
38
+    @activities = @group.upcoming_activities reference
39
+
36 40
     render 'api/activities/index'
37 41
   end
38 42
 
39 43
   # GET /api/groups/1/previous_activities
40 44
   def previous_activities
41
-    @activities = @group.previous_activities
45
+    reference = try_parse_datetime params[:reference]
46
+    @activities = @group.previous_activities reference
47
+
42 48
     render 'api/activities/index'
43 49
   end
44 50
 
@@ -48,4 +54,14 @@ class Api::GroupsController < ApiController
48 54
   def set_group
49 55
     @group = Group.find(params[:id])
50 56
   end
57
+
58
+  # @return [DateTime] the parsed input.
59
+  def try_parse_datetime(input = nil)
60
+    return unless input
61
+    begin
62
+      DateTime.parse input
63
+    rescue ArgumentError
64
+      nil
65
+    end
66
+  end
51 67
 end

+ 6 - 3
app/models/group.rb

@@ -35,7 +35,8 @@ class Group < ApplicationRecord
35 35
 
36 36
   # @return [Array<Activity>]
37 37
   #   all Activities that have started, and not yet ended.
38
-  def current_activities(reference = Time.zone.now)
38
+  def current_activities(reference = nil)
39
+    reference ||= Time.zone.now
39 40
     activities
40 41
       .where('start < ?', reference)
41 42
       .where('end > ?', reference)
@@ -43,7 +44,8 @@ class Group < ApplicationRecord
43 44
 
44 45
   # @return [Array<Activity>]
45 46
   #   at most 3 activities that ended recently.
46
-  def previous_activities(reference = Time.zone.now)
47
+  def previous_activities(reference = nil)
48
+    reference ||= Time.zone.now
47 49
     activities
48 50
       .where('end < ?', reference)
49 51
       .order(end: :desc)
@@ -52,7 +54,8 @@ class Group < ApplicationRecord
52 54
 
53 55
   # @return [Array<Activity>]
54 56
   #   all Activities starting within the next 48 hours.
55
-  def upcoming_activities(reference = Time.zone.now)
57
+  def upcoming_activities(reference = nil)
58
+    reference ||= Time.zone.now
56 59
     activities
57 60
       .where('start > ?', reference)
58 61
       .where('start < ?', reference.days_since(2))