From 4ef63f1b0b8391a8db65d722b541923153f368cb Mon Sep 17 00:00:00 2001 From: Ronald Date: Tue, 25 Jun 2024 21:55:00 +0100 Subject: [PATCH] Adding API --- api/requirements.txt | 3 +++ api/sql_app/__init__.py | 0 api/sql_app/crud.py | 19 +++++++++++++++++++ api/sql_app/database.py | 12 ++++++++++++ api/sql_app/main.py | 27 +++++++++++++++++++++++++++ api/sql_app/models.py | 12 ++++++++++++ api/sql_app/schemas.py | 23 +++++++++++++++++++++++ 7 files changed, 96 insertions(+) create mode 100644 api/requirements.txt create mode 100644 api/sql_app/__init__.py create mode 100644 api/sql_app/crud.py create mode 100644 api/sql_app/database.py create mode 100644 api/sql_app/main.py create mode 100644 api/sql_app/models.py create mode 100644 api/sql_app/schemas.py diff --git a/api/requirements.txt b/api/requirements.txt new file mode 100644 index 0000000..fb7c9d0 --- /dev/null +++ b/api/requirements.txt @@ -0,0 +1,3 @@ +fastapi +uvicorn +pymysql diff --git a/api/sql_app/__init__.py b/api/sql_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/sql_app/crud.py b/api/sql_app/crud.py new file mode 100644 index 0000000..9c4045b --- /dev/null +++ b/api/sql_app/crud.py @@ -0,0 +1,19 @@ +from sqlalchemy.orm import Session +from . import models, schemas + +def get_records(db: Session): + records = db.query(models.Record).all() + return records + +def create_record(db: Session, record: schemas.Record): + db_record = models.Record( + time=record.time, + temperature=record.temperature, + humidity=record.humidity, + room=record.room + ) + db.add(db_record) + db.commit() + db.refresh(db_record) + + return db_record diff --git a/api/sql_app/database.py b/api/sql_app/database.py new file mode 100644 index 0000000..d752fce --- /dev/null +++ b/api/sql_app/database.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +SQLALCHEMY_DATABASE_URL = "mysql+pymysql://dtm:bakedbeans-and-egg-09@192.168.178.190" + \ + "/digital_temperature_monitor?charset=utf8mb4" + +engine = create_engine(SQLALCHEMY_DATABASE_URL) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() diff --git a/api/sql_app/main.py b/api/sql_app/main.py new file mode 100644 index 0000000..b30b536 --- /dev/null +++ b/api/sql_app/main.py @@ -0,0 +1,27 @@ +from typing import List +from fastapi import FastAPI, Depends +from sqlalchemy.orm import Session + +from .database import SessionLocal, engine +from . import models, schemas, crud + +models.Base.metadata.create_all(bind=engine) +app = FastAPI() + +# Dependency +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +@app.get("/records/", response_model=List[schemas.Record]) +def get_records(db: Session = Depends(get_db)): + records = crud.get_records(db) + + return records + +@app.post("/add_record/", response_model=schemas.Record, status_code=201) +def create_record(record: schemas.Record, db: Session = Depends(get_db)): + return crud.create_record(db=db, record=record) diff --git a/api/sql_app/models.py b/api/sql_app/models.py new file mode 100644 index 0000000..5f5a08b --- /dev/null +++ b/api/sql_app/models.py @@ -0,0 +1,12 @@ +from sqlalchemy import Column, Integer, Float, DateTime, String +from .database import Base + + +class Record(Base): + __tablename__ = "th" + + id = Column(Integer, primary_key=True) + time = Column(DateTime, unique=False, index=True) + temperature = Column(Float) + humidity = Column(Float) + room = Column(String(48)) diff --git a/api/sql_app/schemas.py b/api/sql_app/schemas.py new file mode 100644 index 0000000..8ab5da2 --- /dev/null +++ b/api/sql_app/schemas.py @@ -0,0 +1,23 @@ +from typing import Optional +from datetime import datetime + +from pydantic import BaseModel + + +class RecordBase(BaseModel): + time: Optional[datetime] = datetime.now() + temperature: float + humidity: float + room: str + + class Config: + from_attributes = True + +class RecordCreate(RecordBase): + pass + +class Record(RecordBase): + id: int + + class Config: + from_attributes = True