Current section
Files
Jump to
Current section
Files
lib/mix/tasks/coolify.status.ex
defmodule Mix.Tasks.Coolify.Status do
use Mix.Task
@shortdoc "Fetches deployment status from Coolify"
alias CoolifyEx
alias CoolifyEx.Client
alias CoolifyEx.MixTaskSupport
@moduledoc """
Fetches a deployment by UUID or resolves the latest deployment for a project.
mix coolify.status DEPLOYMENT_UUID
mix coolify.status --project web --latest
"""
@impl Mix.Task
def run(args) do
MixTaskSupport.ensure_started!()
{opts, argv, _invalid} =
OptionParser.parse(args,
strict: [
project: :string,
app: :string,
app_uuid: :string,
config: :string,
latest: :boolean
]
)
config = MixTaskSupport.load_config!(opts, "Could not fetch deployment status")
case resolve_deployment_uuid(config, argv, opts) do
{:ok, {deployment_uuid, project_name}} ->
fetch_and_print_status(config, deployment_uuid, project_name)
{:error, :usage} ->
Mix.raise(
"Usage: mix coolify.status DEPLOYMENT_UUID [--config path] or mix coolify.status --project PROJECT --latest"
)
{:error, reason} ->
Mix.raise(
"Could not fetch deployment status: #{MixTaskSupport.format_lookup_error(reason)}"
)
end
end
defp fetch_and_print_status(config, deployment_uuid, project_name) do
case Client.fetch_deployment(config.base_url, config.token, deployment_uuid) do
{:ok, deployment} ->
if project_name do
Mix.shell().info("Project: #{project_name}")
Mix.shell().info("Latest deployment: #{deployment.uuid}")
end
Mix.shell().info("Status: #{deployment.status}")
print_field("Commit", deployment.commit)
print_field("Created at", deployment.created_at)
print_field("Finished at", deployment.finished_at)
print_field("Commit message", deployment.commit_message)
print_logs_url(deployment.deployment_url)
{:error, reason} ->
Mix.raise(
"Could not fetch deployment status: #{MixTaskSupport.format_lookup_error(reason)}"
)
end
end
defp resolve_deployment_uuid(_config, [deployment_uuid], _opts),
do: {:ok, {deployment_uuid, nil}}
defp resolve_deployment_uuid(config, [], opts) do
if Keyword.get(opts, :latest, false) do
project_name = Keyword.get(opts, :project)
case CoolifyEx.fetch_latest_application_deployment(config, project_name, app_uuid_opt(opts)) do
{:ok, deployment} -> {:ok, {deployment.uuid, project_name}}
{:error, reason} -> {:error, reason}
end
else
{:error, :usage}
end
end
defp resolve_deployment_uuid(_config, _argv, _opts), do: {:error, :usage}
defp print_logs_url(nil), do: :ok
defp print_logs_url(url), do: Mix.shell().info("Logs: #{url}")
defp print_field(_label, nil), do: :ok
defp print_field(label, value), do: Mix.shell().info("#{label}: #{value}")
defp app_uuid_opt(opts) do
case Keyword.get(opts, :app_uuid) || Keyword.get(opts, :app) do
nil -> []
app_uuid -> [app_uuid: app_uuid]
end
end
end