From bc73160e1a5eacc08c23f35012faf45bd232a3bf Mon Sep 17 00:00:00 2001 From: Play Life Bot Date: Fri, 2 Jan 2026 15:37:40 +0300 Subject: [PATCH] fix: remove duplicate code in todoistWebhookHandler --- play-life-backend/main.go | 76 --------------------------------------- 1 file changed, 76 deletions(-) diff --git a/play-life-backend/main.go b/play-life-backend/main.go index 6ae68bc..2ab1373 100644 --- a/play-life-backend/main.go +++ b/play-life-backend/main.go @@ -5347,82 +5347,6 @@ func (a *App) todoistWebhookHandler(w http.ResponseWriter, r *http.Request) { log.Printf("Todoist webhook: todoist_user_id=%d -> user_id=%d", todoistUserID, userID) - // Читаем тело запроса для логирования - bodyBytes, err := io.ReadAll(r.Body) - if err != nil { - log.Printf("Error reading request body: %v", err) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string]interface{}{ - "ok": false, - "error": "Error reading request body", - "message": "Failed to read request", - }) - return - } - - // Логируем сырое тело запроса - log.Printf("Request body (raw): %s", string(bodyBytes)) - log.Printf("Request body length: %d bytes", len(bodyBytes)) - - // Опциональная проверка секрета webhook (если задан в переменных окружения) - todoistWebhookSecret := getEnv("TODOIST_WEBHOOK_SECRET", "") - log.Printf("Webhook secret check: configured=%v", todoistWebhookSecret != "") - if todoistWebhookSecret != "" { - providedSecret := r.Header.Get("X-Todoist-Webhook-Secret") - log.Printf("Provided secret in header: %v (length: %d)", providedSecret != "", len(providedSecret)) - if providedSecret != todoistWebhookSecret { - log.Printf("Invalid Todoist webhook secret provided (expected length: %d, provided length: %d)", len(todoistWebhookSecret), len(providedSecret)) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string]interface{}{ - "ok": false, - "error": "Unauthorized", - "message": "Invalid webhook secret", - }) - return - } - log.Printf("Webhook secret validated successfully") - } - - // Парсим webhook от Todoist из уже прочитанных байтов - var webhook TodoistWebhook - if err := json.Unmarshal(bodyBytes, &webhook); err != nil { - log.Printf("Error decoding Todoist webhook: %v", err) - log.Printf("Failed to parse body as JSON: %s", string(bodyBytes)) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string]interface{}{ - "ok": false, - "error": "Invalid request body", - "message": "Failed to parse JSON", - }) - return - } - - // Логируем структуру webhook после парсинга - log.Printf("Parsed webhook structure:") - log.Printf(" EventName: %s", webhook.EventName) - log.Printf(" EventData keys: %v", getMapKeys(webhook.EventData)) - if eventDataJSON, err := json.MarshalIndent(webhook.EventData, " ", " "); err == nil { - log.Printf(" EventData content:\n%s", string(eventDataJSON)) - } else { - log.Printf(" EventData (marshal error): %v", err) - } - - // Проверяем, что это событие закрытия задачи - if webhook.EventName != "item:completed" { - log.Printf("Received Todoist event '%s', ignoring (only processing 'item:completed')", webhook.EventName) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string]interface{}{ - "ok": true, - "message": "Event ignored", - "event": webhook.EventName, - }) - return - } - // Извлекаем content (title) и description из event_data log.Printf("Extracting content and description from event_data...") var title, description string