Current section
Files
Jump to
Current section
Files
lib/dryad/controllers/service_accounts.ex
defmodule Dryad.Controllers.ServiceAccounts do
alias Blossom.Passwords
alias Dryad.Controllers.ServiceAccounts
alias KilnCore.Utils
def make_user(params, user, users) do
%{
"email" => "#{params["name"]}@local",
"username" => params["name"]
}
|> Map.put_new("id", params["user_id"])
|> users.new(user)
end
def account_params(params, account_user, secret) do
params
|> Map.put("user", account_user.id)
|> Map.put("secret", Passwords.hash(secret))
end
def put_new_secret(outcome, secret) do
case outcome do
{:ok, account} ->
{:ok, Map.put(account, :generated_secret, secret)}
{:error, _} = e ->
e
end
end
def make_account(params, account_user, user, ctx) do
secret = ctx[:auth].generate_password()
params
|> ServiceAccounts.account_params(account_user, secret)
|> ctx[:model].new(user)
|> ServiceAccounts.put_new_secret(secret)
end
def new(params, user, ctx) do
case ServiceAccounts.make_user(params, user, ctx[:users]) do
{:ok, account_user} ->
ServiceAccounts.make_account(params, account_user, user, ctx)
{:error, _} = e ->
e
end
end
def delete(id, user, ctx) do
service_account = List.first(ctx[:model].show(id, user))
case ctx[:model].delete(id, user) do
{1, nil} -> ctx[:users].delete(service_account.user, user)
{0, nil} -> {:error, :forbidden}
e -> e
end
end
def generate_jwt(service_account, auth) do
auth.generate_jwt(service_account.users)
end
defmacro __using__(opts \\ []) do
quote do
use KilnCore.Controller, unquote(opts)
@auth Utils.option_or_mod_replace(
@caller,
unquote(opts),
:auth,
Auth,
1,
0..1
)
@users Utils.option_or_mod_replace(
@model,
unquote(opts),
:users,
Users,
2
)
@ctx [auth: @auth, model: @model, users: @users]
def new(params, user, _opts) do
ServiceAccounts.new(params, user, @ctx)
end
def delete(id, user, _opts) do
ServiceAccounts.delete(id, user, @ctx)
end
def generate_jwt(service_account) do
ServiceAccounts.generate_jwt(service_account, @auth)
end
defoverridable delete: 3, new: 3
end
end
end