|
| 1 | +defmodule SentinelCpWeb.GraphQL.Resolvers.Rollouts do |
| 2 | + @moduledoc false |
| 3 | + alias SentinelCp.Audit |
| 4 | + alias SentinelCp.Rollouts |
| 5 | + |
| 6 | + def list(_parent, %{project_id: project_id}, _resolution) do |
| 7 | + {:ok, Rollouts.list_rollouts(project_id)} |
| 8 | + end |
| 9 | + |
| 10 | + def list_for_project(project, _args, _resolution) do |
| 11 | + {:ok, Rollouts.list_rollouts(project.id)} |
| 12 | + end |
| 13 | + |
| 14 | + def create(_parent, %{input: input}, %{context: context}) do |
| 15 | + case Rollouts.create_rollout(input) do |
| 16 | + {:ok, rollout} -> |
| 17 | + audit(context, "create", "rollout", rollout.id, rollout.project_id) |
| 18 | + {:ok, rollout} |
| 19 | + |
| 20 | + {:error, %Ecto.Changeset{} = changeset} -> |
| 21 | + {:error, format_errors(changeset)} |
| 22 | + |
| 23 | + {:error, reason} -> |
| 24 | + {:error, to_string(reason)} |
| 25 | + end |
| 26 | + end |
| 27 | + |
| 28 | + def pause(_parent, %{id: id}, %{context: context}) do |
| 29 | + with_rollout(id, fn rollout -> |
| 30 | + case Rollouts.pause_rollout(rollout) do |
| 31 | + {:ok, updated} -> |
| 32 | + audit(context, "pause", "rollout", id, rollout.project_id) |
| 33 | + {:ok, updated} |
| 34 | + |
| 35 | + {:error, reason} -> |
| 36 | + {:error, to_string(reason)} |
| 37 | + end |
| 38 | + end) |
| 39 | + end |
| 40 | + |
| 41 | + def resume(_parent, %{id: id}, %{context: context}) do |
| 42 | + with_rollout(id, fn rollout -> |
| 43 | + case Rollouts.resume_rollout(rollout) do |
| 44 | + {:ok, updated} -> |
| 45 | + audit(context, "resume", "rollout", id, rollout.project_id) |
| 46 | + {:ok, updated} |
| 47 | + |
| 48 | + {:error, reason} -> |
| 49 | + {:error, to_string(reason)} |
| 50 | + end |
| 51 | + end) |
| 52 | + end |
| 53 | + |
| 54 | + def resolve_progress(rollout, _args, _resolution) do |
| 55 | + {:ok, Rollouts.get_rollout_progress(rollout.id)} |
| 56 | + end |
| 57 | + |
| 58 | + defp with_rollout(id, fun) do |
| 59 | + case Rollouts.get_rollout(id) do |
| 60 | + nil -> {:error, "Rollout not found"} |
| 61 | + rollout -> fun.(rollout) |
| 62 | + end |
| 63 | + end |
| 64 | + |
| 65 | + defp audit(context, action, resource_type, resource_id, project_id) do |
| 66 | + if api_key = context[:current_api_key] do |
| 67 | + Audit.log_api_key_action(api_key, action, resource_type, resource_id, |
| 68 | + project_id: project_id |
| 69 | + ) |
| 70 | + end |
| 71 | + end |
| 72 | + |
| 73 | + defp format_errors(changeset) do |
| 74 | + Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} -> |
| 75 | + Regex.replace(~r"%{(\w+)}", msg, fn _, key -> |
| 76 | + opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() |
| 77 | + end) |
| 78 | + end) |
| 79 | + |> Enum.map_join("; ", fn {field, errors} -> "#{field}: #{Enum.join(errors, ", ")}" end) |
| 80 | + end |
| 81 | +end |
0 commit comments