Skip to content

feat: implement backwards compatibility for social links migration#3427

Merged
idoshamun merged 5 commits intomainfrom
claude/social-links-backwards-compat-5QMIi
Jan 12, 2026
Merged

feat: implement backwards compatibility for social links migration#3427
idoshamun merged 5 commits intomainfrom
claude/social-links-backwards-compat-5QMIi

Conversation

@idoshamun
Copy link
Copy Markdown
Member

This commit implements full backwards compatibility for the flexible social links
migration, ensuring legacy social field columns continue to work while reading from
the new socialLinks JSONB column.

Changes:

  • GraphQL (GraphORM): Added field resolvers for all 13 legacy social fields
    (twitter, github, linkedin, threads, roadmap, codepen, reddit, stackoverflow,
    youtube, bluesky, mastodon, hashnode, portfolio) that derive values from socialLinks
  • Boot endpoint: Updated to read from socialLinks and populate legacy fields for
    backwards compatibility with older clients (especially browser extension)
  • Common utilities: Moved extractHandleFromUrl to common/schema/socials.ts for
    code reuse across GraphQL and boot endpoint
  • Tests: Added test to verify legacy fields are resolved from socialLinks, updated
    user fixtures to use socialLinks instead of legacy columns
  • Dual-write: Maintained existing dual-write logic for mutations to ensure both
    socialLinks and legacy columns stay in sync when updates occur

This ensures the browser extension and other clients can continue using legacy fields
while the system internally reads from the new socialLinks column. Legacy columns can
be safely dropped in Phase 3 after all clients are updated.

This commit implements full backwards compatibility for the flexible social links
migration, ensuring legacy social field columns continue to work while reading from
the new socialLinks JSONB column.

Changes:
- GraphQL (GraphORM): Added field resolvers for all 13 legacy social fields
  (twitter, github, linkedin, threads, roadmap, codepen, reddit, stackoverflow,
  youtube, bluesky, mastodon, hashnode, portfolio) that derive values from socialLinks
- Boot endpoint: Updated to read from socialLinks and populate legacy fields for
  backwards compatibility with older clients (especially browser extension)
- Common utilities: Moved extractHandleFromUrl to common/schema/socials.ts for
  code reuse across GraphQL and boot endpoint
- Tests: Added test to verify legacy fields are resolved from socialLinks, updated
  user fixtures to use socialLinks instead of legacy columns
- Dual-write: Maintained existing dual-write logic for mutations to ensure both
  socialLinks and legacy columns stay in sync when updates occur

This ensures the browser extension and other clients can continue using legacy fields
while the system internally reads from the new socialLinks column. Legacy columns can
be safely dropped in Phase 3 after all clients are updated.
Remove redundant legacy social field columns (twitter, github, hashnode) from
user test fixtures. These fields are now derived from socialLinks, so having
both creates conflicts and duplicate data. This cleanup ensures tests use
socialLinks as the single source of truth.
@pulumi
Copy link
Copy Markdown

pulumi Bot commented Jan 11, 2026

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

Resource Changes

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

Type mismatch - user entity expects string | undefined, not string | null.
…tests

- Ensures JSON backward compatibility by explicitly setting null for undefined fields.
- Removes duplicate social handle validation tests from the users test suite.
Copy link
Copy Markdown
Contributor

@rebelchris rebelchris left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems valid enough

@idoshamun idoshamun merged commit 50b2450 into main Jan 12, 2026
11 checks passed
@idoshamun idoshamun deleted the claude/social-links-backwards-compat-5QMIi branch January 12, 2026 06:53
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.

3 participants