recopytex/backend/api/main.py

127 lines
3.8 KiB
Python
Raw Normal View History

2022-12-27 10:57:50 +00:00
import sqlite3
2022-12-21 13:16:09 +00:00
from fastapi import FastAPI, status
from fastapi.responses import JSONResponse
2022-12-21 05:53:59 +00:00
2022-12-27 10:57:50 +00:00
from backend.adapters.sqlite import create_db
from backend.api.model import StudentModel, TribeModel
from backend.model.student import Student
2022-12-21 05:53:59 +00:00
from backend.model.tribe import Tribe
2022-12-27 10:57:50 +00:00
from backend.repository.student_sqlite_repository import StudentSQLiteRepository
from backend.repository.tribe_sqlite_repository import (
TribeRepositoryError,
TribeSQLiteRepository,
)
from backend.service import services
from backend.service.services import StudentDoesExist, TribeDoesNotExist, TribeExists
2022-12-27 10:57:50 +00:00
# from sqlalchemy import create_engine
# from sqlalchemy.orm import clear_mappers, sessionmaker
# import backend.adapters.orm as orm
# from backend.repository.tribe_sqlalchemy_repository import TribeSQLAlchemyRepository
# orm.start_mappers()
# engine = create_engine("sqlite:///:memory:")
# orm.metadata.create_all(engine)
# session = sessionmaker(bind=engine)()
# tribe_repo = TribeSQLAlchemyRepository(session)
2022-12-21 05:53:59 +00:00
2022-12-28 06:47:35 +00:00
conn = sqlite3.connect("sqlite.db")
2022-12-27 10:57:50 +00:00
create_db(conn)
tribe_repo = TribeSQLiteRepository(conn)
student_repo = StudentSQLiteRepository(conn)
2022-12-21 05:53:59 +00:00
app = FastAPI()
2022-12-27 10:57:50 +00:00
@app.post("/tribes", status_code=status.HTTP_201_CREATED, response_model=TribeModel)
async def post_tribe(item: TribeModel):
2022-12-21 05:53:59 +00:00
tribe = Tribe(**item.dict())
try:
services.add_tribe(
name=item.name, level=item.level, tribe_repo=tribe_repo, conn=conn
)
except TribeExists:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=f"The tribe {tribe.name} already exists",
)
2022-12-21 05:53:59 +00:00
return tribe.to_dict()
2022-12-21 05:53:59 +00:00
@app.get("/tribes", response_model=list[TribeModel])
2022-12-21 13:16:09 +00:00
async def list_tribes():
tribes = tribe_repo.list()
2022-12-21 05:53:59 +00:00
return [t.to_dict() for t in tribes]
2022-12-21 13:16:09 +00:00
@app.get("/tribes/{name}", response_model=TribeModel)
async def get_tribe(name: str):
tribe = tribe_repo.get(name)
return tribe.to_dict()
2022-12-27 10:57:50 +00:00
@app.post("/students", status_code=status.HTTP_201_CREATED, response_model=StudentModel)
async def post_student(item: StudentModel):
if item.id is not None:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=f"You can't post a student with an id. It is already registrered. Use PUT to modify it.",
)
try:
student = services.add_student(
name=item.name,
tribe=item.tribe_name,
tribe_repo=tribe_repo,
student_repo=student_repo,
conn=conn,
)
except TribeDoesNotExist:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=f"The tribe {item.tribe_name} does not exists. You can't add a student in it.",
)
2022-12-27 10:57:50 +00:00
return student.to_dict()
@app.put(
"/students/{student_id}",
status_code=status.HTTP_200_OK,
response_model=StudentModel,
)
async def put_student(student_id, item: StudentModel):
if student_id != item.id:
return JSONResponse(
status_code=status.HTTP_400_BAD_REQUEST,
content=f"Url and student id are the same",
)
try:
student = services.update_student(
id=item.id,
name=item.name,
tribe=item.tribe_name,
tribe_repo=tribe_repo,
student_repo=student_repo,
conn=conn,
)
except TribeDoesNotExist:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=f"The tribe {tribe_name} does not exists. You can't add a student in it.",
)
except StudentDoesExist:
return JSONResponse(
status_code=status.HTTP_409_CONFLICT,
content=f"The student {item.name} ({item.id=}) does not exists. You can't modify it.",
)
return student.to_dict()