|
8 | 8 | from core.database.session_manager import get_async_session |
9 | 9 | from core.models import User |
10 | 10 | from core.types import FileContentType |
11 | | -from pin_sphere.users.service import get_user_by_username |
12 | 11 |
|
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 |
17 | 13 |
|
18 | 14 | # Create an API router for users-related endpoints |
19 | 15 | router = APIRouter( |
|
24 | 20 |
|
25 | 21 | @router.get( |
26 | 22 | "/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.", |
29 | 26 | tags=["Account Operations"], |
30 | 27 | ) |
31 | 28 | async def get_me( |
32 | 29 | current_user: User = Depends(auth.get_current_user), |
33 | 30 | session: AsyncSession = Depends(get_async_session), |
34 | 31 | ): |
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) |
36 | 34 |
|
37 | 35 |
|
38 | | -# Fetch all users with optional pagination |
39 | 36 | @router.get( |
40 | 37 | "", |
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.", |
43 | 41 | tags=["Account Operations"], |
| 42 | + dependencies=[Depends(auth.get_current_user)], |
44 | 43 | ) |
45 | 44 | async def read_users( |
46 | 45 | skip: int = 0, |
47 | 46 | limit: int = 10, |
48 | 47 | db: AsyncSession = Depends(get_async_session), |
49 | | - current_user: User = Depends(auth.get_current_user), |
50 | 48 | ): |
51 | 49 | """ |
52 | 50 | Fetch a list of users with optional pagination. |
53 | 51 |
|
54 | 52 | - **skip**: Number of records to skip (default: 0) |
55 | 53 | - **limit**: Maximum number of records to return (default: 10) |
56 | 54 | """ |
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) |
58 | 57 | return users |
59 | 58 |
|
60 | 59 |
|
61 | 60 | @router.get( |
62 | 61 | "/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.", |
64 | 64 | tags=["Account Operations"], |
| 65 | + dependencies=[Depends(auth.get_current_user)], |
65 | 66 | ) |
66 | 67 | async def check_username_availability( |
67 | 68 | username: str, |
68 | 69 | db: AsyncSession = Depends(get_async_session), |
69 | | - current_user: User = Depends(auth.get_current_user), |
70 | 70 | ): |
71 | 71 | """ |
72 | 72 | Check if the provided username is available for registration. |
73 | 73 |
|
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. |
75 | 77 | """ |
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) |
77 | 80 |
|
78 | 81 | if existing_user: |
79 | 82 | raise HTTPException(status_code=400, detail="Username already taken") |
80 | 83 | return {"message": "Username is available"} |
81 | 84 |
|
82 | 85 |
|
83 | | -# Account deletion route |
84 | 86 | @router.delete( |
85 | 87 | "/{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.", |
88 | 91 | tags=["Account Operations"], |
| 92 | + dependencies=[Depends(auth.get_current_user)], |
89 | 93 | ) |
90 | 94 | async def delete_account( |
91 | 95 | username: str, |
92 | 96 | db: AsyncSession = Depends(get_async_session), |
93 | | - current_user: User = Depends(auth.get_current_user), |
94 | 97 | ): |
95 | 98 | """ |
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 |
97 | 102 |
|
98 | | - - **username**: The username of the users to delete. |
| 103 | + Returns the deleted user data or 404 if user not found. |
99 | 104 | """ |
100 | | - user = await delete_user(db, username=username) |
| 105 | + # Attempt to delete user |
| 106 | + user = await service.delete_user(db, username=username) |
101 | 107 | if not user: |
102 | 108 | raise HTTPException(status_code=404, detail="User not found") |
103 | 109 | return user |
104 | 110 |
|
105 | 111 |
|
106 | 112 | @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"], |
108 | 117 | ) |
109 | | -async def retrive_upload_url( |
| 118 | +async def retrieve_upload_url( |
110 | 119 | ext: Literal["image/png", "image/jpeg"], |
111 | 120 | current_user: User = Depends(auth.get_current_user), |
112 | 121 | ): |
| 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 |
113 | 128 | ext_ = FileContentType(ext) |
114 | 129 | return service.get_upload_url(current_user, ext=ext_) |
115 | 130 |
|
116 | 131 |
|
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 | + |
118 | 162 | @router.get( |
119 | 163 | "/{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.", |
122 | 167 | tags=["Account Operations"], |
123 | 168 | ) |
124 | 169 | async def read_user( |
125 | 170 | username: str, |
126 | 171 | db: AsyncSession = Depends(get_async_session), |
127 | 172 | ): |
128 | 173 | """ |
129 | | - Fetch a single users by their unique username. |
| 174 | + Fetch a single user by their unique username. |
130 | 175 |
|
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. |
132 | 179 | """ |
133 | | - user = await get_user(db, username=username) |
| 180 | + # Fetch user by username |
| 181 | + user = await service.get_user(db, username=username) |
134 | 182 | if not user: |
135 | 183 | raise HTTPException(status_code=404, detail="User not found") |
136 | 184 | return user |
137 | 185 |
|
138 | 186 |
|
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 |
149 | 187 | @router.put( |
150 | 188 | "", |
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.).", |
153 | 192 | tags=["Account Operations"], |
154 | 193 | ) |
155 | 194 | async def update_existing_user( |
156 | | - user_update: UserUpdate, |
| 195 | + user_update: schemas.UserUpdate, |
157 | 196 | db: AsyncSession = Depends(get_async_session), |
158 | 197 | current_user: User = Depends(auth.get_current_user), |
159 | 198 | ): |
160 | 199 | """ |
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.) |
162 | 203 |
|
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. |
165 | 205 | """ |
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) |
167 | 208 | if not user: |
168 | 209 | raise HTTPException(status_code=404, detail="User not found") |
169 | 210 | return user |
170 | 211 |
|
171 | 212 |
|
172 | | -# Delete a users by username |
| 213 | +# Note: Duplicate delete endpoint - consider removing one of the delete methods |
173 | 214 | @router.delete( |
174 | 215 | "/{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.", |
177 | 219 | tags=["Account Operations"], |
| 220 | + dependencies=[Depends(auth.get_current_user)], |
178 | 221 | ) |
179 | 222 | async def delete_existing_user( |
180 | 223 | username: str, |
181 | 224 | db: AsyncSession = Depends(get_async_session), |
182 | | - current_user: User = Depends(auth.get_current_user), |
183 | 225 | ): |
184 | 226 | """ |
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 |
186 | 230 |
|
187 | | - - **username**: The username of the users to delete. |
| 231 | + Returns deleted user data or 404 if user not found. |
188 | 232 | """ |
189 | | - user = await delete_user(db, username=username) |
| 233 | + # Delete user by username |
| 234 | + user = await service.delete_user(db, username=username) |
190 | 235 | if not user: |
191 | 236 | raise HTTPException(status_code=404, detail="User not found") |
192 | 237 | return user |
0 commit comments