Skip to content
Snippets Groups Projects
Commit dab2d91c authored by Adrian Block's avatar Adrian Block
Browse files

semester post and delete interfaces

parent 780a5952
No related branches found
No related tags found
No related merge requests found
import datetime
from typing import List
from sqlalchemy import func, and_
from sqlalchemy.orm import Session
from app import schemas
from app.data.brokers.broker import Broker
from app.data.storage import models
from app.processing import mapper
class DatabaseBroker(Broker):
......@@ -13,22 +16,49 @@ class DatabaseBroker(Broker):
def __init__(self, session: Session):
self.session = session
def find_course_by_id(self, semester_name: str, course_id: str) -> schemas.Course:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.name == semester_name,
def find_course_by_id(self, semester_id: int, course_id: str) -> schemas.Course:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.id == semester_id,
models.Course.cid == course_id).first()
def find_course_by_name(self, semester_name: str, course_name: str) -> schemas.Course:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.name == semester_name,
def find_course_by_name(self, semester_id: int, course_name: str) -> schemas.Course:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.id == semester_id,
models.Course.name == course_name).first()
def find_courses_by_name(self, semester_name: str, course_name: str) -> List[schemas.Course]:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.name == semester_name,
def find_courses_by_name(self, semester_id: int, course_name: str) -> List[schemas.Course]:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.id == semester_id,
models.Course.name.ilike(
f"%{course_name}%")).all()
def get_courses(self, semester_name) -> List[schemas.Course]:
def get_courses(self, semester_id: int) -> List[schemas.Course]:
return self.session.query(models.Course).join(models.Semester).filter(
models.Semester.name == semester_name).all()
models.Semester.name == semester_id).all()
def get_semesters(self) -> List[schemas.SemesterWithoutCourses]:
def get_semesters(self) -> List[schemas.SemesterWithoutCoursesButId]:
return self.session.query(models.Semester).all()
def get_newest_semesters(self) -> List[schemas.SemesterWithoutCoursesButId]:
# query every semester, but only return the newest one
sq = self.session.query(models.Semester.name.label("name"), func.max(models.Semester.created).label("created")) \
.group_by(models.Semester.name).subquery()
return self.session.query(models.Semester) \
.join(sq, and_(models.Semester.name == sq.c.name, models.Semester.created == sq.c.created)).all()
def get_all_courses_of_semester(self, semester_id: int) -> List[schemas.CourseWithoutAppointments]:
return self.session.query(models.Course).join(models.Semester).filter(models.Semester.id == semester_id).all()
def create_semester(self, semester: schemas.Semester):
if semester.created is None:
semester.created = datetime.datetime.now()
db_semester = mapper.map_semester(semester)
self.session.add(db_semester)
self.session.commit()
def delete_semester(self, semester_id: int) -> bool:
db_semester = self.session.query(models.Semester).filter(models.Semester.id == semester_id).first()
if db_semester:
self.session.delete(db_semester)
self.session.commit()
return True
else:
return False
......@@ -80,4 +80,6 @@ class Semester(Base):
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(VARCHAR(32), nullable=False)
created = Column(DateTime, nullable=True, server_default=func.now())
courses = relationship("Course", back_populates="semester")
......@@ -34,4 +34,5 @@ def map_semester(semester: schemas.Semester) -> models.Semester:
return models.Semester(
name=semester.name,
courses=[map_course(course) for course in semester.courses],
created=semester.created,
)
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from app import schemas
from app.data.brokers import DatabaseBroker
from app.routes.api_dependencies import check_api_key
from app.routes.dependencies import get_database_broker
router = APIRouter(
dependencies=[Depends(check_api_key)]
)
@router.post('/semester', status_code=201)
def create_semester(semester: schemas.Semester, broker: DatabaseBroker = Depends(get_database_broker)):
"""
Create a new semester
"""
broker.create_semester(semester)
@router.delete('/semester')
def delete_semester(semesterId: int, broker: DatabaseBroker = Depends(get_database_broker)):
"""
Delete a semester
"""
if not broker.delete_semester(semesterId):
raise HTTPException(status_code=404, detail="Semester not found")
......@@ -10,20 +10,29 @@ router = APIRouter()
@router.get("/search", response_model=List[schemas.CourseWithoutAppointments])
def list_and_search_courses_by_name(semester: str = Query(..., example="Sommer 2022"),
def list_and_search_courses_by_name(semesterId: int = Query(..., example=1),
title: str = Query(..., example="Systemsoftware und"),
broker: Broker = Depends(get_database_broker)):
"""
List and search courses by name.
"""
return broker.find_courses_by_name(semester, title)
return broker.find_courses_by_name(semesterId, title)
@router.get("/{courseId}", response_model=schemas.Course)
def retrieve_information_of_a_course(semester: str = Query(..., example="Sommer 2022"),
def retrieve_information_of_a_course(semesterId: int = Query(..., example=1),
courseId: str = Path(..., example="L.079.05401"),
broker: Broker = Depends(get_database_broker)):
"""
Querries course by id with all small groups and appointments.
"""
return broker.find_course_by_id(semester, courseId)
return broker.find_course_by_id(semesterId, courseId)
@router.get("/all", response_model=List[schemas.CourseWithoutAppointments])
def list_all_courses_of_semester(semesterId: int = Query(..., example=1),
broker: Broker = Depends(get_database_broker)):
"""
List all courses of a semester.
"""
return broker.get_all_courses_of_semester(semesterId)
\ No newline at end of file
......@@ -3,15 +3,23 @@ from typing import List
from fastapi import APIRouter, Depends
from app import schemas
from app.data.brokers import Broker
from app.data.brokers import Broker, DatabaseBroker
from app.routes.dependencies import get_database_broker
router = APIRouter()
@router.get("/available", response_model=List[schemas.SemesterWithoutCourses])
@router.get("/available", response_model=List[schemas.SemesterWithoutCoursesButId])
def see_all_available_semesters(broker: Broker = Depends(get_database_broker)):
"""
Returns all available semesters.
"""
return broker.get_semesters()
@router.get("/newest", response_model=List[schemas.SemesterWithoutCoursesButId])
def see_newest_semesters(broker: DatabaseBroker = Depends(get_database_broker)):
"""
Returns newest semester of all semesters with same name.
"""
return broker.get_newest_semesters()
from .course import Course, Appointment, SmallGroup, CourseList, CourseWithoutAppointments, Semester, SemesterList, \
SemesterWithoutCourses
SemesterWithoutCourses, SemesterWithoutCoursesButId
......@@ -81,6 +81,7 @@ class CourseList(BaseModel):
class SemesterWithoutCourses(BaseModel):
name: str
created: Optional[datetime.datetime] = datetime.datetime.now()
class Config:
orm_mode = True
......@@ -92,6 +93,10 @@ class SemesterWithoutCourses(BaseModel):
}
class SemesterWithoutCoursesButId(SemesterWithoutCourses):
id: int
class Semester(SemesterWithoutCourses):
courses: List[Course] = []
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment