Files
core/services/webhook.py

69 lines
3.1 KiB
Python
Raw Normal View History

2024-06-11 17:51:34 +03:00
import asyncio
2023-12-16 18:24:30 +03:00
import os
import re
2024-05-20 16:46:05 +03:00
from sqlalchemy import select
2023-12-16 18:24:30 +03:00
from starlette.endpoints import HTTPEndpoint
2024-04-08 10:38:58 +03:00
from starlette.exceptions import HTTPException
2023-12-16 18:24:30 +03:00
from starlette.requests import Request
from starlette.responses import JSONResponse
from orm.author import Author
2024-05-18 13:57:30 +03:00
from resolvers.stat import get_with_stat
2024-08-07 08:57:56 +03:00
from cache.cache import cache_author
2024-05-20 16:46:05 +03:00
from services.db import local_session
2023-12-16 18:24:30 +03:00
class WebhookEndpoint(HTTPEndpoint):
async def post(self, request: Request) -> JSONResponse:
try:
data = await request.json()
2024-03-03 16:59:15 +03:00
if not data:
2024-04-17 18:32:23 +03:00
raise HTTPException(status_code=400, detail="Request body is empty")
auth = request.headers.get("Authorization")
if not auth or auth != os.environ.get("WEBHOOK_SECRET"):
2024-05-30 07:12:00 +03:00
raise HTTPException(status_code=401, detail="Invalid Authorization header")
2024-03-04 21:08:01 +03:00
# logger.debug(data)
2024-04-17 18:32:23 +03:00
user = data.get("user")
2024-03-03 16:59:15 +03:00
if not isinstance(user, dict):
2024-05-30 07:12:00 +03:00
raise HTTPException(status_code=400, detail="User data is not a dictionary")
2024-04-17 19:20:35 +03:00
#
2024-03-06 13:43:30 +03:00
name: str = (
f"{user.get('given_name', user.get('slug'))} {user.get('middle_name', '')}"
2024-04-17 18:31:11 +03:00
+ f"{user.get('family_name', '')}".strip()
2024-04-17 18:32:23 +03:00
) or "Аноним"
2024-04-17 19:54:38 +03:00
user_id: str = user.get("id", "")
2024-04-17 18:32:23 +03:00
email: str = user.get("email", "")
pic: str = user.get("picture", "")
2024-04-17 19:54:38 +03:00
if user_id:
with local_session() as session:
2024-05-30 07:12:00 +03:00
author = session.query(Author).filter(Author.user == user_id).first()
2024-04-17 19:54:38 +03:00
if not author:
# If the author does not exist, create a new one
slug: str = email.split("@")[0].replace(".", "-").lower()
slug: str = re.sub("[^0-9a-z]+", "-", slug)
while True:
2024-05-30 07:12:00 +03:00
author = session.query(Author).filter(Author.slug == slug).first()
2024-04-17 19:54:38 +03:00
if not author:
break
slug = f"{slug}-{len(session.query(Author).filter(Author.email == email).all()) + 1}"
author = Author(user=user_id, slug=slug, name=name, pic=pic)
session.add(author)
session.commit()
2024-05-18 14:15:05 +03:00
author_query = select(Author).filter(Author.user == user_id)
2024-06-11 17:51:34 +03:00
result = get_with_stat(author_query)
2024-06-11 22:46:35 +03:00
if result:
2024-06-11 17:51:34 +03:00
author_with_stat = result[0]
author_dict = author_with_stat.dict()
# await cache_author(author_with_stat)
asyncio.create_task(cache_author(author_dict))
2023-12-16 18:24:30 +03:00
2024-04-17 18:32:23 +03:00
return JSONResponse({"status": "success"})
2024-03-03 16:59:15 +03:00
except HTTPException as e:
2024-05-30 07:12:00 +03:00
return JSONResponse({"status": "error", "message": str(e.detail)}, status_code=e.status_code)
2023-12-16 18:24:30 +03:00
except Exception as e:
import traceback
traceback.print_exc()
2024-04-17 18:32:23 +03:00
return JSONResponse({"status": "error", "message": str(e)}, status_code=500)