From 1a6c5c262eb3cf0e380db0209adae744fd617b40 Mon Sep 17 00:00:00 2001 From: iliak Date: Sat, 2 Dec 2023 15:53:43 +0300 Subject: [PATCH] check commit --- userdata_api/routes/category.py | 16 ++++++++++------ userdata_api/routes/param.py | 12 +++++++----- userdata_api/routes/source.py | 10 +++++----- userdata_api/routes/user.py | 25 ++++++++++++++++++++++--- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/userdata_api/routes/category.py b/userdata_api/routes/category.py index f834f65..3c55b97 100644 --- a/userdata_api/routes/category.py +++ b/userdata_api/routes/category.py @@ -14,14 +14,17 @@ category = APIRouter(prefix="/category", tags=["Category"]) -@category.post("", response_model=CategoryGet) +@category.post("", response_model=CategoryGet, + description='Создать категорию пользовательских данных. Получить категорию можно будет со скоупами,' + ' имена которых в category_inp.scopes.\n\n' # Используем символ перевода строки + 'Ручка обновит документацию') + async def create_category( request: Request, category_inp: CategoryPost, _: dict[str, str] = Depends(UnionAuth(scopes=["userdata.category.create"], allow_none=False, auto_error=True)), ) -> CategoryGet: """ - Hello_world! Создать категорию пользовательских данных. Получить категорию можно будет со скоупами, имена которых в category_inp.scopes Ручка обновит документацию :param request: https://fastapi.tiangolo.com/advanced/using-request-directly/ @@ -35,7 +38,7 @@ async def create_category( return CategoryGet.model_validate(category) -@category.get("/{id}", response_model=CategoryGet) +@category.get("/{id}", response_model=CategoryGet, description='Получить категорию') async def get_category(id: int) -> CategoryGet: """ Получить категорию @@ -47,7 +50,8 @@ async def get_category(id: int) -> CategoryGet: return CategoryGet.model_validate(category) -@category.get("", response_model=list[CategoryGet], response_model_exclude_none=True) +@category.get("", response_model=list[CategoryGet], response_model_exclude_none=True, + description='Получить все категории') async def get_categories(query: list[Literal["param"]] = Query(default=[])) -> list[CategoryGet]: result = [] for category in Category.query(session=db.session).all(): @@ -69,7 +73,7 @@ async def get_categories(query: list[Literal["param"]] = Query(default=[])) -> l return type_adapter.validate_python(result) -@category.patch("/{id}", response_model=CategoryGet) +@category.patch("/{id}", response_model=CategoryGet, description='Обновить категорию') async def patch_category( request: Request, id: int, @@ -88,7 +92,7 @@ async def patch_category( return CategoryGet.model_validate(Category.update(id, session=db.session, **category_inp.dict(exclude_unset=True))) -@category.delete("/{id}", response_model=StatusResponseModel) +@category.delete("/{id}", response_model=StatusResponseModel, description='Удалить категорию') async def delete_category( request: Request, id: int, diff --git a/userdata_api/routes/param.py b/userdata_api/routes/param.py index 4a0b714..3485c25 100644 --- a/userdata_api/routes/param.py +++ b/userdata_api/routes/param.py @@ -14,7 +14,9 @@ param = APIRouter(prefix="/category/{category_id}/param", tags=["Param"]) -@param.post("", response_model=ParamGet) +@param.post("", response_model=ParamGet, + description='Создать поле внутри категории. ' + 'Ответ на пользовательские данные будет такой {..., category: {...,param: '', ...}}') async def create_param( request: Request, category_id: int, @@ -35,7 +37,7 @@ async def create_param( return ParamGet.model_validate(Param.create(session=db.session, **param_inp.dict(), category_id=category_id)) -@param.get("/{id}", response_model=ParamGet) +@param.get("/{id}", response_model=ParamGet, description='Получить параметр по айди') async def get_param(id: int, category_id: int) -> ParamGet: """ Получить параметр по айди @@ -49,7 +51,7 @@ async def get_param(id: int, category_id: int) -> ParamGet: return ParamGet.model_validate(res) -@param.get("", response_model=list[ParamGet]) +@param.get("", response_model=list[ParamGet], description='Получить все параметры категории') async def get_params(category_id: int) -> list[ParamGet]: """ Получить все параметры категории @@ -60,7 +62,7 @@ async def get_params(category_id: int) -> list[ParamGet]: return type_adapter.validate_python(Param.query(session=db.session).filter(Param.category_id == category_id).all()) -@param.patch("/{id}", response_model=ParamGet) +@param.patch("/{id}", response_model=ParamGet, description='Обновить параметр внутри категории') async def patch_param( request: Request, id: int, @@ -86,7 +88,7 @@ async def patch_param( return ParamGet.model_validate(Param.update(id, session=db.session, **param_inp.dict(exclude_unset=True))) -@param.delete("/{id}", response_model=StatusResponseModel) +@param.delete("/{id}", response_model=StatusResponseModel, description='Удалить параметр внутри категории') async def delete_param( request: Request, id: int, diff --git a/userdata_api/routes/source.py b/userdata_api/routes/source.py index 9de4ca9..2ebd0c2 100644 --- a/userdata_api/routes/source.py +++ b/userdata_api/routes/source.py @@ -14,7 +14,7 @@ source = APIRouter(prefix="/source", tags=["Source"]) -@source.post("", response_model=SourceGet) +@source.post("", response_model=SourceGet, description="Создать источник данных") async def create_source( request: Request, source_inp: SourcePost, @@ -33,7 +33,7 @@ async def create_source( return SourceGet.model_validate(Source.create(session=db.session, **source_inp.dict())) -@source.get("/{id}", response_model=SourceGet) +@source.get("/{id}", response_model=SourceGet, description="Получить источник данных") async def get_source(id: int) -> SourceGet: """ Получить источник данных @@ -43,7 +43,7 @@ async def get_source(id: int) -> SourceGet: return SourceGet.model_validate(Source.get(id, session=db.session)) -@source.get("", response_model=list[SourceGet]) +@source.get("", response_model=list[SourceGet], description='Получить все источники данных') async def get_sources() -> list[SourceGet]: """ Получить все источники данных @@ -53,7 +53,7 @@ async def get_sources() -> list[SourceGet]: return type_adapter.validate_python(Source.query(session=db.session).all()) -@source.patch("/{id}", response_model=SourceGet) +@source.patch("/{id}", response_model=SourceGet, description='Обновить источник данных') async def patch_source( request: Request, id: int, @@ -71,7 +71,7 @@ async def patch_source( return SourceGet.model_validate(Source.update(id, session=db.session, **source_inp.dict(exclude_unset=True))) -@source.delete("/{id}", response_model=StatusResponseModel) +@source.delete("/{id}", response_model=StatusResponseModel, description='Удалить источник данных') async def delete_source( request: Request, id: int, diff --git a/userdata_api/routes/user.py b/userdata_api/routes/user.py index 6ba0572..376b897 100644 --- a/userdata_api/routes/user.py +++ b/userdata_api/routes/user.py @@ -12,12 +12,12 @@ user = APIRouter(prefix="/user", tags=["User"]) -@user.get("/{id}", response_model=UserInfoGet) +@user.get("/{id}", response_model=UserInfoGet, description='Получить информацию о пользователе') async def get_user_info( id: int, user: dict[str, Any] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)) ) -> UserInfoGet: """ - Получить информацию о польщователе + Получить информацию о пользователе :param id: Айди овнера информации(пользователя) :param user: Аутентфикация :return: Словарь, ключи - категории на которые хватило прав(овнеру не нужны права, он получает всё). @@ -32,7 +32,26 @@ async def get_user_info( return UserInfoGet.model_validate(await get(id, user)) -@user.post("/{id}", response_model=StatusResponseModel) +@user.post("/{id}", response_model=StatusResponseModel, + description= 'Обновить информацию о пользователе.\n\n' + 'Объект - пользователь, информацию которого обновляют\n\n' + 'Субъект - пользователь, который обновляет - источник\n\n' + '\n\n' + 'Если не указать параметр внутри категории, то ничего не обновится, если указать что-то,' + 'то либо создастся новая запись(в случае, если она отсутствовала у данного источника),' + ' либо отредактируется' + 'старая. Если в значении параметра указан None,' + ' то соответствующая информациия удаляется из данного источника' + '\n\n' + 'Обновлять через эту ручку можно только от имени источников admin и user.\n\n' + 'Чтобы обновить от имени админиа, надо иметь скоуп `userdata.info.admin`\n\n' + 'Чтобы обновить неизменяемую информацию надо обладать скоупом `userdata.info.update`\n\n' + 'Для обновления своей информации(источник `user`) не нужны скоупы на обновление ' + 'соответствующих категорий\n\n' + 'Для обновления чужой информации от имени админа(источник `admin`)' + 'нужны скоупы на обновление всех указанных в теле запроса категорий' + ' пользовательских данных данных' + ) async def update_user( new_info: UserInfoUpdate, id: int,