| 10 | |
| 11 | |
| 12 | class UserController(BaseController): |
| 13 | def __init__(self, app: FastAPI, container: Container) -> None: |
| 14 | super().__init__(container=container) |
| 15 | router = APIRouter(prefix="/users", tags=["users"]) |
| 16 | router.add_api_route(path="", endpoint=self.list, methods=["GET"]) |
| 17 | router.add_api_route(path="", endpoint=self.create, methods=["POST"]) |
| 18 | router.add_api_route(path="/{user_id}", endpoint=self.view, methods=["GET"]) |
| 19 | app.include_router(router=router) |
| 20 | |
| 21 | async def list(self, req: UserListRequest = Depends()) -> JsonApiResponse: |
| 22 | users = await self.container.user_service().all( |
| 23 | filters=[ |
| 24 | Filter("email", Oper.EQ, req.email), |
| 25 | ], |
| 26 | pagination=Pagination( |
| 27 | per_page=req.per_page or 10, |
| 28 | page=req.page or 1, |
| 29 | ), |
| 30 | ) |
| 31 | |
| 32 | return await self.response(data=users, include=req.include) |
| 33 | |
| 34 | async def view(self, user_id: int, req: Request) -> JsonApiResponse: |
| 35 | user = await self.container.user_service().get_by_id(user_id) |
| 36 | return await self.response(data=user, include=req.query_params.get("include", None)) |
| 37 | |
| 38 | async def create( |
| 39 | self, |
| 40 | req: UserCreateRequest, |
| 41 | ) -> JsonApiResponse: |
| 42 | user = await self.container.user_service().one( |
| 43 | filters=[ |
| 44 | Filter("email", Oper.EQ, req.email), |
| 45 | ] |
| 46 | ) |
| 47 | if user is not None: |
| 48 | raise UnprocessableEntityException( |
| 49 | error_no=ErrorNo.USER_EMAIL_ALREADY_EXISTS, message="User already exists" |
| 50 | ) |
| 51 | |
| 52 | user = req.to_user() |
| 53 | user.session = self.container.hash_service().random_string() |
| 54 | user.hash_password = self.container.hash_service().hash_password(req.password) |
| 55 | user = await self.container.user_service().create(data=user) |
| 56 | |
| 57 | return await self.response(data=user) |