Skip to content

Commit 2cb8fa1

Browse files
committed
upd
1 parent ffd12d9 commit 2cb8fa1

File tree

21 files changed

+171
-95
lines changed

21 files changed

+171
-95
lines changed

app/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222

2323
app.include_router(api.api_router)
2424

25+
class CustomException(Exception):
26+
def __init__(self, message: str, status_code: int = 500):
27+
super().__init__(message)
28+
self.message = message
29+
self.status_code = status_code
2530

2631
@app.exception_handler(exps.CustomException)
2732
async def exception_handler(request, exc: exps.CustomException):

poetry.lock

Lines changed: 44 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pydantic-settings = "^2.5.2"
1414
pyjwt = "^2.10.1"
1515
pytest = "^8.3.4"
1616
bcrypt = "^4.2.1"
17+
uvicorn = "^0.34.0"
1718

1819

1920
[build-system]

src/__main__.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from fastapi import FastAPI
2+
from fastapi.responses import JSONResponse
3+
4+
from presentation.api.user_controller import router as user_router
5+
from domain.base.exception import DomainError
6+
7+
app = FastAPI()
8+
9+
app.include_router(user_router)
10+
11+
@app.exception_handler(Exception)
12+
async def exception_handler(request, exc: DomainError):
13+
return JSONResponse(
14+
status_code=exc.status,
15+
content={"detail": exc.message},
16+
)
17+
18+
if __name__ == "__main__":
19+
import uvicorn
20+
uvicorn.run(app, host="0.0.0.0", port=8000)

src/application/__init__.py

Whitespace-only changes.

src/application/services/__init__.py

Whitespace-only changes.

src/application/services/user.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import Optional
2+
from uuid import UUID
3+
4+
from domain.user.entities.user import User
5+
from domain.user.repositories.user import UserRepository
6+
7+
8+
class UserService:
9+
def __init__(self, user_repository: UserRepository):
10+
self.user_repository = user_repository
11+
12+
def create_user(self, username: str, password: str) -> User:
13+
if not (user := self.user_repository.find_by_username(username)):
14+
user = User.create(username, password)
15+
self.user_repository.save(user)
16+
return user
17+
18+
def get_user_by_username(self, username: str) -> Optional[User]:
19+
return self.user_repository.find_by_username(username)
20+
21+
def get_user_by_id(self, user_id: UUID) -> Optional[User]:
22+
return self.user_repository.find_by_id(user_id)

src/application/services/user_service.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/domain/base/exception.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from abc import abstractmethod
12
from dataclasses import dataclass
23
from typing import ClassVar
34

@@ -15,3 +16,7 @@ class DomainError(AppError):
1516
@property
1617
def detail(self) -> str:
1718
return "A domain error occurred"
19+
20+
@property
21+
@abstractmethod
22+
def message(self) -> str: ...
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from abc import ABC, abstractmethod
2+
from typing import Optional
3+
from uuid import UUID
4+
5+
from domain.user.entities.user import User
6+
7+
8+
class UserRepository(ABC):
9+
"""
10+
Абстрактный класс репозитория для работы с пользователями.
11+
"""
12+
13+
@abstractmethod
14+
def save(self, user: User) -> None:
15+
"""
16+
Сохраняет пользователя в репозитории.
17+
"""
18+
pass
19+
20+
@abstractmethod
21+
def find_by_username(self, username: str) -> Optional[User]:
22+
"""
23+
Находит пользователя по имени пользователя.
24+
"""
25+
pass
26+
27+
@abstractmethod
28+
def find_by_id(self, user_id: UUID) -> Optional[User]:
29+
"""
30+
Находит пользователя по идентификатору.
31+
"""
32+
pass

0 commit comments

Comments
 (0)