Add frontend, member_state_log, etc.
This commit is contained in:
+60
-2
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user