diff --git a/app/dependencies.py b/app/dependencies.py index aa13cea..469de6d 100644 --- a/app/dependencies.py +++ b/app/dependencies.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Annotated from fastapi import Depends, HTTPException, status @@ -82,8 +83,24 @@ def get_user(username: str, return db_user +def parse_start_date(start: str | None = None): + if not start: + return datetime.fromtimestamp(datetime.utcnow().timestamp() - 30 * 24 * 3600) + else: + return datetime.fromisoformat(start) + + +def parse_end_date(end: str | None = None): + if not end: + return datetime.utcnow() + else: + return datetime.fromisoformat(end) + + SubUserDep = Annotated[User, Depends(get_subscription_user)] UserDep = Annotated[User, Depends(get_user)] AdminDep = Annotated[Admin, Depends(get_current_admin)] SudoAdminDep = Annotated[Admin, Depends(sudo_admin)] DBDep = Annotated[Session, Depends(get_db)] +StartDateDep = Annotated[datetime, Depends(parse_start_date)] +EndDateDep = Annotated[datetime, Depends(parse_end_date)] diff --git a/app/routes/node.py b/app/routes/node.py index d66058d..070111b 100644 --- a/app/routes/node.py +++ b/app/routes/node.py @@ -8,7 +8,7 @@ from fastapi import HTTPException, WebSocket from app import marznode from app.db import crud, get_tls_certificate -from app.dependencies import DBDep, SudoAdminDep, sudo_admin +from app.dependencies import DBDep, SudoAdminDep, sudo_admin, EndDateDep, StartDateDep from app.marznode import MarzNodeGRPC from app.models.admin import Admin from app.models.node import (NodeCreate, NodeModify, NodeResponse, @@ -152,21 +152,11 @@ async def remove_node(node_id: int, @router.get("/api/nodes/usage", response_model=NodesUsageResponse) def get_usage(db: DBDep, admin: SudoAdminDep, - start: str = None, - end: str = None): + start_date: StartDateDep, + end_date: EndDateDep): """ Get nodes usage """ - if start is None: - start_date = datetime.fromtimestamp(datetime.utcnow().timestamp() - 30 * 24 * 3600) - else: - start_date = datetime.fromisoformat(start) - - if end is None: - end_date = datetime.utcnow() - else: - end_date = datetime.fromisoformat(end) - usages = crud.get_nodes_usage(db, start_date, end_date) return {"usages": usages} diff --git a/app/routes/subscription.py b/app/routes/subscription.py index 6c59454..fe5bfb0 100644 --- a/app/routes/subscription.py +++ b/app/routes/subscription.py @@ -1,12 +1,11 @@ import re -from datetime import datetime from fastapi import APIRouter from fastapi import Header, HTTPException, Path, Request, Response from fastapi.responses import HTMLResponse from app.db import crud -from app.dependencies import DBDep, SubUserDep +from app.dependencies import DBDep, SubUserDep, StartDateDep, EndDateDep from app.models.user import UserResponse from app.templates import render_template from app.utils.share import encode_title, generate_subscription, generate_v2ray_links @@ -99,19 +98,8 @@ def user_subscription_info(db_user: SubUserDep): @router.get("/sub/{username}/{key}/usage") def user_get_usage(db_user: SubUserDep, db: DBDep, - start: str = None, - end: str = None): - - if start is None: - start_date = datetime.fromtimestamp(datetime.utcnow().timestamp() - 30 * 24 * 3600) - else: - start_date = datetime.fromisoformat(start) - - if end is None: - end_date = datetime.utcnow() - else: - end_date = datetime.fromisoformat(end) - + start_date: StartDateDep, + end_date: EndDateDep): usages = crud.get_user_usages(db, db_user, start_date, end_date) return {"usages": usages, "username": db_user.username} diff --git a/app/routes/user.py b/app/routes/user.py index 0f1946f..49f9a13 100644 --- a/app/routes/user.py +++ b/app/routes/user.py @@ -9,7 +9,7 @@ from fastapi import HTTPException, Query from app import marznode from app.db import crud -from app.dependencies import DBDep, AdminDep, SudoAdminDep, UserDep +from app.dependencies import DBDep, AdminDep, SudoAdminDep, UserDep, StartDateDep, EndDateDep from app.models.user import (UserCreate, UserModify, UserResponse, UsersResponse, UserStatus, UserUsagesResponse) from app.utils import report @@ -26,7 +26,7 @@ async def add_user(new_user: UserCreate, Add a new user - **username** must have 3 to 32 characters and is allowed to contain a-z, 0-9, and underscores in between - - **expire** must be an UTC timestamp + - **expire** must be a UTC timestamp - **data_limit** must be in Bytes, e.g. 1073741824B = 1GB - **services** list of service ids """ @@ -234,22 +234,11 @@ async def reset_users_data_usage(db: DBDep, @router.get("/api/user/{username}/usage", response_model=UserUsagesResponse) def get_user_usage(db: DBDep, db_user: UserDep, - start: str = None, - end: str = None): + start_date: StartDateDep, + end_date: EndDateDep): """ Get users usage """ - if start is None: - start_date = datetime.fromtimestamp( - datetime.utcnow().timestamp() - 30 * 24 * 3600) - else: - start_date = datetime.fromisoformat(start) - - if end is None: - end_date = datetime.utcnow() - else: - end_date = datetime.fromisoformat(end) - usages = crud.get_user_usages(db, db_user, start_date, end_date) return {"usages": usages, "username": db_user.username}