2c0cfffd54
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
39 lines
1.2 KiB
JavaScript
39 lines
1.2 KiB
JavaScript
/**
|
|
* MediaAttachment entity serializer for Mastodon Client API.
|
|
*
|
|
* Converts stored media metadata to Mastodon MediaAttachment shape.
|
|
*/
|
|
|
|
/**
|
|
* Serialize a MediaAttachment entity.
|
|
*
|
|
* @param {object} media - Media document from ap_media collection
|
|
* @returns {object} Mastodon MediaAttachment entity
|
|
*/
|
|
export function serializeMediaAttachment(media) {
|
|
const type = detectMediaType(media.contentType || media.type || "");
|
|
|
|
return {
|
|
id: media._id ? media._id.toString() : media.id || "",
|
|
type,
|
|
url: media.url || "",
|
|
preview_url: media.thumbnailUrl || media.url || "",
|
|
remote_url: null,
|
|
text_url: media.url || "",
|
|
meta: media.meta || {},
|
|
description: media.description || media.alt || null,
|
|
blurhash: media.blurhash || null,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Map MIME type or simple type string to Mastodon media type.
|
|
*/
|
|
function detectMediaType(contentType) {
|
|
if (contentType.startsWith("image/") || contentType === "image") return "image";
|
|
if (contentType.startsWith("video/") || contentType === "video") return "video";
|
|
if (contentType.startsWith("audio/") || contentType === "audio") return "audio";
|
|
if (contentType.startsWith("image/gif")) return "gifv";
|
|
return "unknown";
|
|
}
|