gitscope
← marzneshin / Diff · 667402d → 667402d
Changes 667402d..667402d
Patch commit
diff --git a/app/dependencies.py b/app/dependencies.py
index d649211..964adfc 100644
--- a/app/dependencies.py
+++ b/app/dependencies.py
@@ -5,6 +5,7 @@ from fastapi import Depends, HTTPException, status
from sqlalchemy.orm import Session
from app.db import crud, User, GetDB
+from app.db.models import Service
from app.models.admin import Admin, oauth2_scheme
from app.utils.auth import get_admin_payload
@@ -112,6 +113,13 @@ def parse_end_date(end: str | None = None):
return datetime.fromisoformat(end)
+def get_service(id: int, db: Annotated[Session, Depends(get_db)]):
+ service = crud.get_service(db, id)
+ if not service:
+ raise HTTPException(status_code=404, detail="Service not found")
+ return service
+
+
SubUserDep = Annotated[User, Depends(get_subscription_user)]
UserDep = Annotated[User, Depends(get_user)]
AdminDep = Annotated[Admin, Depends(get_current_admin)]
@@ -120,3 +128,4 @@ DBDep = Annotated[Session, Depends(get_db)]
StartDateDep = Annotated[datetime, Depends(parse_start_date)]
EndDateDep = Annotated[datetime, Depends(parse_end_date)]
ModifyUsersAccess = Annotated[None, Depends(user_modification_access)]
+ServiceDep = Annotated[Service, Depends(get_service)]
diff --git a/app/routes/service.py b/app/routes/service.py
index a99ca40..d2c933b 100644
--- a/app/routes/service.py
+++ b/app/routes/service.py
@@ -7,7 +7,7 @@ from fastapi_pagination.links import Page
from app import marznode
from app.db import crud
from app.db.models import Service, User
-from app.dependencies import DBDep, AdminDep, SudoAdminDep
+from app.dependencies import DBDep, AdminDep, SudoAdminDep, ServiceDep
from app.models.proxy import Inbound
from app.models.service import ServiceCreate, ServiceModify, ServiceResponse
from app.models.user import UserResponse
@@ -46,32 +46,23 @@ def add_service(new_service: ServiceCreate, db: DBDep, admin: SudoAdminDep):
@router.get("/{id}", response_model=ServiceResponse)
-def get_service(id: int, db: DBDep, admin: AdminDep):
+def get_service(service: ServiceDep, db: DBDep, admin: AdminDep):
"""
Get Service information with id
"""
- dbservice = crud.get_service(db, id)
- if not dbservice:
- raise HTTPException(status_code=404, detail="Service not found")
-
if not (
admin.is_sudo or admin.all_services_access or id in admin.service_ids
):
raise HTTPException(status_code=403, detail="You're not allowed")
- return dbservice
+ return service
@router.get("/{id}/users", response_model=Page[UserResponse])
-def get_service_users(id: int, db: DBDep, admin: SudoAdminDep):
+def get_service_users(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
"""
Get service users
"""
- service = crud.get_service(db, id)
-
- if not service:
- raise HTTPException(status_code=404, detail="Service not found")
-
query = (
db.query(User)
.join(User.services)
@@ -83,15 +74,10 @@ def get_service_users(id: int, db: DBDep, admin: SudoAdminDep):
@router.get("/{id}/inbounds", response_model=Page[Inbound])
-def get_service_inbounds(id: int, db: DBDep, admin: SudoAdminDep):
+def get_service_inbounds(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
"""
Get service inbounds
"""
- service = crud.get_service(db, id)
-
- if not service:
- raise HTTPException(status_code=404, detail="Service not found")
-
query = (
db.query(Inbound)
.join(Inbound.services)
@@ -103,7 +89,10 @@ def get_service_inbounds(id: int, db: DBDep, admin: SudoAdminDep):
@router.put("/{id}", response_model=ServiceResponse)
async def modify_service(
- id: int, modification: ServiceModify, db: DBDep, admin: SudoAdminDep
+ service: ServiceDep,
+ modification: ServiceModify,
+ db: DBDep,
+ admin: SudoAdminDep,
):
"""
Modify Service
@@ -112,12 +101,9 @@ async def modify_service(
- **inbounds** list of inbound ids. if not specified no change will be applied;
in case of an empty list all inbounds would be removed.
"""
- dbservice = crud.get_service(db, id)
- if not dbservice:
- raise HTTPException(status_code=404, detail="Service not found")
- old_inbounds = {(i.node_id, i.protocol, i.tag) for i in dbservice.inbounds}
+ old_inbounds = {(i.node_id, i.protocol, i.tag) for i in service.inbounds}
try:
- response = crud.update_service(db, dbservice, modification)
+ response = crud.update_service(db, service, modification)
except sqlalchemy.exc.IntegrityError:
db.rollback()
raise HTTPException(
@@ -133,10 +119,6 @@ async def modify_service(
@router.delete("/{id}")
-def remove_service(id: int, db: DBDep, admin: SudoAdminDep):
- dbservice = crud.get_service(db, id)
- if not dbservice:
- raise HTTPException(status_code=404, detail="Service not found")
-
- crud.remove_service(db, dbservice)
+def remove_service(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
+ crud.remove_service(db, service)
return dict()