diff --git a/app.py b/app.py index f199180..682658b 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,6 @@ from pprint import pprint + +from events.WebhookEventHandlers import register_all_webhook_event_handlers from logging_handlers.DatabaseLogHandler import DatabaseLogHandler from api import limiter from flask import Flask, request @@ -42,7 +44,7 @@ CORS(app, resources={ limiter.init_app(app) api.register_blueprints(app) - +register_all_webhook_event_handlers() @app.before_request def log_request(): if request.path.startswith("/api/log"): diff --git a/db/models/Path.py b/db/models/Path.py index e9d7197..85d42c8 100644 --- a/db/models/Path.py +++ b/db/models/Path.py @@ -10,7 +10,7 @@ class Path(Base): name = Column(String(50), nullable=False) parent_id = Column(Integer, ForeignKey("path.id"), nullable=True) order = Column(String(36), default=lambda: str(uuid.uuid4())) - setting_id = Column(Integer, ForeignKey("path_settings.id"), nullable=True) + setting_id = Column(Integer, ForeignKey("path_setting.id"), nullable=True) __table_args__ = (UniqueConstraint("parent_id", "name", name="unique_parent_id_name"), ) def to_dict(self): return { diff --git a/db/models/PathSetting.py b/db/models/PathSetting.py index 6bf06af..1b64c2f 100644 --- a/db/models/PathSetting.py +++ b/db/models/PathSetting.py @@ -4,7 +4,7 @@ from db.models import Base class PathSetting(Base): - __tablename__ = 'path_settings' + __tablename__ = 'path_setting' id = Column(Integer, primary_key=True, autoincrement=True) webhook_setting_id = Column(Integer, ForeignKey('webhook_setting.id'), nullable=True) template_setting_id = Column(Integer, ForeignKey('path_template.id'), nullable=True) diff --git a/events/WebhookEventHandlers/__init__.py b/events/WebhookEventHandlers/__init__.py index 21df737..6cf704d 100644 --- a/events/WebhookEventHandlers/__init__.py +++ b/events/WebhookEventHandlers/__init__.py @@ -1,7 +1,10 @@ from sqlalchemy.orm import Session from db.models.Path import Path +from db.models.PathSetting import PathSetting from db.models.Webhook import Webhook from db.models.WebhookSetting import WebhookSetting +from events import MARKDOWN_CREATED_EVENT, MARKDOWN_UPDATED_EVENT, MARKDOWN_DELETED_EVENT, PATH_CREATED_EVENT, \ + PATH_UPDATED_EVENT, PATH_DELETED_EVENT import abc import importlib import json @@ -9,6 +12,15 @@ import pkgutil import requests import db + +event_type_map = { + MARKDOWN_CREATED_EVENT: 'markdown_created_event', + MARKDOWN_UPDATED_EVENT: 'markdown_updated_event', + MARKDOWN_DELETED_EVENT: 'markdown_deleted_event', + PATH_CREATED_EVENT: 'path_created_event', + PATH_UPDATED_EVENT: 'path_updated_event', + PATH_DELETED_EVENT: 'path_deleted_event', +} class WebhookEventHandler(abc.ABC): def __init__(self, event_type=0): self.event_type = event_type @@ -17,20 +29,21 @@ class WebhookEventHandler(abc.ABC): def get_path_id(self, payload): pass - def __call__(self, **kwargs): + def __call__(self, *args, **kwargs): payload = kwargs['payload'] path_id = self.get_path_id(payload) with db.get_db() as session: setting = self.get_setting(session, path_id) if setting is None: return - headers = {'Content-Type': 'application/json'} - if setting["additional_headers"] is not None: - headers.update(json.loads(setting["additional_headers"])) + headers = {'Content-Type': 'application/json', 'x-alchegos-event': event_type_map[self.event_type]} + if setting.get("additional_header", None) is not None: + headers.update(json.loads(setting["additional_header"])) + body = json.dumps(payload, default=str) try: - response = requests.post(setting["webhook_url"], json=payload, headers=headers, timeout=5) + response = requests.post(setting["webhook_url"], data=body, headers=headers, timeout=5) response.raise_for_status() - except requests.RequestException as e: + except Exception as e: print(e) def get_setting(self, session: Session, path_id): @@ -39,7 +52,10 @@ class WebhookEventHandler(abc.ABC): if path is None: return None p = path.to_dict() - webhook_setting = session.query(WebhookSetting).filter(WebhookSetting.path_id == path_id).first() + path_setting = session.query(PathSetting).get(path.setting_id) + if path_setting is None: + return None + webhook_setting = session.query(WebhookSetting).get(path_setting.webhook_setting_id) if webhook_setting is None and p["parent_id"] != 1: return self.get_setting(session, p["parent_id"]) @@ -47,7 +63,7 @@ class WebhookEventHandler(abc.ABC): setting = webhook_setting.to_dict() if not setting["enabled"] or setting["on_events"] & self.event_type == 0: return None - webhook = session.query(Webhook).filter(Webhook.id == webhook_setting.webhook_id).first() + webhook = session.query(Webhook).get(webhook_setting.webhook_id) if webhook is None: return None setting["webhook_url"] = webhook.to_dict()["hook_url"] diff --git a/req2.txt b/req2.txt deleted file mode 100644 index 9034a53..0000000 --- a/req2.txt +++ /dev/null @@ -1,9 +0,0 @@ -cryptography==44.0.0 -Flask==3.1.0 -Flask_Cors==5.0.0 -Flask_Limiter==3.9.2 -PyJWT==2.10.1 -PyJWT==2.10.1 -python-dotenv==1.0.1 -Requests==2.32.3 -SQLAlchemy==2.0.36 \ No newline at end of file diff --git a/requirements-test.txt b/requirements-test.txt new file mode 100644 index 0000000..7d1ef5c --- /dev/null +++ b/requirements-test.txt @@ -0,0 +1,5 @@ +# Test dependencies +pytest==7.4.0 +pytest-flask==1.2.0 +pytest-cov==4.1.0 +pytest-mock==3.11.1 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index d53830c..257709b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,3 +34,5 @@ typing_extensions==4.12.2 urllib3==2.2.3 Werkzeug==3.1.3 wrapt==1.17.0 + +pytest~=8.3.5 \ No newline at end of file