event controller

This commit is contained in:
Philipp Rothmann 2022-03-06 15:51:27 +01:00
parent 8fb2a4f7b7
commit b92ea36a94
4 changed files with 42 additions and 16 deletions

8
app/event_controller.py Normal file
View file

@ -0,0 +1,8 @@
class Event_Controller:
def __init__(self):
pass
def handle_model_created_event(self, model):
pass

View file

@ -2,55 +2,67 @@ import logging
import structlog import structlog
from unicodedata import name from unicodedata import name
from urllib.error import HTTPError from urllib.error import HTTPError
from fastapi import FastAPI, Request from fastapi import Depends, FastAPI, Request
from pydantic import BaseModel from pydantic import BaseModel
from app.authentik.api import Authentik from app.authentik.api import Authentik
from app.authentik.models import User from app.authentik.models import User
from app.event_controller import Event_Controller
from .wekan.api import Wekan from .wekan.api import Wekan
import json import json
logging = structlog.get_logger() logging = structlog.get_logger()
class Hook_Model(BaseModel):
class Authentik_Hook_Model(BaseModel):
pk: str pk: str
app: str app: str
name: str name: str
model_name: str model_name: str
class Http_request(BaseModel): class Http_request(BaseModel):
args: dict args: dict
path: str path: str
method: str method: str
app = FastAPI() app = FastAPI()
@app.get("/") @app.get("/")
async def root(): async def root():
return {'message': 'Hello World'} return {'message': 'Hello World'}
@app.post("/authentik/hook/") @app.post("/authentik/hook/")
async def hook(model: Hook_Model, http_request: Http_request): async def hook(model: Authentik_Hook_Model,
http_request: Http_request,
event_controller: Event_Controller = Depends(Event_Controller)):
# print(await request.body()) # print(await request.body())
logging.info(model) logging.info(model)
logging.info(http_request) logging.info(http_request)
if http_request.path == "/api/v3/core/users/":
event_controller.handle_model_created_event(model)
return 200 return 200
# model_created = json.loads(r['body'].split("model_created: ")[1])["model"] # model_created = json.loads(r['body'].split("model_created: ")[1])["model"]
# hook wekan.create_user(model_created["pk"]) # hook wekan.create_user(model_created["pk"])
@app.get("/authentik/create_hook/") @app.get("/authentik/create_hook/")
async def hook(request: Request): async def hook(request: Request):
a = Authentik(base="http://localhost:9000/", token="foobar123") a = Authentik(base="http://localhost:9000/", token="foobar123")
res = a.create_web_hook() res = a.create_web_hook()
logging.info(res) logging.info(res)
@app.get("/authentik/users/create_demo_user/") @app.get("/authentik/users/create_demo_user/")
async def create_demo_user(request: Request): async def create_demo_user(request: Request):
a = Authentik(base="http://localhost:9000/", token="foobar123") a = Authentik(base="http://localhost:9000/", token="foobar123")
try: try:
user = a.create_user(User(username="demo", name="dmeo", email="foo@example.org")) user = a.create_user(
except Exception as e: # TODO User(username="demo", name="dmeo", email="foo@example.org"))
except Exception as e: # TODO
return e return e
logging.info(user) logging.info(user)
return user.dict return user.dict

View file

@ -8,4 +8,3 @@ class Settings(BaseSettings):
class Config: class Config:
env_file = '.env' env_file = '.env'
nc

View file

@ -2,7 +2,7 @@ from fastapi.testclient import TestClient
from app.wekan.api import Wekan from app.wekan.api import Wekan
from .main import app from .main import Authentik_Hook_Model, app
client = TestClient(app) client = TestClient(app)
@ -24,16 +24,23 @@ def test_hook():
assert response.status_code == 422 assert response.status_code == 422
# mock = mocker.patch('app.wekan.api.Wekan.create_user',
# return_value='fake user')
# print(mock.mock_calls)
#
def test_hook_model_created(mocker): def test_hook_model_created(mocker):
mock = mocker.patch('app.wekan.api.Wekan.create_user', mock = mocker.patch("app.event_controller.Event_Controller.handle_model_created_event")
return_value='fake user')
print(mock.mock_calls)
d = """ d = """
{"model": {"pk": 5, "app": "authentik_core", "name": "asd", "model_name": "user"}, "http_request": {"args": {}, "path": "/api/v3/core/users/", "method": "POST"}} {"model": {"pk": 5, "app": "authentik_core", "name": "asd", "model_name": "user"}, "http_request": {"args": {}, "path": "/api/v3/core/users/", "method": "POST"}}
""" """
response = client.post("/authentik/hook/", data=d, ) response = client.post("/authentik/hook/", data=d, )
assert response.status_code == 200 assert response.status_code == 200
# assert len(mock.mock_calls) > 0 assert len(mock.mock_calls) > 0
# kall = mock.call_args kall = mock.call_args
# assert kall.args[0] == "18" assert type(kall.args[0]) == Authentik_Hook_Model
# assert str(response.text) == 'fake user' model: Authentik_Hook_Model = kall.args[0]
assert model.pk == "5"
assert model.app == "authentik_core"
assert model.name == "asd"
assert model.model_name == "user"