Add frontend, member_state_log, etc.

This commit is contained in:
2025-07-29 14:47:03 +02:00
parent ebed331760
commit 4be0e48442
19 changed files with 5962 additions and 5 deletions
+60 -2
View File
@@ -1,4 +1,4 @@
from fastapi import FastAPI, HTTPException, Depends
from fastapi import FastAPI, HTTPException, Depends, WebSocket
from fastapi.security import OAuth2PasswordBearer
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
@@ -7,6 +7,9 @@ from sustApp.models.models import Base, Members, Payments
from sustApp.models.database import engine, SessionLocal
from sqlalchemy.orm import Session
from datetime import datetime
import asyncio
import logging
#http://127.0.0.1:8000/docs -> swagger like ui
#ngrok http http://localhost:8000
@@ -27,6 +30,7 @@ origins = [
"http://localhost",
"http://localhost:8080",
"http://localhost:3000",
"http://localhost:5173",
]
app.add_middleware(
@@ -37,6 +41,48 @@ app.add_middleware(
allow_headers=["*"],
)
# Store active WebSocket connections
connected_clients = []
# Custom logging handler to send logs via WebSocket
class WebSocketHandler(logging.Handler):
def emit(self, record):
log_message = self.format(record)
# Send to all connected clients
asyncio.create_task(broadcast_log(log_message))
# Set up logging
logger = logging.getLogger("app")
logger.setLevel(logging.INFO)
ws_handler = WebSocketHandler()
logger.addHandler(ws_handler)
@app.websocket("/ws/logs")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
connected_clients.append(websocket)
try:
while True:
await websocket.receive_text()
except:
connected_clients.remove(websocket)
async def broadcast_log(message):
for client in connected_clients[:]: # Copy list to avoid modification during iteration
try:
await client.send_json({
"type": "log",
"message": message,
"timestamp": asyncio.get_event_loop().time()
})
except:
connected_clients.remove(client)
@app.get("/test")
async def test_endpoint():
logger.info("This is a test log message from backend!")
return {"message": "Check your browser console"}
class User(BaseModel):
username: str
email: str | None = None
@@ -69,6 +115,8 @@ class MemberBase(BaseModel):
#payments: Optional[List[PaymentBase]]
member_deliveries: Optional[List[DeliveryBase]]
#deliveries: Mapped[List["DeliveryBase"]] = relationship()
current_state_code: str | None = None
current_state_name: str | None = None
def get_db():
db = SessionLocal()
@@ -86,11 +134,21 @@ async def read_members(db: db_dependency, skip: int = 0, limit: int = 100 ):
raise HTTPException(status_code=400, detail='No members')
return members
@app.get("/activememberscount/", response_model=int)
async def read_activememberscount(db: db_dependency):
count = db.query(Members).filter(Members.member_active == True).count()
logger.info("This is a test log message from backend!")
return count
@app.get("/member/{member_id}")
async def read_member(member_id: int, db: db_dependency): #, token: Annotated[str, Depends(oauth2_scheme)]):
result = db.query(Members).filter(Members.id == member_id).first()
result = db.query(Members).join(Members.current_state).filter(Members.id == member_id).first()
if not result:
raise HTTPException(status_code=400, detail='Member does not exist')
print(f"Member: {result.member_surname}")
print(f"State: {result.current_state.state_name}")
print(f"Description: {result.current_state.description}")
return result
@app.get("/payments/{member_id}")