diff --git a/js/src/views/Discussions/Create.vue b/js/src/views/Discussions/Create.vue index adec42d16..f7ff343e2 100644 --- a/js/src/views/Discussions/Create.vue +++ b/js/src/views/Discussions/Create.vue @@ -3,7 +3,11 @@

{{ $t("Create a discussion") }}

- + @@ -64,7 +68,10 @@ export default class CreateDiscussion extends Vue { discussion = { title: "", text: "" }; + errors = { title: "" }; + async createDiscussion(): Promise { + this.errors = { title: "" }; try { if (!this.group.id || !this.currentActor.id) return; const { data } = await this.$apollo.mutate({ @@ -86,7 +93,11 @@ export default class CreateDiscussion extends Vue { } catch (error) { console.error(error); if (error.graphQLErrors && error.graphQLErrors.length > 0) { - this.$notifier.error(error.graphQLErrors[0].message); + if (error.graphQLErrors[0].field == "title") { + this.errors.title = error.graphQLErrors[0].message; + } else { + this.$notifier.error(error.graphQLErrors[0].message); + } } } } diff --git a/lib/federation/activity_pub/types/discussions.ex b/lib/federation/activity_pub/types/discussions.ex index f57af16e7..f9b615d68 100644 --- a/lib/federation/activity_pub/types/discussions.ex +++ b/lib/federation/activity_pub/types/discussions.ex @@ -7,6 +7,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do alias Mobilizon.Federation.ActivityPub.Audience alias Mobilizon.Federation.ActivityPub.Types.Entity alias Mobilizon.Federation.ActivityStream.Convertible + alias Mobilizon.GraphQL.API.Utils, as: APIUtils alias Mobilizon.Service.Activity.Discussion, as: DiscussionActivity alias Mobilizon.Web.Endpoint import Mobilizon.Federation.ActivityPub.Utils, only: [make_create_data: 2, make_update_data: 2] @@ -17,7 +18,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do @impl Entity @spec create(map(), map()) :: {:ok, map()} def create(%{discussion_id: discussion_id} = args, additional) when not is_nil(discussion_id) do - with %Discussion{} = discussion <- Discussions.get_discussion(discussion_id), + with args <- prepare_args(args), + %Discussion{} = discussion <- Discussions.get_discussion(discussion_id), {:ok, %Discussion{last_comment_id: last_comment_id} = discussion} <- Discussions.reply_to_discussion(discussion, args), {:ok, _} <- @@ -39,7 +41,8 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do @impl Entity @spec create(map(), map()) :: {:ok, map()} def create(args, additional) do - with {:ok, %Discussion{} = discussion} <- + with args <- prepare_args(args), + {:ok, %Discussion{} = discussion} <- Discussions.create_discussion(args), {:ok, _} <- DiscussionActivity.insert_activity(discussion, subject: "discussion_created"), @@ -118,4 +121,18 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Discussions do :ok end + + defp prepare_args(args) do + {text, _mentions, _tags} = + APIUtils.make_content_html( + args |> Map.get(:text, "") |> String.trim(), + # Can't put additional tags on a comment + [], + "text/html" + ) + + args + |> Map.update(:title, "", &String.trim/1) + |> Map.put(:text, text) + end end diff --git a/lib/graphql/resolvers/discussion.ex b/lib/graphql/resolvers/discussion.ex index cfe4f5b7b..328b0d718 100644 --- a/lib/graphql/resolvers/discussion.ex +++ b/lib/graphql/resolvers/discussion.ex @@ -104,6 +104,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do }) do {:ok, discussion} else + {:error, :discussion, err, _} -> + {:error, err} + {:member, false} -> {:error, :unauthorized} end diff --git a/lib/mobilizon/discussions/discussion.ex b/lib/mobilizon/discussions/discussion.ex index 8e06b3294..99ac93795 100644 --- a/lib/mobilizon/discussions/discussion.ex +++ b/lib/mobilizon/discussions/discussion.ex @@ -28,6 +28,7 @@ defmodule Mobilizon.Discussions.Discussion do alias Mobilizon.Discussions.Discussion.TitleSlug alias Mobilizon.Web.Endpoint alias Mobilizon.Web.Router.Helpers, as: Routes + import Mobilizon.Web.Gettext, only: [dgettext: 2] @type t :: %__MODULE__{ creator: Actor.t(), @@ -63,7 +64,7 @@ defmodule Mobilizon.Discussions.Discussion do discussion |> cast(attrs, @attrs) |> maybe_generate_id() - |> validate_required([:title, :id]) + |> validate_required([:title, :id], message: dgettext("errors", "can't be blank")) |> TitleSlug.maybe_generate_slug() |> TitleSlug.unique_constraint() |> maybe_generate_url()