class OidcUserConsent < ApplicationRecord belongs_to :user belongs_to :application validates :user, :application, :scopes_granted, :granted_at, presence: true validates :user_id, uniqueness: {scope: :application_id} before_validation :set_granted_at, on: :create before_validation :set_sid, on: :create # Parse scopes_granted into an array def scopes scopes_granted.split(" ") end # Set scopes from an array def scopes=(scope_array) self.scopes_granted = Array(scope_array).uniq.join(" ") end # Check if this consent covers the requested scopes def covers_scopes?(requested_scopes) requested = Array(requested_scopes).map(&:to_s) granted = scopes # All requested scopes must be included in granted scopes (requested - granted).empty? end # Get a human-readable list of scopes def formatted_scopes scopes.map do |scope| case scope when "openid" "Basic authentication" when "profile" "Profile information" when "email" "Email address" when "groups" "Group membership" else scope.humanize end end.join(", ") end # Find consent by SID def self.find_by_sid(sid) find_by(sid: sid) end private def set_granted_at self.granted_at ||= Time.current end def set_sid self.sid ||= SecureRandom.uuid end end