class Doorkeeper::OAuth::Authorization::Code

def access_grant_attributes

def access_grant_attributes
  pkce_attributes.merge(
    application_id: pre_auth.client.id,
    resource_owner_id: resource_owner.id,
    expires_in: authorization_code_expires_in,
    redirect_uri: pre_auth.redirect_uri,
    scopes: pre_auth.scopes.to_s
  )
end

def authorization_code_expires_in

def authorization_code_expires_in
  Doorkeeper.configuration.authorization_code_expires_in
end

def initialize(pre_auth, resource_owner)

def initialize(pre_auth, resource_owner)
  @pre_auth = pre_auth
  @resource_owner = resource_owner
end

def issue_token

def issue_token
  @token ||= AccessGrant.create!(access_grant_attributes)
end

def oob_redirect

def oob_redirect
  { action: :show, code: token.plaintext_token }
end

def pkce_attributes

def pkce_attributes
  return {} unless pkce_supported?
  {
    code_challenge: pre_auth.code_challenge,
    code_challenge_method: pre_auth.code_challenge_method,
  }
end

def pkce_supported?

generated and migrated
Ensures firstly, if migration with additional PKCE columns was
def pkce_supported?
  Doorkeeper::AccessGrant.pkce_supported?
end