Split GraphQL as separate context
This commit is contained in:
82
lib/graphql/resolvers/feed_token.ex
Normal file
82
lib/graphql/resolvers/feed_token.ex
Normal file
@@ -0,0 +1,82 @@
|
||||
defmodule Mobilizon.GraphQL.Resolvers.FeedToken do
|
||||
@moduledoc """
|
||||
Handles the feed tokens-related GraphQL calls.
|
||||
"""
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Events
|
||||
alias Mobilizon.Events.FeedToken
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
require Logger
|
||||
|
||||
@doc """
|
||||
Create an feed token for an user and a defined actor
|
||||
"""
|
||||
@spec create_feed_token(any, map, map) :: {:ok, FeedToken.t()} | {:error, String.t()}
|
||||
def create_feed_token(
|
||||
_parent,
|
||||
%{actor_id: actor_id},
|
||||
%{context: %{current_user: %User{id: id} = user}}
|
||||
) do
|
||||
with {:is_owned, %Actor{}} <- User.owns_actor(user, actor_id),
|
||||
{:ok, feed_token} <- Events.create_feed_token(%{"user_id" => id, "actor_id" => actor_id}) do
|
||||
{:ok, feed_token}
|
||||
else
|
||||
{:is_owned, nil} ->
|
||||
{:error, "Actor id is not owned by authenticated user"}
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Create an feed token for an user
|
||||
"""
|
||||
@spec create_feed_token(any, map, map) :: {:ok, FeedToken.t()}
|
||||
def create_feed_token(_parent, %{}, %{context: %{current_user: %User{id: id}}}) do
|
||||
with {:ok, feed_token} <- Events.create_feed_token(%{"user_id" => id}) do
|
||||
{:ok, feed_token}
|
||||
end
|
||||
end
|
||||
|
||||
@spec create_feed_token(any, map, map) :: {:error, String.t()}
|
||||
def create_feed_token(_parent, _args, %{}) do
|
||||
{:error, "You are not allowed to create a feed token if not connected"}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Delete a feed token
|
||||
"""
|
||||
@spec delete_feed_token(any, map, map) :: {:ok, map} | {:error, String.t()}
|
||||
def delete_feed_token(
|
||||
_parent,
|
||||
%{token: token},
|
||||
%{context: %{current_user: %User{id: id} = _user}}
|
||||
) do
|
||||
with {:ok, token} <- Ecto.UUID.cast(token),
|
||||
{:no_token, %FeedToken{actor: actor, user: %User{} = user} = feed_token} <-
|
||||
{:no_token, Events.get_feed_token(token)},
|
||||
{:token_from_user, true} <- {:token_from_user, id == user.id},
|
||||
{:ok, _} <- Events.delete_feed_token(feed_token) do
|
||||
res = %{user: %{id: id}}
|
||||
res = if is_nil(actor), do: res, else: Map.put(res, :actor, %{id: actor.id})
|
||||
{:ok, res}
|
||||
else
|
||||
{:error, nil} ->
|
||||
{:error, "No such feed token"}
|
||||
|
||||
:error ->
|
||||
{:error, "Token is not a valid UUID"}
|
||||
|
||||
{:no_token, _} ->
|
||||
{:error, "Token does not exist"}
|
||||
|
||||
{:token_from_user, false} ->
|
||||
{:error, "You don't have permission to delete this token"}
|
||||
end
|
||||
end
|
||||
|
||||
@spec delete_feed_token(any, map, map) :: {:error, String.t()}
|
||||
def delete_feed_token(_parent, _args, %{}) do
|
||||
{:error, "You are not allowed to delete a feed token if not connected"}
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user