Browse Source

Expose correct relay address in federation

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
chapril
Thomas Citharel 3 months ago
parent
commit
888d2ef4b8
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
  1. 1
      js/src/graphql/admin.ts
  2. 1
      js/src/types/instance.model.ts
  3. 6
      js/src/views/Admin/Instance.vue
  4. 8
      lib/graphql/resolvers/admin.ex
  5. 4
      lib/graphql/schema/admin.ex
  6. 10
      lib/mobilizon/actors/actors.ex

1
js/src/graphql/admin.ts

@ -74,6 +74,7 @@ export const INSTANCE_FRAGMENT = gql`
fragment InstanceFragment on Instance {
domain
hasRelay
relayAddress
followerStatus
followedStatus
eventCount

1
js/src/types/instance.model.ts

@ -3,6 +3,7 @@ import { InstanceFollowStatus } from "./enums";
export interface IInstance {
domain: string;
hasRelay: boolean;
relayAddress: string | null;
followerStatus: InstanceFollowStatus;
followedStatus: InstanceFollowStatus;
personCount: number;

6
js/src/views/Admin/Instance.vue

@ -162,7 +162,7 @@ export default class Instance extends Vue {
await this.$apollo.mutate({
mutation: ACCEPT_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({
@ -194,7 +194,7 @@ export default class Instance extends Vue {
await this.$apollo.mutate({
mutation: REJECT_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({
@ -242,7 +242,7 @@ export default class Instance extends Vue {
await this.$apollo.mutate({
mutation: REMOVE_RELAY,
variables: {
address: `relay@${this.domain}`,
address: this.instance.relayAddress,
},
update(cache: ApolloCache<any>) {
cache.writeFragment({

8
lib/graphql/resolvers/admin.ex

@ -468,12 +468,16 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
context: %{current_user: %User{role: role}}
})
when is_admin(role) do
has_relay = Actors.has_relay?(domain)
remote_relay = Actors.get_relay(domain)
local_relay = Relay.get_actor()
result = %{
has_relay: has_relay,
has_relay: !is_nil(remote_relay),
relay_address:
if(is_nil(remote_relay),
do: nil,
else: "#{remote_relay.preferred_username}@#{remote_relay.domain}"
),
follower_status: follow_status(remote_relay, local_relay),
followed_status: follow_status(local_relay, remote_relay)
}

4
lib/graphql/schema/admin.ex

@ -216,6 +216,10 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
description:
"Whether this instance has a relay, meaning that it's a Mobilizon instance that we can follow"
)
field(:relay_address, :string,
description: "If this instance has a relay, it's federated username"
)
end
@desc """

10
lib/mobilizon/actors/actors.ex

@ -1297,16 +1297,6 @@ defmodule Mobilizon.Actors do
:ok
end
@spec has_relay?(String.t()) :: boolean()
def has_relay?(domain) do
Actor
|> where(
[a],
a.preferred_username == "relay" and a.domain == ^domain and a.type == :Application
)
|> Repo.exists?()
end
@doc """
Returns a relay actor, either `relay@domain` (Mobilizon) or `domain@domain` (Mastodon)
"""

Loading…
Cancel
Save