Fix '/api/v1/movies/popular' route

This commit is contained in:
2025-11-21 16:29:08 +02:00
parent d9e48495f7
commit 65e7ff90bd
11 changed files with 220 additions and 239 deletions

View File

@@ -2,7 +2,7 @@ package services
import (
"fmt"
"log"
"go.mongodb.org/mongo-driver/mongo"
"neomovies-api/pkg/models"
@@ -31,105 +31,60 @@ func (s *MovieService) Search(query string, page int, language, region string, y
}
func (s *MovieService) GetByID(id int, language string, idType string) (*models.Movie, error) {
// Строго уважаем явный id_type, без скрытого fallback на TMDB
switch idType {
case "kp":
if s.kpService == nil {
return nil, fmt.Errorf("kinopoisk service not configured")
}
// Строго уважаем явный id_type, без скрытого fallback на TMDB
switch idType {
case "kp":
if s.kpService == nil {
return nil, fmt.Errorf("kinopoisk service not configured")
}
// Сначала пробуем как Kinopoisk ID
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
// Возвращаем KP-модель в TMDB-формате без подмены на TMDB объект
return MapKPFilmToTMDBMovie(kpFilm), nil
}
// Сначала пробуем как Kinopoisk ID
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
// Возвращаем KP-модель в TMDB-формате без подмены на TMDB объект
return MapKPFilmToTMDBMovie(kpFilm), nil
}
// Возможно пришел TMDB ID — пробуем конвертировать TMDB -> KP
if kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id); convErr == nil {
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId); err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil
}
}
// Явно указан KP, но ничего не нашли — возвращаем ошибку
return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id)
// Возможно пришел TMDB ID — пробуем конвертировать TMDB -> KP
if kpId, convErr := TmdbIdToKPId(s.tmdb, s.kpService, id); convErr == nil {
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(kpId); err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil
}
}
// Явно указан KP, но ничего не нашли — возвращаем ошибку
return nil, fmt.Errorf("film not found in Kinopoisk with id %d", id)
case "tmdb":
return s.tmdb.GetMovie(id, language)
}
case "tmdb":
return s.tmdb.GetMovie(id, language)
}
// Если id_type не указан — старая логика по языку
if ShouldUseKinopoisk(language) && s.kpService != nil {
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil
}
}
return s.tmdb.GetMovie(id, language)
// Если id_type не указан — старая логика по языку
if ShouldUseKinopoisk(language) && s.kpService != nil {
if kpFilm, err := s.kpService.GetFilmByKinopoiskId(id); err == nil {
return MapKPFilmToTMDBMovie(kpFilm), nil
}
}
return s.tmdb.GetMovie(id, language)
}
func (s *MovieService) GetPopular(page int, language, region string) (*models.TMDBResponse, error) {
log.Printf("[GetPopular] language=%s, region=%s, page=%d", language, region, page)
if ShouldUseKinopoisk(language) && s.kpService != nil {
log.Printf("[GetPopular] Using Kinopoisk for language: %s", language)
// Try GetTopFilms first
kpTop, err := s.kpService.GetTopFilms("TOP_100_POPULAR_FILMS", page)
if err != nil {
log.Printf("[GetPopular] GetTopFilms error: %v, trying GetPopularFilms", err)
} else if kpTop != nil && len(kpTop.Films) > 0 {
log.Printf("[GetPopular] Got %d films from GetTopFilms", len(kpTop.Films))
return MapKPSearchToTMDBResponse(kpTop), nil
} else {
log.Printf("[GetPopular] GetTopFilms returned empty results, trying GetPopularFilms")
}
// Try GetPopularFilms as fallback
kpPopular, err := s.kpService.GetPopularFilms(page)
if err != nil {
log.Printf("[GetPopular] GetPopularFilms error: %v, falling back to TMDB", err)
} else if kpPopular != nil && len(kpPopular.Films) > 0 {
log.Printf("[GetPopular] Got %d films from GetPopularFilms", len(kpPopular.Films))
return MapKPSearchToTMDBResponse(kpPopular), nil
} else {
log.Printf("[GetPopular] GetPopularFilms returned empty results, falling back to TMDB")
kpResult, err := s.kpService.GetCollection("TOP_POPULAR_ALL", page)
if err == nil && kpResult != nil && len(kpResult.Films) > 0 {
return MapKPSearchToTMDBResponse(kpResult), nil
}
}
log.Printf("[GetPopular] Using TMDB for language: %s", language)
return s.tmdb.GetPopularMovies(page, language, region)
}
func (s *MovieService) GetTopRated(page int, language, region string) (*models.TMDBResponse, error) {
log.Printf("[GetTopRated] language=%s, region=%s, page=%d", language, region, page)
if ShouldUseKinopoisk(language) && s.kpService != nil {
log.Printf("[GetTopRated] Using Kinopoisk for language: %s", language)
// Try GetTopFilms first
kpTop, err := s.kpService.GetTopFilms("TOP_250_BEST_FILMS", page)
if err != nil {
log.Printf("[GetTopRated] GetTopFilms error: %v, trying GetPopularFilms", err)
} else if kpTop != nil && len(kpTop.Films) > 0 {
log.Printf("[GetTopRated] Got %d films from GetTopFilms", len(kpTop.Films))
return MapKPSearchToTMDBResponse(kpTop), nil
} else {
log.Printf("[GetTopRated] GetTopFilms returned empty results, trying GetPopularFilms")
}
// Try GetPopularFilms as fallback (sorted by rating)
kpPopular, err := s.kpService.GetPopularFilms(page)
if err != nil {
log.Printf("[GetTopRated] GetPopularFilms error: %v, falling back to TMDB", err)
} else if kpPopular != nil && len(kpPopular.Films) > 0 {
log.Printf("[GetTopRated] Got %d films from GetPopularFilms", len(kpPopular.Films))
return MapKPSearchToTMDBResponse(kpPopular), nil
} else {
log.Printf("[GetTopRated] GetPopularFilms returned empty results, falling back to TMDB")
kpResult, err := s.kpService.GetCollection("TOP_250_MOVIES", page)
if err == nil && kpResult != nil && len(kpResult.Films) > 0 {
return MapKPSearchToTMDBResponse(kpResult), nil
}
}
log.Printf("[GetTopRated] Using TMDB for language: %s", language)
return s.tmdb.GetTopRatedMovies(page, language, region)
}
@@ -155,29 +110,29 @@ func (s *MovieService) GetExternalIDs(id int) (*models.ExternalIDs, error) {
if err == nil && kpFilm != nil {
externalIDs := MapKPExternalIDsToTMDB(kpFilm)
externalIDs.ID = id
// Пытаемся получить TMDB ID через IMDB ID
if kpFilm.ImdbId != "" && s.tmdb != nil {
if tmdbID, tmdbErr := s.tmdb.FindTMDBIdByIMDB(kpFilm.ImdbId, "movie", "ru-RU"); tmdbErr == nil {
externalIDs.TMDBID = tmdbID
}
}
return externalIDs, nil
}
}
tmdbIDs, err := s.tmdb.GetMovieExternalIDs(id)
if err != nil {
return nil, err
}
if s.kpService != nil && tmdbIDs.IMDbID != "" {
kpFilm, err := s.kpService.GetFilmByImdbId(tmdbIDs.IMDbID)
if err == nil && kpFilm != nil {
tmdbIDs.KinopoiskID = kpFilm.KinopoiskId
}
}
return tmdbIDs, nil
}