From 58f93eae7980ec02643c52e335155a2bd6b2c041 Mon Sep 17 00:00:00 2001
From: Aymeric Chaumont <aymeric.chaumont@student-cs.fr>
Date: Fri, 8 Jul 2022 14:26:39 +0200
Subject: [PATCH] db and back routes for restaurants opening hours

---
 backend/db/crud.py               | 41 ++++++++++++++++++++++++++++++++
 backend/db/models.py             | 20 +++++++++++++---
 backend/db/schemas.py            | 19 +++++++++++++++
 backend/main.py                  |  3 ++-
 backend/routers/opening_hours.py | 29 ++++++++++++++++++++++
 5 files changed, 108 insertions(+), 4 deletions(-)
 create mode 100644 backend/routers/opening_hours.py

diff --git a/backend/db/crud.py b/backend/db/crud.py
index 6315054..5bff687 100644
--- a/backend/db/crud.py
+++ b/backend/db/crud.py
@@ -125,3 +125,44 @@ def delete_news(id: int, db: Session):
     else:
         db.query(models.News).filter(models.News.id == id).delete()
     db.commit()
+
+
+# Define CRUD operation for the opening hours
+
+def get_opening_hours(place: str, db: Session):
+    """ Get the opening hours for the given place """
+    opening_hours = db.query(
+        models.OpeningHours
+        ).filter(
+            models.OpeningHours.place == place
+        ).order_by(
+            models.OpeningHours.day, models.OpeningHours.timeslot.desc()
+        ).all()
+    return opening_hours
+
+
+def get_timeslot(place: str, day: int, timeslot: bool, db: Session):
+    """ Get the opening hours for the given place and timeslot"""
+    opening_hours = db.query(models.OpeningHours).filter(
+        models.OpeningHours.place == place,
+        models.OpeningHours.day == day,
+        models.OpeningHours.timeslot == timeslot).first()
+    return opening_hours
+
+
+def create_opening_hours(new_opening_hours: schemas.OpeningHoursBase, db: Session):
+    """ Add opening hours to the database """
+    db_opening_hours = models.News(**new_opening_hours.dict())
+    db.add(db_opening_hours)
+    db.commit()
+    db.refresh(db_opening_hours)
+    return db_opening_hours
+
+
+def delete_opening_hours(id: int, db: Session):
+    """ Delete the opening hours with the matching id """
+    if id == 0:
+        db.query(models.OpeningHours).delete()
+    else:
+        db.query(models.OpeningHours).filter(models.OpeningHours.id == id).delete()
+    db.commit()
diff --git a/backend/db/models.py b/backend/db/models.py
index 898bf95..58c3afa 100644
--- a/backend/db/models.py
+++ b/backend/db/models.py
@@ -1,7 +1,7 @@
 """
 Models of the database for magasin app
 """
-from sqlalchemy import Column, Integer, DateTime, Float, Interval, String, Text
+from sqlalchemy import Column, Integer, DateTime, Float, Interval, String, Text, Boolean
 
 from db.database import Base
 
@@ -28,8 +28,8 @@ class Comments(Base):
 
 
 class News(Base):
-    """Records sql table model"""
-    __tablename__ = "News sql table model"
+    """News sql table model"""
+    __tablename__ = "news"
 
     id = Column(Integer, primary_key=True, index=True)
     title = Column(String(50))
@@ -37,3 +37,17 @@ class News(Base):
     published_at = Column(DateTime)
     end_date = Column(DateTime)
     place = Column(String(10))
+
+
+class OpeningHours(Base):
+    """OpeningHours sql table model"""
+    __tablename__ = "opening_hours"
+
+    id = Column(Integer, primary_key=True, index=True)
+    place = Column(String(10))
+    day= Column(Integer)
+    timeslot = Column(Boolean)
+    open_hour = Column(Integer)
+    open_minute = Column(Integer)
+    close_hour = Column(Integer)
+    close_minute = Column(Integer)
diff --git a/backend/db/schemas.py b/backend/db/schemas.py
index 71fe821..474dd94 100644
--- a/backend/db/schemas.py
+++ b/backend/db/schemas.py
@@ -52,3 +52,22 @@ class News(NewsBase):
 
     class Config:
         orm_mode = True
+
+
+class OpeningHoursBase(BaseModel):
+    """Database opening_hours base schema"""
+    place: str = Field(..., title="Name of the RU corresponding the given record")
+    day: int = Field(..., title="Day of the week")
+    timeslot: bool = Field(..., title="Service slot (True for midday, False for evening)")
+    open_hour: int = Field(..., title="Hour of the opening time")
+    open_minute: int = Field(..., title="Minute of the opening time")
+    close_hour: int = Field(..., title="Hour of the closing time")
+    close_minute: int = Field(..., title="Minute of the closing time")
+
+
+class OpeningHours(OpeningHoursBase):
+    """Database opening_hours base schema"""
+    id: int
+
+    class Config:
+        orm_mode = True
diff --git a/backend/main.py b/backend/main.py
index d4d2ed4..705da50 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -4,7 +4,7 @@ from dotenv import load_dotenv
 import os
 
 from db import database, models
-from routers import stats, comments, news
+from routers import stats, comments, news, opening_hours
 
 app = FastAPI(docs_url="/api/docs", openapi_url="/api/openapi.json")
 
@@ -34,6 +34,7 @@ def on_startup():
 app.include_router(stats.router)
 app.include_router(comments.router)
 app.include_router(news.router)
+app.include_router(opening_hours.router)
 
 
 """
diff --git a/backend/routers/opening_hours.py b/backend/routers/opening_hours.py
new file mode 100644
index 0000000..5f2725e
--- /dev/null
+++ b/backend/routers/opening_hours.py
@@ -0,0 +1,29 @@
+from fastapi import APIRouter, Depends
+from sqlalchemy.orm import Session
+from typing import List
+
+from db import schemas, crud
+from db.database import get_db
+
+
+router = APIRouter(prefix="/api/opening_hours", tags=["opening_hours"])
+
+
+@router.get('/{place}', response_model=List[schemas.OpeningHours])
+async def get_opening_hours(place: str, page: int = 1, db: Session = Depends(get_db)):
+    return crud.get_opening_hours(place, page, db)
+
+
+@router.get('/{place}/{day}/{timeslot}', response_model=List[schemas.OpeningHours])
+async def get_timeslot(place: str, day: int, timeslot: bool, db: Session = Depends(get_db)):
+    return crud.get_timeslot(place, day, timeslot, db)
+
+
+@router.post('/{place}', response_model=schemas.OpeningHours)
+async def create_opening_hours(place: str, opening_hours: schemas.OpeningHoursBase, db: Session = Depends(get_db)):
+    return crud.create_opening_hours(place, opening_hours, db)
+
+
+@router.delete('/{id}', response_model=None)
+async def delete_opening_hours(id: int, db: Session = Depends(get_db)):
+    return crud.delete_opening_hours(id, db)
-- 
GitLab