2023-12-16 15:24:30 +00:00
|
|
|
import os
|
|
|
|
import re
|
|
|
|
|
|
|
|
from starlette.endpoints import HTTPEndpoint
|
|
|
|
from starlette.requests import Request
|
|
|
|
from starlette.responses import JSONResponse
|
2024-03-03 13:59:15 +00:00
|
|
|
from starlette.exceptions import HTTPException
|
2023-12-16 15:24:30 +00:00
|
|
|
|
|
|
|
from orm.author import Author
|
|
|
|
from services.db import local_session
|
|
|
|
|
|
|
|
|
|
|
|
class WebhookEndpoint(HTTPEndpoint):
|
|
|
|
async def post(self, request: Request) -> JSONResponse:
|
|
|
|
try:
|
|
|
|
data = await request.json()
|
2024-03-03 13:59:15 +00:00
|
|
|
if not data:
|
|
|
|
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'):
|
|
|
|
raise HTTPException(status_code=401, detail="Invalid Authorization header")
|
2024-03-04 18:08:01 +00:00
|
|
|
# logger.debug(data)
|
2024-03-03 13:59:15 +00:00
|
|
|
user = data.get('user')
|
|
|
|
if not isinstance(user, dict):
|
|
|
|
raise HTTPException(status_code=400, detail="User data is not a dictionary")
|
|
|
|
user_id: str = user.get('id')
|
|
|
|
name: str = user.get('given_name', user.get('slug'))
|
|
|
|
email: str = user.get('email', '')
|
|
|
|
pic: str = user.get('picture', '')
|
|
|
|
|
|
|
|
with local_session() as session:
|
2024-03-04 16:08:21 +00:00
|
|
|
author = session.query(Author).filter(Author.user == user_id).first()
|
2024-03-03 13:59:15 +00: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:
|
|
|
|
author = session.query(Author).filter(Author.slug == slug).first()
|
|
|
|
if not author:
|
|
|
|
break
|
|
|
|
slug = f"{slug}-{len(session.query(Author).filter(Author.email == email).all()) + 1}"
|
2024-03-04 17:24:17 +00:00
|
|
|
author = Author(user=user_id, slug=slug, name=name, pic=pic)
|
2024-03-03 13:59:15 +00:00
|
|
|
session.add(author)
|
|
|
|
session.commit()
|
2023-12-16 15:24:30 +00:00
|
|
|
|
2024-02-21 16:14:58 +00:00
|
|
|
return JSONResponse({'status': 'success'})
|
2024-03-03 13:59:15 +00:00
|
|
|
except HTTPException as e:
|
|
|
|
return JSONResponse({'status': 'error', 'message': str(e.detail)}, status_code=e.status_code)
|
2023-12-16 15:24:30 +00:00
|
|
|
except Exception as e:
|
|
|
|
import traceback
|
|
|
|
|
|
|
|
traceback.print_exc()
|
2024-02-21 16:14:58 +00:00
|
|
|
return JSONResponse({'status': 'error', 'message': str(e)}, status_code=500)
|