Files
stack/docs/scratchpads/66-search-api-endpoint.md
Jason Woltje 5d348526de feat(#71): implement graph data API
Implemented three new API endpoints for knowledge graph visualization:

1. GET /api/knowledge/graph - Full knowledge graph
   - Returns all entries and links with optional filtering
   - Supports filtering by tags, status, and node count limit
   - Includes orphan detection (entries with no links)

2. GET /api/knowledge/graph/stats - Graph statistics
   - Total entries and links counts
   - Orphan entries detection
   - Average links per entry
   - Top 10 most connected entries
   - Tag distribution across entries

3. GET /api/knowledge/graph/:slug - Entry-centered subgraph
   - Returns graph centered on specific entry
   - Supports depth parameter (1-5) for traversal distance
   - Includes all connected nodes up to specified depth

New Files:
- apps/api/src/knowledge/graph.controller.ts
- apps/api/src/knowledge/graph.controller.spec.ts

Modified Files:
- apps/api/src/knowledge/dto/graph-query.dto.ts (added GraphFilterDto)
- apps/api/src/knowledge/entities/graph.entity.ts (extended with new types)
- apps/api/src/knowledge/services/graph.service.ts (added new methods)
- apps/api/src/knowledge/services/graph.service.spec.ts (added tests)
- apps/api/src/knowledge/knowledge.module.ts (registered controller)
- apps/api/src/knowledge/dto/index.ts (exported new DTOs)
- docs/scratchpads/71-graph-data-api.md (implementation notes)

Test Coverage: 21 tests (all passing)
- 14 service tests including orphan detection, filtering, statistics
- 7 controller tests for all three endpoints

Follows TDD principles with tests written before implementation.
All code quality gates passed (lint, typecheck, tests).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-02 15:27:00 -06:00

3.6 KiB

Issue #66: [KNOW-014] Search API Endpoint

Objective

Implement a full-text search API endpoint for the knowledge module with ranking, highlighting, filtering, and pagination capabilities.

Acceptance Criteria

  1. Create GET /api/knowledge/search?q=... endpoint
  2. Return ranked results with snippets
  3. Highlight matching terms in results
  4. Add filter by tags and status
  5. Implement pagination
  6. Ensure response time < 200ms

Approach

  1. Review existing knowledge module structure (controller, service, entities)
  2. Review full-text search setup from issue #65
  3. Write tests first (TDD - RED phase)
  4. Implement minimal code to pass tests (GREEN phase)
  5. Refactor and optimize (REFACTOR phase)
  6. Performance testing
  7. Quality gates and code review

Current State Analysis

The search endpoint already exists with most features implemented:

  • GET /api/knowledge/search endpoint exists
  • Full-text search with ts_rank for ranking
  • Snippet generation with ts_headline
  • Term highlighting with tags
  • Status filter implemented
  • Pagination implemented
  • ⚠️ Tag filtering NOT implemented in main search endpoint
  • Performance not tested

Gap: The main search endpoint doesn't support filtering by tags. There's a separate endpoint /by-tags that only does tag filtering without text search.

Solution: Add tags parameter to SearchQueryDto and modify the search service to combine full-text search with tag filtering.

Progress

  • Review existing code structure
  • Write failing tests for tag filter in search endpoint (TDD - RED)
  • Update SearchQueryDto to include tags parameter
  • Implement tag filtering in search service (TDD - GREEN)
  • Refactor and optimize (TDD - REFACTOR)
  • Run all tests - 25 tests pass (16 service + 9 controller)
  • TypeScript type checking passes
  • Linting passes (fixed non-null assertion)
  • Commit changes (commit c350078)
  • Performance testing (< 200ms) - Deferred to integration testing
  • Code review - Automated via pre-commit hooks
  • QA checks - Automated via pre-commit hooks

Testing

  • Unit tests for service methods
  • Integration tests for controller endpoint
  • Performance tests for response time
  • Target: 85%+ coverage

Implementation Summary

Successfully implemented tag filtering in the search API endpoint:

What was already there:

  • Full-text search using PostgreSQL search_vector column (from issue #65)
  • Ranking with ts_rank
  • Snippet generation and highlighting with ts_headline
  • Status filtering
  • Pagination

What was added (issue #66):

  • Tags parameter in SearchQueryDto (supports comma-separated values)
  • Tag filtering in SearchService.search() method
  • SQL query modification to join with knowledge_entry_tags when tags provided
  • Entries must have ALL specified tags (AND logic using HAVING COUNT(DISTINCT t.slug) = N)
  • 4 new tests (2 controller, 2 service)
  • Documentation updates

Quality Metrics:

  • 25 tests pass (16 service + 9 controller)
  • All knowledge module tests pass (209 tests)
  • TypeScript type checking: PASS
  • Linting: PASS (fixed non-null assertion)
  • Pre-commit hooks: PASS

Performance Note: Response time < 200ms requirement will be validated during integration testing with actual database load. The implementation uses:

  • Precomputed tsvector with GIN index (from #65)
  • Efficient subquery for tag filtering with GROUP BY
  • Result caching via KnowledgeCacheService

Notes

  • Use PostgreSQL full-text search from issue #65
  • Follow NestJS conventions
  • Use existing DTOs and entities
  • Ensure type safety (no explicit any)