Skip to content

Commit 53de387

Browse files
authored
Merge pull request #50 from Saurabh254/refactor/cleaned_users_endpoint_file
refactor/cleaned users endpoint file
2 parents 1805453 + f4fdb33 commit 53de387

2 files changed

Lines changed: 113 additions & 56 deletions

File tree

server/pin_sphere/users/endpoint.py

Lines changed: 101 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@
88
from core.database.session_manager import get_async_session
99
from core.models import User
1010
from core.types import FileContentType
11-
from pin_sphere.users.service import get_user_by_username
1211

13-
from . import service
14-
from .filters import SettingsFilter
15-
from .schemas import UserResponse, UserUpdate
16-
from .service import delete_user, get_user, get_users, update_user
12+
from . import filters, schemas, service
1713

1814
# Create an API router for users-related endpoints
1915
router = APIRouter(
@@ -24,169 +20,218 @@
2420

2521
@router.get(
2622
"/me",
27-
response_model=UserResponse,
28-
summary="Get current user",
23+
response_model=schemas.UserResponse,
24+
summary="Get current user profile",
25+
description="Retrieve the profile information of the currently authenticated user.",
2926
tags=["Account Operations"],
3027
)
3128
async def get_me(
3229
current_user: User = Depends(auth.get_current_user),
3330
session: AsyncSession = Depends(get_async_session),
3431
):
35-
return await get_user(session, current_user.username)
32+
"""Get current authenticated user's profile"""
33+
return await service.get_user(session, current_user.username)
3634

3735

38-
# Fetch all users with optional pagination
3936
@router.get(
4037
"",
41-
response_model=list[UserResponse],
42-
summary="Fetch all users",
38+
response_model=list[schemas.UserResponse],
39+
summary="List all users",
40+
description="Fetch a paginated list of all users in the system.",
4341
tags=["Account Operations"],
42+
dependencies=[Depends(auth.get_current_user)],
4443
)
4544
async def read_users(
4645
skip: int = 0,
4746
limit: int = 10,
4847
db: AsyncSession = Depends(get_async_session),
49-
current_user: User = Depends(auth.get_current_user),
5048
):
5149
"""
5250
Fetch a list of users with optional pagination.
5351
5452
- **skip**: Number of records to skip (default: 0)
5553
- **limit**: Maximum number of records to return (default: 10)
5654
"""
57-
users = await get_users(db, skip=skip, limit=limit)
55+
# Fetch users with pagination
56+
users = await service.get_users(db, skip=skip, limit=limit)
5857
return users
5958

6059

6160
@router.get(
6261
"/check-username/{username}",
63-
summary="Check if a username is available",
62+
summary="Check username availability",
63+
description="Verify if a username is available for registration.",
6464
tags=["Account Operations"],
65+
dependencies=[Depends(auth.get_current_user)],
6566
)
6667
async def check_username_availability(
6768
username: str,
6869
db: AsyncSession = Depends(get_async_session),
69-
current_user: User = Depends(auth.get_current_user),
7070
):
7171
"""
7272
Check if the provided username is available for registration.
7373
74-
- **username**: The username to check.
74+
- **username**: The username to check for availability
75+
76+
Returns success message if available, otherwise raises 400 error.
7577
"""
76-
existing_user = await get_user_by_username(db, username=username)
78+
# Check if username already exists
79+
existing_user = await service.get_user_by_username(db, username=username)
7780

7881
if existing_user:
7982
raise HTTPException(status_code=400, detail="Username already taken")
8083
return {"message": "Username is available"}
8184

8285

83-
# Account deletion route
8486
@router.delete(
8587
"/{username}",
86-
response_model=UserResponse,
87-
summary="Delete an account by username",
88+
response_model=schemas.UserResponse,
89+
summary="Delete user account",
90+
description="Delete a user account by username. Returns the deleted user information.",
8891
tags=["Account Operations"],
92+
dependencies=[Depends(auth.get_current_user)],
8993
)
9094
async def delete_account(
9195
username: str,
9296
db: AsyncSession = Depends(get_async_session),
93-
current_user: User = Depends(auth.get_current_user),
9497
):
9598
"""
96-
Delete the users account by their username.
99+
Delete a user account by their username.
100+
101+
- **username**: The username of the user to delete
97102
98-
- **username**: The username of the users to delete.
103+
Returns the deleted user data or 404 if user not found.
99104
"""
100-
user = await delete_user(db, username=username)
105+
# Attempt to delete user
106+
user = await service.delete_user(db, username=username)
101107
if not user:
102108
raise HTTPException(status_code=404, detail="User not found")
103109
return user
104110

105111

106112
@router.get(
107-
"/upload_url", summary="Upload URL for profile photo", tags=["Account Operations"]
113+
"/upload_url",
114+
summary="Get profile photo upload URL",
115+
description="Generate a pre-signed URL for uploading profile photos. Supports PNG and JPEG formats.",
116+
tags=["Account Operations"],
108117
)
109-
async def retrive_upload_url(
118+
async def retrieve_upload_url(
110119
ext: Literal["image/png", "image/jpeg"],
111120
current_user: User = Depends(auth.get_current_user),
112121
):
122+
"""
123+
Generate upload URL for profile photo.
124+
125+
- **ext**: Image format (image/png or image/jpeg)
126+
"""
127+
# Convert extension and generate upload URL
113128
ext_ = FileContentType(ext)
114129
return service.get_upload_url(current_user, ext=ext_)
115130

116131

117-
# Fetch a specific users by username
132+
@router.get(
133+
"/settings",
134+
summary="Get user settings",
135+
description="Retrieve the current user's account settings and preferences.",
136+
tags=["Account Operations"],
137+
response_model=filters.SettingsFilter,
138+
)
139+
async def get_settings(
140+
current_user: User = Depends(auth.get_current_user),
141+
session: AsyncSession = Depends(get_async_session),
142+
):
143+
"""Get current user's settings"""
144+
return await service.get_settings(session, current_user)
145+
146+
147+
@router.put(
148+
"/settings",
149+
status_code=status.HTTP_204_NO_CONTENT,
150+
summary="Update user settings",
151+
description="Update the current user's account settings and preferences.",
152+
)
153+
async def update_settings(
154+
current_user: User = Depends(auth.get_current_user),
155+
settings: filters.SettingsFilter = Depends(),
156+
session: AsyncSession = Depends(get_async_session),
157+
):
158+
"""Update current user's settings"""
159+
await service.update_settings(current_user, settings, session)
160+
161+
118162
@router.get(
119163
"/{username}",
120-
response_model=UserResponse,
121-
summary="Fetch a users by username",
164+
response_model=schemas.UserResponse,
165+
summary="Get user by username",
166+
description="Retrieve a specific user's profile information by their username.",
122167
tags=["Account Operations"],
123168
)
124169
async def read_user(
125170
username: str,
126171
db: AsyncSession = Depends(get_async_session),
127172
):
128173
"""
129-
Fetch a single users by their unique username.
174+
Fetch a single user by their unique username.
130175
131-
- **username**: The username of the users to retrieve.
176+
- **username**: The username of the user to retrieve
177+
178+
Returns user data or 404 if user not found.
132179
"""
133-
user = await get_user(db, username=username)
180+
# Fetch user by username
181+
user = await service.get_user(db, username=username)
134182
if not user:
135183
raise HTTPException(status_code=404, detail="User not found")
136184
return user
137185

138186

139-
@router.put("/settings", status_code=status.HTTP_204_NO_CONTENT)
140-
async def update_settings(
141-
current_user: User = Depends(auth.get_current_user),
142-
settings: SettingsFilter = Depends(),
143-
session: AsyncSession = Depends(get_async_session),
144-
):
145-
await service.update_settings(current_user, settings, session)
146-
147-
148-
# Update an existing users
149187
@router.put(
150188
"",
151-
response_model=UserResponse,
152-
summary="Update a user",
189+
response_model=schemas.UserResponse,
190+
summary="Update current user",
191+
description="Update the current authenticated user's profile information (name, email, etc.).",
153192
tags=["Account Operations"],
154193
)
155194
async def update_existing_user(
156-
user_update: UserUpdate,
195+
user_update: schemas.UserUpdate,
157196
db: AsyncSession = Depends(get_async_session),
158197
current_user: User = Depends(auth.get_current_user),
159198
):
160199
"""
161-
Update an existing users by their unique username.
200+
Update the current user's profile information.
201+
202+
- **user_update**: JSON payload containing the fields to update (name, email, etc.)
162203
163-
- **username**: The username of the users to update.
164-
- **user_update**: JSON payload containing the fields to update (name, email).
204+
Returns updated user data or 404 if user not found.
165205
"""
166-
user = await update_user(db, current_user, user_update=user_update)
206+
# Update current user's information
207+
user = await service.update_user(db, current_user, user_update=user_update)
167208
if not user:
168209
raise HTTPException(status_code=404, detail="User not found")
169210
return user
170211

171212

172-
# Delete a users by username
213+
# Note: Duplicate delete endpoint - consider removing one of the delete methods
173214
@router.delete(
174215
"/{username}",
175-
response_model=UserResponse,
176-
summary="Delete a users",
216+
response_model=schemas.UserResponse,
217+
summary="Delete user by username",
218+
description="Delete a user account by username. This is a duplicate endpoint.",
177219
tags=["Account Operations"],
220+
dependencies=[Depends(auth.get_current_user)],
178221
)
179222
async def delete_existing_user(
180223
username: str,
181224
db: AsyncSession = Depends(get_async_session),
182-
current_user: User = Depends(auth.get_current_user),
183225
):
184226
"""
185-
Delete a users by their unique username.
227+
Delete a user by their unique username.
228+
229+
- **username**: The username of the user to delete
186230
187-
- **username**: The username of the users to delete.
231+
Returns deleted user data or 404 if user not found.
188232
"""
189-
user = await delete_user(db, username=username)
233+
# Delete user by username
234+
user = await service.delete_user(db, username=username)
190235
if not user:
191236
raise HTTPException(status_code=404, detail="User not found")
192237
return user

server/pin_sphere/users/service.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,15 @@ async def update_settings(user: User, settings: SettingsFilter, session: AsyncSe
130130
.values(settings=old_settings)
131131
)
132132
await session.commit()
133+
134+
135+
async def get_settings(session: AsyncSession, current_user: User):
136+
return (
137+
(
138+
await session.execute(
139+
select(User.settings).filter(User.username == current_user.username)
140+
)
141+
)
142+
.scalars()
143+
.one()
144+
)

0 commit comments

Comments
 (0)