Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions services/ai/app/api/courses_api.py
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
"""Courses API controller - HTTP + error mapping."""
from fastapi import APIRouter
from typing import List
from services import course_service
from schemas.course_schemas import CourseSchema, LessonSchema

router = APIRouter(prefix="/api", tags=["Courses"])

@router.get("/courses", response_model=List[CourseSchema])
def get_courses():
return course_service.list_courses()

@router.get("/courses/{course_id}", response_model=CourseSchema)
def get_course(course_id: int):
return course_service.get_course(course_id)

@router.get("/courses/{course_id}/lessons", response_model=List[LessonSchema])
def get_course_lessons(course_id: int):
return course_service.get_course_lessons(course_id)

@router.get("/lessons/{lesson_id}", response_model=LessonSchema)
def get_lesson(lesson_id: int):
return course_service.get_lesson(lesson_id)
7 changes: 7 additions & 0 deletions services/ai/app/main.py
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
"""FastAPI application entry point."""
from fastapi import FastAPI
from api.courses_api import router as courses_router

app = FastAPI(title="Courses API", version="1.0.0")

# Includi il router dei corsi
app.include_router(courses_router)
22 changes: 22 additions & 0 deletions services/ai/app/repositories/course_repo.py
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
"""Course repository - data access for course aggregate."""
courses = [
{"id": 1, "title": "Python Basics", "description": "Learn Python from scratch"},
{"id": 2, "title": "FastAPI Advanced", "description": "Deep dive into FastAPI"}
]

lessons = [
{"id": 1, "course_id": 1, "title": "Variables and Types", "content": "Intro to types"},
{"id": 2, "course_id": 1, "title": "Functions", "content": "How to define functions"},
{"id": 3, "course_id": 2, "title": "Routing", "content": "Learn how routing works"},
]

def get_all_courses():
return courses

def get_course_by_id(course_id: int):
return next((c for c in courses if c["id"] == course_id), None)

def get_lessons_by_course_id(course_id: int):
return [l for l in lessons if l["course_id"] == course_id]

def get_lesson_by_id(lesson_id: int):
return next((l for l in lessons if l["id"] == lesson_id), None)
23 changes: 23 additions & 0 deletions services/ai/app/schemas/course_schemas.py
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@
"""Pydantic schemas for course DTOs."""
from pydantic import BaseModel
from typing import List, Optional

class LessonSchema(BaseModel):
id: int
title: str
content: Optional[str] = None

class Config:
orm_mode = True


class CourseSchema(BaseModel):
id: int
title: str
description: Optional[str] = None

class Config:
orm_mode = True


class CourseWithLessonsSchema(CourseSchema):
lessons: List[LessonSchema] = []
23 changes: 23 additions & 0 deletions services/ai/app/services/course_service.py
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@
"""Course service - business logic for create/update course, structure checks."""
from repositories import course_repo
from fastapi import HTTPException

def list_courses():
return course_repo.get_all_courses()

def get_course(course_id: int):
course = course_repo.get_course_by_id(course_id)
if not course:
raise HTTPException(status_code=404, detail="Course not found")
return course

def get_course_lessons(course_id: int):
course = course_repo.get_course_by_id(course_id)
if not course:
raise HTTPException(status_code=404, detail="Course not found")
return course_repo.get_lessons_by_course_id(course_id)

def get_lesson(lesson_id: int):
lesson = course_repo.get_lesson_by_id(lesson_id)
if not lesson:
raise HTTPException(status_code=404, detail="Lesson not found")
return lesson
Loading