Class: DraftSequence

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/draft_sequence.rb

Class Method Summary collapse

Class Method Details

.current(user, key) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'app/models/draft_sequence.rb', line 35

def self.current(user, key)
  return nil if !user

  user_id = user
  user_id = user.id unless user.is_a?(Integer)

  return 0 if !User.human_user_id?(user_id)

  # perf critical path
  r, _ =
    DB.query_single(
      "select sequence from draft_sequences where user_id = ? and draft_key = ?",
      user_id,
      key,
    )
  r.to_i
end

.next!(user, key) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/models/draft_sequence.rb', line 4

def self.next!(user, key)
  return nil if !user

  user_id = user
  user_id = user.id unless user.is_a?(Integer)

  return 0 if !User.human_user_id?(user_id)

  sequence = DB.query_single(<<~SQL, user_id: user_id, draft_key: key).first
      INSERT INTO draft_sequences (user_id, draft_key, sequence)
      VALUES (:user_id, :draft_key, 1)
      ON CONFLICT (user_id, draft_key) DO
      UPDATE
      SET sequence = draft_sequences.sequence + 1
      WHERE draft_sequences.user_id = :user_id
      AND draft_sequences.draft_key = :draft_key
      RETURNING sequence
    SQL

  DB.exec(
    "DELETE FROM drafts WHERE user_id = :user_id AND draft_key = :draft_key AND sequence < :sequence",
    draft_key: key,
    user_id: user_id,
    sequence: sequence,
  )

  UserStat.update_draft_count(user_id)

  sequence
end