fix buggos
[akkoma] / lib / pleroma / elasticsearch / store.ex
index 55c459801fe7bd1bba97a6c112bc16d0d886964a..f309bf7a5e484ca54652f0d30c8c159123383af9 100644 (file)
 defmodule Pleroma.Elasticsearch do
   alias Pleroma.Activity
   alias Pleroma.Elasticsearch.DocumentMappings
-
-  @searchable [
-    "hashtag", "instance", "user"
-  ]
+  alias Pleroma.Config
 
   defp url do
-    Pleroma.Config.get([:elasticsearch, :url])
+    Config.get([:elasticsearch, :url])
   end
 
-  def put(%Activity{} = activity) do
-    Elastix.Document.index(
-        url(),
-        "activities",
-        "activity",
-        DocumentMappings.Activity.id(activity),
-        DocumentMappings.Activity.encode(activity)
-    )
+  def put_by_id(id) do
+    id
+    |> Activity.get_by_id_with_object()
+    |> maybe_put_into_elasticsearch()
   end
 
-  def bulk_post(data, :activities) do
-    d = data
-    |> Enum.map(fn d ->
-        [
-            %{index: %{_id: DocumentMappings.Activity.id(d)}},
-            DocumentMappings.Activity.encode(d)
-        ]
-    end)
-    |> List.flatten()
-
-    Elastix.Bulk.post(
-        url(),
-        d,
-        index: "activities",
-        type: "activity"
-    )
+  def maybe_put_into_elasticsearch({:ok, activity}) do
+    maybe_put_into_elasticsearch(activity)
   end
 
-  defp parse_term(t) do
-    if String.contains?(t, ":") and !String.starts_with?(t, "\"") do
-      [field, query] = String.split(t, ":")
-      if Enum.member?(@searchable, field) do
-        {field, query}
-      else
-        {"content", query}
-      end
-    else
-        {"content", t}
-    end
-  end
+  def maybe_put_into_elasticsearch(%{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity) do
+    if Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch do
+      actor = Pleroma.Activity.user_actor(activity)
 
-  defp search_user(params, q) do
-    if q["user"] != nil do
-      params ++ [%{match: %{user: %{
-        query: Enum.join(q["user"], " "),
-        operator: "OR"
-      }}}]
-    else
-      params
+      activity
+      |> Map.put(:user_actor, actor)
+      |> put()
     end
   end
 
-  defp search_instance(params, q) do
-    if q["instance"] != nil do 
-      params ++ [%{match: %{instance: %{
-        query: Enum.join(q["instance"], " "),
-        operator: "OR"
-      }}}]
-    else
-      params
-    end
+  def maybe_put_into_elasticsearch(_) do
+    {:ok, :skipped}
   end
 
-  defp search_content(params, q) do
-    if q["content"] != nil do
-      params ++ [%{match: %{content: %{
-        query: Enum.join(q["content"], " "),
-        operator: "AND"
-      }}}]
-    else
-      params
-    end
- end
-  defp to_es(q) do
-    []
-    |> search_content(q)
-    |> search_instance(q)
-    |> search_user(q)
+  def put(%Activity{} = activity) do
+    Elastix.Document.index(
+      url(),
+      "activities",
+      "activity",
+      DocumentMappings.Activity.id(activity),
+      DocumentMappings.Activity.encode(activity)
+    )
   end
 
-  defp parse(query) do
-    String.split(query, " ")
-    |> Enum.map(&parse_term/1)
-    |> Enum.reduce(%{}, fn {field, query}, acc ->
-        Map.put(acc, field,
-            Map.get(acc, field, []) ++ [query]
-        )
-    end)
-    |> to_es()
+  def bulk_post(data, :activities) do
+    d =
+      data
+      |> Enum.map(fn d ->
+        [
+          %{index: %{_id: DocumentMappings.Activity.id(d)}},
+          DocumentMappings.Activity.encode(d)
+        ]
+      end)
+      |> List.flatten()
+
+    Elastix.Bulk.post(
+      url(),
+      d,
+      index: "activities",
+      type: "activity"
+    )
   end
-    
-  def search(query) do
-    q = %{query: %{
-      bool: %{
-        must: parse(query)
-      }
-    }}
-    IO.inspect(q)
+
+  def search_activities(q) do
     Elastix.Search.search(
-        url(),
-        "activities",
-        ["activity"],
-        q
+      url(),
+      "activities",
+      ["activity"],
+      q
     )
   end
 end