diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..55ad7d2 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/database.db + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/pySourceRootDetection.xml b/.idea/pySourceRootDetection.xml new file mode 100644 index 0000000..089a2ac --- /dev/null +++ b/.idea/pySourceRootDetection.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d559bb4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Erst nur requirements kopieren -> besseres Docker-Layer-Caching +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8000 + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/db.py b/db.py index abae123..4702c3d 100644 --- a/db.py +++ b/db.py @@ -1,10 +1,10 @@ -from sqlalchemy import create_engine -from sqlmodel import SQLModel, Session +import os +from sqlmodel import create_engine, SQLModel, Session -from models.station import Station -from models.measurement import IndoorMeasurement, OutdoorMeasurement +DATA_DIR = "data" +os.makedirs(DATA_DIR, exist_ok=True) -engine = create_engine("sqlite:///database.db") +engine = create_engine(f"sqlite:///{DATA_DIR}/database.db") SQLModel.metadata.create_all(engine) def get_session(): diff --git a/main.py b/main.py index 14a710f..e925e4f 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import functools from datetime import datetime from typing import List +import uvicorn from fastapi import FastAPI, Depends, Query from enum import Enum @@ -19,7 +20,7 @@ from services import stationService, measurementService app = FastAPI() app.add_middleware( CORSMiddleware, - allow_origins=["http://localhost:4200"], + allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], @@ -64,4 +65,7 @@ async def get_measurements( @app.get('/measurements/records', response_model=RecordResponse, status_code=200) async def get_records(station_ids: list[int] | None = Query(default=None), from_timestamp: datetime | None = None, session: Session = Depends(get_session)): - return RecordResponse.model_validate(measurementService.get_measurement_records(session, station_ids, from_timestamp)) \ No newline at end of file + return RecordResponse.model_validate(measurementService.get_measurement_records(session, station_ids, from_timestamp)) + +if __name__ == "__main__": + uvicorn.run("main:app", host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4915188 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,24 @@ +annotated-doc==0.0.4 +annotated-types==0.7.0 +anyio==4.14.1 +certifi==2026.6.17 +charset-normalizer==3.4.7 +click==8.4.2 +coolname==5.0.0 +fastapi==0.138.1 +greenlet==3.5.3 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +idna==3.18 +pydantic==2.13.4 +pydantic_core==2.46.4 +requests==2.34.2 +SQLAlchemy==2.0.51 +sqlmodel==0.0.39 +starlette==1.3.1 +typing-inspection==0.4.2 +typing_extensions==4.15.0 +urllib3==2.7.0 +utcnow==0.3.8 +uvicorn==0.49.0