Add webhook endpoints and update Docker configuration

This commit is contained in:
sHa
2024-03-12 22:03:09 +00:00
parent a45d83a71c
commit 30f8e8b81a
3 changed files with 75 additions and 12 deletions

57
app.py
View File

@@ -23,27 +23,49 @@ def store_last_request(last_request, filename=HISTORY_FILE):
with open(filename, "w") as f: with open(filename, "w") as f:
json.dump(data, f) json.dump(data, f)
@app.get("/", status_code=status.HTTP_200_OK)
@app.post("/", status_code=status.HTTP_200_OK) @app.post("/", status_code=status.HTTP_200_OK)
@app.put("/", status_code=status.HTTP_200_OK)
@app.delete("/", status_code=status.HTTP_200_OK)
@app.patch("/", status_code=status.HTTP_200_OK)
@app.options("/", status_code=status.HTTP_200_OK)
@app.head("/", status_code=status.HTTP_200_OK)
async def webhook_handler(request: Request, response: Response): async def webhook_handler(request: Request, response: Response):
try:
payload = await request.body() json = await request.json()
except:
json = {"invalid": "json"}
last_request = { last_request = {
"data": json,
"method": request.method, "method": request.method,
"data": payload.decode("utf-8"), "url": str(request.url),
"headers": dict(request.headers), "headers": dict(request.headers),
"url": request.url,
"time": datetime.now().isoformat(), "time": datetime.now().isoformat(),
} }
store_last_request(last_request) store_last_request(last_request)
response.status_code = status.HTTP_200_OK response.status_code = status.HTTP_200_OK
return {"status": "ok"} return {"status": "ok", "message": "Request catched."}
@app.get("/__last_request__", status_code=status.HTTP_200_OK) @app.get("/api/__help", status_code=status.HTTP_200_OK)
def help():
return {
"message": "This is a simple webhook service. It stores the last 10 requests and returns them on demand.",
"endpoints": {
"/": "Accepts a webhook request and stores it.",
"/docs": "Swagger UI for the API.",
"/redoc": "ReDoc UI for the API.",
"/api/__last_request": "GET: Returns the last request received.",
"/api/__history": "GET: Returns the last 10 requests received.",
"/api/__history/{id}": "GET: Returns the request with the given ID.",
"/api/__clear": "GET: Clears the request history.",
},
}
@app.get("/api/__last_request", status_code=status.HTTP_200_OK)
async def last_requests(): async def last_requests():
try: try:
with open(HISTORY_FILE, "r") as f: with open(HISTORY_FILE, "r") as f:
@@ -51,15 +73,30 @@ async def last_requests():
except (FileNotFoundError, json.JSONDecodeError): except (FileNotFoundError, json.JSONDecodeError):
data = [] data = []
return data[-1:] return data[-1]
@app.get("/__history__", status_code=status.HTTP_200_OK) @app.get("/api/__history/{id}", status_code=status.HTTP_200_OK)
async def history(): @app.get("/api/__history", status_code=status.HTTP_200_OK)
async def history(id: int = None):
try: try:
with open(HISTORY_FILE, "r") as f: with open(HISTORY_FILE, "r") as f:
data = json.load(f) data = json.load(f)
except (FileNotFoundError, json.JSONDecodeError): except (FileNotFoundError, json.JSONDecodeError):
data = [] data = []
if id is not None:
return data[-id]
return data return data
@app.get("/api/__clear", status_code=status.HTTP_200_OK)
async def clear_history():
with open(HISTORY_FILE, "w") as f:
json.dump([], f)
return {"status": "ok", "message": "History cleared."}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)

View File

@@ -10,6 +10,7 @@ services:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
volumes: volumes:
- ./app.py:/app/app.py
- ./storage:/app/storage - ./storage:/app/storage
networks: networks:
- "apps-proxy" - "apps-proxy"
@@ -20,5 +21,5 @@ services:
traefik.http.routers.catcher.rule: Host(`catcher.rs.shadoll.dev`) traefik.http.routers.catcher.rule: Host(`catcher.rs.shadoll.dev`)
traefik.http.routers.catcher.tls: true traefik.http.routers.catcher.tls: true
traefik.http.routers.catcher.tls.certresolver: letsencrypt traefik.http.routers.catcher.tls.certresolver: letsencrypt
traefik.http.services.catcher.loadbalancer.server.port: 5000 traefik.http.services.catcher.loadbalancer.server.port: 8000

View File

@@ -1 +1,26 @@
GET https://catcher.rs.shadoll.dev/__last_request__ GET https://catcher.rs.shadoll.dev/api/__help
###
GET https://catcher.rs.shadoll.dev/api/__last_request
###
GET https://catcher.rs.shadoll.dev/__history__
###
GET https://catcher.rs.shadoll.dev/__history__/1
###
GET https://catcher.rs.shadoll.dev/api/__clear
###
POST https://catcher.rs.shadoll.dev/
Content-Type: application/json
{
"message": "Hello, World!",
"level": "info",
"tags": [
"example",
"hello-world"
],
"extra": {
"key": "value",
}
}
###
GET https://catcher.rs.shadoll.dev?message=Hello%2C%20World%21&level=info&tags=example&tags=hello-world&extra[key]=value