Skip to content

Commit

Permalink
Возможность получать параметры в запросе на все категории (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
grigoriev-semyon authored Aug 26, 2023
1 parent ed1f243 commit 51e9f1b
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 24 deletions.
6 changes: 3 additions & 3 deletions tests/test_routes/test_category.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def test_create_with_no_scopes(client, dbsession):
dbsession.commit()


@pytest.mark.authenticated("userdata.category.read")
@pytest.mark.authenticated()
def test_get(client, dbsession, category):
_category = category()
response = client.get(f"/category/{_category.id}")
Expand All @@ -49,7 +49,7 @@ def test_get(client, dbsession, category):
assert response.json()["name"] == _category.name


@pytest.mark.authenticated("userdata.category.read")
@pytest.mark.authenticated()
def test_get_all(client, dbsession, category):
category1 = category()
category2 = category()
Expand Down Expand Up @@ -89,7 +89,7 @@ def test_update(client, dbsession, category):
assert _category.update_scope == old_update_scope


@pytest.mark.authenticated("userdata.category.delete", "userdata.category.read")
@pytest.mark.authenticated("userdata.category.delete")
def test_delete(client, dbsession, category):
_category = category()
response = client.delete(f"/category/{_category.id}")
Expand Down
7 changes: 4 additions & 3 deletions userdata_api/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import uvicorn

from userdata_api.routes.base import app
from worker.consumer import process


def get_args():
parser = argparse.ArgumentParser()
Expand All @@ -20,6 +17,10 @@ def get_args():
args = get_args()
match args.instance:
case "api":
from userdata_api.routes.base import app

uvicorn.run(app)
case "worker":
from worker.consumer import process

process()
31 changes: 23 additions & 8 deletions userdata_api/routes/category.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from typing import Literal

from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends, Request
from fastapi import APIRouter, Depends, Query, Request
from fastapi_sqlalchemy import db
from pydantic import parse_obj_as
from pydantic.type_adapter import TypeAdapter

from userdata_api.exceptions import AlreadyExists
from userdata_api.models.db import Category
Expand Down Expand Up @@ -29,13 +31,13 @@ async def create_category(
if Category.query(session=db.session).filter(Category.name == category_inp.name).all():
raise AlreadyExists(Category, category_inp.name)
category = Category.create(session=db.session, **category_inp.dict())
return CategoryGet.from_orm(category)
return CategoryGet.model_validate(category)


@category.get("/{id}", response_model=CategoryGet)
async def get_category(
id: int,
_: dict[str, str] = Depends(UnionAuth(scopes=["userdata.category.read"], allow_none=False, auto_error=True)),
_: dict[str, str] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)),
) -> CategoryGet:
"""
Получить категорию
Expand All @@ -47,16 +49,29 @@ async def get_category(
return CategoryGet.model_validate(category)


@category.get("", response_model=list[CategoryGet])
@category.get("", response_model=list[CategoryGet], response_model_exclude_none=True)
async def get_categories(
_: dict[str, str] = Depends(UnionAuth(scopes=["userdata.category.read"], allow_none=False, auto_error=True))
query: list[Literal["param"]] = Query(default=[]),
_: dict[str, str] = Depends(UnionAuth(scopes=[], allow_none=False, auto_error=True)),
) -> list[CategoryGet]:
result = []
for category in Category.query(session=db.session).all():
to_append = category.dict()
if "param" in query:
to_append["params"] = []
for param in category.params:
to_append["params"].append(param.dict())
result.append(to_append)
"""
Получить все категории
:param query: Лист query параметров.
Если ничего не указано то вернет просто список категорий
Параметр 'param' - если указан, то в каждой категории будет список ее параметров
:param _: Аутентифиуация
:return: Список категорий. В каждой ноде списка - информация о скоупах, которые нужны для получения пользовательских данных этой категории
"""
return parse_obj_as(list[CategoryGet], Category.query(session=db.session).all())
type_adapter = TypeAdapter(list[CategoryGet])
return type_adapter.validate_python(result)


@category.patch("/{id}", response_model=CategoryGet)
Expand All @@ -75,7 +90,7 @@ async def patch_category(
:return: CategoryGet - обновленную категорию
"""
category: Category = Category.get(id, session=db.session)
return CategoryGet.from_orm(Category.update(id, session=db.session, **category_inp.dict(exclude_unset=True)))
return CategoryGet.model_validate(Category.update(id, session=db.session, **category_inp.dict(exclude_unset=True)))


@category.delete("/{id}", response_model=StatusResponseModel)
Expand Down
11 changes: 6 additions & 5 deletions userdata_api/routes/param.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends, Request
from fastapi_sqlalchemy import db
from pydantic import parse_obj_as
from pydantic.type_adapter import TypeAdapter

from userdata_api.exceptions import AlreadyExists, ObjectNotFound
from userdata_api.models.db import Category, Param
Expand Down Expand Up @@ -32,7 +32,7 @@ async def create_param(
Category.get(category_id, session=db.session)
if Param.query(session=db.session).filter(Param.category_id == category_id, Param.name == param_inp.name).all():
raise AlreadyExists(Param, param_inp.name)
return ParamGet.from_orm(Param.create(session=db.session, **param_inp.dict(), category_id=category_id))
return ParamGet.model_validate(Param.create(session=db.session, **param_inp.dict(), category_id=category_id))


@param.get("/{id}", response_model=ParamGet)
Expand All @@ -46,7 +46,7 @@ async def get_param(id: int, category_id: int) -> ParamGet:
res = Param.query(session=db.session).filter(Param.id == id, Param.category_id == category_id).one_or_none()
if not res:
raise ObjectNotFound(Param, id)
return ParamGet.from_orm(res)
return ParamGet.model_validate(res)


@param.get("", response_model=list[ParamGet])
Expand All @@ -56,7 +56,8 @@ async def get_params(category_id: int) -> list[ParamGet]:
:param category_id: Айди категории
:return: list[ParamGet] - список полученных параметров
"""
return parse_obj_as(list[ParamGet], Param.query(session=db.session).filter(Param.category_id == category_id).all())
type_adapter = TypeAdapter(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)
Expand All @@ -82,7 +83,7 @@ async def patch_param(
return ParamGet.from_orm(
Param.update(id, session=db.session, **param_inp.dict(exclude_unset=True), category_id=category_id)
)
return ParamGet.from_orm(Param.update(id, session=db.session, **param_inp.dict(exclude_unset=True)))
return ParamGet.model_validate(Param.update(id, session=db.session, **param_inp.dict(exclude_unset=True)))


@param.delete("/{id}", response_model=StatusResponseModel)
Expand Down
11 changes: 6 additions & 5 deletions userdata_api/routes/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from auth_lib.fastapi import UnionAuth
from fastapi import APIRouter, Depends, Request
from fastapi_sqlalchemy import db
from pydantic import parse_obj_as
from pydantic.type_adapter import TypeAdapter

from userdata_api.exceptions import AlreadyExists
from userdata_api.models.db import Source
Expand All @@ -30,7 +30,7 @@ async def create_source(
source = Source.query(session=db.session).filter(Source.name == source_inp.name).all()
if source:
raise AlreadyExists(Source, source_inp.name)
return SourceGet.from_orm(Source.create(session=db.session, **source_inp.dict()))
return SourceGet.model_validate(Source.create(session=db.session, **source_inp.dict()))


@source.get("/{id}", response_model=SourceGet)
Expand All @@ -40,7 +40,7 @@ async def get_source(id: int) -> SourceGet:
:param id: Айди источника
:return: SourceGet - полученный источник
"""
return SourceGet.from_orm(Source.get(id, session=db.session))
return SourceGet.model_validate(Source.get(id, session=db.session))


@source.get("", response_model=list[SourceGet])
Expand All @@ -49,7 +49,8 @@ async def get_sources() -> list[SourceGet]:
Получить все источники данных
:return: list[SourceGet] - список источников данных
"""
return parse_obj_as(list[SourceGet], Source.query(session=db.session).all())
type_adapter = TypeAdapter(list[SourceGet])
return type_adapter.validate_python(Source.query(session=db.session).all())


@source.patch("/{id}", response_model=SourceGet)
Expand All @@ -67,7 +68,7 @@ async def patch_source(
:param _: Аутентификация
:return: SourceGet - обновленный источник данных
"""
return SourceGet.from_orm(Source.update(id, session=db.session, **source_inp.dict(exclude_unset=True)))
return SourceGet.model_validate(Source.update(id, session=db.session, **source_inp.dict(exclude_unset=True)))


@source.delete("/{id}", response_model=StatusResponseModel)
Expand Down
2 changes: 2 additions & 0 deletions userdata_api/schemas/category.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pydantic import constr

from .base import Base
from .param import ParamGet
from .types.scope import Scope


Expand All @@ -18,3 +19,4 @@ class CategoryPatch(Base):

class CategoryGet(CategoryPost):
id: int
params: list[ParamGet] | None = None

0 comments on commit 51e9f1b

Please sign in to comment.