webhook-fix

This commit is contained in:
Untone 2024-12-16 19:44:24 +03:00
parent 2aefcd2708
commit 5944d9542e
2 changed files with 35 additions and 20 deletions

View File

@ -6,12 +6,13 @@
## Мультидоменная авторизация ## Мультидоменная авторизация
- Поддержка авторизации для разных доменов - Поддержка авторизации для разных доменов:
- Автоматическое определение сервера авторизации на основе домена запроса - *.dscrs.site (включая testing.dscrs.site)
- Поддержка доменов: - localhost[:port]
- *.dscrs.site - testingdiscoursio-git-*-discoursio.vercel.app
- localhost - *.discours.io
- Кастомные домены через AUTH_SERVER_URL - Автоматическое определение сервера авторизации
- Корректная обработка CORS для всех поддерживаемых доменов
## Webhooks ## Webhooks
@ -19,3 +20,5 @@
- Предотвращение создания дублирующихся вебхуков - Предотвращение создания дублирующихся вебхуков
- Автоматическая очистка устаревших вебхуков - Автоматическая очистка устаревших вебхуков
- Поддержка авторизации вебхуков через WEBHOOK_SECRET - Поддержка авторизации вебхуков через WEBHOOK_SECRET
- Обработка ошибок при операциях с вебхуками
- Динамическое определение endpoint'а на основе окружения

View File

@ -56,8 +56,8 @@ async def check_webhook_existence():
async def create_webhook_endpoint(): async def create_webhook_endpoint():
""" """
Создает вебхук для user.login события если он не существует Создает вебхук для user.login события.
Удаляет старый вебхук если он существует с модифицированным именем Если существует старый вебхук - удаляет его и создает новый.
""" """
logger.info("create_webhook_endpoint called") logger.info("create_webhook_endpoint called")
@ -67,40 +67,49 @@ async def create_webhook_endpoint():
} }
exists, webhook_id, current_endpoint = await check_webhook_existence() exists, webhook_id, current_endpoint = await check_webhook_existence()
endpoint = "https://core.dscrs.site/new-author"
# Определяем endpoint в зависимости от окружения
host = os.environ.get('HOST', 'core.dscrs.site')
endpoint = f"https://{host}/new-author"
if exists: if exists:
# Если вебхук существует, но с другим endpoint или с модифицированным именем # Если вебхук существует, но с другим endpoint или с модифицированным именем
if current_endpoint != endpoint or webhook_id: if current_endpoint != endpoint or webhook_id:
operation = "DeleteWebhook" operation = "DeleteWebhook"
query_name = "_delete_webhook" query_name = "_delete_webhook"
variables = {"params": {"id": webhook_id}} # Исправляем тип на WebhookRequest
variables = {"params": {"webhook_id": webhook_id}} # Изменено с id на webhook_id
gql = { gql = {
"query": f"mutation {operation}($params: DeleteWebhookRequest!)" "query": f"mutation {operation}($params: WebhookRequest!)"
+ "{" + "{"
+ f"{query_name}(params: $params) {{ message }} " + f"{query_name}(params: $params) {{ message }} "
+ "}", + "}",
"variables": variables, "variables": variables,
"operationName": operation, "operationName": operation,
} }
try:
await request_graphql_data(gql, headers=headers) await request_graphql_data(gql, headers=headers)
exists = False exists = False
except Exception as e:
logger.error(f"Failed to delete webhook: {e}")
# Продолжаем выполнение даже при ошибке удаления
exists = False
else: else:
logger.info(f"Webhook already exists and configured correctly: {webhook_id}") logger.info(f"Webhook already exists and configured correctly: {webhook_id}")
return return
if not exists: if not exists:
# Создаем новый вебхук с правильным именем события # Создаем новый вебхук
operation = "AddWebhook"
query_name = "_add_webhook"
variables = { variables = {
"params": { "params": {
"event_name": "user.login", # Используем базовое имя события "event_name": "user.login",
"endpoint": endpoint, "endpoint": endpoint,
"enabled": True, "enabled": True,
"headers": {"Authorization": WEBHOOK_SECRET}, "headers": {"Authorization": WEBHOOK_SECRET},
} }
} }
operation = "AddWebhook"
query_name = "_add_webhook"
gql = { gql = {
"query": f"mutation {operation}($params: AddWebhookRequest!)" "query": f"mutation {operation}($params: AddWebhookRequest!)"
+ "{" + "{"
@ -109,8 +118,11 @@ async def create_webhook_endpoint():
"variables": variables, "variables": variables,
"operationName": operation, "operationName": operation,
} }
try:
result = await request_graphql_data(gql, headers=headers) result = await request_graphql_data(gql, headers=headers)
logger.info(result) logger.info(result)
except Exception as e:
logger.error(f"Failed to create webhook: {e}")
class WebhookEndpoint(HTTPEndpoint): class WebhookEndpoint(HTTPEndpoint):