Skip to content

Commit 015ad01

Browse files
committed
Extract services from users and links
1 parent 544646e commit 015ad01

File tree

15 files changed

+602
-105
lines changed

15 files changed

+602
-105
lines changed

futuramaapi/routers/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
from .rest.crypto import router as crypto_router
77
from .rest.episodes import router as episodes_router
88
from .rest.favorites import router as favorites_router
9+
from .rest.links import router as links_router
910
from .rest.notifications import router as notification_router
1011
from .rest.randoms import router as randoms_router
1112
from .rest.root import router as root_router
1213
from .rest.seasons import router as seasons_router
1314
from .rest.tokens import router as tokens_router
1415
from .rest.users import router as users_router
16+
from .rest.users_new import router as users_new_router
1517

1618
__all__ = [
1719
"api_router",
@@ -30,4 +32,6 @@
3032
api_router.include_router(seasons_router)
3133
api_router.include_router(tokens_router)
3234
api_router.include_router(users_router)
35+
api_router.include_router(users_new_router)
36+
api_router.include_router(links_router)
3337
api_router.include_router(favorites_router)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .api import router
2+
3+
__all__ = [
4+
"router",
5+
]
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from typing import Annotated
2+
3+
from fastapi import APIRouter, Depends, Path, status
4+
from fastapi_pagination import Page
5+
6+
from futuramaapi.repositories import INT32
7+
from futuramaapi.routers.rest.users.dependencies import _oauth2_scheme
8+
from futuramaapi.routers.services.links.create_link import (
9+
CreateLinkRequest,
10+
CreateLinkResponse,
11+
CreateLinkService,
12+
)
13+
from futuramaapi.routers.services.links.get_link import GetLinkResponse, GetLinkService
14+
from futuramaapi.routers.services.links.list_links import (
15+
ListLinksResponse,
16+
ListLinksService,
17+
)
18+
19+
router = APIRouter(
20+
prefix="/links",
21+
tags=["Links"],
22+
)
23+
24+
25+
@router.post(
26+
"",
27+
name="create_link",
28+
)
29+
async def create_link(
30+
token: Annotated[str, Depends(_oauth2_scheme)],
31+
data: CreateLinkRequest,
32+
) -> CreateLinkResponse:
33+
"""Generate shortened URL."""
34+
service: CreateLinkService = CreateLinkService(
35+
token=token,
36+
request_data=data,
37+
)
38+
return await service()
39+
40+
41+
@router.get(
42+
"/{link_id}",
43+
status_code=status.HTTP_200_OK,
44+
response_model=GetLinkResponse,
45+
name="get_link",
46+
)
47+
async def get_link(
48+
link_id: Annotated[
49+
int,
50+
Path(
51+
le=INT32,
52+
),
53+
],
54+
token: Annotated[str, Depends(_oauth2_scheme)],
55+
) -> GetLinkResponse:
56+
service: GetLinkService = GetLinkService(
57+
token=token,
58+
link_id=link_id,
59+
)
60+
return await service()
61+
62+
63+
@router.get(
64+
"",
65+
status_code=status.HTTP_200_OK,
66+
response_model=Page[ListLinksResponse],
67+
name="list_links",
68+
)
69+
async def list_links(
70+
token: Annotated[str, Depends(_oauth2_scheme)],
71+
) -> Page[ListLinksResponse]:
72+
"""Retrieve user links."""
73+
service: ListLinksService = ListLinksService(
74+
token=token,
75+
offset=0,
76+
limit=20,
77+
)
78+
return await service()

futuramaapi/routers/rest/users/api.py

Lines changed: 8 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from futuramaapi.repositories import INT32, FilterStatementKwargs
88
from futuramaapi.repositories.session import get_async_session
9-
from futuramaapi.routers.exceptions import ModelExistsError, ModelNotFoundError, UnauthorizedResponse
9+
from futuramaapi.routers.exceptions import ModelNotFoundError, UnauthorizedResponse
1010

1111
from .dependencies import from_form_signature, from_signature, from_token, password_from_form_data
1212
from .schemas import (
@@ -15,7 +15,6 @@
1515
PasswordChange,
1616
User,
1717
UserAlreadyActivatedError,
18-
UserCreateRequest,
1918
UserPasswordChangeRequest,
2019
UserSearchResponse,
2120
UserUpdateRequest,
@@ -27,55 +26,6 @@
2726
)
2827

2928

30-
@router.post(
31-
"",
32-
status_code=status.HTTP_201_CREATED,
33-
response_model=User,
34-
name="user",
35-
)
36-
async def create_user(
37-
data: UserCreateRequest,
38-
session: AsyncSession = Depends(get_async_session), # noqa: B008
39-
) -> User:
40-
"""Create User.
41-
42-
The user add endpoint is an API function allowing the creation of new user accounts.
43-
It receives user details via HTTP requests, validates the information,
44-
and stores it in the system's database.
45-
This endpoint is essential for user registration and onboarding.
46-
47-
Please note that currently endpoint is not protected.
48-
However, if there are a lot of spam requests, the endpoint will be blocked or limited.
49-
"""
50-
try:
51-
return await User.create(session, data)
52-
except ModelExistsError:
53-
raise HTTPException(
54-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
55-
detail="User already exists.",
56-
) from None
57-
58-
59-
@router.get(
60-
"/me",
61-
responses={
62-
status.HTTP_401_UNAUTHORIZED: {
63-
"model": UnauthorizedResponse,
64-
},
65-
},
66-
name="user_me",
67-
)
68-
async def get_me(
69-
user: Annotated[User, Depends(from_token)],
70-
) -> User:
71-
"""Get user details.
72-
73-
Retrieve authenticated user profile information, including username, email, and account details.
74-
Personalize user experiences within the application using the JSON response containing user-specific data.
75-
"""
76-
return user
77-
78-
7929
@router.get(
8030
"/activate",
8131
include_in_schema=False,
@@ -101,29 +51,6 @@ async def activate_user(
10151
) from None
10252

10353

104-
@router.put(
105-
"",
106-
responses={
107-
status.HTTP_401_UNAUTHORIZED: {
108-
"model": UnauthorizedResponse,
109-
},
110-
},
111-
name="update_user",
112-
)
113-
async def update_user(
114-
user: Annotated[User, Depends(from_token)],
115-
data: UserUpdateRequest,
116-
session: AsyncSession = Depends(get_async_session), # noqa: B008
117-
) -> User:
118-
"""Update user details.
119-
120-
This endpoint is crucial for users to manage and maintain accurate profile information,
121-
often including authentication and authorization checks for security.
122-
"""
123-
await user.update(session, data)
124-
return user
125-
126-
12754
@router.post(
12855
"/confirmations/resend",
12956
responses={
@@ -207,6 +134,8 @@ async def change_user_password(
207134
@router.post(
208135
"/links",
209136
name="generate_user_link",
137+
description="This endpoint is deprecated and will be removed in version 1.12.1. Please use `/api/links` instead.",
138+
deprecated=True,
210139
)
211140
async def create_user_link(
212141
data: LinkCreateRequest,
@@ -228,6 +157,8 @@ async def create_user_link(
228157
status_code=status.HTTP_200_OK,
229158
response_model=Page[Link],
230159
name="user_links",
160+
description="This endpoint is deprecated and will be removed in version 1.12.1. Please use `/api/links` instead.",
161+
deprecated=True,
231162
)
232163
async def get_user_links(
233164
user: Annotated[User, Depends(from_token)],
@@ -249,6 +180,9 @@ async def get_user_links(
249180
status_code=status.HTTP_200_OK,
250181
response_model=Link,
251182
name="user_link",
183+
description="This endpoint is deprecated and will be removed in version 1.12.1. "
184+
"Please use `/api/links/{link_id}` instead.",
185+
deprecated=True,
252186
)
253187
async def get_user_link(
254188
link_id: Annotated[
@@ -302,34 +236,3 @@ async def search_user(
302236
},
303237
)
304238
return await UserSearchResponse.paginate(session, filter_params=filter_params)
305-
306-
307-
@router.get(
308-
"",
309-
status_code=status.HTTP_200_OK,
310-
response_model=Page[UserSearchResponse],
311-
name="users",
312-
)
313-
async def get_users(
314-
query: Annotated[
315-
str | None,
316-
Query(
317-
alias="query",
318-
description="Search by username.",
319-
max_length=128,
320-
),
321-
] = None,
322-
session: AsyncSession = Depends(get_async_session), # noqa: B008
323-
) -> UserSearchResponse:
324-
"""Get users.
325-
326-
Retrieve users. Search by username.
327-
"""
328-
filter_params: FilterStatementKwargs = FilterStatementKwargs(
329-
offset=0,
330-
limit=20,
331-
extra={
332-
"query": query,
333-
},
334-
)
335-
return await UserSearchResponse.paginate(session, filter_params=filter_params)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .api import router
2+
3+
__all__ = [
4+
"router",
5+
]

0 commit comments

Comments
 (0)