This commit is contained in:
sebastian 2026-06-28 14:15:24 +02:00
parent 10dd1f76cb
commit a38d30071e
11 changed files with 173 additions and 0 deletions

10
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.14 (WetterstationServer)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.14 (WetterstationServer)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.14 (WetterstationServer)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/WetterstationServer.iml" filepath="$PROJECT_DIR$/.idea/WetterstationServer.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

9
db.py Normal file
View File

@ -0,0 +1,9 @@
from sqlalchemy import create_engine
from sqlmodel import SQLModel, Session
engine = create_engine("sqlite:///database.db")
SQLModel.metadata.create_all(engine)
def get_session():
with Session(engine) as session:
yield session

35
main.py Normal file
View File

@ -0,0 +1,35 @@
import functools
from fastapi import FastAPI, Depends
from sqlmodel import Session
from db import get_session
from models.station import StationCreateRequest, StationCreateResponse, Station, StationListResponse, \
StationUpdateResponse, StationUpdateRequest
from services import stationService
app = FastAPI()
@app.get("/stations/list")
async def list_stations(session: Session = Depends(get_session)):
result = stationService.list_stations(session)
return [StationListResponse.model_validate(station) for station in result]
@app.post("/stations/create", response_model=StationCreateResponse, status_code=200)
async def create_station(station_data: StationCreateRequest, session: Session = Depends(get_session)) -> StationCreateResponse:
station = stationService.create_station(session, station_data)
return StationCreateResponse.model_validate(station)
@app.patch("/stations/update", response_model=StationUpdateResponse, status_code=200)
async def update_station(station_data: StationUpdateRequest, session: Session = Depends(get_session)):
station = stationService.update_station(session, station_data)
return StationUpdateResponse.model_validate(station)
@app.delete("/stations/{station_id}", status_code=204)
async def delete_station(station_id: int, session: Session = Depends(get_session)):
stationService.delete_station(session, station_id)
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}

32
models/station.py Normal file
View File

@ -0,0 +1,32 @@
from datetime import datetime
from typing import Optional
from sqlmodel import SQLModel, Field
class Station(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
mac: str = Field(unique=True)
name: Optional[str] = Field(default=None)
created_at: datetime = Field(default_factory=datetime.now)
class StationCreateRequest(SQLModel):
name: str
mac: str
class StationCreateResponse(SQLModel):
id: int
name: str
class StationListResponse(SQLModel):
id: int
name: str
created_at: datetime
class StationUpdateRequest(SQLModel):
id: int
name: str
class StationUpdateResponse(SQLModel):
id: int
name: str

View File

@ -0,0 +1,39 @@
from typing import Sequence
from fastapi import HTTPException
from sqlmodel import Session, select
from models.station import StationCreateRequest, Station, StationUpdateRequest
def list_stations(session: Session) -> Sequence[Station]:
statement = select(Station)
result = session.exec(statement).all()
return result
def create_station(session: Session, station_data: StationCreateRequest) -> Station:
station = Station.model_validate(station_data)
session.add(station)
session.commit()
session.refresh(station)
return station
def update_station(session: Session, station_data: StationUpdateRequest) -> Station:
station = session.get(Station, station_data.id)
if not station:
raise HTTPException(status_code=404, detail="Station not found")
station.name = station_data.name
session.commit()
session.refresh(station)
return Station.model_validate(station)
def delete_station(session: Session, station_id: int):
station = session.get(Station, station_id)
if not station:
raise HTTPException(status_code=404, detail="Station not found")
session.delete(station)
session.commit()

11
test_main.http Normal file
View File

@ -0,0 +1,11 @@
# Test your FastAPI endpoints
GET http://127.0.0.1:8000/
Accept: application/json
###
GET http://127.0.0.1:8000/hello/User
Accept: application/json
###