Skip to content

fix(highlights): exclude deleted/invisible posts from highlight feeds#3990

Merged
idoshamun merged 1 commit into
mainfrom
fix/highlights-feed-deleted-post-filter
Jul 8, 2026
Merged

fix(highlights): exclude deleted/invisible posts from highlight feeds#3990
idoshamun merged 1 commit into
mainfrom
fix/highlights-feed-deleted-post-filter

Conversation

@idoshamun

Copy link
Copy Markdown
Member

Problem

postHighlightsFeed throws Unexpected error at …node.post in production when a highlighted post has been deleted.

Root cause: posts are soft-deleted (deleted=true, row kept), so the highlights_canonical FK ON DELETE CASCADE never fires and the highlight survives. GraphORM resolves the non-nullable post: Post! field with a deleted=false AND visible=true filter, so the correlated post subquery returns null → non-null violation → masked as Unexpected error.

Verified in prod: 2/1784 highlights were orphaned (both soft-deleted share posts). Those rows have been cleaned up separately.

Fix

Add applyVisiblePostFilter — a correlated EXISTS requiring the highlight's post to exist, be visible and not deleted. Applied to postHighlightsFeed, majorHeadlines, and postHighlights.

GraphORM emits the nested post as a correlated subquery in the same SQL statement, so filtering the outer rows on the same predicate is race-free — the non-null post can never resolve to null.

Test

Added a case marking one post deleted and another visible=false, asserting only the visible post's highlight is returned.

Build + lint clean; highlight query suites pass.

Highlights point at soft-deleted posts (deleted=true, row kept), so the
FK ON DELETE CASCADE never fires and the highlight survives. GraphORM
resolves the non-null post field with a deleted=false AND visible=true
filter, so the post subquery returns null and the feed throws
"Unexpected error".

Add a correlated EXISTS filter requiring the post to exist, be visible
and not deleted, applied to postHighlightsFeed, majorHeadlines and
postHighlights. Since GraphORM emits the nested post as a correlated
subquery in the same statement, filtering the outer rows on the same
predicate is race-free.
@pulumi

pulumi Bot commented Jul 8, 2026

Copy link
Copy Markdown

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

Resource Changes

    Name                                                       Type                           Operation
~   vpc-native-clean-gifted-plus-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-clean-zombie-users-cron                         kubernetes:batch/v1:CronJob    update
~   vpc-native-update-achievement-rarity-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-update-current-streak-cron                      kubernetes:batch/v1:CronJob    update
~   vpc-native-personalized-digest-deployment                  kubernetes:apps/v1:Deployment  update
~   vpc-native-materialize-monthly-best-post-archives-cron     kubernetes:batch/v1:CronJob    update
~   vpc-native-check-analytics-report-cron                     kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-old-notifications-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-channel-highlights-cron                         kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-channel-highlights-cron                   kubernetes:batch/v1:CronJob    update
~   vpc-native-user-profile-analytics-history-clickhouse-cron  kubernetes:batch/v1:CronJob    update
~   vpc-native-user-profile-analytics-clickhouse-cron          kubernetes:batch/v1:CronJob    update
~   vpc-native-daily-digest-cron                               kubernetes:batch/v1:CronJob    update
~   vpc-native-generic-referral-reminder-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-post-lifecycle-state-clickhouse-cron            kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-images-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-expire-super-agent-trial-cron                   kubernetes:batch/v1:CronJob    update
+   vpc-native-api-clickhouse-migration-f21b392d               kubernetes:batch/v1:Job        create
~   vpc-native-private-deployment                              kubernetes:apps/v1:Deployment  update
~   vpc-native-clean-zombie-user-companies-cron                kubernetes:batch/v1:CronJob    update
~   vpc-native-deployment                                      kubernetes:apps/v1:Deployment  update
~   vpc-native-user-profile-updated-sync-cron                  kubernetes:batch/v1:CronJob    update
-   vpc-native-api-db-migration-8bcbf299                       kubernetes:batch/v1:Job        delete
~   vpc-native-update-tags-str-cron                            kubernetes:batch/v1:CronJob    update
~   vpc-native-update-highlighted-views-cron                   kubernetes:batch/v1:CronJob    update
~   vpc-native-sync-subscription-with-cio-cron                 kubernetes:batch/v1:CronJob    update
~   vpc-native-update-source-public-threshold-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-validate-active-users-cron                      kubernetes:batch/v1:CronJob    update
~   vpc-native-squad-posts-analytics-refresh-cron              kubernetes:batch/v1:CronJob    update
+   vpc-native-api-db-migration-f21b392d                       kubernetes:batch/v1:Job        create
~   vpc-native-clean-stale-user-transactions-cron              kubernetes:batch/v1:CronJob    update
~   vpc-native-materialize-yearly-best-post-archives-cron      kubernetes:batch/v1:CronJob    update
~   vpc-native-temporal-deployment                             kubernetes:apps/v1:Deployment  update
~   vpc-native-rotate-weekly-quests-cron                       kubernetes:batch/v1:CronJob    update
~   vpc-native-hourly-notification-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-update-trending-cron                            kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-expired-better-auth-sessions-cron         kubernetes:batch/v1:CronJob    update
~   vpc-native-rotate-daily-quests-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-worker-job-deployment                           kubernetes:apps/v1:Deployment  update
... and 15 other changes

@idoshamun idoshamun merged commit f9031bd into main Jul 8, 2026
9 checks passed
@idoshamun idoshamun deleted the fix/highlights-feed-deleted-post-filter branch July 8, 2026 09:21
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.

1 participant