Description
Several API files contain direct database queries that should use existing or new repositories for consistency with the layered architecture.
Steps to Reproduce
- Open
backend/api/courses.py - lines 68, 96, 130, 154, 189
- Open
backend/api/profiles.py - lines 109, 118
- Open
backend/api/users.py - lines 75-76, 138
- Note: All use
db.execute() directly
Expected Behavior
API layer should call repositories instead of executing queries directly.
Actual Behavior
api/courses.py (CourseRepository exists but is not used here):
- Line 68:
db.execute(query) for course listing
- Line 96:
db.execute(select(Course)...) for single course
- Lines 130, 154, 189: Tag/skill queries
api/profiles.py:
- Lines 109-118: Direct queries for profile history endpoint (should use
UserProfileRepository.get_snapshots())
api/users.py:
- Lines 75-76:
db.add(user), db.commit() for password change
- Line 138:
db.execute(select(Course)...) for recommendation history enrichment
Root Cause
CourseRepository exists in repositories/course_repository.py but API does not use it
UserProfileRepository.get_snapshots() exists but api/profiles.py duplicates the query
- Inconsistent application of layered architecture across the codebase
Possible Solutions
-
Option A: Use existing repositories
- Use
CourseRepository in api/courses.py
- Use
UserProfileRepository.get_snapshots() in api/profiles.py
- Add
get_all_tags(), get_all_skills() to CourseRepository
-
Option B: Accept as pragmatic choice
- These are simple read-only queries with no business logic
- Document that simple selects in API layer are acceptable
- Focus refactoring effort on
admin.py (Issue 1) instead
Description
Several API files contain direct database queries that should use existing or new repositories for consistency with the layered architecture.
Steps to Reproduce
backend/api/courses.py- lines 68, 96, 130, 154, 189backend/api/profiles.py- lines 109, 118backend/api/users.py- lines 75-76, 138db.execute()directlyExpected Behavior
API layer should call repositories instead of executing queries directly.
Actual Behavior
api/courses.py(CourseRepositoryexists but is not used here):db.execute(query)for course listingdb.execute(select(Course)...)for single courseapi/profiles.py:UserProfileRepository.get_snapshots())api/users.py:db.add(user),db.commit()for password changedb.execute(select(Course)...)for recommendation history enrichmentRoot Cause
CourseRepositoryexists inrepositories/course_repository.pybut API does not use itUserProfileRepository.get_snapshots()exists butapi/profiles.pyduplicates the queryPossible Solutions
Option A: Use existing repositories
CourseRepositoryinapi/courses.pyUserProfileRepository.get_snapshots()inapi/profiles.pyget_all_tags(),get_all_skills()toCourseRepositoryOption B: Accept as pragmatic choice
admin.py(Issue 1) instead