Module: ApiKeys::Models::Concerns::HasApiKeys

Extended by:
ActiveSupport::Concern
Defined in:
lib/api_keys/models/concerns/has_api_keys.rb

Overview

Concern to add API key capabilities to an owner model (e.g., User, Organization). This module provides the has_api_keys class method when extended onto ActiveRecord::Base.

Defined Under Namespace

Modules: ClassMethods Classes: DslProvider

Instance Method Summary collapse

Instance Method Details

#create_api_key!(name: nil, scopes: nil, expires_at: nil, metadata: nil) ⇒ ApiKeys::ApiKey

Creates a new API key for this owner instance and returns the ApiKey instance. Raises ActiveRecord::RecordInvalid if creation fails.

Parameters:

  • name (String) (defaults to: nil)

    The name for the new API key (required).

  • scopes (Array<String>, nil) (defaults to: nil)

    Scopes for the key. Defaults to owner/global settings.

  • expires_at (Time, nil) (defaults to: nil)

    Optional expiration timestamp.

  • metadata (Hash, nil) (defaults to: nil)

    Optional metadata hash.

Returns:

  • (ApiKeys::ApiKey)

    The newly created ApiKey instance. The plaintext token is available via the #token attribute on this instance *only until it’s reloaded*.



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/api_keys/models/concerns/has_api_keys.rb', line 108

def create_api_key!(name: nil, scopes: nil, expires_at: nil, metadata: nil)
  # Fetch default scopes from this owner class's settings, falling back to global config.
  owner_settings = self.class.api_keys_settings
  default_scopes = owner_settings&.[](:default_scopes) || ApiKeys.configuration.default_scopes || []

  # Use provided scopes if given, otherwise use the calculated defaults.
  key_scopes = scopes.nil? ? default_scopes : Array(scopes)

  # Create the key using the association, letting AR handle owner_id/type.
  api_key = self.api_keys.create!(
    name: name,
    scopes: key_scopes,
    expires_at: expires_at,
    metadata:  || {} # Ensure metadata is at least an empty hash
    # prefix, token_digest, digest_algorithm are set by ApiKey callbacks
  )

  # Return the ApiKey instance itself.
  # The plaintext token is available via `api_key.token` immediately after this.
  api_key
end