From 62f04a14d5847c242790ac9eabacfd0e01e8cdbe Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:36:45 -0400 Subject: [PATCH] chore: Add Annotation to Path, Query, and Body params --- src/routers/apps.py | 54 ++++++++++-------------- src/routers/collections.py | 40 +++++++++--------- src/routers/documents.py | 54 ++++++++++++------------ src/routers/keys.py | 10 ++--- src/routers/messages.py | 48 ++++++++++----------- src/routers/metamessages.py | 30 ++++++------- src/routers/sessions.py | 84 ++++++++++++++++++++----------------- src/routers/users.py | 60 ++++++++------------------ 8 files changed, 174 insertions(+), 206 deletions(-) diff --git a/src/routers/apps.py b/src/routers/apps.py index 81bc7861..929e0eae 100644 --- a/src/routers/apps.py +++ b/src/routers/apps.py @@ -1,7 +1,7 @@ import logging from typing import Optional -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Body, Depends, Path, Query from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -48,39 +48,18 @@ async def get_app( return await crud.get_app(db, app_id=target_app_id) -# @router.get( -# "", -# response_model=schemas.App, -# ) -# async def get_app_from_token(jwt_params=jwt_params, db=db): -# """ -# Get an App by ID from the app_id provided in the JWT. -# If no app_id is provided, return a 401 Unauthorized error. -# """ -# if jwt_params.ap is None: -# raise AuthenticationException("App not found in JWT") -# return await crud.get_app(db, app_id=jwt_params.ap) -# -# -# @router.get( -# "/{app_id}", -# response_model=schemas.App, -# dependencies=[Depends(require_auth(app_id="app_id"))], -# ) -# async def get_app(app_id: str, db=db): -# """Get an App by ID""" -# app = await crud.get_app(db, app_id=app_id) -# return app - - @router.post( "/list", response_model=Page[schemas.App], dependencies=[Depends(require_auth(admin=True))], ) async def get_all_apps( - options: schemas.AppGet, - reverse: Optional[bool] = False, + options: schemas.AppGet = Body( + ..., description="Filtering and pagination options for the apps list" + ), + reverse: Optional[bool] = Query( + False, description="Whether to reverse the order of results" + ), db=db, ): """Get all Apps""" @@ -99,7 +78,10 @@ async def get_all_apps( response_model=schemas.App, dependencies=[Depends(require_auth(admin=True))], ) -async def get_app_by_name(name: str, db=db): +async def get_app_by_name( + name: str = Path(..., description="Name of the app to retrieve"), + db=db, +): """Get an App by Name""" # ResourceNotFoundException will be caught by global handler if app not found app = await crud.get_app_by_name(db, name=name) @@ -109,7 +91,10 @@ async def get_app_by_name(name: str, db=db): @router.post( "", response_model=schemas.App, dependencies=[Depends(require_auth(admin=True))] ) -async def create_app(app: schemas.AppCreate, db=db): +async def create_app( + app: schemas.AppCreate = Body(..., description="App creation parameters"), + db=db, +): """Create a new App""" honcho_app = await crud.create_app(db, app=app) return honcho_app @@ -120,7 +105,10 @@ async def create_app(app: schemas.AppCreate, db=db): response_model=schemas.App, dependencies=[Depends(require_auth(admin=True))], ) -async def get_or_create_app(name: str, db=db): +async def get_or_create_app( + name: str = Path(..., description="Name of the app to get or create"), + db=db, +): """Get or Create an App""" try: app = await crud.get_app_by_name(db=db, name=name) @@ -137,8 +125,8 @@ async def get_or_create_app(name: str, db=db): dependencies=[Depends(require_auth(app_id="app_id"))], ) async def update_app( - app_id: str, - app: schemas.AppUpdate, + app_id: str = Path(..., description="ID of the app to update"), + app: schemas.AppUpdate = Body(..., description="Updated app parameters"), db=db, ): """Update an App""" diff --git a/src/routers/collections.py b/src/routers/collections.py index cdad9d93..bfe36455 100644 --- a/src/routers/collections.py +++ b/src/routers/collections.py @@ -1,6 +1,6 @@ from typing import Optional -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Depends, Query, Path, Body from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -20,8 +20,8 @@ router = APIRouter( response_model=schemas.Collection, ) async def get_collection( - app_id: str, - user_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), collection_id: Optional[str] = Query( None, description="Collection ID to retrieve. If not provided, uses JWT token" ), @@ -69,10 +69,10 @@ async def get_collection( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def get_collections( - app_id: str, - user_id: str, - options: schemas.CollectionGet, - reverse: Optional[bool] = False, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + options: schemas.CollectionGet = Body(..., description="Filtering options for the collections list"), + reverse: Optional[bool] = Query(False, description="Whether to reverse the order of results"), db=db, ): """Get All Collections for a User""" @@ -90,9 +90,9 @@ async def get_collections( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def get_collection_by_name( - app_id: str, - user_id: str, - name: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + name: str = Path(..., description="Name of the collection to retrieve"), db=db, ) -> schemas.Collection: """Get a Collection by Name""" @@ -108,9 +108,9 @@ async def get_collection_by_name( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def create_collection( - app_id: str, - user_id: str, - collection: schemas.CollectionCreate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection: schemas.CollectionCreate = Body(..., description="Collection creation parameters"), db=db, ): """Create a new Collection""" @@ -133,10 +133,10 @@ async def create_collection( ], ) async def update_collection( - app_id: str, - user_id: str, - collection_id: str, - collection: schemas.CollectionUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection to update"), + collection: schemas.CollectionUpdate = Body(..., description="Updated collection parameters"), db=db, ): "Update a Collection's name or metadata" @@ -163,9 +163,9 @@ async def update_collection( ], ) async def delete_collection( - app_id: str, - user_id: str, - collection_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection to delete"), db=db, ): """Delete a Collection and its documents""" diff --git a/src/routers/documents.py b/src/routers/documents.py index c067c8f5..e8111a4e 100644 --- a/src/routers/documents.py +++ b/src/routers/documents.py @@ -2,7 +2,7 @@ import logging from collections.abc import Sequence from typing import Optional -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Query, Path, Body from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -28,11 +28,11 @@ router = APIRouter( @router.post("/list", response_model=Page[schemas.Document]) async def get_documents( - app_id: str, - user_id: str, - collection_id: str, - options: schemas.DocumentGet, - reverse: Optional[bool] = False, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + options: schemas.DocumentGet = Body(..., description="Filtering options for the documents list"), + reverse: Optional[bool] = Query(False, description="Whether to reverse the order of results"), db=db, ): """Get all of the Documents in a Collection""" @@ -58,10 +58,10 @@ async def get_documents( @router.get("/{document_id}", response_model=schemas.Document) async def get_document( - app_id: str, - user_id: str, - collection_id: str, - document_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + document_id: str = Path(..., description="ID of the document to retrieve"), db=db, ): """Get a document by ID""" @@ -77,10 +77,10 @@ async def get_document( @router.post("/query", response_model=Sequence[schemas.Document]) async def query_documents( - app_id: str, - user_id: str, - collection_id: str, - options: schemas.DocumentQuery, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + options: schemas.DocumentQuery = Body(..., description="Query parameters for document search"), db=db, ): """Cosine Similarity Search for Documents""" @@ -112,10 +112,10 @@ async def query_documents( @router.post("", response_model=schemas.Document) async def create_document( - app_id: str, - user_id: str, - collection_id: str, - document: schemas.DocumentCreate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + document: schemas.DocumentCreate = Body(..., description="Document creation parameters"), db=db, ): """Embed text as a vector and create a Document""" @@ -143,11 +143,11 @@ async def create_document( response_model=schemas.Document, ) async def update_document( - app_id: str, - user_id: str, - collection_id: str, - document_id: str, - document: schemas.DocumentUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + document_id: str = Path(..., description="ID of the document to update"), + document: schemas.DocumentUpdate = Body(..., description="Updated document parameters"), db=db, ): """Update the content and/or the metadata of a Document""" @@ -175,10 +175,10 @@ async def update_document( @router.delete("/{document_id}") async def delete_document( - app_id: str, - user_id: str, - collection_id: str, - document_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + collection_id: str = Path(..., description="ID of the collection"), + document_id: str = Path(..., description="ID of the document to delete"), db=db, ): """Delete a Document by ID""" diff --git a/src/routers/keys.py b/src/routers/keys.py index aaadd82e..45888e54 100644 --- a/src/routers/keys.py +++ b/src/routers/keys.py @@ -1,7 +1,7 @@ import logging import os -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Query from src.exceptions import DisabledException, ValidationException from src.security import ( @@ -23,10 +23,10 @@ router = APIRouter( @router.post("") async def create_key( - app_id: str | None = None, - user_id: str | None = None, - session_id: str | None = None, - collection_id: str | None = None, + app_id: str | None = Query(None, description="ID of the app to scope the key to"), + user_id: str | None = Query(None, description="ID of the user to scope the key to"), + session_id: str | None = Query(None, description="ID of the session to scope the key to"), + collection_id: str | None = Query(None, description="ID of the collection to scope the key to"), ): """Create a new Key""" if not USE_AUTH: diff --git a/src/routers/messages.py b/src/routers/messages.py index 43dfd8d1..ec376628 100644 --- a/src/routers/messages.py +++ b/src/routers/messages.py @@ -2,7 +2,7 @@ import logging import os from typing import List, Optional -from fastapi import APIRouter, BackgroundTasks, Depends +from fastapi import APIRouter, BackgroundTasks, Depends, Query, Path, Body from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate from sqlalchemy.sql import insert @@ -151,11 +151,11 @@ async def enqueue(payload: dict | list[dict]): @router.post("", response_model=schemas.Message) async def create_message_for_session( - app_id: str, - user_id: str, - session_id: str, - message: schemas.MessageCreate, background_tasks: BackgroundTasks, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + message: schemas.MessageCreate = Body(..., description="Message creation parameters"), db=db, ): """Adds a message to a session""" @@ -189,11 +189,11 @@ async def create_message_for_session( @router.post("/batch", response_model=List[schemas.Message]) async def create_batch_messages_for_session( - app_id: str, - user_id: str, - session_id: str, - batch: schemas.MessageBatchCreate, background_tasks: BackgroundTasks, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + batch: schemas.MessageBatchCreate = Body(..., description="Batch of messages to create"), db=db, ): """Bulk create messages for a session while maintaining order. Maximum 100 messages per batch.""" @@ -236,11 +236,11 @@ async def create_batch_messages_for_session( @router.post("/list", response_model=Page[schemas.Message]) async def get_messages( - app_id: str, - user_id: str, - session_id: str, - options: schemas.MessageGet, - reverse: Optional[bool] = False, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + options: schemas.MessageGet = Body(..., description="Filtering options for the messages list"), + reverse: Optional[bool] = Query(False, description="Whether to reverse the order of results"), db=db, ): """Get all messages for a session""" @@ -266,10 +266,10 @@ async def get_messages( @router.get("/{message_id}", response_model=schemas.Message) async def get_message( - app_id: str, - user_id: str, - session_id: str, - message_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + message_id: str = Path(..., description="ID of the message to retrieve"), db=db, ): """Get a Message by ID""" @@ -284,11 +284,11 @@ async def get_message( @router.put("/{message_id}", response_model=schemas.Message) async def update_message( - app_id: str, - user_id: str, - session_id: str, - message_id: str, - message: schemas.MessageUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + message_id: str = Path(..., description="ID of the message to update"), + message: schemas.MessageUpdate = Body(..., description="Updated message parameters"), db=db, ): """Update the metadata of a Message""" @@ -305,4 +305,4 @@ async def update_message( return updated_message except ValueError as e: logger.warning(f"Failed to update message {message_id}: {str(e)}") - raise ResourceNotFoundException("Message or session not found") from e + raise ResourceNotFoundException("Message not found") from e diff --git a/src/routers/metamessages.py b/src/routers/metamessages.py index 083a8a57..4e280d2a 100644 --- a/src/routers/metamessages.py +++ b/src/routers/metamessages.py @@ -1,7 +1,7 @@ import logging from typing import Optional -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Query, Path, Body from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -24,9 +24,9 @@ router = APIRouter( @router.post("", response_model=schemas.Metamessage) async def create_metamessage( - app_id: str, - user_id: str, - metamessage: schemas.MetamessageCreate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + metamessage: schemas.MetamessageCreate = Body(..., description="Metamessage creation parameters"), db=db, ): """ @@ -51,10 +51,10 @@ async def create_metamessage( @router.post("/list", response_model=Page[schemas.Metamessage]) async def get_metamessages( - app_id: str, - user_id: str, - options: schemas.MetamessageGet, - reverse: Optional[bool] = False, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + options: schemas.MetamessageGet = Body(..., description="Filtering options for the metamessages list"), + reverse: Optional[bool] = Query(False, description="Whether to reverse the order of results"), db=db, ): """ @@ -89,9 +89,9 @@ async def get_metamessages( response_model=schemas.Metamessage, ) async def get_metamessage( - app_id: str, - user_id: str, - metamessage_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + metamessage_id: str = Path(..., description="ID of the metamessage to retrieve"), db=db, ): """Get a specific Metamessage by ID""" @@ -114,10 +114,10 @@ async def get_metamessage( response_model=schemas.Metamessage, ) async def update_metamessage( - app_id: str, - user_id: str, - metamessage_id: str, - metamessage: schemas.MetamessageUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + metamessage_id: str = Path(..., description="ID of the metamessage to update"), + metamessage: schemas.MetamessageUpdate = Body(..., description="Updated metamessage parameters"), db=db, ): """Update a metamessage's metadata, type, or relationships""" diff --git a/src/routers/sessions.py b/src/routers/sessions.py index d884ce7e..6a0d5baf 100644 --- a/src/routers/sessions.py +++ b/src/routers/sessions.py @@ -2,7 +2,7 @@ import logging from typing import Optional from anthropic import MessageStreamManager -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Depends, Query, Path, Body from fastapi.responses import StreamingResponse from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -29,8 +29,8 @@ router = APIRouter( response_model=schemas.Session, ) async def get_session( - app_id: str, - user_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), session_id: Optional[str] = Query( None, description="Session ID to retrieve. If not provided, uses JWT token" ), @@ -78,10 +78,10 @@ async def get_session( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def get_sessions( - app_id: str, - user_id: str, - options: schemas.SessionGet, - reverse: Optional[bool] = False, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + options: schemas.SessionGet = Body(..., description="Filtering and pagination options for the sessions list"), + reverse: Optional[bool] = Query(False, description="Whether to reverse the order of results"), db=db, ): """Get All Sessions for a User""" @@ -104,9 +104,9 @@ async def get_sessions( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def create_session( - app_id: str, - user_id: str, - session: schemas.SessionCreate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session: schemas.SessionCreate = Body(..., description="Session creation parameters"), db=db, ): """Create a Session for a User""" @@ -131,10 +131,10 @@ async def create_session( ], ) async def update_session( - app_id: str, - user_id: str, - session_id: str, - session: schemas.SessionUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session to update"), + session: schemas.SessionUpdate = Body(..., description="Updated session parameters"), db=db, ): """Update the metadata of a Session""" @@ -158,9 +158,9 @@ async def update_session( ], ) async def delete_session( - app_id: str, - user_id: str, - session_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session to delete"), db=db, ): """Delete a session by marking it as inactive""" @@ -185,10 +185,10 @@ async def delete_session( ], ) async def chat( - app_id: str, - user_id: str, - session_id: str, - query: schemas.AgentQuery, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + query: schemas.AgentQuery = Body(..., description="Chat query parameters"), ): """Chat with the Dialectic API""" return await agent.chat( @@ -213,10 +213,10 @@ async def chat( ], ) async def get_chat_stream( - app_id: str, - user_id: str, - session_id: str, - query: schemas.AgentQuery, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session"), + query: schemas.AgentQuery = Body(..., description="Chat query parameters"), ): """Stream Results from the Dialectic API""" @@ -248,19 +248,25 @@ async def get_chat_stream( ], ) async def clone_session( - app_id: str, - user_id: str, - session_id: str, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user"), + session_id: str = Path(..., description="ID of the session to clone"), db=db, - message_id: Optional[str] = None, - deep_copy: bool = False, + message_id: Optional[str] = Query(None, description="Message ID to cut off the clone at"), + deep_copy: bool = Query(False, description="Whether to deep copy metamessages"), ): - """Clone a session for a user, optionally will deep clone metamessages as well""" - return await crud.clone_session( - db, - app_id=app_id, - user_id=user_id, - original_session_id=session_id, - cutoff_message_id=message_id, - deep_copy=deep_copy, - ) + """Clone a session, optionally up to a specific message""" + try: + cloned_session = await crud.clone_session( + db, + app_id=app_id, + user_id=user_id, + original_session_id=session_id, + cutoff_message_id=message_id, + deep_copy=deep_copy, + ) + logger.info(f"Session {session_id} cloned successfully") + return cloned_session + except ValueError as e: + logger.warning(f"Failed to clone session {session_id}: {str(e)}") + raise ResourceNotFoundException("Session not found") from e diff --git a/src/routers/users.py b/src/routers/users.py index e5166c54..721d1f99 100644 --- a/src/routers/users.py +++ b/src/routers/users.py @@ -1,7 +1,7 @@ import logging from typing import Optional -from fastapi import APIRouter, Depends, Query +from fastapi import APIRouter, Depends, Query, Path, Body from fastapi_pagination import Page from fastapi_pagination.ext.sqlalchemy import paginate @@ -27,8 +27,8 @@ router = APIRouter( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def create_user( - app_id: str, - user: schemas.UserCreate, + app_id: str = Path(..., description="ID of the app"), + user: schemas.UserCreate = Body(..., description="User creation parameters"), db=db, ): """Create a new User""" @@ -42,9 +42,9 @@ async def create_user( dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def get_users( - app_id: str, - options: schemas.UserGet, - reverse: bool = False, + app_id: str = Path(..., description="ID of the app"), + options: schemas.UserGet = Body(..., description="Filtering options for the users list"), + reverse: bool = Query(False, description="Whether to reverse the order of results"), db=db, ): """Get All Users for an App""" @@ -59,7 +59,7 @@ async def get_users( response_model=schemas.User, ) async def get_user( - app_id: str, + app_id: str = Path(..., description="ID of the app"), user_id: Optional[str] = Query( None, description="User ID to retrieve. If not provided, users JWT token" ), @@ -89,36 +89,6 @@ async def get_user( return user -# @router.get( -# "", -# response_model=schemas.User, -# ) -# async def get_user_from_token(app_id: str, jwt_params=jwt_params, db=db): -# """ -# Get a User by ID from the user_id provided in the JWT. -# If no user_id is provided, return a 401 Unauthorized error. -# """ -# if jwt_params.us is None: -# raise AuthenticationException("User not found in JWT") -# return await crud.get_user(db, app_id=app_id, user_id=jwt_params.us) -# -# -# @router.get( -# "/{user_id}", -# response_model=schemas.User, -# dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], -# ) -# async def get_user( -# app_id: str, -# user_id: str, -# db=db, -# ): -# """Get a User by ID""" -# user = await crud.get_user(db, app_id=app_id, user_id=user_id) -# return user -# - - @router.get( "/name/{name}", response_model=schemas.User, @@ -131,8 +101,8 @@ async def get_user( ], ) async def get_user_by_name( - app_id: str, - name: str, + app_id: str = Path(..., description="ID of the app"), + name: str = Path(..., description="Name of the user to retrieve"), db=db, ): """Get a User by name""" @@ -151,7 +121,11 @@ async def get_user_by_name( ) ], ) -async def get_or_create_user(app_id: str, name: str, db=db): +async def get_or_create_user( + app_id: str = Path(..., description="ID of the app"), + name: str = Path(..., description="Name of the user to get or create"), + db=db, +): """Get a User or create a new one by the input name""" try: user = await crud.get_user_by_name(db, app_id=app_id, name=name) @@ -170,9 +144,9 @@ async def get_or_create_user(app_id: str, name: str, db=db): dependencies=[Depends(require_auth(app_id="app_id", user_id="user_id"))], ) async def update_user( - app_id: str, - user_id: str, - user: schemas.UserUpdate, + app_id: str = Path(..., description="ID of the app"), + user_id: str = Path(..., description="ID of the user to update"), + user: schemas.UserUpdate = Body(..., description="Updated user parameters"), db=db, ): """Update a User's name and/or metadata"""