fix emoji tests
[akkoma] / lib / pleroma / elasticsearch / store.ex
index 2d8aeabc29d539708c2755494ff38889e92b1de6..98c88a7c722f70149ed41809d6167565f910af5e 100644 (file)
@@ -1,6 +1,11 @@
+# Akkoma: A lightweight social networking server
+# Copyright © 2022-2022 Akkoma Authors <https://git.ihatebeinga.live/IHBAGang/akkoma/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Elasticsearch do
   alias Pleroma.Activity
   alias Pleroma.User
+  alias Pleroma.Object
   alias Pleroma.Elasticsearch.DocumentMappings
   alias Pleroma.Config
   require Logger
@@ -13,6 +18,12 @@ defmodule Pleroma.Elasticsearch do
     Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch
   end
 
+  def delete_by_id(:activity, id) do
+    if enabled?() do
+      Elastix.Document.delete(url(), "activities", "activity", id)
+    end
+  end
+
   def put_by_id(:activity, id) do
     id
     |> Activity.get_by_id_with_object()
@@ -35,7 +46,7 @@ defmodule Pleroma.Elasticsearch do
     end
   end
 
-  def maybe_put_into_elasticsearch(%User{} = user) do
+  def maybe_put_into_elasticsearch(%User{actor_type: "Person"} = user) do
     if enabled?() do
       put(user)
     end
@@ -45,27 +56,50 @@ defmodule Pleroma.Elasticsearch do
     {:ok, :skipped}
   end
 
+  def maybe_bulk_post(data, type) do
+    if enabled?() do
+      bulk_post(data, type)
+    end
+  end
+
   def put(%Activity{} = activity) do
-    {:ok, _} = Elastix.Document.index(
-      url(),
-      "activities",
-      "activity",
-      DocumentMappings.Activity.id(activity),
-      DocumentMappings.Activity.encode(activity)
-    )
-    {:ok, _} = bulk_post(
-        activity.object.hashtags, :hashtags
-    )
+    with {:ok, _} <-
+           Elastix.Document.index(
+             url(),
+             "activities",
+             "activity",
+             DocumentMappings.Activity.id(activity),
+             DocumentMappings.Activity.encode(activity)
+           ) do
+      activity
+      |> Map.get(:object)
+      |> Object.hashtags()
+      |> Enum.map(fn x ->
+        %{id: x, name: x, timestamp: DateTime.to_iso8601(DateTime.utc_now())}
+      end)
+      |> bulk_post(:hashtags)
+    else
+      {:error, %{reason: err}} ->
+        Logger.error("Could not put activity: #{err}")
+        :skipped
+    end
   end
 
   def put(%User{} = user) do
-    {:ok, _ } = Elastix.Document.index(
-      url(),
-      "users",
-      "user",
-      DocumentMappings.User.id(user),
-      DocumentMappings.User.encode(user)
-    )
+    with {:ok, _} <-
+           Elastix.Document.index(
+             url(),
+             "users",
+             "user",
+             DocumentMappings.User.id(user),
+             DocumentMappings.User.encode(user)
+           ) do
+      :ok
+    else
+      {:error, %{reason: err}} ->
+        Logger.error("Could not put user: #{err}")
+        :skipped
+    end
   end
 
   def bulk_post(data, :activities) do
@@ -87,17 +121,28 @@ defmodule Pleroma.Elasticsearch do
       end)
       |> List.flatten()
 
-    {:ok, %{body: %{"errors" => false}}} = Elastix.Bulk.post(
-      url(),
-      d,
-      index: "activities",
-      type: "activity"
-    )
+    with {:ok, %{body: %{"errors" => false}}} <-
+           Elastix.Bulk.post(
+             url(),
+             d,
+             index: "activities",
+             type: "activity"
+           ) do
+      :ok
+    else
+      {:error, %{reason: err}} ->
+        Logger.error("Could not bulk put activity: #{err}")
+        :skipped
+
+      {:ok, %{body: _}} ->
+        :skipped
+    end
   end
 
   def bulk_post(data, :users) do
     d =
       data
+      |> Enum.filter(fn x -> x.actor_type == "Person" end)
       |> Enum.map(fn d ->
         [
           %{index: %{_id: DocumentMappings.User.id(d)}},
@@ -106,15 +151,25 @@ defmodule Pleroma.Elasticsearch do
       end)
       |> List.flatten()
 
-    Elastix.Bulk.post(
-      url(),
-      d,
-      index: "users",
-      type: "user"
-    )
+    with {:ok, %{body: %{"errors" => false}}} <-
+           Elastix.Bulk.post(
+             url(),
+             d,
+             index: "users",
+             type: "user"
+           ) do
+      :ok
+    else
+      {:error, %{reason: err}} ->
+        Logger.error("Could not bulk put users: #{err}")
+        :skipped
+
+      {:ok, %{body: _}} ->
+        :skipped
+    end
   end
 
-  def bulk_post(data, :hashtags) do
+  def bulk_post(data, :hashtags) when is_list(data) do
     d =
       data
       |> Enum.map(fn d ->
@@ -125,14 +180,28 @@ defmodule Pleroma.Elasticsearch do
       end)
       |> List.flatten()
 
-    Elastix.Bulk.post(
-      url(),
-      d,
-      index: "hashtags",
-      type: "hashtag"
-    )
+    with {:ok, %{body: %{"errors" => false}}} <-
+           Elastix.Bulk.post(
+             url(),
+             d,
+             index: "hashtags",
+             type: "hashtag"
+           ) do
+      :ok
+    else
+      {:error, %{reason: err}} ->
+        Logger.error("Could not bulk put hashtags: #{err}")
+        :skipped
+
+      {:ok, %{body: _}} ->
+        :skipped
+    end
   end
 
+  def bulk_post(_, :hashtags), do: {:ok, nil}
+
+  def search(_, _, _, :skip), do: []
+
   def search(:raw, index, type, q) do
     with {:ok, raw_results} <- Elastix.Search.search(url(), index, [type], q) do
       results =
@@ -154,6 +223,7 @@ defmodule Pleroma.Elasticsearch do
       results
       |> Enum.map(fn result -> result["_id"] end)
       |> Pleroma.Activity.all_by_ids_with_object()
+      |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
     else
       e ->
         Logger.error(e)