feat(journal): outbound trails-to-trails follows (social-federation §6)
Tasks 6.1–6.6. A local user can follow a user on another trails instance: WebFinger-resolve the handle, verify the target runs trails.cool via NodeInfo — checked against the ACTOR IRI's host, never the handle's domain (split-domain constraint) — record a Pending follow row, deliver a signed Follow. The §4 inbox listeners already settle (Accept) or drop (Reject) the row. - federation-outbound.server.ts: followRemoteActor / cancelRemoteFollow (Undo delivery) / listOutgoingRemoteFollows. Network steps (lookup, NodeInfo, delivery) injectable for offline integration tests. Software allowlist: trails-cool. - /follows/outgoing: follow-by-handle form + pending/accepted list + cancel; linked from the feed empty state; i18n en+de. Remote actors have no local profile page, so the remote Pending state lives here (the profile Pending button from locked accounts covers local). - /.well-known/trails-cool now publishes software: trails-cool (6.2). - Clear 4xx codes: invalid_handle, local_handle, remote_resolve_failed, not_trails (6.3). - Tests: handle-parser + allowlist units; integration suite for the Pending lifecycle (create/idempotent/refuse-non-trails/refuse- unresolvable/own-host/cancel+Undo) with injected network deps; e2e anonymous-redirect guard for the new page. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
be53f6670a
commit
62b40a25f3
12 changed files with 703 additions and 7 deletions
|
|
@ -321,6 +321,19 @@ export default {
|
|||
count_other: "Folgt {{count}}",
|
||||
empty: "Folgt noch niemandem.",
|
||||
},
|
||||
outgoing: {
|
||||
heading: "Folgen über Instanzen hinweg",
|
||||
subtitle: "Folge Leuten auf anderen trails.cool-Instanzen. Anfragen bleiben ausstehend, bis ihre Instanz sie annimmt.",
|
||||
handleLabel: "Handle der Person",
|
||||
followButton: "Folgen",
|
||||
pendingBadge: "Ausstehend",
|
||||
acceptedBadge: "Folge ich",
|
||||
cancelRequest: "Anfrage zurückziehen",
|
||||
unfollow: "Entfolgen",
|
||||
empty: "Noch keine Follows auf anderen Instanzen. Gib oben ein Handle ein, um zu starten.",
|
||||
notTrails: "Ausgehende Föderation ist derzeit nur zwischen trails-Instanzen möglich — diese Instanz nutzt kein trails.cool.",
|
||||
disabled: "Föderation ist auf dieser Instanz nicht aktiviert.",
|
||||
},
|
||||
prevPage: "Zurück",
|
||||
nextPage: "Weiter",
|
||||
pageOfTotal: "Seite {{page}} von {{totalPages}}",
|
||||
|
|
@ -328,6 +341,7 @@ export default {
|
|||
title: "Feed",
|
||||
heading: "Folge ich",
|
||||
empty: "Du folgst noch niemandem. Stöbere Profile durch und klicke auf Folgen, um deinen Feed aufzubauen.",
|
||||
followRemote: "Folge jemandem auf einer anderen trails-Instanz →",
|
||||
seePublic: "Oder durchstöbere den öffentlichen Feed dieser Instanz →",
|
||||
toggle: {
|
||||
followed: "Folge ich",
|
||||
|
|
|
|||
|
|
@ -321,6 +321,19 @@ export default {
|
|||
count_other: "Following {{count}}",
|
||||
empty: "Not following anyone yet.",
|
||||
},
|
||||
outgoing: {
|
||||
heading: "Following across instances",
|
||||
subtitle: "Follow people on other trails.cool instances. Requests stay pending until their instance accepts.",
|
||||
handleLabel: "Their handle",
|
||||
followButton: "Follow",
|
||||
pendingBadge: "Pending",
|
||||
acceptedBadge: "Following",
|
||||
cancelRequest: "Cancel request",
|
||||
unfollow: "Unfollow",
|
||||
empty: "No follows on other instances yet. Enter a handle above to start.",
|
||||
notTrails: "Outbound federation is currently trails-to-trails only — that instance doesn't run trails.cool.",
|
||||
disabled: "Federation is not enabled on this instance.",
|
||||
},
|
||||
prevPage: "Previous",
|
||||
nextPage: "Next",
|
||||
pageOfTotal: "Page {{page}} of {{totalPages}}",
|
||||
|
|
@ -328,6 +341,7 @@ export default {
|
|||
title: "Feed",
|
||||
heading: "Following",
|
||||
empty: "You're not following anyone yet. Browse profiles and tap Follow to start building your feed.",
|
||||
followRemote: "Follow someone on another trails instance →",
|
||||
seePublic: "Or browse the instance public feed →",
|
||||
toggle: {
|
||||
followed: "Following",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue