A community based topic aggregation platform built on atproto

feat: Implement identity resolution with cache and handle update system master

## Core Features ### Identity Resolution System (internal/atproto/identity/) - Implement DNS/HTTPS handle resolution using Bluesky Indigo library - Add DID document resolution via PLC directory - Create PostgreSQL-backed caching layer (24h TTL) - Support bidirectional caching (handle ↔ DID) - Add atomic cache purge with single-query CTE optimization ### Database Schema - Add identity_cache table with timezone-aware timestamps - Support handle normalization via database trigger - Enable automatic expiry checking ### Handle Update System - Add UpdateHandle method to UserService and UserRepository - Implement handle change detection in Jetstream consumer - Update database BEFORE purging cache (prevents race condition) - Purge BOTH old handle and DID entries on handle changes - Add structured logging for cache operations ### Bug Fixes - Fix timezone bugs throughout codebase (use UTC consistently) - Fix rate limiter timestamp handling - Resolve pre-existing test isolation bug in identity cache tests - Fix Makefile test command to exclude restricted directories ### Testing - Add comprehensive identity resolution test suite (450+ lines) - Add handle change integration test with cache verification - All 46+ integration test subtests passing - Test both local and real atProto handle resolution ### Configuration - Add IDENTITY_PLC_URL and IDENTITY_CACHE_TTL env vars - Add golangci-lint configuration - Update Makefile to avoid permission denied errors ## Architecture Decisions - Use decorator pattern for caching resolver - Maintain layer separation (no SQL in handlers) - Reject database triggers for cache invalidation (keeps logic in app layer) - Follow atProto best practices from QuickDID ## Files Changed - 7 new files (identity system + migration + tests) - 12 modified files (integration + bug fixes) - ~800 lines of production code - ~450 lines of tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>