Browse Source

federation_status: New endpoint showing unreachable instances

2298-weird-follow-issue
Haelwenn (lanodan) Monnier 3 years ago
parent
commit
3b5a7a6b14
No known key found for this signature in database GPG Key ID: D5B7A8E43C997DEE
5 changed files with 72 additions and 0 deletions
  1. +1
    -0
      lib/pleroma/instances.ex
  2. +11
    -0
      lib/pleroma/instances/instance.ex
  3. +19
    -0
      lib/pleroma/web/pleroma_api/controllers/instances_controller.ex
  4. +1
    -0
      lib/pleroma/web/router.ex
  5. +40
    -0
      test/pleroma/web/pleroma_api/controllers/instances_controller_test.exs

+ 1
- 0
lib/pleroma/instances.ex View File

@@ -11,6 +11,7 @@ defmodule Pleroma.Instances do
defdelegate reachable?(url_or_host), to: @adapter
defdelegate set_reachable(url_or_host), to: @adapter
defdelegate set_unreachable(url_or_host, unreachable_since \\ nil), to: @adapter
defdelegate get_consistently_unreachable(), to: @adapter

def set_consistently_unreachable(url_or_host),
do: set_unreachable(url_or_host, reachability_datetime_threshold())


+ 11
- 0
lib/pleroma/instances/instance.ex View File

@@ -119,6 +119,17 @@ defmodule Pleroma.Instances.Instance do

def set_unreachable(_, _), do: {:error, nil}

def get_consistently_unreachable do
reachability_datetime_threshold = Instances.reachability_datetime_threshold()

from(i in Instance,
where: ^reachability_datetime_threshold > i.unreachable_since,
order_by: i.unreachable_since,
select: {i.host, i.unreachable_since}
)
|> Repo.all()
end

defp parse_datetime(datetime) when is_binary(datetime) do
NaiveDateTime.from_iso8601(datetime)
end


+ 19
- 0
lib/pleroma/web/pleroma_api/controllers/instances_controller.ex View File

@@ -0,0 +1,19 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.PleromaAPI.InstancesController do
use Pleroma.Web, :controller

alias Pleroma.Instances

# defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaInstancesController

def show(conn, _params) do
unreachable =
Instances.get_consistently_unreachable()
|> Enum.reduce(%{}, fn {host, date}, acc -> Map.put(acc, host, to_string(date)) end)

json(conn, %{"unreachable" => unreachable})
end
end

+ 1
- 0
lib/pleroma/web/router.ex View File

@@ -373,6 +373,7 @@ defmodule Pleroma.Web.Router do
scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do
pipe_through(:api)
get("/accounts/:id/scrobbles", ScrobbleController, :index)
get("/federation_status", InstancesController, :show)
end

scope "/api/v1", Pleroma.Web.MastodonAPI do


+ 40
- 0
test/pleroma/web/pleroma_api/controllers/instances_controller_test.exs View File

@@ -0,0 +1,40 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.PleromaApi.InstancesControllerTest do
use Pleroma.Web.ConnCase

alias Pleroma.Instances

setup_all do: clear_config([:instance, :federation_reachability_timeout_days], 1)

setup do
constant = "http://consistently-unreachable.name/"
eventual = "http://eventually-unreachable.com/path"

{:ok, %Pleroma.Instances.Instance{unreachable_since: constant_unreachable}} =
Instances.set_consistently_unreachable(constant)

_eventual_unrechable = Instances.set_unreachable(eventual)

%{constant_unreachable: constant_unreachable, constant: constant}
end

test "GET /api/v1/pleroma/federation_status", %{
conn: conn,
constant_unreachable: constant_unreachable,
constant: constant
} do
constant_host = URI.parse(constant).host

assert conn
|> put_req_header("content-type", "application/json")
|> get("/api/v1/pleroma/federation_status")
|> json_response(200) == %{
"unreachable" => %{constant_host => to_string(constant_unreachable)}
}

# |> json_response_and_validate_schema(200)
end
end

Loading…
Cancel
Save