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