Skip to content

Commit

Permalink
feat: adds service factory
Browse files Browse the repository at this point in the history
  • Loading branch information
cofin committed Jan 14, 2025
1 parent 84f8f6e commit 60057be
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 486 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ repos:
rev: v0.19.1
hooks:
- id: slotscheck
exclude: test_*|docs|migrations|scripts
exclude: test_*|docs|src/app/db/migrations|tools|manage.py
entry: env PYTHONPATH=src slotscheck
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.14.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""Users and Teams
Revision ID: 1c703154d1d8
Revises:
Revises:
Create Date: 2025-01-13 18:19:37.270730+00:00
"""
Expand Down
15 changes: 0 additions & 15 deletions src/app/domain/accounts/controllers/roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,13 @@

from __future__ import annotations

from uuid import UUID

from litestar import Controller

from app.domain.accounts.guards import requires_superuser
from app.lib.deps import create_filter_dependencies


class RoleController(Controller):
"""Handles the adding and removing of new Roles."""

tags = ["Roles"]
guards = [requires_superuser]
dependencies = {
"filters": create_filter_dependencies(
{
"id_filter": UUID,
"created_at": True,
"updated_at": True,
"pagination_size": 5,
"sort_field": "name",
"search_fields": ["name", "slug"],
},
),
}
17 changes: 2 additions & 15 deletions src/app/domain/accounts/controllers/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from __future__ import annotations

from typing import TYPE_CHECKING, Annotated
from uuid import UUID

from litestar import Controller, delete, get, patch, post
from litestar.di import Provide
Expand All @@ -13,9 +12,10 @@
from app.domain.accounts.deps import provide_users_service
from app.domain.accounts.guards import requires_superuser
from app.domain.accounts.schemas import User, UserCreate, UserUpdate
from app.lib.deps import create_filter_dependencies

if TYPE_CHECKING:
from uuid import UUID

from advanced_alchemy.filters import FilterTypes
from advanced_alchemy.service import OffsetPagination

Expand All @@ -29,19 +29,6 @@ class UserController(Controller):
guards = [requires_superuser]
dependencies = {
"users_service": Provide(provide_users_service),
"filters": Provide(
create_filter_dependencies(
{
"id_filter": UUID,
"created_at": True,
"updated_at": True,
"pagination_size": 20,
"sort_field": "email",
"sort_order": "asc",
"search_fields": ["name", "email"],
},
)
),
}

@get(operation_id="ListUsers", path=urls.ACCOUNT_LIST, cache=60)
Expand Down
15 changes: 3 additions & 12 deletions src/app/domain/tags/controllers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from __future__ import annotations

from typing import TYPE_CHECKING, Annotated
from uuid import UUID

from advanced_alchemy.extensions.litestar.dto import SQLAlchemyDTO
from litestar import Controller, delete, get, patch, post
Expand All @@ -11,11 +10,13 @@
from app.domain.accounts.guards import requires_active_user, requires_superuser
from app.domain.tags.services import TagService
from app.lib import dto
from app.lib.deps import create_filter_dependencies, create_service_provider
from app.lib.deps import create_service_provider

from . import urls

if TYPE_CHECKING:
from uuid import UUID

from advanced_alchemy.filters import FilterTypes
from advanced_alchemy.service import OffsetPagination
from litestar.dto import DTOData
Expand Down Expand Up @@ -44,16 +45,6 @@ class TagController(Controller):

guards = [requires_active_user]
dependencies = {
"filters": create_filter_dependencies(
{
"id_filter": UUID,
"created_at": True,
"updated_at": True,
"pagination_size": 10,
"search_fields": ["name", "slug"],
"search_is_case_sensitive": False,
},
),
"tags_service": create_service_provider(
TagService,
load=[selectinload(m.Tag.teams, recursion_depth=2)],
Expand Down
28 changes: 6 additions & 22 deletions src/app/domain/teams/controllers/teams.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from __future__ import annotations

from typing import TYPE_CHECKING, Annotated
from uuid import UUID

from litestar import Controller, delete, get, patch, post
from sqlalchemy import select
Expand All @@ -15,32 +14,22 @@
from app.domain.teams.guards import requires_team_admin, requires_team_membership
from app.domain.teams.schemas import Team, TeamCreate, TeamUpdate
from app.domain.teams.services import TeamService
from app.lib.deps import create_filter_dependencies, create_service_provider
from app.lib.deps import create_service_provider

if TYPE_CHECKING:
from uuid import UUID

from advanced_alchemy.service import FilterTypeT
from advanced_alchemy.service.pagination import OffsetPagination
from litestar.params import Dependency, Parameter

from app.lib.dependencies import FilterTypes


class TeamController(Controller):
"""Teams."""

tags = ["Teams"]
dependencies = {
"teams_service": create_service_provider(TeamService, load=[m.Team.tags, m.Team.members]),
"filters": create_filter_dependencies(
{
"id_filter": UUID,
"created_at": True,
"updated_at": True,
"pagination_size": 1,
"sort_field": "name",
"sort_order": "asc",
"search_fields": ["name", "slug"],
},
),
}
guards = [requires_active_user]

Expand All @@ -49,7 +38,7 @@ async def list_teams(
self,
teams_service: TeamService,
current_user: m.User,
filters: Annotated[list[FilterTypes], Dependency(skip_validation=True)],
filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)],
) -> OffsetPagination[Team]:
"""List teams that your account can access.."""
if not teams_service.can_view_all(current_user):
Expand All @@ -60,12 +49,7 @@ async def list_teams(
return teams_service.to_schema(data=results, total=total, schema_type=Team, filters=filters)

@post(operation_id="CreateTeam", path=urls.TEAM_CREATE)
async def create_team(
self,
teams_service: TeamService,
current_user: m.User,
data: TeamCreate,
) -> Team:
async def create_team(self, teams_service: TeamService, current_user: m.User, data: TeamCreate) -> Team:
"""Create a new team."""
obj = data.to_dict()
obj.update({"owner_id": current_user.id, "owner": current_user})
Expand Down
Loading

0 comments on commit 60057be

Please sign in to comment.