Skip to content

Commit a256fae

Browse files
authored
Merge pull request #3 from IDTS-LAB/ddd-clean-architecture-with-cqrs-review-dfff8
Update from task 9d6c2646-8dbc-409e-bccc-824f40edfff8
2 parents 358660d + 1a8a61b commit a256fae

36 files changed

Lines changed: 366 additions & 69 deletions

File tree

.gitignore

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,51 @@
1-
# Poetry specific files
2-
.venv/
3-
/dist/
4-
/poetry.toml
5-
6-
# Python bytecode and caches
1+
```
2+
# Python
73
__pycache__/
84
*.pyc
95
*.pyo
106
*.pyd
7+
.Python
8+
*.so
9+
*.egg-info/
10+
.eggs/
11+
12+
# Virtual environments
13+
venv/
14+
.venv/
15+
env/
16+
ENV/
17+
.ENV
18+
19+
# Build artifacts
20+
build/
21+
dist/
22+
*.egg
23+
24+
# Testing
25+
.coverage
26+
htmlcov/
1127
.pytest_cache/
1228
.mypy_cache/
13-
.ruff_cache/
14-
.cache/
1529

16-
# Environment variables (secret keys)
30+
# Logs
31+
*.log
32+
33+
# Environment variables
1734
.env
35+
.env.local
36+
*.env.*
1837

19-
# IDE settings
38+
# IDE
2039
.vscode/
2140
.idea/
41+
*.swp
42+
*.swo
43+
*.tmp
44+
45+
# OS
46+
.DS_Store
47+
Thumbs.db
48+
49+
# Coverage
50+
coverage/
51+
```
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from pydantic import BaseModel
2+
3+
4+
class CreatePermissionCommand(BaseModel):
5+
resource: str
6+
action: str
7+
description: str | None = None
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from src.modules.authorization.application.create_permission.command import (
2+
CreatePermissionCommand,
3+
)
4+
from src.modules.authorization.domain.entities.permission import Permission
5+
from src.modules.authorization.domain.permissions import permission_key
6+
from src.modules.authorization.domain.repositories.casbin_policy_repository import (
7+
CasbinPolicyRepository,
8+
)
9+
from src.shared.unit_of_work import UnitOfWork
10+
11+
12+
class CreatePermissionHandler:
13+
def __init__(
14+
self,
15+
policy_repo: CasbinPolicyRepository,
16+
unit_of_work: UnitOfWork,
17+
):
18+
self._policy_repo = policy_repo
19+
self._unit_of_work = unit_of_work
20+
21+
async def execute(self, command: CreatePermissionCommand) -> Permission:
22+
permission = Permission.create(
23+
key=permission_key(command.resource, command.action),
24+
resource=command.resource,
25+
action=command.action,
26+
description=command.description,
27+
)
28+
async with self._unit_of_work:
29+
created = await self._policy_repo.create_permission(permission)
30+
await self._unit_of_work.commit()
31+
return created
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from pydantic import BaseModel
2+
3+
4+
class CreateRoleCommand(BaseModel):
5+
name: str
6+
description: str | None = None
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from src.modules.authorization.application.create_role.command import CreateRoleCommand
2+
from src.modules.authorization.domain.entities.role import Role
3+
from src.modules.authorization.domain.repositories.casbin_policy_repository import (
4+
CasbinPolicyRepository,
5+
)
6+
from src.shared.unit_of_work import UnitOfWork
7+
8+
9+
class CreateRoleHandler:
10+
def __init__(
11+
self,
12+
policy_repo: CasbinPolicyRepository,
13+
unit_of_work: UnitOfWork,
14+
):
15+
self._policy_repo = policy_repo
16+
self._unit_of_work = unit_of_work
17+
18+
async def execute(self, command: CreateRoleCommand) -> Role:
19+
role = Role.create(name=command.name, description=command.description)
20+
async with self._unit_of_work:
21+
created = await self._policy_repo.create_role(role)
22+
await self._unit_of_work.commit()
23+
return created
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from uuid import UUID
2+
3+
from pydantic import BaseModel
4+
5+
6+
class DeletePermissionCommand(BaseModel):
7+
permission_id: UUID
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from src.modules.authorization.application.delete_permission.command import (
2+
DeletePermissionCommand,
3+
)
4+
from src.modules.authorization.domain.repositories.casbin_policy_repository import (
5+
CasbinPolicyRepository,
6+
)
7+
from src.shared.unit_of_work import UnitOfWork
8+
9+
10+
class DeletePermissionHandler:
11+
def __init__(
12+
self,
13+
policy_repo: CasbinPolicyRepository,
14+
unit_of_work: UnitOfWork,
15+
):
16+
self._policy_repo = policy_repo
17+
self._unit_of_work = unit_of_work
18+
19+
async def execute(self, command: DeletePermissionCommand) -> None:
20+
async with self._unit_of_work:
21+
await self._policy_repo.delete_permission(command.permission_id)
22+
await self._unit_of_work.commit()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from uuid import UUID
2+
3+
from pydantic import BaseModel
4+
5+
6+
class DeleteRoleCommand(BaseModel):
7+
role_id: UUID
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from src.modules.authorization.application.delete_role.command import DeleteRoleCommand
2+
from src.modules.authorization.domain.repositories.casbin_policy_repository import (
3+
CasbinPolicyRepository,
4+
)
5+
from src.shared.unit_of_work import UnitOfWork
6+
7+
8+
class DeleteRoleHandler:
9+
def __init__(
10+
self,
11+
policy_repo: CasbinPolicyRepository,
12+
unit_of_work: UnitOfWork,
13+
):
14+
self._policy_repo = policy_repo
15+
self._unit_of_work = unit_of_work
16+
17+
async def execute(self, command: DeleteRoleCommand) -> None:
18+
async with self._unit_of_work:
19+
await self._policy_repo.delete_role(command.role_id)
20+
await self._unit_of_work.commit()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from src.modules.authorization.application.get_permission.query import GetPermissionQuery
2+
from src.modules.authorization.domain.entities.permission import Permission
3+
from src.modules.authorization.domain.repositories.casbin_policy_repository import (
4+
CasbinPolicyRepository,
5+
)
6+
7+
8+
class GetPermissionQueryHandler:
9+
def __init__(self, policy_repo: CasbinPolicyRepository):
10+
self._policy_repo = policy_repo
11+
12+
async def execute(self, query: GetPermissionQuery) -> Permission | None:
13+
return await self._policy_repo.get_permission(query.permission_id)

0 commit comments

Comments
 (0)