Przeglądaj źródła

feat: webhook backend

Timothy J. Baek 1 rok temu
rodzic
commit
2c6e2d5e8a

+ 2 - 0
backend/apps/web/main.py

@@ -19,6 +19,7 @@ from config import (
     DEFAULT_USER_ROLE,
     DEFAULT_USER_ROLE,
     ENABLE_SIGNUP,
     ENABLE_SIGNUP,
     USER_PERMISSIONS,
     USER_PERMISSIONS,
+    WEBHOOK_URL,
 )
 )
 
 
 app = FastAPI()
 app = FastAPI()
@@ -32,6 +33,7 @@ app.state.DEFAULT_MODELS = DEFAULT_MODELS
 app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
 app.state.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
 app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
 app.state.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
 app.state.USER_PERMISSIONS = USER_PERMISSIONS
 app.state.USER_PERMISSIONS = USER_PERMISSIONS
+app.state.WEBHOOK_URL = WEBHOOK_URL
 
 
 
 
 app.add_middleware(
 app.add_middleware(

+ 12 - 1
backend/apps/web/routers/auths.py

@@ -27,7 +27,8 @@ from utils.utils import (
     create_token,
     create_token,
 )
 )
 from utils.misc import parse_duration, validate_email_format
 from utils.misc import parse_duration, validate_email_format
-from constants import ERROR_MESSAGES
+from utils.webhook import post_webhook
+from constants import ERROR_MESSAGES, WEBHOOK_MESSAGES
 
 
 router = APIRouter()
 router = APIRouter()
 
 
@@ -155,6 +156,16 @@ async def signup(request: Request, form_data: SignupForm):
             )
             )
             # response.set_cookie(key='token', value=token, httponly=True)
             # response.set_cookie(key='token', value=token, httponly=True)
 
 
+            if request.app.state.WEBHOOK_URL:
+                post_webhook(
+                    request.app.state.WEBHOOK_URL,
+                    {
+                        "action": "signup",
+                        "message": WEBHOOK_MESSAGES.USER_SIGNUP(user.name),
+                        "user": user.model_dump_json(exclude_none=True),
+                    },
+                )
+
             return {
             return {
                 "token": token,
                 "token": token,
                 "token_type": "Bearer",
                 "token_type": "Bearer",

+ 1 - 0
backend/config.py

@@ -302,6 +302,7 @@ MODEL_FILTER_ENABLED = os.environ.get("MODEL_FILTER_ENABLED", False)
 MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
 MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
 MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")]
 MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")]
 
 
+WEBHOOK_URL = os.environ.get("WEBHOOK_URL", "")
 
 
 ####################################
 ####################################
 # WEBUI_VERSION
 # WEBUI_VERSION

+ 7 - 0
backend/constants.py

@@ -5,6 +5,13 @@ class MESSAGES(str, Enum):
     DEFAULT = lambda msg="": f"{msg if msg else ''}"
     DEFAULT = lambda msg="": f"{msg if msg else ''}"
 
 
 
 
+class WEBHOOK_MESSAGES(str, Enum):
+    DEFAULT = lambda msg="": f"{msg if msg else ''}"
+    USER_SIGNUP = lambda username="": (
+        f"New user signed up: {username}" if username else "New user signed up"
+    )
+
+
 class ERROR_MESSAGES(str, Enum):
 class ERROR_MESSAGES(str, Enum):
     def __str__(self) -> str:
     def __str__(self) -> str:
         return super().__str__()
         return super().__str__()

+ 27 - 1
backend/main.py

@@ -38,6 +38,7 @@ from config import (
     FRONTEND_BUILD_DIR,
     FRONTEND_BUILD_DIR,
     MODEL_FILTER_ENABLED,
     MODEL_FILTER_ENABLED,
     MODEL_FILTER_LIST,
     MODEL_FILTER_LIST,
+    WEBHOOK_URL,
 )
 )
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
 
 
@@ -58,6 +59,9 @@ app = FastAPI(docs_url="/docs" if ENV == "dev" else None, redoc_url=None)
 app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED
 app.state.MODEL_FILTER_ENABLED = MODEL_FILTER_ENABLED
 app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
 
+app.state.WEBHOOK_URL = WEBHOOK_URL
+
+
 origins = ["*"]
 origins = ["*"]
 
 
 
 
@@ -178,7 +182,7 @@ class ModelFilterConfigForm(BaseModel):
 
 
 
 
 @app.post("/api/config/model/filter")
 @app.post("/api/config/model/filter")
-async def get_model_filter_config(
+async def update_model_filter_config(
     form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
     form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
 ):
 ):
 
 
@@ -197,6 +201,28 @@ async def get_model_filter_config(
     }
     }
 
 
 
 
+@app.get("/api/webhook")
+async def get_webhook_url(user=Depends(get_admin_user)):
+    return {
+        "url": app.state.WEBHOOK_URL,
+    }
+
+
+class UrlForm(BaseModel):
+    url: str
+
+
+@app.post("/api/webhook")
+async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
+    app.state.WEBHOOK_URL = form_data.url
+
+    webui_app.state.WEBHOOK_URL = app.state.WEBHOOK_URL
+
+    return {
+        "url": app.state.WEBHOOK_URL,
+    }
+
+
 @app.get("/api/version")
 @app.get("/api/version")
 async def get_app_config():
 async def get_app_config():
 
 

+ 11 - 0
backend/utils/webhook.py

@@ -0,0 +1,11 @@
+import requests
+
+
+def post_webhook(url: str, json: dict) -> bool:
+    try:
+        r = requests.post(url, json=json)
+        r.raise_for_status()
+        return True
+    except Exception as e:
+        print(e)
+        return False