clacks/lib/mix/tasks/clacks/user.ex

44 lines
1.2 KiB
Elixir

defmodule Mix.Tasks.Clacks.User do
use Mix.Task
alias Clacks.{Repo, User, Actor, Keys, ActivityPub}
@shortdoc "Creates a new user"
def run(["create"]) do
username = IO.gets("Username: ") |> String.trim()
# password = IO.gets("Password: ") |> String.trim()
{:ok, pem} = Keys.generate_rsa_pem()
{:ok, _private, public} = Keys.keys_from_private_key_pem(pem)
{:ok, public_key_pem} = Keys.public_key_pem(public)
changeset = User.changeset(%User{}, %{username: username, private_key: pem})
# start the app so the DB connection is established
Mix.Task.run("app.start")
{:ok, user} = Repo.insert(changeset)
url = Application.get_env(:clacks, ClacksWeb.Endpoint)[:url]
uri =
URI.to_string(%URI{
scheme: url[:scheme],
host: url[:host],
port: url[:port],
path: Path.join("/users", username)
})
actor =
Ecto.build_assoc(user, :actor, %{
ap_id: uri,
nickname: username,
local: true,
data: ActivityPub.actor(uri, username, username, public_key_pem)
})
{:ok, actor} = Repo.insert(actor)
IO.puts("User #{username} successfully created")
end
end