fix: Remove TMDB fallback and add ID conversion for strict id_type handling

ПРОБЛЕМА:
- При 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 на другой источник
This commit is contained in:
2025-10-18 23:55:42 +00:00
parent e2c6201e7e
commit dec78baffe
2 changed files with 36 additions and 0 deletions

View File

@@ -1,6 +1,7 @@
package services package services
import ( import (
"fmt"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
"neomovies-api/pkg/models" "neomovies-api/pkg/models"
@@ -41,11 +42,28 @@ func (s *MovieService) GetByID(id int, language string, idType string) (*models.
} }
if useKP && s.kpService != nil { if useKP && s.kpService != nil {
// Сначала пробуем напрямую по KP ID
kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) kpFilm, err := s.kpService.GetFilmByKinopoiskId(id)
if err == nil { if err == nil {
return MapKPFilmToTMDBMovie(kpFilm), 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) return s.tmdb.GetMovie(id, language)
} }

View File

@@ -1,6 +1,7 @@
package services package services
import ( import (
"fmt"
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
"neomovies-api/pkg/models" "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 { if useKP && s.kpService != nil {
// Сначала пробуем напрямую по KP ID
kpFilm, err := s.kpService.GetFilmByKinopoiskId(id) kpFilm, err := s.kpService.GetFilmByKinopoiskId(id)
if err == nil && kpFilm != nil { if err == nil && kpFilm != nil {
return MapKPFilmToTVShow(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) return s.tmdb.GetTVShow(id, language)
} }