Class: Panda::Core::PresenceService

Inherits:
Object
  • Object
show all
Defined in:
app/services/panda/core/presence_service.rb

Class Method Summary collapse

Class Method Details

.cleanup_stale!Object



44
45
46
# File 'app/services/panda/core/presence_service.rb', line 44

def self.cleanup_stale!
  Presence.stale(Presence::PRESENCE_TTL).delete_all
end

.current_editors(resource) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/services/panda/core/presence_service.rb', line 31

def self.current_editors(resource)
  Presence
    .for_resource(resource)
    .active(Presence::PRESENCE_TTL)
    .includes(:user)
    .map do |presence|
      {
        user_id: presence.user_id,
        user_name: presence.user.name.presence || presence.user.email
      }
    end
end

.record_presence(resource, user_id) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'app/services/panda/core/presence_service.rb', line 6

def self.record_presence(resource, user_id)
  attrs = {
    presenceable_type: resource.class.name,
    presenceable_id: resource.id,
    user_id: user_id
  }

  result = Presence.upsert(
    attrs.merge(last_seen_at: Time.current),
    unique_by: %i[presenceable_type presenceable_id user_id],
    returning: %w[id]
  )

  record_id = result.first&.fetch("id") { raise "Upsert did not return an ID" }
  Presence.find(record_id)
end

.remove_presence(resource, user_id) ⇒ Object



23
24
25
26
27
28
29
# File 'app/services/panda/core/presence_service.rb', line 23

def self.remove_presence(resource, user_id)
  Presence.where(
    presenceable_type: resource.class.name,
    presenceable_id: resource.id,
    user_id: user_id
  ).delete_all
end