Skip to content

Conversation

@idoshamun
Copy link
Member

Summary

Phase 1 implementation of the flexible social media links refactor. This replaces 13 individual social columns with a flexible JSONB array structure while maintaining backwards compatibility through dual-write.

Changes

  • ENG-246: Add socialLinks JSONB array column to User entity
  • ENG-247: Add UserSocialLink GraphQL type and socialLinks field on User
  • ENG-248: Add platform detection (detectPlatformFromUrl) and Zod validation schemas
  • ENG-249: Implement dual-write in mutations (writes to both old columns and new JSONB)
  • ENG-250: Mark all 13 individual social fields as deprecated in GraphQL

Key Features

  • Array structure preserves display order for future drag-and-drop reordering
  • Platform auto-detection from URLs (supports all existing platforms + mastodon instances)
  • Dual-write ensures old clients continue to work during migration
  • No breaking changes - existing fields still work but are deprecated

Migration Note

A database migration is needed to add the socialLinks column:

ALTER TABLE "user" ADD COLUMN "socialLinks" jsonb DEFAULT '[]';

Test plan

  • Verify GraphQL introspection shows new socialLinks field and deprecated individual fields
  • Test mutation with socialLinks input - verify dual-write to both JSONB and legacy columns
  • Test platform auto-detection for various URL formats
  • Verify existing individual field mutations still work

Add new socialLinks JSONB array column to store social media links
as [{platform, url}] entries. Array structure preserves order for
future drag-and-drop reordering.

Note: Database migration to add the column needs to be created separately.
Add GraphQL types for flexible social links:
- UserSocialLink type with platform and url fields
- UserSocialLinkInput input type for mutations
- socialLinks field on User type returning array of social links
Add URL-based platform detection and Zod validation schemas:
- detectPlatformFromUrl() auto-detects platform from URL hostname
- PLATFORM_DOMAINS mapping for all supported platforms
- socialLinksInputSchema with auto-detection transformation
- Falls back to 'other' for unknown platforms
Update updateUserProfile and updateUserInfo mutations to support
socialLinks input with dual-write capability:
- Add socialLinks to GraphQL mutation inputs
- Implement processSocialLinksForDualWrite helper function
- Extract handles from URLs for legacy column compatibility
- Write to both socialLinks JSONB array and old individual columns
Mark all 13 individual social media fields as deprecated on:
- User type
- UpdateUserInput input type
- UpdateUserInfoInput input type

All deprecation messages point to the new socialLinks field.
@pulumi
Copy link

pulumi bot commented Jan 7, 2026

🍹 The Update (preview) for dailydotdev/api/prod (at dd3e37d) was successful.

Resource Changes

    Name                                                   Type                           Operation
~   vpc-native-generate-search-invites-cron                kubernetes:batch/v1:CronJob    update
~   vpc-native-personalized-digest-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-stale-user-transactions-cron          kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-images-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-ws-deployment                               kubernetes:apps/v1:Deployment  update
~   vpc-native-clean-gifted-plus-cron                      kubernetes:batch/v1:CronJob    update
-   vpc-native-api-db-migration-b116f366                   kubernetes:batch/v1:Job        delete
~   vpc-native-clean-zombie-users-cron                     kubernetes:batch/v1:CronJob    update
~   vpc-native-sync-subscription-with-cio-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-update-source-tag-view-cron                 kubernetes:batch/v1:CronJob    update
~   vpc-native-hourly-notification-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-update-views-cron                           kubernetes:batch/v1:CronJob    update
~   vpc-native-temporal-deployment                         kubernetes:apps/v1:Deployment  update
~   vpc-native-update-current-streak-cron                  kubernetes:batch/v1:CronJob    update
+   vpc-native-api-clickhouse-migration-5be5ca69           kubernetes:batch/v1:Job        create
~   vpc-native-update-trending-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-update-tags-str-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-post-analytics-history-day-clickhouse-cron  kubernetes:batch/v1:CronJob    update
~   vpc-native-update-source-public-threshold-cron         kubernetes:batch/v1:CronJob    update
~   vpc-native-deployment                                  kubernetes:apps/v1:Deployment  update
~   vpc-native-update-highlighted-views-cron               kubernetes:batch/v1:CronJob    update
~   vpc-native-daily-digest-cron                           kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-opportunities-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-update-tag-recommendations-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-generic-referral-reminder-cron              kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-user-companies-cron            kubernetes:batch/v1:CronJob    update
-   vpc-native-api-clickhouse-migration-b116f366           kubernetes:batch/v1:Job        delete
~   vpc-native-user-profile-updated-sync-cron              kubernetes:batch/v1:CronJob    update
~   vpc-native-check-analytics-report-cron                 kubernetes:batch/v1:CronJob    update
~   vpc-native-bg-deployment                               kubernetes:apps/v1:Deployment  update
~   vpc-native-post-analytics-clickhouse-cron              kubernetes:batch/v1:CronJob    update
~   vpc-native-personalized-digest-deployment              kubernetes:apps/v1:Deployment  update
~   vpc-native-private-deployment                          kubernetes:apps/v1:Deployment  update
+   vpc-native-api-db-migration-5be5ca69                   kubernetes:batch/v1:Job        create
~   vpc-native-calculate-top-readers-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-validate-active-users-cron                  kubernetes:batch/v1:CronJob    update

Note: This migration was auto-generated and may include unrelated
schema drift. Review before deploying.
- Remove schema drift from auto-generated migration
- Add note in AGENTS.md about reviewing migrations for schema drift
…ility

The function never returns undefined, so the return type should be
string | null, not string | null | undefined.
Add unit tests for detectPlatformFromUrl and socialLinksInputSchema,
plus integration tests for updateUserProfile mutation with socialLinks.
@idoshamun idoshamun marked this pull request as ready for review January 7, 2026 15:23
@idoshamun idoshamun requested review from a team and capJavert as code owners January 7, 2026 15:23
@idoshamun idoshamun merged commit ad280b0 into main Jan 7, 2026
10 checks passed
@idoshamun idoshamun deleted the flexible-social-links branch January 7, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants