133 lines
2.5 KiB
Elixir
133 lines
2.5 KiB
Elixir
|
|
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
|