feat: add blob-to-URL transformation for feed API responses master
Transform blob references to direct PDS URLs in feed responses, enabling clients to fetch thumbnails without complex blob resolution logic. **Blob Transform Module:** - TransformBlobRefsToURLs: Convert blob refs → PDS URLs in-place - transformThumbToURL: Extract CID and build getBlob URL - Handles external embeds only (social.coves.embed.external) - Graceful handling of missing/malformed data **Transform Logic:** ```go // Before (blob ref in database): "thumb": { "$type": "blob", "ref": {"$link": "bafyrei..."}, "mimeType": "image/jpeg", "size": 52813 } // After (URL string in API response): "thumb": "http://pds.example.com/xrpc/com.atproto.sync.getBlob?did=did:plc:community&cid=bafyrei..." ``` **Repository Updates:** - Add community_pds_url to all feed queries (feed_repo_base.go) - Include PDSURL in PostView.Community for transformation - Apply to: GetCommunityFeed, GetTimeline, GetDiscover **Handler Updates:** - Call TransformBlobRefsToURLs before returning posts - Applies to: social.coves.feed.getCommunityFeed - Applies to: social.coves.feed.getTimeline - Applies to: social.coves.feed.getDiscover **Comprehensive Tests** (13 test cases): - Valid blob ref → URL transformation - Missing thumb (no-op) - Already-transformed URL (no-op) - Nil post/community (no-op) - Missing/empty PDS URL (no-op) - Malformed blob refs (graceful) - Non-external embed types (ignored) **Why This Matters:** Clients receive ready-to-use image URLs instead of blob references, simplifying rendering and eliminating need for CID resolution logic. Works seamlessly with federated communities (each has own PDS URL). Fixes client-side rendering for external embeds with thumbnails.