Files
Ricardo 2c0cfffd54 feat: add Mastodon Client API layer for Phanpy/Elk compatibility
Implement the Mastodon Client REST API (/api/v1/*, /api/v2/*) and OAuth2
server within the ActivityPub plugin, enabling Mastodon-compatible clients
to connect to the Fedify-based server.

Core features:
- OAuth2 with PKCE (S256) — app registration, authorization, token exchange
- Instance info + nodeinfo for client discovery
- Account lookup, verification, relationships, follow/unfollow/mute/block
- Home/public/hashtag timelines with cursor-based pagination
- Status viewing, creation, deletion, thread context
- Favourite, boost, bookmark interactions with AP federation
- Notifications with type filtering and pagination
- Search across accounts, statuses, and hashtags
- Markers for read position tracking
- Bookmarks and favourites collection lists
- 25+ stub endpoints preventing client errors on unimplemented features

Architecture:
- 24 new files under lib/mastodon/ (entities, helpers, middleware, routes)
- Virtual endpoint at "/" via Indiekit.addEndpoint() for domain-root access
- CORS + JSON error handling for browser-based clients
- Six-layer mute/block filtering reusing existing moderation infrastructure

BREAKING CHANGE: bumps to v3.0.0 — adds new MongoDB collections
(ap_oauth_apps, ap_oauth_tokens, ap_markers) and new route registrations

Confab-Link: http://localhost:8080/sessions/5360e3f5-b3cc-4bf3-8c31-5448e2b23947
2026-03-18 12:50:52 +01:00

39 lines
1.1 KiB
JavaScript

/**
* Relationship entity serializer for Mastodon Client API.
*
* Represents the relationship between the authenticated user
* and another account.
*/
/**
* Serialize a Relationship entity.
*
* @param {string} id - Account ID
* @param {object} state - Relationship state
* @param {boolean} [state.following=false]
* @param {boolean} [state.followed_by=false]
* @param {boolean} [state.blocking=false]
* @param {boolean} [state.muting=false]
* @param {boolean} [state.requested=false]
* @returns {object} Mastodon Relationship entity
*/
export function serializeRelationship(id, state = {}) {
return {
id,
following: state.following || false,
showing_reblogs: state.following || false,
notifying: false,
languages: [],
followed_by: state.followed_by || false,
blocking: state.blocking || false,
blocked_by: false,
muting: state.muting || false,
muting_notifications: state.muting || false,
requested: state.requested || false,
requested_by: false,
domain_blocking: false,
endorsed: false,
note: "",
};
}