From 6b9d9766e8c1088cd019cc2bd72b1261e04460b7 Mon Sep 17 00:00:00 2001 From: wqba Date: Mon, 20 Jan 2025 12:51:40 -0500 Subject: [PATCH 1/4] implemented backend tasks --- backend/api/endpoints/command.py | 27 ++++++++++++++--- backend/api/middlewares/logger_middleware.py | 32 ++++++++++++++++++-- backend/data/data_models.py | 7 ++++- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/backend/api/endpoints/command.py b/backend/api/endpoints/command.py index 583ea5a..5100040 100644 --- a/backend/api/endpoints/command.py +++ b/backend/api/endpoints/command.py @@ -24,23 +24,40 @@ def get_commands(db: Session = Depends(get_db)): @command_router.post("/", response_model=CommandSingleResponse) -def create_command(payload: CommandRequest): +def create_command(payload: CommandRequest, db: Session = Depends(get_db)): """ Creates an item with the given payload in the database and returns this payload after pulling it from the database @param payload: The data used to create an item @return returns a json object with field of "data" under which there is the payload now pulled from the database """ - # TODO:(Member) Implement this endpoint - + + new_command = Command(**payload.dict()); + + db.add(new_command) + db.commit() + db.refresh(new_command) + + return {"data" : new_command} @command_router.delete("/{id}", response_model=CommandListResponse) -def delete_command(id: int): +def delete_command(id: int, db: Session = Depends(get_db)): """ Deletes the item with the given id if it exists. Otherwise raises a 404 error. @param id: The id of the item to delete @return returns the list of commands after deleting the item """ - # TODO:(Member) Implement this endpoint + + command_to_delete = db.get(Command, id) + if not command_to_delete: + raise HTTPException(status_code=404) + + db.delete(command_to_delete) + db.commit() + + remaining_commands = db.exec(select(Command)).all() + + return {"data": remaining_commands} + diff --git a/backend/api/middlewares/logger_middleware.py b/backend/api/middlewares/logger_middleware.py index 44daa5d..44c9f1d 100644 --- a/backend/api/middlewares/logger_middleware.py +++ b/backend/api/middlewares/logger_middleware.py @@ -1,8 +1,12 @@ from collections.abc import Callable +from time import time from typing import Any from fastapi import Request, Response +from loguru import logger from starlette.middleware.base import BaseHTTPMiddleware +from backend.utils.logging import logger_setup, logger_close + class LoggerMiddleware(BaseHTTPMiddleware): async def dispatch( @@ -17,6 +21,28 @@ async def dispatch( @param call_next: Endpoint or next middleware to be called (if any, this is the next middleware in the chain of middlewares, it is supplied by FastAPI) @return Response from endpoint """ - # TODO:(Member) Finish implementing this method - response = await call_next(request) - return response + + #logger_setup() assuming this is run during startup + + logger.info(f"Incoming request: {request.method} {request.url.path}"); + logger.info(f"Params: {request.query_params}"); + logger.info(f"Headers: {dict(request.headers)}"); + + try: + start_time = time() + response = await call_next(request) + end_time = time() - start_time + + logger.info(f"Outgoing response: {request.method} {request.url.path}") + logger.info(f"Response status: {response.status_code}") + logger.info(f"Response headers: {dict(response.headers)}") + logger.info(f"Response time: {end_time}") + + #await logger_close() + return response + + except Exception as e: + #await logger_close() + raise + + diff --git a/backend/data/data_models.py b/backend/data/data_models.py index 68adddb..22f6fed 100644 --- a/backend/data/data_models.py +++ b/backend/data/data_models.py @@ -33,7 +33,12 @@ def validate_params_format(self): The format of the comma seperated values is "data1,data2" so no spaces between data and the commas. """ # TODO: (Member) Implement this method - return self + if not self.params and not self.format: + return self + elif self.params and self.format and len(self.params.split(",")) == len(self.format.split(",")): + return self + else: + raise ValueError class Command(BaseSQLModel, table=True): From 714fdc51ef25b1984cafcd91fddbda2ea88f5b61 Mon Sep 17 00:00:00 2001 From: wqba Date: Tue, 21 Jan 2025 16:03:59 -0500 Subject: [PATCH 2/4] fixed changes in PR --- backend/api/endpoints/command.py | 2 +- backend/api/middlewares/logger_middleware.py | 35 ++++++++++++-------- backend/data/data_models.py | 4 +-- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/backend/api/endpoints/command.py b/backend/api/endpoints/command.py index 5100040..d9c53d6 100644 --- a/backend/api/endpoints/command.py +++ b/backend/api/endpoints/command.py @@ -32,7 +32,7 @@ def create_command(payload: CommandRequest, db: Session = Depends(get_db)): @return returns a json object with field of "data" under which there is the payload now pulled from the database """ - new_command = Command(**payload.dict()); + new_command = Command(**payload.model_dump()); db.add(new_command) db.commit() diff --git a/backend/api/middlewares/logger_middleware.py b/backend/api/middlewares/logger_middleware.py index 44c9f1d..42e93ff 100644 --- a/backend/api/middlewares/logger_middleware.py +++ b/backend/api/middlewares/logger_middleware.py @@ -2,10 +2,8 @@ from time import time from typing import Any from fastapi import Request, Response -from loguru import logger from starlette.middleware.base import BaseHTTPMiddleware - -from backend.utils.logging import logger_setup, logger_close +from ...utils.logging import logger class LoggerMiddleware(BaseHTTPMiddleware): @@ -28,21 +26,30 @@ async def dispatch( logger.info(f"Params: {request.query_params}"); logger.info(f"Headers: {dict(request.headers)}"); + start_time = time() + try: - start_time = time() response = await call_next(request) - end_time = time() - start_time - - logger.info(f"Outgoing response: {request.method} {request.url.path}") - logger.info(f"Response status: {response.status_code}") - logger.info(f"Response headers: {dict(response.headers)}") - logger.info(f"Response time: {end_time}") + except Exception as e: + logger.warning(f"Error calling next middleware!. Error: {str(e)}") - #await logger_close() - return response + logger.info(f"Outgoing response: {request.method} {request.url.path}") + logger.info(f"Response status: {response.status_code}") + logger.info(f"Response headers: {dict(response.headers)}") + + try: + body = await request.json() + logger.info(f"Request body: {body}") except Exception as e: - #await logger_close() - raise + logger.warning(f"Error reading body!. Error: {str(e)}") + + + end_time = time() - start_time + logger.info(f"Response time: {end_time}") + + return response + + diff --git a/backend/data/data_models.py b/backend/data/data_models.py index 22f6fed..b8adebe 100644 --- a/backend/data/data_models.py +++ b/backend/data/data_models.py @@ -35,10 +35,10 @@ def validate_params_format(self): # TODO: (Member) Implement this method if not self.params and not self.format: return self - elif self.params and self.format and len(self.params.split(",")) == len(self.format.split(",")): + elif self.params and self.format and self.params.count(",") == self.format.count(","): return self else: - raise ValueError + raise ValueError("Validation failed! 'params' and 'format' must either both be None or contain the same number of comma-separated values.") class Command(BaseSQLModel, table=True): From 88bc83ff92538bb78226a96a47f9e659965aa506 Mon Sep 17 00:00:00 2001 From: wqba Date: Wed, 22 Jan 2025 10:55:16 -0500 Subject: [PATCH 3/4] fixed more changes in PR --- backend/api/middlewares/logger_middleware.py | 34 +++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/backend/api/middlewares/logger_middleware.py b/backend/api/middlewares/logger_middleware.py index 42e93ff..b8ab5ba 100644 --- a/backend/api/middlewares/logger_middleware.py +++ b/backend/api/middlewares/logger_middleware.py @@ -7,9 +7,7 @@ class LoggerMiddleware(BaseHTTPMiddleware): - async def dispatch( - self, request: Request, call_next: Callable[[Request], Any] - ) -> Response: + async def dispatch(self, request: Request, call_next: Callable[[Request], Any]) -> Response: """ Logs all incoming and outgoing request, response pairs. This method logs the request params, datetime of request, duration of execution. Logs should be printed using the custom logging module provided. @@ -20,29 +18,33 @@ async def dispatch( @return Response from endpoint """ - #logger_setup() assuming this is run during startup + start_time = time() logger.info(f"Incoming request: {request.method} {request.url.path}"); logger.info(f"Params: {request.query_params}"); logger.info(f"Headers: {dict(request.headers)}"); - - start_time = time() + + try: + reqBody = await request.body() + logger.info(f"Request body: {reqBody}") + except Exception as e: + logger.warning(f"Error reading body!. Error: {str(e)}") + try: response = await call_next(request) - except Exception as e: - logger.warning(f"Error calling next middleware!. Error: {str(e)}") + logger.info(f"Outgoing response: {request.method} {request.url.path}") + logger.info(f"Response status: {response.status_code}") + logger.info(f"Response headers: {dict(response.headers)}") + try: + resBody = await response.body() + logger.info(f"Response body: {resBody}") + except Exception as e: + logger.warning(f"Error reading body!. Error: {str(e)}") - logger.info(f"Outgoing response: {request.method} {request.url.path}") - logger.info(f"Response status: {response.status_code}") - logger.info(f"Response headers: {dict(response.headers)}") - - try: - body = await request.json() - logger.info(f"Request body: {body}") except Exception as e: - logger.warning(f"Error reading body!. Error: {str(e)}") + logger.warning(f"Error calling next middleware!. Error: {str(e)}") end_time = time() - start_time From b68a143ea4c2758cde9f1c566fe4cdd4588f98a5 Mon Sep 17 00:00:00 2001 From: wqba Date: Wed, 22 Jan 2025 13:52:12 -0500 Subject: [PATCH 4/4] used conventions --- backend/api/middlewares/logger_middleware.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/api/middlewares/logger_middleware.py b/backend/api/middlewares/logger_middleware.py index b8ab5ba..a3a2252 100644 --- a/backend/api/middlewares/logger_middleware.py +++ b/backend/api/middlewares/logger_middleware.py @@ -3,7 +3,7 @@ from typing import Any from fastapi import Request, Response from starlette.middleware.base import BaseHTTPMiddleware -from ...utils.logging import logger +from backend.utils.logging import logger class LoggerMiddleware(BaseHTTPMiddleware): @@ -25,8 +25,8 @@ async def dispatch(self, request: Request, call_next: Callable[[Request], Any]) logger.info(f"Headers: {dict(request.headers)}"); try: - reqBody = await request.body() - logger.info(f"Request body: {reqBody}") + req_body = await request.body() + logger.info(f"Request body: {req_body}") except Exception as e: logger.warning(f"Error reading body!. Error: {str(e)}") @@ -38,8 +38,8 @@ async def dispatch(self, request: Request, call_next: Callable[[Request], Any]) logger.info(f"Response headers: {dict(response.headers)}") try: - resBody = await response.body() - logger.info(f"Response body: {resBody}") + res_body = await response.body() + logger.info(f"Response body: {res_body}") except Exception as e: logger.warning(f"Error reading body!. Error: {str(e)}")