zoeys.computer/lib/zoeyscomputer/api_keys.ex

133 lines
2.5 KiB
Elixir
Raw Normal View History

2024-10-22 16:51:56 -04:00
defmodule Zoeyscomputer.ApiKeys do
@moduledoc """
The ApiKeys context.
"""
require Logger
import Ecto.Query, warn: false
alias Hex.API.User
alias Zoeyscomputer.ApiKeys.ApiKey
alias Zoeyscomputer.Repo
alias Zoeyscomputer.Users.User
alias Zoeyscomputer.ApiKeys.ApiKey
@doc """
Returns the list of api_keys.
## Examples
iex> list_api_keys()
[%ApiKey{}, ...]
"""
def list_api_keys do
Repo.all(ApiKey)
end
@doc """
Gets a single api_key.
Raises `Ecto.NoResultsError` if the Api key does not exist.
## Examples
iex> get_api_key!(123)
%ApiKey{}
iex> get_api_key!(456)
** (Ecto.NoResultsError)
"""
def get_api_key!(id), do: Repo.get!(ApiKey, id)
@doc """
Gets an API key by its token
"""
def get_api_key_by_token(token) do
Repo.get_by(ApiKey, token: token)
end
@doc """
Creates an API key for a user.
"""
def create_api_key(user, attrs \\ %{}) do
# Convert attrs to string keys and add user_id with string key
attrs = Map.put(attrs, "user_id", user.id)
result =
%ApiKey{}
|> ApiKey.changeset(attrs)
|> Repo.insert()
result
end
@doc """
Updates a api_key.
## Examples
iex> update_api_key(api_key, %{field: new_value})
{:ok, %ApiKey{}}
iex> update_api_key(api_key, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_api_key(%ApiKey{} = api_key, attrs) do
api_key
|> ApiKey.changeset(attrs)
|> Repo.update()
end
@doc """
List all API Keys for a given user
"""
def list_api_keys(%User{} = user) do
ApiKey
|> where([a], a.user_id == ^user.id)
|> Repo.all()
end
@doc """
Deletes a api_key.
## Examples
iex> delete_api_key(api_key)
{:ok, %ApiKey{}}
iex> delete_api_key(api_key)
{:error, %Ecto.Changeset{}}
"""
def delete_api_key(%ApiKey{} = api_key) do
Repo.delete(api_key)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking api_key changes.
## Examples
iex> change_api_key(api_key)
%Ecto.Changeset{data: %ApiKey{}}
"""
def change_api_key(%ApiKey{} = api_key, attrs \\ %{}) do
ApiKey.changeset(api_key, attrs)
end
@doc """
Validates an API key token and returns associated user.
Returns nil if token is invalid
"""
def authenticate_api_key(token) when is_binary(token) do
case get_api_key_by_token(token) do
%ApiKey{} = key -> Repo.preload(key, :user).user
nil -> nil
end
end
end