defmodule GlificWeb.Resolvers.Extensions do @moduledoc """ Extensions Resolver which sits between the GraphQL schema and Glific Extensions API. """ alias Glific.{Extensions.Extension, Repo} @doc """ Get a specific extension by id """ @spec extension(Absinthe.Resolution.t(), map(), %{context: map()}) :: {:ok, any} | {:error, any} def extension(_, %{id: id}, _) do with {:ok, extension} <- Repo.fetch_by(Extension, %{id: id}, skip_organization_id: true), do: {:ok, %{extension: extension}} end @doc false @spec get_organization_extension(Absinthe.Resolution.t(), map(), %{context: map()}) :: {:ok, any} | {:error, any} def get_organization_extension(_, %{client_id: client_id}, _) do with {:ok, extension} <- Repo.fetch_by(Extension, %{organization_id: client_id}, skip_organization_id: true), do: {:ok, %{extension: extension}} end @doc """ Create extension """ @spec create_extension(Absinthe.Resolution.t(), %{input: map()}, %{context: map()}) :: {:ok, any} | {:error, any} def create_extension(_, %{input: params}, _) do updated_params = Glific.substitute_organization_id(params, params.client_id, :client_id) with {:ok, extension} <- Extension.create_extension(updated_params) do {:ok, %{extension: extension}} end end @doc """ Update extension """ @spec update_extension(Absinthe.Resolution.t(), %{id: integer, input: map()}, %{ context: map() }) :: {:ok, any} | {:error, any} def update_extension(_, %{id: id, input: params}, _) do updated_params = Glific.substitute_organization_id(params, params.client_id, :client_id) with {:ok, extension} <- Repo.fetch_by(Extension, %{id: id}), {:ok, extension} <- Extension.update_extension( extension, Map.put(updated_params, :module, extension.module) ) do {:ok, %{extension: extension}} end end @doc """ Update organization extension """ @spec update_organization_extension(Absinthe.Resolution.t(), map(), %{ context: map() }) :: {:ok, any} | {:error, any} def update_organization_extension(_, %{client_id: client_id, input: params}, _) do updated_params = Glific.substitute_organization_id(params, params.client_id, :client_id) with {:ok, extension} <- Repo.fetch_by(Extension, %{organization_id: client_id}), {:ok, extension} <- Extension.update_extension( extension, Map.put(updated_params, :module, extension.module) ) do {:ok, %{extension: extension}} end end @doc """ Delete consulting hour """ @spec delete_extension(Absinthe.Resolution.t(), map(), %{ context: map() }) :: {:ok, any} | {:error, any} def delete_extension(_, %{id: id}, _) do with {:ok, extension} <- Repo.fetch_by(Extension, %{id: id}, skip_organization_id: true), {:ok, extension} <- Extension.delete_extension(extension) do {:ok, %{extension: extension}} end end end