Skip to content

Commit 6e7200a

Browse files
authored
Merge pull request #16 from BitPolito/Edoardo
Courses API
2 parents 5aacd20 + d5c0727 commit 6e7200a

5 files changed

Lines changed: 97 additions & 0 deletions

File tree

services/ai/app/api/courses_api.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,23 @@
11
"""Courses API controller - HTTP + error mapping."""
2+
from fastapi import APIRouter
3+
from typing import List
4+
from services import course_service
5+
from schemas.course_schemas import CourseSchema, LessonSchema
6+
7+
router = APIRouter(prefix="/api", tags=["Courses"])
8+
9+
@router.get("/courses", response_model=List[CourseSchema])
10+
def get_courses():
11+
return course_service.list_courses()
12+
13+
@router.get("/courses/{course_id}", response_model=CourseSchema)
14+
def get_course(course_id: int):
15+
return course_service.get_course(course_id)
16+
17+
@router.get("/courses/{course_id}/lessons", response_model=List[LessonSchema])
18+
def get_course_lessons(course_id: int):
19+
return course_service.get_course_lessons(course_id)
20+
21+
@router.get("/lessons/{lesson_id}", response_model=LessonSchema)
22+
def get_lesson(lesson_id: int):
23+
return course_service.get_lesson(lesson_id)

services/ai/app/main.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
11
"""FastAPI application entry point."""
2+
from fastapi import FastAPI
3+
from api.courses_api import router as courses_router
4+
5+
app = FastAPI(title="Courses API", version="1.0.0")
6+
7+
# Includi il router dei corsi
8+
app.include_router(courses_router)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,23 @@
11
"""Course repository - data access for course aggregate."""
2+
courses = [
3+
{"id": 1, "title": "Python Basics", "description": "Learn Python from scratch"},
4+
{"id": 2, "title": "FastAPI Advanced", "description": "Deep dive into FastAPI"}
5+
]
6+
7+
lessons = [
8+
{"id": 1, "course_id": 1, "title": "Variables and Types", "content": "Intro to types"},
9+
{"id": 2, "course_id": 1, "title": "Functions", "content": "How to define functions"},
10+
{"id": 3, "course_id": 2, "title": "Routing", "content": "Learn how routing works"},
11+
]
12+
13+
def get_all_courses():
14+
return courses
15+
16+
def get_course_by_id(course_id: int):
17+
return next((c for c in courses if c["id"] == course_id), None)
18+
19+
def get_lessons_by_course_id(course_id: int):
20+
return [l for l in lessons if l["course_id"] == course_id]
21+
22+
def get_lesson_by_id(lesson_id: int):
23+
return next((l for l in lessons if l["id"] == lesson_id), None)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,24 @@
11
"""Pydantic schemas for course DTOs."""
2+
from pydantic import BaseModel
3+
from typing import List, Optional
4+
5+
class LessonSchema(BaseModel):
6+
id: int
7+
title: str
8+
content: Optional[str] = None
9+
10+
class Config:
11+
orm_mode = True
12+
13+
14+
class CourseSchema(BaseModel):
15+
id: int
16+
title: str
17+
description: Optional[str] = None
18+
19+
class Config:
20+
orm_mode = True
21+
22+
23+
class CourseWithLessonsSchema(CourseSchema):
24+
lessons: List[LessonSchema] = []
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,24 @@
11
"""Course service - business logic for create/update course, structure checks."""
2+
from repositories import course_repo
3+
from fastapi import HTTPException
4+
5+
def list_courses():
6+
return course_repo.get_all_courses()
7+
8+
def get_course(course_id: int):
9+
course = course_repo.get_course_by_id(course_id)
10+
if not course:
11+
raise HTTPException(status_code=404, detail="Course not found")
12+
return course
13+
14+
def get_course_lessons(course_id: int):
15+
course = course_repo.get_course_by_id(course_id)
16+
if not course:
17+
raise HTTPException(status_code=404, detail="Course not found")
18+
return course_repo.get_lessons_by_course_id(course_id)
19+
20+
def get_lesson(lesson_id: int):
21+
lesson = course_repo.get_lesson_by_id(lesson_id)
22+
if not lesson:
23+
raise HTTPException(status_code=404, detail="Lesson not found")
24+
return lesson

0 commit comments

Comments
 (0)