gitscope
https://dev.kronoz.win/r/marzneshin.git
app/routes/service.py · master
Source
1 a47eb4c Dawsh 2y ago import sqlalchemy
2 9ddfbc8 Mardin 2y ago from fastapi import APIRouter, Query
3 c13a1aa Dawsh 2y ago from fastapi import HTTPException
4 d4ec019 Dawsh 2y ago from fastapi_pagination.ext.sqlalchemy import paginate
5 d4ec019 Dawsh 2y ago from fastapi_pagination.links import Page
6 a47eb4c Dawsh 2y ago
7 d6e2aad Dawsh 2y ago from app import marznode
8 c13a1aa Dawsh 2y ago from app.db import crud
9 db68a58 Dawsh 2y ago from app.db.models import Service, User
10 667402d Erfan 1y ago from app.dependencies import DBDep, AdminDep, SudoAdminDep, ServiceDep
11 db68a58 Dawsh 2y ago from app.models.proxy import Inbound
12 01cdf2e Dawsh 2y ago from app.models.service import ServiceCreate, ServiceModify, ServiceResponse
13 db68a58 Dawsh 2y ago from app.models.user import UserResponse
14 a47eb4c Dawsh 2y ago
15 9ddfbc8 Mardin 2y ago router = APIRouter(prefix="/services", tags=["Service"])
16 a47eb4c Dawsh 2y ago
17 f7af2b3 Dawsh 2y ago
18 d4ec019 Dawsh 2y ago @router.get("", response_model=Page[ServiceResponse])
19 9ddfbc8 Mardin 2y ago def get_services(db: DBDep, admin: AdminDep, name: str = Query(None)):
20 d4ec019 Dawsh 2y ago query = db.query(Service)
21 4708fcb Dawsh 2y ago
22 d4ec019 Dawsh 2y ago if name:
23 d4ec019 Dawsh 2y ago query = query.filter(Service.name.ilike(f"%{name}%"))
24 4708fcb Dawsh 2y ago
25 4708fcb Dawsh 2y ago if not admin.is_sudo and not admin.all_services_access:
26 4708fcb Dawsh 2y ago query = query.filter(Service.id.in_(admin.service_ids))
27 4708fcb Dawsh 2y ago
28 d4ec019 Dawsh 2y ago return paginate(query)
29 d4ec019 Dawsh 2y ago
30 d4ec019 Dawsh 2y ago
31 2de9d72 Dawsh 2y ago @router.post("", response_model=ServiceResponse)
32 9ddfbc8 Mardin 2y ago def add_service(new_service: ServiceCreate, db: DBDep, admin: SudoAdminDep):
33 a47eb4c Dawsh 2y ago """
34 d6e2aad Dawsh 2y ago Add a new service
35 a47eb4c Dawsh 2y ago
36 d6e2aad Dawsh 2y ago - **name** service name
37 d6e2aad Dawsh 2y ago - **inbounds** list of inbound ids
38 a47eb4c Dawsh 2y ago """
39 a47eb4c Dawsh 2y ago try:
40 a47eb4c Dawsh 2y ago return crud.create_service(db, new_service)
41 a47eb4c Dawsh 2y ago except sqlalchemy.exc.IntegrityError:
42 a47eb4c Dawsh 2y ago db.rollback()
43 01cdf2e Dawsh 2y ago raise HTTPException(
44 01cdf2e Dawsh 2y ago status_code=409, detail="Service by this name already exists"
45 01cdf2e Dawsh 2y ago )
46 a47eb4c Dawsh 2y ago
47 a47eb4c Dawsh 2y ago
48 2de9d72 Dawsh 2y ago @router.get("/{id}", response_model=ServiceResponse)
49 667402d Erfan 1y ago def get_service(service: ServiceDep, db: DBDep, admin: AdminDep):
50 a47eb4c Dawsh 2y ago """
51 a47eb4c Dawsh 2y ago Get Service information with id
52 a47eb4c Dawsh 2y ago """
53 33f2c28 Dawsh 2y ago if not (
54 33f2c28 Dawsh 2y ago admin.is_sudo or admin.all_services_access or id in admin.service_ids
55 33f2c28 Dawsh 2y ago ):
56 4708fcb Dawsh 2y ago raise HTTPException(status_code=403, detail="You're not allowed")
57 4708fcb Dawsh 2y ago
58 667402d Erfan 1y ago return service
59 a47eb4c Dawsh 2y ago
60 a47eb4c Dawsh 2y ago
61 db68a58 Dawsh 2y ago @router.get("/{id}/users", response_model=Page[UserResponse])
62 667402d Erfan 1y ago def get_service_users(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
63 db68a58 Dawsh 2y ago """
64 db68a58 Dawsh 2y ago Get service users
65 db68a58 Dawsh 2y ago """
66 fdd3f61 Dawsh 2y ago query = (
67 fdd3f61 Dawsh 2y ago db.query(User)
68 fdd3f61 Dawsh 2y ago .join(User.services)
69 fdd3f61 Dawsh 2y ago .where(Service.id == service.id)
70 fdd3f61 Dawsh 2y ago .filter(User.removed != True)
71 fdd3f61 Dawsh 2y ago )
72 db68a58 Dawsh 2y ago
73 db68a58 Dawsh 2y ago return paginate(query)
74 db68a58 Dawsh 2y ago
75 db68a58 Dawsh 2y ago
76 db68a58 Dawsh 2y ago @router.get("/{id}/inbounds", response_model=Page[Inbound])
77 667402d Erfan 1y ago def get_service_inbounds(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
78 db68a58 Dawsh 2y ago """
79 db68a58 Dawsh 2y ago Get service inbounds
80 db68a58 Dawsh 2y ago """
81 f1ab16c Dawsh 2y ago query = (
82 f1ab16c Dawsh 2y ago db.query(Inbound)
83 f1ab16c Dawsh 2y ago .join(Inbound.services)
84 f1ab16c Dawsh 2y ago .where(Service.id == service.id)
85 f1ab16c Dawsh 2y ago )
86 db68a58 Dawsh 2y ago
87 db68a58 Dawsh 2y ago return paginate(query)
88 db68a58 Dawsh 2y ago
89 db68a58 Dawsh 2y ago
90 2de9d72 Dawsh 2y ago @router.put("/{id}", response_model=ServiceResponse)
91 9ddfbc8 Mardin 2y ago async def modify_service(
92 667402d Erfan 1y ago service: ServiceDep,
93 667402d Erfan 1y ago modification: ServiceModify,
94 667402d Erfan 1y ago db: DBDep,
95 667402d Erfan 1y ago admin: SudoAdminDep,
96 9ddfbc8 Mardin 2y ago ):
97 a47eb4c Dawsh 2y ago """
98 a47eb4c Dawsh 2y ago Modify Service
99 a47eb4c Dawsh 2y ago
100 a47eb4c Dawsh 2y ago - **name** can be up to 64 characters
101 ee1351a Dawsh 2y ago - **inbounds** list of inbound ids. if not specified no change will be applied;
102 ee1351a Dawsh 2y ago in case of an empty list all inbounds would be removed.
103 a47eb4c Dawsh 2y ago """
104 667402d Erfan 1y ago old_inbounds = {(i.node_id, i.protocol, i.tag) for i in service.inbounds}
105 a47eb4c Dawsh 2y ago try:
106 667402d Erfan 1y ago response = crud.update_service(db, service, modification)
107 a47eb4c Dawsh 2y ago except sqlalchemy.exc.IntegrityError:
108 a47eb4c Dawsh 2y ago db.rollback()
109 f1ab16c Dawsh 2y ago raise HTTPException(
110 f1ab16c Dawsh 2y ago status_code=409, detail="problem updating the service"
111 f1ab16c Dawsh 2y ago )
112 d6e2aad Dawsh 2y ago else:
113 d6e2aad Dawsh 2y ago for user in response.users:
114 d377c4c Dawsh 2y ago if user.activated:
115 d377c4c Dawsh 2y ago marznode.operations.update_user(
116 d377c4c Dawsh 2y ago user, old_inbounds=old_inbounds
117 d377c4c Dawsh 2y ago )
118 d6e2aad Dawsh 2y ago return response
119 a47eb4c Dawsh 2y ago
120 a47eb4c Dawsh 2y ago
121 2de9d72 Dawsh 2y ago @router.delete("/{id}")
122 667402d Erfan 1y ago def remove_service(service: ServiceDep, db: DBDep, admin: SudoAdminDep):
123 667402d Erfan 1y ago crud.remove_service(db, service)
124 ee1351a Dawsh 2y ago return dict()