fix: sync company email verification to work experiences#3976
Merged
Conversation
When a user verifies their company email, the verified state lives on UserCompany, while the profile UI reads UserExperienceWork.verified. The two are only linked via the onUserCompanyCompanyChange CDC worker, which reacts to companyId changes (creation-with-company or companyId change) — not to a plain verified flip. As a result: - verifyUserCompanyCode flips verified false->true without changing companyId, so the matching work experience is never marked verified. - The profile still shows the experience as unverified, so the user re-submits addUserCompany and hits 'This email has already been verified', trapping them in a dead-end loop. Fixes: - Add syncVerifiedUserWorkExperiences helper that marks matching Work experiences verified for a (userId, companyId). - Call it from verifyUserCompanyCode after the verified flip. - Make addUserCompany idempotent: when the email is already verified for the same user, re-assert experience verification and return success instead of throwing. Adds tests for both resolvers.
|
🍹 The Update (preview) for dailydotdev/api/prod (at a2eccf9) was successful. Resource Changes Name Type Operation
~ vpc-native-update-highlighted-views-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-analytics-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-source-public-threshold-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-analytics-history-day-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-profile-updated-sync-cron kubernetes:batch/v1:CronJob update
~ vpc-native-validate-active-users-cron kubernetes:batch/v1:CronJob update
- vpc-native-api-clickhouse-migration-fcab9478 kubernetes:batch/v1:Job delete
- vpc-native-api-db-migration-fcab9478 kubernetes:batch/v1:Job delete
~ vpc-native-personalized-digest-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-clean-zombie-opportunities-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-expired-better-auth-sessions-cron kubernetes:batch/v1:CronJob update
~ vpc-native-rotate-weekly-quests-cron kubernetes:batch/v1:CronJob update
~ vpc-native-deployment kubernetes:apps/v1:Deployment update
+ vpc-native-api-db-migration-688df2ea kubernetes:batch/v1:Job create
~ vpc-native-update-tag-materialized-views-cron kubernetes:batch/v1:CronJob update
~ vpc-native-check-analytics-report-cron kubernetes:batch/v1:CronJob update
~ vpc-native-expire-super-agent-trial-cron kubernetes:batch/v1:CronJob update
~ vpc-native-worker-job-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-update-tags-str-cron kubernetes:batch/v1:CronJob update
~ vpc-native-post-analytics-achievements-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-old-notifications-cron kubernetes:batch/v1:CronJob update
~ vpc-native-daily-digest-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-achievement-rarity-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-stale-user-transactions-cron kubernetes:batch/v1:CronJob update
~ vpc-native-squad-posts-analytics-refresh-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-current-streak-cron kubernetes:batch/v1:CronJob update
~ vpc-native-sync-subscription-with-cio-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-users-cron kubernetes:batch/v1:CronJob update
~ vpc-native-private-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-update-views-cron kubernetes:batch/v1:CronJob update
~ vpc-native-update-trending-cron kubernetes:batch/v1:CronJob update
~ vpc-native-generate-search-invites-cron kubernetes:batch/v1:CronJob update
~ vpc-native-ws-deployment kubernetes:apps/v1:Deployment update
~ vpc-native-materialize-monthly-best-post-archives-cron kubernetes:batch/v1:CronJob update
~ vpc-native-rotate-daily-quests-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-images-cron kubernetes:batch/v1:CronJob update
~ vpc-native-clean-zombie-user-companies-cron kubernetes:batch/v1:CronJob update
~ vpc-native-hourly-notification-cron kubernetes:batch/v1:CronJob update
~ vpc-native-materialize-yearly-best-post-archives-cron kubernetes:batch/v1:CronJob update
~ vpc-native-user-profile-analytics-clickhouse-cron kubernetes:batch/v1:CronJob update
~ vpc-native-calculate-top-readers-cron kubernetes:batch/v1:CronJob update
... and 15 other changes |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
User feedback (ENG-1825): a user tried to verify their company email and got
This email has already been verified, even though the profile UI still showed the work experience as unverified — trapping them in a dead-end loop.Root cause
There are two separate
verifiedflags:UserCompany.verified— the email record (what the GraphQL error checks)UserExperienceWork.verified— what the profile UI showsThey're only linked through the
onUserCompanyCompanyChangeCDC worker, which reacts tocompanyIdchanges (creation-with-company or a companyId change) — not to a plainverifiedflip.So:
verifyUserCompanyCodeflipsverifiedfalse → truewithout changingcompanyId, so the matching work experience is never marked verified.addUserCompany, and hitsThis email has already been verified.The prior fix (#3891,
shouldEnrichUserCompany) only covered thecompanyId IS NULLpath (enrich → set companyId → CDC fires). The case where the company already exists (companyId set at creation, then a verified-flip with no companyId change) was left uncovered — which is exactly what the reported user hit.Fix
syncVerifiedUserWorkExperiences(con, userId, companyId)helper that marks matchingUserExperienceWorkrows verified.verifyUserCompanyCodeafter the verified flip, so confirming the code propagates to the work experience.addUserCompanyidempotent: when the email is already verified for the same user, re-assert the experience verification and return success instead of throwing — killing the dead-end loop.Tests
verifyUserCompanyCodemarks the matching work experience verified.