| 1 | # frozen_string_literal: true |
| 2 | |
| 3 | # One row per user per billing period, counting siGit Code Cloud requests for |
| 4 | # allowance enforcement. Atomic increments so concurrent requests can't lose a |
| 5 | # count. |
| 6 | class CloudUsage < ApplicationRecord |
| 7 | belongs_to :user |
| 8 | |
| 9 | # Count for a user in the given period (0 when unseen). |
| 10 | def self.used(user, period_key) |
| 11 | where(user_id: user.id, period_key: period_key).pick(:request_count) || 0 |
| 12 | end |
| 13 | |
| 14 | # Record one cloud request against the user's current period. Returns the new |
| 15 | # count. |
| 16 | def self.record_request!(user, period_key) |
| 17 | row = find_or_create_by!(user_id: user.id, period_key: period_key) |
| 18 | where(id: row.id).update_all("request_count = request_count + 1, updated_at = NOW()") |
| 19 | row.reload.request_count |
| 20 | end |
| 21 | end |