gitscope
https://dev.kronoz.win/r/marzneshin.git
app/routes/user.py · v0.7.4
Source
1 f7af2b3 Dawsh 2y ago import asyncio
2 f7af2b3 Dawsh 2y ago import logging
3 d377c4c Dawsh 2y ago from datetime import datetime, timedelta
4 d4ec019 Dawsh 2y ago from enum import Enum
5 f7af2b3 Dawsh 2y ago
6 f7af2b3 Dawsh 2y ago import sqlalchemy
7 f7af2b3 Dawsh 2y ago from fastapi import APIRouter
8 f7af2b3 Dawsh 2y ago from fastapi import HTTPException, Query
9 d4ec019 Dawsh 2y ago from fastapi_pagination.ext.sqlalchemy import paginate
10 d4ec019 Dawsh 2y ago from fastapi_pagination.links import Page
11 f7af2b3 Dawsh 2y ago
12 f7af2b3 Dawsh 2y ago from app import marznode
13 d4ec019 Dawsh 2y ago from app.db import crud, User
14 db68a58 Dawsh 2y ago from app.db.models import Service
15 01cdf2e Dawsh 2y ago from app.dependencies import (
16 01cdf2e Dawsh 2y ago DBDep,
17 01cdf2e Dawsh 2y ago AdminDep,
18 01cdf2e Dawsh 2y ago SudoAdminDep,
19 01cdf2e Dawsh 2y ago UserDep,
20 01cdf2e Dawsh 2y ago StartDateDep,
21 01cdf2e Dawsh 2y ago EndDateDep,
22 4708fcb Dawsh 2y ago ModifyUsersAccess,
23 01cdf2e Dawsh 2y ago )
24 8440155 mahdim10 1y ago from app.models.notification import UserNotification
25 db68a58 Dawsh 2y ago from app.models.service import ServiceResponse
26 01cdf2e Dawsh 2y ago from app.models.user import (
27 01cdf2e Dawsh 2y ago UserCreate,
28 01cdf2e Dawsh 2y ago UserModify,
29 01cdf2e Dawsh 2y ago UserResponse,
30 e6e6467 Dawsh 2y ago UserUsageSeriesResponse,
31 01cdf2e Dawsh 2y ago )
32 8440155 mahdim10 1y ago from app.notification import notify
33 f7af2b3 Dawsh 2y ago
34 f7af2b3 Dawsh 2y ago logger = logging.getLogger(__name__)
35 01cdf2e Dawsh 2y ago router = APIRouter(prefix="/users", tags=["User"])
36 f7af2b3 Dawsh 2y ago
37 f7af2b3 Dawsh 2y ago
38 d4ec019 Dawsh 2y ago class UsersSortingOptions(str, Enum):
39 d377c4c Dawsh 2y ago USERNAME = "username"
40 d377c4c Dawsh 2y ago USED_TRAFFIC = "used_traffic"
41 d377c4c Dawsh 2y ago DATA_LIMIT = "data_limit"
42 d377c4c Dawsh 2y ago EXPIRE_DATE = "expire_date"
43 d377c4c Dawsh 2y ago CREATED_AT = "created_at"
44 d377c4c Dawsh 2y ago
45 d377c4c Dawsh 2y ago
46 d377c4c Dawsh 2y ago user_filters = [
47 d377c4c Dawsh 2y ago "username",
48 d377c4c Dawsh 2y ago "is_active",
49 d377c4c Dawsh 2y ago "activated",
50 d377c4c Dawsh 2y ago "expired",
51 d377c4c Dawsh 2y ago "data_limit_reached",
52 d377c4c Dawsh 2y ago "enabled",
53 d0daa61 Mardin 2y ago "owner_username",
54 d377c4c Dawsh 2y ago ]
55 d4ec019 Dawsh 2y ago
56 d4ec019 Dawsh 2y ago
57 d4ec019 Dawsh 2y ago @router.get("", response_model=Page[UserResponse])
58 01cdf2e Dawsh 2y ago def get_users(
59 01cdf2e Dawsh 2y ago db: DBDep,
60 01cdf2e Dawsh 2y ago admin: AdminDep,
61 01cdf2e Dawsh 2y ago username: list[str] = Query(None),
62 01cdf2e Dawsh 2y ago order_by: UsersSortingOptions = Query(None),
63 01cdf2e Dawsh 2y ago descending: bool = Query(False),
64 d377c4c Dawsh 2y ago is_active: bool | None = Query(None),
65 d377c4c Dawsh 2y ago activated: bool | None = Query(None),
66 d377c4c Dawsh 2y ago expired: bool | None = Query(None),
67 d377c4c Dawsh 2y ago data_limit_reached: bool | None = Query(None),
68 d377c4c Dawsh 2y ago enabled: bool | None = Query(None),
69 d0daa61 Mardin 2y ago owner_username: str | None = Query(None),
70 01cdf2e Dawsh 2y ago ):
71 d4ec019 Dawsh 2y ago """
72 d4ec019 Dawsh 2y ago Filters users based on the options
73 d4ec019 Dawsh 2y ago """
74 d4ec019 Dawsh 2y ago dbadmin = crud.get_admin(db, admin.username)
75 d4ec019 Dawsh 2y ago
76 24826a2 Dawsh 2y ago query = db.query(User).filter(User.removed == False)
77 d4ec019 Dawsh 2y ago
78 d4ec019 Dawsh 2y ago admin = dbadmin if not admin.is_sudo else None
79 d4ec019 Dawsh 2y ago
80 d377c4c Dawsh 2y ago for name in user_filters:
81 d377c4c Dawsh 2y ago value = locals().get(name)
82 d377c4c Dawsh 2y ago if value is not None:
83 d377c4c Dawsh 2y ago if name == "username":
84 d377c4c Dawsh 2y ago if len(username) > 1:
85 d377c4c Dawsh 2y ago query = query.filter(User.username.in_(username))
86 d377c4c Dawsh 2y ago else:
87 d377c4c Dawsh 2y ago query = query.filter(
88 d377c4c Dawsh 2y ago User.username.ilike(f"%{username[0]}%")
89 d377c4c Dawsh 2y ago )
90 d0daa61 Mardin 2y ago elif name == "owner_username":
91 d0daa61 Mardin 2y ago if not dbadmin.is_sudo:
92 d0daa61 Mardin 2y ago raise HTTPException(403, "You're not allowed.")
93 d0daa61 Mardin 2y ago filter_admin = crud.get_admin(db, value)
94 d0daa61 Mardin 2y ago if not filter_admin:
95 d0daa61 Mardin 2y ago raise HTTPException(404, "owner_username not found.")
96 d0daa61 Mardin 2y ago query = query.filter(User.admin_id == filter_admin.id)
97 d377c4c Dawsh 2y ago else:
98 d377c4c Dawsh 2y ago query = query.filter(getattr(User, name) == value)
99 d4ec019 Dawsh 2y ago
100 d4ec019 Dawsh 2y ago if admin:
101 d4ec019 Dawsh 2y ago query = query.filter(User.admin == admin)
102 d4ec019 Dawsh 2y ago
103 d4ec019 Dawsh 2y ago if order_by:
104 d4ec019 Dawsh 2y ago order_column = getattr(User, order_by)
105 d4ec019 Dawsh 2y ago if descending:
106 d4ec019 Dawsh 2y ago order_column = order_column.desc()
107 d4ec019 Dawsh 2y ago query = query.order_by(order_column)
108 d4ec019 Dawsh 2y ago
109 d4ec019 Dawsh 2y ago return paginate(db, query)
110 d4ec019 Dawsh 2y ago
111 d4ec019 Dawsh 2y ago
112 5bb2712 Mardin 2y ago @router.post("", response_model=UserResponse)
113 01cdf2e Dawsh 2y ago async def add_user(new_user: UserCreate, db: DBDep, admin: AdminDep):
114 f7af2b3 Dawsh 2y ago """
115 f7af2b3 Dawsh 2y ago Add a new user
116 f7af2b3 Dawsh 2y ago
117 f7af2b3 Dawsh 2y ago - **username** must have 3 to 32 characters and is allowed to contain a-z, 0-9, and underscores in between
118 d377c4c Dawsh 2y ago - **expire_date** must be a datetime
119 f7af2b3 Dawsh 2y ago - **data_limit** must be in Bytes, e.g. 1073741824B = 1GB
120 f7af2b3 Dawsh 2y ago - **services** list of service ids
121 f7af2b3 Dawsh 2y ago """
122 f7af2b3 Dawsh 2y ago
123 f7af2b3 Dawsh 2y ago try:
124 01cdf2e Dawsh 2y ago db_user = crud.create_user(
125 4708fcb Dawsh 2y ago db,
126 4708fcb Dawsh 2y ago new_user,
127 4708fcb Dawsh 2y ago admin=crud.get_admin(db, admin.username),
128 4708fcb Dawsh 2y ago allowed_services=(
129 4708fcb Dawsh 2y ago admin.service_ids
130 4708fcb Dawsh 2y ago if not admin.is_sudo and not admin.all_services_access
131 4708fcb Dawsh 2y ago else None
132 4708fcb Dawsh 2y ago ),
133 01cdf2e Dawsh 2y ago )
134 f7af2b3 Dawsh 2y ago except sqlalchemy.exc.IntegrityError:
135 f7af2b3 Dawsh 2y ago db.rollback()
136 f7af2b3 Dawsh 2y ago raise HTTPException(status_code=409, detail="User already exists")
137 f7af2b3 Dawsh 2y ago
138 f7af2b3 Dawsh 2y ago user = UserResponse.model_validate(db_user)
139 d377c4c Dawsh 2y ago marznode.operations.update_user(user=db_user)
140 8440155 mahdim10 1y ago
141 d377c4c Dawsh 2y ago asyncio.ensure_future(
142 8440155 mahdim10 1y ago notify(
143 8440155 mahdim10 1y ago action=UserNotification.Action.user_created, user=user, by=admin
144 8440155 mahdim10 1y ago )
145 f1ab16c Dawsh 2y ago )
146 8440155 mahdim10 1y ago
147 f7af2b3 Dawsh 2y ago logger.info("New user `%s` added", db_user.username)
148 f7af2b3 Dawsh 2y ago return user
149 f7af2b3 Dawsh 2y ago
150 f7af2b3 Dawsh 2y ago
151 d4ec019 Dawsh 2y ago @router.post("/reset")
152 01cdf2e Dawsh 2y ago async def reset_users_data_usage(db: DBDep, admin: SudoAdminDep):
153 d4ec019 Dawsh 2y ago """
154 d4ec019 Dawsh 2y ago Reset all users data usage,
155 d4ec019 Dawsh 2y ago You will need to restart for this to take effect for now
156 d4ec019 Dawsh 2y ago """
157 d4ec019 Dawsh 2y ago dbadmin = crud.get_admin(db, admin.username)
158 d4ec019 Dawsh 2y ago crud.reset_all_users_data_usage(db=db, admin=dbadmin)
159 d4ec019 Dawsh 2y ago return {}
160 d4ec019 Dawsh 2y ago
161 d4ec019 Dawsh 2y ago
162 d4ec019 Dawsh 2y ago @router.delete("/expired")
163 4708fcb Dawsh 2y ago async def delete_expired(
164 4708fcb Dawsh 2y ago passed_time: int,
165 4708fcb Dawsh 2y ago db: DBDep,
166 4708fcb Dawsh 2y ago admin: AdminDep,
167 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
168 4708fcb Dawsh 2y ago ):
169 d4ec019 Dawsh 2y ago """
170 d4ec019 Dawsh 2y ago Delete expired users
171 d4ec019 Dawsh 2y ago - **passed_time** must be a timestamp
172 d4ec019 Dawsh 2y ago - This function will delete all expired users that meet the specified number of days passed and can't be undone.
173 d4ec019 Dawsh 2y ago """
174 d4ec019 Dawsh 2y ago
175 d4ec019 Dawsh 2y ago dbadmin = crud.get_admin(db, admin.username)
176 d4ec019 Dawsh 2y ago
177 01cdf2e Dawsh 2y ago db_users = crud.get_users(
178 01cdf2e Dawsh 2y ago db=db,
179 d377c4c Dawsh 2y ago expired=True,
180 01cdf2e Dawsh 2y ago admin=dbadmin if not admin.is_sudo else None,
181 01cdf2e Dawsh 2y ago )
182 d4ec019 Dawsh 2y ago
183 d377c4c Dawsh 2y ago current_time = datetime.utcnow()
184 d377c4c Dawsh 2y ago expiration_threshold = current_time - timedelta(seconds=passed_time)
185 d4ec019 Dawsh 2y ago expired_users = [
186 01cdf2e Dawsh 2y ago user
187 01cdf2e Dawsh 2y ago for user in db_users
188 24826a2 Dawsh 2y ago if user.expire_date is not None
189 24826a2 Dawsh 2y ago and user.expire_date <= expiration_threshold
190 01cdf2e Dawsh 2y ago ]
191 d4ec019 Dawsh 2y ago if not expired_users:
192 d4ec019 Dawsh 2y ago raise HTTPException(status_code=404, detail="No expired user found.")
193 d4ec019 Dawsh 2y ago
194 d4ec019 Dawsh 2y ago for db_user in expired_users:
195 d4ec019 Dawsh 2y ago crud.remove_user(db, db_user)
196 d4ec019 Dawsh 2y ago
197 d4ec019 Dawsh 2y ago logger.info("User `%s` removed", db_user.username)
198 d4ec019 Dawsh 2y ago
199 d4ec019 Dawsh 2y ago return {}
200 d4ec019 Dawsh 2y ago
201 d4ec019 Dawsh 2y ago
202 5bb2712 Mardin 2y ago @router.get("/{username}", response_model=UserResponse)
203 f7af2b3 Dawsh 2y ago def get_user(db_user: UserDep):
204 f7af2b3 Dawsh 2y ago """
205 f7af2b3 Dawsh 2y ago Get users information
206 f7af2b3 Dawsh 2y ago """
207 f7af2b3 Dawsh 2y ago return db_user
208 f7af2b3 Dawsh 2y ago
209 f7af2b3 Dawsh 2y ago
210 5bb2712 Mardin 2y ago @router.put("/{username}", response_model=UserResponse)
211 01cdf2e Dawsh 2y ago async def modify_user(
212 4708fcb Dawsh 2y ago db_user: UserDep,
213 4708fcb Dawsh 2y ago modifications: UserModify,
214 4708fcb Dawsh 2y ago db: DBDep,
215 4708fcb Dawsh 2y ago admin: AdminDep,
216 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
217 01cdf2e Dawsh 2y ago ):
218 f7af2b3 Dawsh 2y ago """
219 f7af2b3 Dawsh 2y ago Modify a user
220 f7af2b3 Dawsh 2y ago
221 f7af2b3 Dawsh 2y ago - set **data_limit** to 0 to make the user unlimited in data, null for no change
222 f7af2b3 Dawsh 2y ago """
223 d377c4c Dawsh 2y ago active_before = db_user.is_active
224 f7af2b3 Dawsh 2y ago
225 f7af2b3 Dawsh 2y ago old_inbounds = {(i.node_id, i.protocol, i.tag) for i in db_user.inbounds}
226 4708fcb Dawsh 2y ago new_user = crud.update_user(
227 4708fcb Dawsh 2y ago db,
228 4708fcb Dawsh 2y ago db_user,
229 4708fcb Dawsh 2y ago modifications,
230 4708fcb Dawsh 2y ago allowed_services=(
231 4708fcb Dawsh 2y ago admin.service_ids
232 4708fcb Dawsh 2y ago if not admin.is_sudo and not admin.all_services_access
233 4708fcb Dawsh 2y ago else None
234 4708fcb Dawsh 2y ago ),
235 4708fcb Dawsh 2y ago )
236 d377c4c Dawsh 2y ago active_after = new_user.is_active
237 f7af2b3 Dawsh 2y ago new_inbounds = {(i.node_id, i.protocol, i.tag) for i in new_user.inbounds}
238 f7af2b3 Dawsh 2y ago
239 f7af2b3 Dawsh 2y ago inbound_change = old_inbounds != new_inbounds
240 d377c4c Dawsh 2y ago
241 cba9caa Dawsh 2y ago if (
242 d377c4c Dawsh 2y ago inbound_change and new_user.is_active
243 d377c4c Dawsh 2y ago ) or active_before != active_after:
244 d377c4c Dawsh 2y ago marznode.operations.update_user(
245 a26139d Dawsh 2y ago new_user, old_inbounds, remove=not db_user.is_active
246 d377c4c Dawsh 2y ago )
247 d377c4c Dawsh 2y ago db_user.activated = db_user.is_active
248 d377c4c Dawsh 2y ago db.commit()
249 f7af2b3 Dawsh 2y ago
250 d377c4c Dawsh 2y ago asyncio.ensure_future(
251 8440155 mahdim10 1y ago notify(
252 8440155 mahdim10 1y ago action=UserNotification.Action.user_updated,
253 8440155 mahdim10 1y ago user=UserResponse.model_validate(db_user),
254 8440155 mahdim10 1y ago by=admin,
255 d377c4c Dawsh 2y ago )
256 d377c4c Dawsh 2y ago )
257 01cdf2e Dawsh 2y ago
258 d377c4c Dawsh 2y ago logger.info("User `%s` modified", db_user.username)
259 f7af2b3 Dawsh 2y ago
260 d377c4c Dawsh 2y ago if active_before != active_after:
261 8440155 mahdim10 1y ago action = (
262 8440155 mahdim10 1y ago UserNotification.Action.user_activated
263 8440155 mahdim10 1y ago if active_after
264 8440155 mahdim10 1y ago else UserNotification.Action.user_deactivated
265 8440155 mahdim10 1y ago )
266 8440155 mahdim10 1y ago
267 d377c4c Dawsh 2y ago asyncio.ensure_future(
268 8440155 mahdim10 1y ago notify(
269 8440155 mahdim10 1y ago action=action,
270 d377c4c Dawsh 2y ago user=UserResponse.model_validate(db_user),
271 d377c4c Dawsh 2y ago by=admin,
272 01cdf2e Dawsh 2y ago )
273 01cdf2e Dawsh 2y ago )
274 01cdf2e Dawsh 2y ago
275 01cdf2e Dawsh 2y ago logger.info(
276 d377c4c Dawsh 2y ago "User `%s` activation changed from `%s` to `%s`",
277 d377c4c Dawsh 2y ago db_user.username,
278 d377c4c Dawsh 2y ago active_before,
279 d377c4c Dawsh 2y ago active_after,
280 01cdf2e Dawsh 2y ago )
281 f7af2b3 Dawsh 2y ago
282 d377c4c Dawsh 2y ago return db_user
283 f7af2b3 Dawsh 2y ago
284 f7af2b3 Dawsh 2y ago
285 5bb2712 Mardin 2y ago @router.delete("/{username}")
286 4708fcb Dawsh 2y ago async def remove_user(
287 4708fcb Dawsh 2y ago db_user: UserDep,
288 4708fcb Dawsh 2y ago db: DBDep,
289 4708fcb Dawsh 2y ago admin: AdminDep,
290 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
291 4708fcb Dawsh 2y ago ):
292 f7af2b3 Dawsh 2y ago """
293 f7af2b3 Dawsh 2y ago Remove a user
294 f7af2b3 Dawsh 2y ago """
295 d377c4c Dawsh 2y ago marznode.operations.update_user(db_user, remove=True)
296 f7af2b3 Dawsh 2y ago
297 8440155 mahdim10 1y ago deleted_username = db_user.username
298 f7af2b3 Dawsh 2y ago crud.remove_user(db, db_user)
299 8440155 mahdim10 1y ago
300 8440155 mahdim10 1y ago db_user.username = deleted_username
301 8440155 mahdim10 1y ago user = UserResponse.model_validate(db_user)
302 8440155 mahdim10 1y ago db.expunge(db_user)
303 f7af2b3 Dawsh 2y ago
304 d377c4c Dawsh 2y ago asyncio.ensure_future(
305 8440155 mahdim10 1y ago notify(
306 8440155 mahdim10 1y ago action=UserNotification.Action.user_deleted, user=user, by=admin
307 8440155 mahdim10 1y ago )
308 f1ab16c Dawsh 2y ago )
309 8440155 mahdim10 1y ago
310 f7af2b3 Dawsh 2y ago logger.info("User %s deleted", db_user.username)
311 f7af2b3 Dawsh 2y ago return {}
312 f7af2b3 Dawsh 2y ago
313 f7af2b3 Dawsh 2y ago
314 db68a58 Dawsh 2y ago @router.get("/{username}/services", response_model=Page[ServiceResponse])
315 4708fcb Dawsh 2y ago def get_user_services(user: UserDep, db: DBDep, admin: AdminDep):
316 db68a58 Dawsh 2y ago """
317 db68a58 Dawsh 2y ago Get user services
318 db68a58 Dawsh 2y ago """
319 db68a58 Dawsh 2y ago
320 f1ab16c Dawsh 2y ago query = (
321 4708fcb Dawsh 2y ago db.query(Service)
322 4708fcb Dawsh 2y ago .join(Service.users)
323 4708fcb Dawsh 2y ago .where(User.username == user.username)
324 f1ab16c Dawsh 2y ago )
325 db68a58 Dawsh 2y ago
326 4708fcb Dawsh 2y ago if not admin.is_sudo and not admin.all_services_access:
327 4708fcb Dawsh 2y ago query.filter(Service.id.in_(admin.service_ids))
328 4708fcb Dawsh 2y ago
329 db68a58 Dawsh 2y ago return paginate(query)
330 db68a58 Dawsh 2y ago
331 db68a58 Dawsh 2y ago
332 5bb2712 Mardin 2y ago @router.post("/{username}/reset", response_model=UserResponse)
333 4708fcb Dawsh 2y ago async def reset_user_data_usage(
334 4708fcb Dawsh 2y ago db_user: UserDep,
335 4708fcb Dawsh 2y ago db: DBDep,
336 4708fcb Dawsh 2y ago admin: AdminDep,
337 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
338 4708fcb Dawsh 2y ago ):
339 f7af2b3 Dawsh 2y ago """
340 f7af2b3 Dawsh 2y ago Reset user data usage
341 f7af2b3 Dawsh 2y ago """
342 6b36509 Dawsh 2y ago was_active = db_user.is_active
343 f7af2b3 Dawsh 2y ago db_user = crud.reset_user_data_usage(db, db_user)
344 f7af2b3 Dawsh 2y ago
345 d377c4c Dawsh 2y ago if db_user.is_active and not was_active:
346 d377c4c Dawsh 2y ago marznode.operations.update_user(db_user)
347 d377c4c Dawsh 2y ago db_user.activated = True
348 d377c4c Dawsh 2y ago db.commit()
349 f7af2b3 Dawsh 2y ago
350 f7af2b3 Dawsh 2y ago user = UserResponse.model_validate(db_user)
351 8440155 mahdim10 1y ago
352 8440155 mahdim10 1y ago asyncio.ensure_future(
353 8440155 mahdim10 1y ago notify(
354 8440155 mahdim10 1y ago action=UserNotification.Action.data_usage_reset,
355 8440155 mahdim10 1y ago user=user,
356 8440155 mahdim10 1y ago by=admin,
357 8440155 mahdim10 1y ago )
358 8440155 mahdim10 1y ago )
359 f7af2b3 Dawsh 2y ago
360 f7af2b3 Dawsh 2y ago logger.info("User `%s`'s usage was reset", db_user.username)
361 f7af2b3 Dawsh 2y ago
362 f7af2b3 Dawsh 2y ago return user
363 f7af2b3 Dawsh 2y ago
364 f7af2b3 Dawsh 2y ago
365 cba9caa Dawsh 2y ago @router.post("/{username}/enable", response_model=UserResponse)
366 4708fcb Dawsh 2y ago async def enable_user(
367 4708fcb Dawsh 2y ago db_user: UserDep,
368 4708fcb Dawsh 2y ago db: DBDep,
369 4708fcb Dawsh 2y ago admin: AdminDep,
370 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
371 4708fcb Dawsh 2y ago ):
372 cba9caa Dawsh 2y ago """
373 cba9caa Dawsh 2y ago Enables a user
374 cba9caa Dawsh 2y ago """
375 cba9caa Dawsh 2y ago if db_user.enabled:
376 cba9caa Dawsh 2y ago raise HTTPException(409, "User is already enabled")
377 d7870a7 mahdim10 2y ago
378 cba9caa Dawsh 2y ago db_user.enabled = True
379 cba9caa Dawsh 2y ago
380 d7870a7 mahdim10 2y ago if db_user.is_active:
381 d7870a7 mahdim10 2y ago db_user.activated = True
382 d7870a7 mahdim10 2y ago marznode.operations.update_user(db_user)
383 d7870a7 mahdim10 2y ago
384 d7870a7 mahdim10 2y ago db.commit()
385 cba9caa Dawsh 2y ago
386 cba9caa Dawsh 2y ago user = UserResponse.model_validate(db_user)
387 cba9caa Dawsh 2y ago
388 8440155 mahdim10 1y ago asyncio.ensure_future(
389 8440155 mahdim10 1y ago notify(
390 8440155 mahdim10 1y ago action=UserNotification.Action.user_enabled, user=user, by=admin
391 8440155 mahdim10 1y ago )
392 8440155 mahdim10 1y ago )
393 8440155 mahdim10 1y ago
394 cba9caa Dawsh 2y ago logger.info("User `%s` has been enabled", db_user.username)
395 cba9caa Dawsh 2y ago
396 cba9caa Dawsh 2y ago return user
397 cba9caa Dawsh 2y ago
398 cba9caa Dawsh 2y ago
399 cba9caa Dawsh 2y ago @router.post("/{username}/disable", response_model=UserResponse)
400 4708fcb Dawsh 2y ago async def disable_user(
401 4708fcb Dawsh 2y ago db_user: UserDep,
402 4708fcb Dawsh 2y ago db: DBDep,
403 4708fcb Dawsh 2y ago admin: AdminDep,
404 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
405 4708fcb Dawsh 2y ago ):
406 cba9caa Dawsh 2y ago """
407 cba9caa Dawsh 2y ago Disables a user
408 cba9caa Dawsh 2y ago """
409 cba9caa Dawsh 2y ago if not db_user.enabled:
410 cba9caa Dawsh 2y ago raise HTTPException(409, "User is not enabled")
411 cba9caa Dawsh 2y ago db_user.enabled = False
412 d377c4c Dawsh 2y ago db_user.activated = False
413 cba9caa Dawsh 2y ago db.commit()
414 cba9caa Dawsh 2y ago
415 d377c4c Dawsh 2y ago marznode.operations.update_user(db_user, remove=True)
416 cba9caa Dawsh 2y ago
417 cba9caa Dawsh 2y ago user = UserResponse.model_validate(db_user)
418 cba9caa Dawsh 2y ago
419 8440155 mahdim10 1y ago asyncio.ensure_future(
420 8440155 mahdim10 1y ago notify(
421 8440155 mahdim10 1y ago action=UserNotification.Action.user_disabled, user=user, by=admin
422 8440155 mahdim10 1y ago )
423 8440155 mahdim10 1y ago )
424 8440155 mahdim10 1y ago
425 cba9caa Dawsh 2y ago logger.info("User `%s` has been disabled", db_user.username)
426 cba9caa Dawsh 2y ago
427 cba9caa Dawsh 2y ago return user
428 cba9caa Dawsh 2y ago
429 cba9caa Dawsh 2y ago
430 5bb2712 Mardin 2y ago @router.post("/{username}/revoke_sub", response_model=UserResponse)
431 f1ab16c Dawsh 2y ago async def revoke_user_subscription(
432 4708fcb Dawsh 2y ago db_user: UserDep,
433 4708fcb Dawsh 2y ago db: DBDep,
434 4708fcb Dawsh 2y ago admin: AdminDep,
435 4708fcb Dawsh 2y ago modify_access: ModifyUsersAccess,
436 f1ab16c Dawsh 2y ago ):
437 f7af2b3 Dawsh 2y ago """
438 f7af2b3 Dawsh 2y ago Revoke users subscription (Subscription link and proxies)
439 f7af2b3 Dawsh 2y ago """
440 f7af2b3 Dawsh 2y ago db_user = crud.revoke_user_sub(db, db_user)
441 f7af2b3 Dawsh 2y ago
442 d377c4c Dawsh 2y ago if db_user.is_active:
443 d377c4c Dawsh 2y ago marznode.operations.update_user(db_user, remove=True)
444 d377c4c Dawsh 2y ago marznode.operations.update_user(db_user)
445 8440155 mahdim10 1y ago
446 f7af2b3 Dawsh 2y ago user = UserResponse.model_validate(db_user)
447 8440155 mahdim10 1y ago
448 d377c4c Dawsh 2y ago asyncio.ensure_future(
449 8440155 mahdim10 1y ago notify(
450 8440155 mahdim10 1y ago action=UserNotification.Action.subscription_revoked,
451 8440155 mahdim10 1y ago user=user,
452 8440155 mahdim10 1y ago by=admin,
453 8440155 mahdim10 1y ago )
454 d377c4c Dawsh 2y ago )
455 f7af2b3 Dawsh 2y ago
456 f7af2b3 Dawsh 2y ago logger.info("User %s subscription revoked", db_user.username)
457 f7af2b3 Dawsh 2y ago
458 f7af2b3 Dawsh 2y ago return user
459 f7af2b3 Dawsh 2y ago
460 f7af2b3 Dawsh 2y ago
461 e6e6467 Dawsh 2y ago @router.get("/{username}/usage", response_model=UserUsageSeriesResponse)
462 01cdf2e Dawsh 2y ago def get_user_usage(
463 01cdf2e Dawsh 2y ago db: DBDep, db_user: UserDep, start_date: StartDateDep, end_date: EndDateDep
464 01cdf2e Dawsh 2y ago ):
465 f7af2b3 Dawsh 2y ago """
466 f7af2b3 Dawsh 2y ago Get users usage
467 f7af2b3 Dawsh 2y ago """
468 f7af2b3 Dawsh 2y ago
469 e6e6467 Dawsh 2y ago return crud.get_user_usages(db, db_user, start_date, end_date)
470 f7af2b3 Dawsh 2y ago
471 f7af2b3 Dawsh 2y ago
472 5bb2712 Mardin 2y ago @router.put("/{username}/set-owner", response_model=UserResponse)
473 f1ab16c Dawsh 2y ago def set_owner(
474 f1ab16c Dawsh 2y ago username: str, admin_username: str, db: DBDep, admin: SudoAdminDep
475 f1ab16c Dawsh 2y ago ):
476 f7af2b3 Dawsh 2y ago db_user = crud.get_user(db, username)
477 f7af2b3 Dawsh 2y ago if not db_user:
478 f7af2b3 Dawsh 2y ago raise HTTPException(status_code=404, detail="User not found")
479 f7af2b3 Dawsh 2y ago
480 f7af2b3 Dawsh 2y ago new_admin = crud.get_admin(db, username=admin_username)
481 f7af2b3 Dawsh 2y ago if not new_admin:
482 f7af2b3 Dawsh 2y ago raise HTTPException(status_code=404, detail="Admin not found")
483 f7af2b3 Dawsh 2y ago
484 f7af2b3 Dawsh 2y ago db_user = crud.set_owner(db, db_user, new_admin)
485 f7af2b3 Dawsh 2y ago user = UserResponse.model_validate(db_user)
486 f7af2b3 Dawsh 2y ago
487 f1ab16c Dawsh 2y ago logger.info(
488 f1ab16c Dawsh 2y ago "`%s`'s owner successfully set to `%s`", user.username, admin.username
489 f1ab16c Dawsh 2y ago )
490 f7af2b3 Dawsh 2y ago
491 f7af2b3 Dawsh 2y ago return user