From f5a754ddf779ec7725f2182d03dcd5b4608bd811 Mon Sep 17 00:00:00 2001 From: Erno Date: Sat, 18 Oct 2025 23:55:42 +0000 Subject: [PATCH] fix: Remove TMDB fallback and add ID conversion for strict id_type handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ПРОБЛЕМА: - При id_type='kp' код делал fallback на TMDB если фильм не найден - Если передан TMDB ID с id_type='kp', возвращались данные из TMDB - Нарушалась явная логика выбора источника РЕШЕНИЕ: 1. Убран автоматический fallback на TMDB при id_type='kp' 2. Добавлена конвертация ID: - Если id_type='kp' и фильм не найден напрямую - Пробуем конвертировать TMDB ID → KP ID через TmdbIdToKPId - Запрашиваем данные по сконвертированному KP ID 3. Если конвертация не удалась → возвращаем ошибку ЛОГИКА: - id_type='kp' + ID=550 (TMDB): 1. Поиск KP фильма с id=550 → не найдено 2. Конвертация 550 (TMDB) → получаем KP ID (например 326) 3. Поиск KP фильма с id=326 → успех 4. Возврат данных из Kinopoisk ✅ - id_type='kp' + несуществующий ID: 1. Поиск KP фильма → не найдено 2. Конвертация → не удалась 3. Возврат ошибки (НЕ fallback на TMDB) ✅ ИЗМЕНЕНИЯ: - pkg/services/movie.go: добавлена конвертация и удален fallback - pkg/services/tv.go: добавлена конвертация и удален fallback - Добавлен import fmt для форматирования ошибок РЕЗУЛЬТАТ: ✅ Строгое соблюдение id_type параметра ✅ Умная конвертация между TMDB и KP ID ✅ Нет неожиданного fallback на другой источник --- pkg/services/movie.go | 18 ++++++++++++++++++ pkg/services/tv.go | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/pkg/services/movie.go b/pkg/services/movie.go index dac625d..ced4c94 100644 --- a/pkg/services/movie.go +++ b/pkg/services/movie.go @@ -1,6 +1,7 @@ package services import ( + "fmt" "go.mongodb.org/mongo-driver/mongo" "neomovies-api/pkg/models" @@ -41,11 +42,28 @@ func (s *MovieService) GetByID(id int, language string, idType string) (*models. } if useKP && s.kpService != nil { + // Сначала пробуем напрямую по KP ID kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) if err == nil { return MapKPFilmToTMDBMovie(kpFilm), nil } + + // Если не найдено и явно указан id_type=kp, возможно это TMDB ID + // Пробуем конвертировать TMDB -> KP + if idType == "kp" { + kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id) + if convErr == nil { + kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId) + if err == nil { + return MapKPFilmToTMDBMovie(kpFilm), nil + } + } + // Если конвертация не удалась, возвращаем ошибку вместо fallback + return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id) + } } + + // Для TMDB или если KP не указан return s.tmdb.GetMovie(id, language) } diff --git a/pkg/services/tv.go b/pkg/services/tv.go index 21e39b6..3ac3bbe 100644 --- a/pkg/services/tv.go +++ b/pkg/services/tv.go @@ -1,6 +1,7 @@ package services import ( + "fmt" "go.mongodb.org/mongo-driver/mongo" "neomovies-api/pkg/models" @@ -37,11 +38,28 @@ func (s *TVService) GetByID(id int, language string, idType string) (*models.TVS } if useKP && s.kpService != nil { + // Сначала пробуем напрямую по KP ID kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) if err == nil && kpFilm != nil { return MapKPFilmToTVShow(kpFilm), nil } + + // Если не найдено и явно указан id_type=kp, возможно это TMDB ID + // Пробуем конвертировать TMDB -> KP + if idType == "kp" { + kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id) + if convErr == nil { + kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId) + if err == nil && kpFilm != nil { + return MapKPFilmToTVShow(kpFilm), nil + } + } + // Если конвертация не удалась, возвращаем ошибку вместо fallback + return nil, fmt.Errorf("TV show not found in Kinopoisk with id %d", id) + } } + + // Для TMDB или если KP не указан return s.tmdb.GetTVShow(id, language) }