The Reading List API provides comprehensive functionality for managing reading lists within projects. This implementation includes all 12 endpoints as specified in the detailed API documentation, with full CRUD operations, filtering, pagination, statistics, and advanced features.
- โ Complete CRUD Operations: Create, read, update, delete reading list items
- โ Advanced Filtering: Filter by status, priority, difficulty, relevance, bookmarks, recommendations
- โ Pagination: Cursor-based pagination with configurable page sizes
- โ Search: Full-text search across notes and tags
- โ Sorting: Multiple sort options with ascending/descending order
- โ Statistics: Comprehensive reading analytics and metrics
- โ Progress Tracking: Reading progress with automatic status management
- โ Rating System: 1-5 star rating for completed items
- โ Bookmarking: Toggle bookmark status for quick access
- โ Notes Management: Rich notes with markdown support
- โ Recommendations: AI-powered paper recommendations (placeholder)
- โ Access Control: Project-based authorization (owner/collaborator)
- โ Status Management: Automatic timestamp handling for status transitions
- โ Progress Auto-Update: Automatic status changes based on progress
- โ Time Tracking: Estimated vs actual reading time
- โ Tag System: Flexible tagging for categorization
- โ Audit Trail: Comprehensive logging for all operations
- โ Validation: Comprehensive input validation and error handling
- โ Performance: Optimized database queries with proper indexing
CREATE TABLE reading_list (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
paper_id UUID NOT NULL REFERENCES papers(id) ON DELETE CASCADE,
status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'in-progress', 'completed', 'skipped')),
priority VARCHAR(20) NOT NULL DEFAULT 'medium' CHECK (priority IN ('low', 'medium', 'high', 'critical')),
difficulty VARCHAR(20) NOT NULL DEFAULT 'medium' CHECK (difficulty IN ('easy', 'medium', 'hard', 'expert')),
relevance VARCHAR(20) NOT NULL DEFAULT 'medium' CHECK (relevance IN ('low', 'medium', 'high', 'critical')),
estimated_time INTEGER CHECK (estimated_time > 0),
actual_time INTEGER CHECK (actual_time > 0),
notes TEXT,
tags TEXT[],
rating INTEGER CHECK (rating >= 1 AND rating <= 5),
reading_progress INTEGER NOT NULL DEFAULT 0 CHECK (reading_progress >= 0 AND reading_progress <= 100),
read_count INTEGER NOT NULL DEFAULT 0 CHECK (read_count >= 0),
is_bookmarked BOOLEAN NOT NULL DEFAULT FALSE,
is_recommended BOOLEAN NOT NULL DEFAULT FALSE,
recommended_by VARCHAR(100),
recommended_reason TEXT,
added_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
started_at TIMESTAMP WITH TIME ZONE,
completed_at TIMESTAMP WITH TIME ZONE,
last_read_at TIMESTAMP WITH TIME ZONE,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(project_id, paper_id)
);idx_reading_list_project_id: For project-based queriesidx_reading_list_status: For status filteringidx_reading_list_priority: For priority filteringidx_reading_list_difficulty: For difficulty filteringidx_reading_list_relevance: For relevance filteringidx_reading_list_is_bookmarked: For bookmark filteringidx_reading_list_is_recommended: For recommendation filteringidx_reading_list_added_at: For chronological sortingidx_reading_list_last_read_at: For recent activityidx_reading_list_reading_progress: For progress-based queriesidx_reading_list_rating: For rating-based queries- Composite indexes for common query patterns
src/main/java/dev/project/scholar_ai/
โโโ model/core/project/
โ โโโ ReadingListItem.java # JPA Entity with enums
โโโ dto/project/
โ โโโ ReadingListItemDto.java # Response DTO
โ โโโ AddReadingListItemDto.java # Create request DTO
โ โโโ UpdateReadingListItemDto.java # Update request DTO
โโโ repository/core/project/
โ โโโ ReadingListItemRepository.java # Spring Data JPA Repository
โโโ mapping/project/
โ โโโ ReadingListItemMapper.java # MapStruct mapper
โโโ service/project/
โ โโโ ReadingListItemService.java # Business logic service
โโโ controller/project/
โโโ ReadingListController.java # REST controller
- Enums: Status, Priority, Difficulty, Relevance
- Validation: Database constraints and JPA annotations
- Timestamps: Automatic creation and update timestamps
- Relationships: Links to projects and papers
- ReadingListItemDto: Complete response object
- AddReadingListItemDto: Create with validation annotations
- UpdateReadingListItemDto: Update with optional fields
- Swagger Documentation: Comprehensive API documentation
- Custom Queries: Native SQL for complex filtering
- Pagination Support: Spring Data Pageable
- Statistics Queries: Aggregation functions
- Search Functionality: Full-text search capabilities
- Business Logic: Status transitions, progress management
- Access Control: Project authorization validation
- Transaction Management: Database consistency
- Error Handling: Comprehensive exception management
- REST Endpoints: All 12 API endpoints implemented
- Rate Limiting: Resilience4j integration
- Authentication: JWT token validation
- Response Formatting: Consistent API response structure
Purpose: Retrieve all reading list items with filtering and pagination
Query Parameters:
status: Filter by status (pending, in-progress, completed, skipped)priority: Filter by priority (low, medium, high, critical)difficulty: Filter by difficulty (easy, medium, hard, expert)relevance: Filter by relevance (low, medium, high, critical)isBookmarked: Filter by bookmark status (true/false)isRecommended: Filter by recommendation status (true/false)search: Search in notes and tagssortBy: Sort field (addedAt, priority, title, rating, difficulty)sortOrder: Sort direction (asc, desc)page: Page number (default: 1)limit: Items per page (default: 20, max: 100)
Example Request:
GET /api/v1/projects/550e8400-e29b-41d4-a716-446655440000/reading-list?status=in-progress&priority=high&page=1&limit=20Purpose: Add a new paper to the reading list
Request Body:
{
"paperId": "550e8400-e29b-41d4-a716-446655440001",
"priority": "high",
"estimatedTime": 45,
"notes": "Important paper for understanding transformer architecture",
"tags": ["transformer", "attention", "nlp"],
"difficulty": "hard",
"relevance": "high"
}Purpose: Update an existing reading list item
Request Body:
{
"status": "in-progress",
"priority": "critical",
"estimatedTime": 60,
"actualTime": 30,
"notes": "Updated notes with additional insights",
"tags": ["transformer", "attention", "nlp", "deep-learning"],
"rating": 4,
"difficulty": "expert",
"relevance": "critical",
"readingProgress": 75,
"isBookmarked": true
}Purpose: Update only the status with automatic timestamp management
Request Body:
{
"status": "completed"
}Purpose: Update reading progress with automatic status management
Request Body:
{
"readingProgress": 75
}Purpose: Remove a paper from the reading list
Purpose: Get comprehensive reading list statistics
Query Parameters:
timeRange: Time range for stats (7d, 30d, 90d, all)
Purpose: Get AI-powered paper recommendations
Query Parameters:
limit: Number of recommendations (default: 10, max: 50)difficulty: Preferred difficulty levelexcludeRead: Exclude already read papers (default: true)
Purpose: Add or update notes for a reading list item
Request Body:
{
"note": "Key insight: The attention mechanism allows the model to focus on different parts of the input sequence dynamically."
}Purpose: Rate a completed reading list item (1-5 stars)
Request Body:
{
"rating": 4
}Purpose: Toggle the bookmark status of a reading list item
Purpose: Update multiple reading list items at once (Future Enhancement)
The system automatically handles status transitions and timestamps:
- pending โ in-progress: Sets
startedAt, incrementsreadCount - in-progress โ completed: Sets
completedAt, calculatesactualTime - in-progress โ pending: Clears
startedAt - completed โ in-progress: Clears
completedAt, setsstartedAt - Any โ skipped: No timestamp changes
Reading progress automatically triggers status changes:
- 0% progress: Sets status to 'pending' if currently 'in-progress'
- 1-99% progress: Sets status to 'in-progress' if currently 'pending'
- 100% progress: Sets status to 'completed'
Users can only access reading lists for projects they:
- Own (project owner)
- Collaborate on (project collaborator)
- Paper ID: Must be valid UUID and exist in papers table
- Priority/Difficulty/Relevance: Must be valid enum values
- Estimated/Actual Time: Must be positive integers
- Notes: Maximum 1000 characters
- Tags: Maximum 10 tags, each max 50 characters
- Rating: 1-5 stars, only for completed items
- Progress: 0-100 percentage
A comprehensive Postman collection is provided at:
postman/scholarai-reading-list.postman_collection.json
Set up the following variables in Postman:
base_url: Your API base URL (e.g., http://localhost:8080)auth_token: Your JWT authentication tokenproject_id: A valid project UUIDitem_id: A valid reading list item UUIDpaper_id: A valid paper UUID
- Basic CRUD Operations: Create, read, update, delete items
- Filtering and Pagination: Test all filter combinations
- Status Transitions: Verify automatic timestamp management
- Progress Updates: Test automatic status changes
- Access Control: Test unauthorized access scenarios
- Validation: Test invalid input scenarios
- Statistics: Verify calculation accuracy
- Error Handling: Test various error conditions
- Indexes: Comprehensive indexing strategy for all query patterns
- Query Optimization: Native SQL queries for complex operations
- Pagination: Cursor-based pagination for large datasets
- Connection Pooling: Optimized database connection management
- Statistics Caching: Cache reading list statistics (15-minute TTL)
- Recommendation Caching: Cache AI recommendations (1-hour TTL)
- User Session Caching: Cache user project access permissions
- Query Performance: Monitor slow queries and optimize
- API Response Times: Track endpoint performance
- Error Rates: Monitor and alert on high error rates
- User Activity: Track reading patterns for insights
- Bulk Operations: Update multiple items simultaneously
- Advanced Search: Elasticsearch integration for full-text search
- AI Recommendations: Machine learning-based paper recommendations
- Reading Analytics: Detailed reading behavior analysis
- Export Functionality: Export reading lists to various formats
- Collaborative Features: Shared reading lists and annotations
- Mobile Optimization: Mobile-specific API optimizations
- Real-time Updates: WebSocket integration for live updates
- GraphQL Support: Alternative API interface
- Event Sourcing: Complete audit trail of all changes
- Microservices: Split into dedicated reading list service
- CQRS Pattern: Separate read and write models
- Distributed Caching: Redis cluster for high availability
curl -X POST "http://localhost:8080/api/v1/projects/550e8400-e29b-41d4-a716-446655440000/reading-list" \
-H "Authorization: Bearer your_jwt_token" \
-H "Content-Type: application/json" \
-d '{
"paperId": "550e8400-e29b-41d4-a716-446655440001",
"priority": "high",
"estimatedTime": 45,
"notes": "Important paper for understanding transformer architecture",
"tags": ["transformer", "attention", "nlp"],
"difficulty": "hard",
"relevance": "high"
}'curl -X PATCH "http://localhost:8080/api/v1/projects/550e8400-e29b-41d4-a716-446655440000/reading-list/550e8400-e29b-41d4-a716-446655440001/progress" \
-H "Authorization: Bearer your_jwt_token" \
-H "Content-Type: application/json" \
-d '{
"readingProgress": 75
}'curl -X GET "http://localhost:8080/api/v1/projects/550e8400-e29b-41d4-a716-446655440000/reading-list/stats?timeRange=30d" \
-H "Authorization: Bearer your_jwt_token"- JWT Tokens: Secure token-based authentication
- Project Access: Validate user permissions for each project
- Rate Limiting: Prevent API abuse with Resilience4j
- Input Validation: Comprehensive validation of all inputs
- SQL Injection Prevention: Parameterized queries
- XSS Protection: Input sanitization
- Audit Logging: Complete audit trail of all operations
- Data Encryption: Sensitive data encryption at rest
- API Response Times: Monitor endpoint performance
- Error Rates: Track and alert on errors
- User Engagement: Reading completion rates
- System Health: Database performance and availability
- Structured Logging: JSON format for easy parsing
- Request Tracing: Track requests across services
- Error Tracking: Detailed error information
- Performance Monitoring: Query and API performance
- Clone Repository:
git clone <repository-url> - Install Dependencies:
mvn clean install - Run Database Migrations: Flyway will auto-execute
- Start Application:
mvn spring-boot:run - Run Tests:
mvn test
- Spotless: Automatic code formatting
- SonarQube: Code quality analysis
- Unit Tests: Comprehensive test coverage
- Integration Tests: End-to-end API testing
- Create Feature Branch:
git checkout -b feature/reading-list-enhancement - Implement Changes: Follow coding standards
- Add Tests: Ensure adequate test coverage
- Update Documentation: Keep README and API docs current
- Submit PR: Include detailed description and testing notes
- API Documentation: Swagger UI at
/swagger-ui.html - Database Schema: See migration files in
src/main/resources/db/migration/ - Code Comments: Comprehensive inline documentation
- Common Issues: Check application logs for detailed error messages
- Database Issues: Verify database connectivity and migration status
- Authentication Issues: Ensure valid JWT token and proper format
- Performance Issues: Monitor database queries and API response times
For technical support or feature requests, please:
- Check existing documentation and issues
- Create detailed bug reports with reproduction steps
- Provide relevant logs and error messages
- Include environment details and configuration
Note: This implementation provides a solid foundation for reading list management with room for future enhancements and scalability improvements.