Date: 2026-03-07 (updated 2026-03-11)
- Files: All repository files in
backend/app/repositories/ - Status: Still uses OFFSET-based pagination. Mitigated by
COUNT(*) OVER()pattern. Cursor-based pagination is an architectural improvement for future consideration when tables exceed 100k+ rows.
- Status: All required indexes exist across migration files:
ix_posts_sig_id,ix_posts_category_id,ix_posts_user_id,ix_comments_post_id,ix_form_responses_form_id,idx_notifications_user_is_read(partial index), plus composite indexes for common query patterns.
- Status:
comment_repo.find_many()fetches all comments in a single query withCOUNT(*) OVER(). No loop-based child fetching.
- Status: Consistently implemented across all repository
find_manyfunctions with fallback COUNT query for empty result sets.
- Status: Uses non-correlated
LEFT JOIN (SELECT form_id, COUNT(*) ... GROUP BY form_id)— optimal single hash aggregate.
- Status: GIN index
ix_posts_search_vectorexists onposts.search_vectorcolumn.
- Issue: asyncpg pool (min=10, max=30) has no monitoring of pool exhaustion or wait times.
- Fix: Add pool stats to health endpoint or metrics system.
- Issue: Most operations use default READ COMMITTED. SERIALIZABLE or REPEATABLE READ may be needed for critical multi-step operations.
- Fix: Evaluate on a case-by-case basis for bulk operations.