feat: handle-based blocking and system age onboarding (#111) master
* feat(profiles,onboarding): handle-based blocking and system age onboarding Add handle resolution endpoint and enrich preferences with blocked user profiles so the frontend can display handles instead of raw DIDs. - GET /api/users/resolve-handles: resolve handles to profiles via DB lookup with Bluesky public API fallback - GET /api/users/me/preferences: include blockedProfiles in response - GET /api/users/me/preferences/communities: include blockedProfiles per community with batch resolution - GET /api/onboarding/status: inject system-level age_confirmation field when user has no declaredAge and no admin age field exists - POST /api/onboarding/submit: sync age_confirmation responses to user_preferences and users tables - checkOnboardingComplete: include system age field in completeness check Closes barazo-forum/barazo-workspace#59 Closes barazo-forum/barazo-workspace#60 * fix(tests): update mocks for onboarding gate system age field queries The checkOnboardingComplete function was extended with two new DB queries (all community fields for age_confirmation check, and user preferences for declaredAge). Test mocks needed updating: - onboarding-gate.test.ts: queue 4 select results instead of 1-2 to cover the new allCommunityFields + userPreferences queries - onboarding.test.ts: queue 3rd select result for the userPreferences query added to GET /api/onboarding/status - reactions, votes, replies, integration tests: mock checkOnboardingComplete at module level (matching the pattern in topics.test.ts) instead of fragile inline DB mock ordering