Class: ToiletTracker::Services::ShiftService

Inherits:
Object
  • Object
show all
Defined in:
lib/toilet_tracker/services/shift_service.rb

Defined Under Namespace

Classes: ShiftEntry

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(timezone_service = TimezoneService.new) ⇒ ShiftService

Returns a new instance of ShiftService.



10
11
12
13
# File 'lib/toilet_tracker/services/shift_service.rb', line 10

def initialize(timezone_service = TimezoneService.new)
  @timezone_service = timezone_service
  @user_shifts = Hash.new { |h, k| h[k] = [ default_shift_entry ] }
end

Instance Attribute Details

#timezone_serviceObject (readonly)

Returns the value of attribute timezone_service.



8
9
10
# File 'lib/toilet_tracker/services/shift_service.rb', line 8

def timezone_service
  @timezone_service
end

Instance Method Details

#clear_all_historyObject



71
72
73
# File 'lib/toilet_tracker/services/shift_service.rb', line 71

def clear_all_history
  @user_shifts.clear
end

#clear_history(user) ⇒ Object



67
68
69
# File 'lib/toilet_tracker/services/shift_service.rb', line 67

def clear_history(user)
  @user_shifts[user] = [ default_shift_entry ]
end

#get_active_shift(user, at_time = Time.current) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/toilet_tracker/services/shift_service.rb', line 55

def get_active_shift(user, at_time = Time.current)
  history = @user_shifts[user]

  # Find the most recent shift that was set before or at the given time
  relevant_entry = history.reverse_each.find { |entry| entry.time <= at_time }
  relevant_entry&.shift || 0
end

#get_shift_history(user) ⇒ Object



63
64
65
# File 'lib/toilet_tracker/services/shift_service.rb', line 63

def get_shift_history(user)
  @user_shifts[user].dup
end

#set_retroactive_shift(user, shift, effective_time, timezone = nil) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/toilet_tracker/services/shift_service.rb', line 28

def set_retroactive_shift(user, shift, effective_time, timezone = nil)
  validate_shift!(shift)

  entry = ShiftEntry.new(
    time: effective_time,
    shift: shift,
    timezone: timezone
  )

  # Remove any shifts that were set after this effective time
  @user_shifts[user].reject! { |existing| existing.time > effective_time }

  @user_shifts[user] << entry
  @user_shifts[user].sort_by!(&:time)
end

#set_shift(user, shift, effective_time = Time.current, timezone = nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/toilet_tracker/services/shift_service.rb', line 15

def set_shift(user, shift, effective_time = Time.current, timezone = nil)
  validate_shift!(shift)

  entry = ShiftEntry.new(
    time: effective_time,
    shift: shift,
    timezone: timezone
  )

  @user_shifts[user] << entry
  @user_shifts[user].sort_by!(&:time)
end

#set_timezone(user, timezone_spec, effective_time = Time.current) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/toilet_tracker/services/shift_service.rb', line 44

def set_timezone(user, timezone_spec, effective_time = Time.current)
  timezone = timezone_service.resolve_timezone(timezone_spec)
  shift = timezone_service.calculate_shift(
    ToiletTracker.configuration.default_timezone,
    timezone,
    effective_time
  )

  set_shift(user, shift, effective_time, timezone_spec)
end