Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
7 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex b/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
index 77aaf7f29..00d0194af 100644
--- a/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
@@ -1,107 +1,107 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.ObjectValidators.TagValidator do
use Ecto.Schema
alias Pleroma.EctoType.ActivityPub.ObjectValidators
import Ecto.Changeset
@primary_key false
embedded_schema do
# Common
field(:type, :string)
field(:name, :string)
# Mention, Hashtag
field(:href, ObjectValidators.Uri)
# Emoji
embeds_one :icon, IconObjectValidator, primary_key: false do
field(:type, :string)
field(:url, ObjectValidators.Uri)
end
field(:updated, ObjectValidators.DateTime)
field(:id, ObjectValidators.Uri)
end
def cast_and_validate(data) do
data
|> cast_data()
end
def cast_data(data) do
%__MODULE__{}
|> changeset(data)
end
def changeset(struct, %{"type" => "Mention"} = data) do
struct
|> cast(data, [:type, :name, :href])
|> validate_required([:type, :href])
end
def changeset(struct, %{"type" => "Hashtag", "name" => name} = data) do
name =
cond do
"#" <> name -> name
name -> name
end
|> String.downcase()
data = Map.put(data, "name", name)
struct
|> cast(data, [:type, :name, :href])
|> validate_required([:type, :name])
end
def changeset(struct, %{"type" => "Emoji"} = data) do
data = Map.put(data, "name", String.trim(data["name"], ":"))
struct
|> cast(data, [:type, :name, :updated, :id])
|> cast_embed(:icon, with: &icon_changeset/2)
|> validate_required([:type, :name, :icon])
end
def changeset(struct, %{"type" => "Book"} = data) do
data = Map.put(data, "name", data["title"])
struct
|> cast(data, [:type, :name])
|> validate_required([:type, :name])
end
def changeset(struct, %{"type" => "Edition"} = data) do
- data = Map.put(data, "name", data["work"])
+ data = Map.put(data, "name", data["title"])
struct
|> cast(data, [:type, :name])
|> validate_required([:type, :name])
end
def changeset(struct, %{"type" => "Work"} = data) do
- data = Map.put(data, "name", data["lccn"])
+ data = Map.put(data, "name", data["title"])
struct
|> cast(data, [:type, :name])
|> validate_required([:type, :name])
end
def changeset(struct, %{"type" => "Author"} = data) do
struct
|> cast(data, [:type, :name])
|> validate_required([:type, :name])
end
def icon_changeset(struct, data) do
struct
|> cast(data, [:type, :url])
|> validate_inclusion(:type, ~w[Image])
|> validate_required([:type, :url])
end
end
diff --git a/test/pleroma/web/activity_pub/object_validators/tag_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/tag_validator_test.exs
new file mode 100644
index 000000000..bca7a32b9
--- /dev/null
+++ b/test/pleroma/web/activity_pub/object_validators/tag_validator_test.exs
@@ -0,0 +1,112 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.ObjectValidators.TagValidatorTest do
+ use Pleroma.DataCase, async: true
+
+ alias Pleroma.Web.ActivityPub.ObjectValidators.TagValidator
+
+ test "it validates an Edition" do
+ edition = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "asin" => "",
+ "authors" => ["https://bookwyrm.com/author/3"],
+ "cover" => %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "name" => "Piranesi (2020, Bloomsbury Publishing)",
+ "type" => "Document",
+ "url" => "https://bookwyrm.com/images/covers/9fd28af7-ebb8-4df3-80c8-28488fc5349f.jpeg"
+ },
+ "description" => "",
+ "editionRank" => 7,
+ "firstPublishedDate" => "",
+ "goodreadsKey" => "",
+ "id" => "https://bookwyrm.com/book/10",
+ "isbn10" => "163557563X",
+ "isbn13" => "9781635575637",
+ "languages" => ["English"],
+ "librarythingKey" => "",
+ "oclcNumber" => "",
+ "openlibraryKey" => "OL28300471M",
+ "pages" => 272,
+ "physicalFormat" => "",
+ "physicalFormatDetail" => "hardcover",
+ "publishedDate" => "2020-09-15T00:00:00+00:00",
+ "publishers" => ["Bloomsbury Publishing"],
+ "series" => "",
+ "seriesNumber" => "",
+ "sortTitle" => "",
+ "subjectPlaces" => [],
+ "subjects" => [],
+ "subtitle" => "",
+ "title" => "Piranesi",
+ "type" => "Edition",
+ "work" => "https://bookwyrm.com/book/9"
+ }
+
+ assert %{valid?: true, changes: %{name: "Piranesi"}} = TagValidator.cast_and_validate(edition)
+ end
+
+ test "it should validate an author" do
+ author = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "aliases" => [],
+ "bio" => "snipped",
+ "bnfId" => "14603397h",
+ "born" => "1959-11-01T00:00:00+00:00",
+ "goodreadsKey" => "",
+ "id" => "https://bookwyrm.com/author/3",
+ "isni" => "0000 0001 0877 1086",
+ "librarythingKey" => "",
+ "name" => "Susanna Clarke",
+ "openlibraryKey" => "OL1387961A",
+ "type" => "Author",
+ "viafId" => "19931023",
+ "wikipediaLink" => ""
+ }
+
+ assert %{valid?: true, changes: %{name: "Susanna Clarke"}} =
+ TagValidator.cast_and_validate(author)
+ end
+
+ test "it should validate a work" do
+ work = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "authors" => ["https://bookwyrm.com/author/3"],
+ "cover" => %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "name" => "Piranesi",
+ "type" => "Document",
+ "url" => "https://bookwyrm.com/images/covers/e950ac10-feaf-4c3e-b2d3-de20d3a28329.jpeg"
+ },
+ "description" => "snipped",
+ "editions" => [
+ "https://bookwyrm.com/book/12",
+ "https://bookwyrm.com/book/10",
+ "https://bookwyrm.com/book/14",
+ "https://bookwyrm.com/book/13",
+ "https://bookwyrm.com/book/11",
+ "https://bookwyrm.com/book/15"
+ ],
+ "firstPublishedDate" => "",
+ "goodreadsKey" => "",
+ "id" => "https://bookwyrm.com/book/9",
+ "languages" => [],
+ "lccn" => "",
+ "librarythingKey" => "",
+ "openlibraryKey" => "OL20893680W",
+ "publishedDate" => "",
+ "series" => "",
+ "seriesNumber" => "",
+ "sortTitle" => "",
+ "subjectPlaces" => [],
+ "subjects" => ["English literature"],
+ "subtitle" => "",
+ "title" => "Piranesi",
+ "type" => "Work"
+ }
+
+ assert %{valid?: true, changes: %{name: "Piranesi"}} = TagValidator.cast_and_validate(work)
+ end
+end

File Metadata

Mime Type
text/x-diff
Expires
Fri, Oct 30, 2:18 AM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1799199
Default Alt Text
(7 KB)

Event Timeline