Backend Current Status - KietTruongTuan/TaskMind GitHub Wiki

TaskMind Backend — Structure Assessment

✅ What You Already Have (Solid Foundation)

Area Status Details
Goal/Task CRUD ✅ Done Full CRUD with UUID PKs, filtering, search, date range
JWT Auth ✅ Done Login, register, logout, token blacklisting
Refresh Token Rotation ✅ Done 24h threshold rotation, HttpOnly cookies, SSR support
AI Goal Generation ✅ Done Groq API, streaming, retry logic, fault tolerance
AI Context Expansion ✅ Done PDF, DOCX, image (vision) parsing with file limits
Service Layer ✅ Done AI logic extracted to services.py
Unit + E2E Tests ✅ Done 40 tests (35 unit + 1 E2E + 4 account)
API Docs ✅ Done Swagger/OpenAPI via drf-spectacular
Docker ✅ Done Dockerfile + docker-compose for dev
CamelCase API ✅ Done djangorestframework-camel-case for FE compatibility
CORS ✅ Done Configured for localhost + production

Your 4 Planned Items — Verdict

1. ✅ Basic API (Goals, Tasks, ...) — Already complete

No further work needed. CRUD, filtering, search, tags, and date ranges are all implemented.

2. ✅ JWT Token Rotation Logic — Already complete

Your 24h rotation threshold is already implemented in RefreshTokenView. It checks rotation_issued_at and only rotates after 24 hours.

3. ✅ AI Context Expansion — Already complete

File upload (PDF, DOCX, JPG, PNG, WebP) with context extraction and vision API is already in services.py.

4. ✅ Unit Testing — Already in place

You have 40 tests with mocked AI, real E2E tests, and account tests. The testing discipline is already established.


🔴 What's MISSING — Recommended Additions

These are areas a production-quality backend typically needs that your current structure doesn't cover:

Priority 1: Critical for Production

Feature Why It Matters
Pagination Your GET /v1/goals and GET /v1/tasks return ALL results. With 100+ goals this will be slow. Add PageNumberPagination or CursorPagination.
Rate Limiting / Throttling No throttling on any endpoint. The AI generation endpoint (/v1/goals/generate) is especially vulnerable — each call costs API credits. Use DRF's throttle_classes.
Input Sanitization on AI Prompts User-provided name and description are directly interpolated into AI prompts (services.py:L152-L157). This is a prompt injection risk.
User Profile Endpoint No GET /v1/accounts/me endpoint. The frontend needs to know the current user's info (name, email).

Priority 2: Important for Quality

Feature Why It Matters
Password Change/Reset No way for users to change or reset their password. Essential for any auth system.
Logging & Monitoring Only basic logger usage. No structured logging config in settings.py, no request logging middleware.
Environment-specific Settings settings.py mixes dev/prod config. Consider splitting into settings/base.py, settings/dev.py, settings/prod.py.
Database Indexing No custom indexes on commonly filtered fields like status, deadline, user. Will slow down as data grows.
Cookie Inconsistency Login sets secure=True, samesite='None' but RefreshTokenView sets secure=False, samesite='Lax'. This will break cross-origin refresh in production.

Priority 3: Nice to Have

Feature Why It Matters
Soft Delete Goals/tasks are hard-deleted. Consider adding is_deleted + deleted_at for recovery.
Activity/Audit Log No history of who changed what and when. Useful for debugging and user trust.
Goal Progress Calculation You have completed_count / task_count but no percentage field or auto-status-update when all tasks are done.
Notifications (future) No notification model or system for deadline reminders.
API Versioning Strategy You use /v1/ prefix which is good, but no middleware or router-level versioning strategy for future v2.
Health Check Endpoint No GET /health for Docker/deployment monitoring.

🐛 Bugs/Issues Found During Review

Issue Location Fix
Cookie config mismatch LoginView L89-90 vs RefreshTokenView L223-224 Make both use secure=True, samesite='None' for cross-origin
Duplicate in requirements.txt gunicorn and whitenoise appear twice Remove duplicates at lines 67-70
Typo in Goal model update_at should be updated_at models.py:L24
GoalBreakdownView has no permission_classes Anyone can call AI generation without auth Add permission_classes = [IsAuthenticated]

Summary

Your 4 planned items are already implemented. The structure is solid for a capstone project. The most impactful additions would be pagination, rate limiting, a user profile endpoint, and fixing the cookie inconsistency bug.