mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-12-16 20:46:10 +05:00
Fix '/api/v1/movies/popular' route
This commit is contained in:
@@ -996,18 +996,26 @@ func getOpenAPISpecWithURL(baseURL string) *OpenAPISpec {
|
||||
"/api/v1/movies/popular": map[string]interface{}{
|
||||
"get": map[string]interface{}{
|
||||
"summary": "Популярные фильмы",
|
||||
"description": "Получение списка популярных фильмов",
|
||||
"description": "Получение списка популярных фильмов из Kinopoisk коллекции TOP_POPULAR_ALL (для русского языка) или TMDB (для английского)",
|
||||
"tags": []string{"Movies"},
|
||||
"parameters": []map[string]interface{}{
|
||||
{
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"description": "Номер страницы",
|
||||
},
|
||||
{
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"description": "Язык: ru-RU (Kinopoisk) или en-US (TMDB)",
|
||||
},
|
||||
{
|
||||
"name": "region",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string"},
|
||||
"description": "Регион для TMDB (например, US, RU)",
|
||||
},
|
||||
},
|
||||
"responses": map[string]interface{}{
|
||||
@@ -1171,18 +1179,26 @@ func getOpenAPISpecWithURL(baseURL string) *OpenAPISpec {
|
||||
"/api/v1/movies/top-rated": map[string]interface{}{
|
||||
"get": map[string]interface{}{
|
||||
"summary": "Топ рейтинг фильмов",
|
||||
"description": "Получение списка фильмов с высоким рейтингом",
|
||||
"description": "Получение списка фильмов с высоким рейтингом из Kinopoisk коллекции TOP_250_MOVIES (для русского языка) или TMDB (для английского)",
|
||||
"tags": []string{"Movies"},
|
||||
"parameters": []map[string]interface{}{
|
||||
{
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"description": "Номер страницы",
|
||||
},
|
||||
{
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"description": "Язык: ru-RU (Kinopoisk TOP_250_MOVIES) или en-US (TMDB)",
|
||||
},
|
||||
{
|
||||
"name": "region",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string"},
|
||||
"description": "Регион для TMDB (например, US, RU)",
|
||||
},
|
||||
},
|
||||
"responses": map[string]interface{}{
|
||||
@@ -1345,18 +1361,20 @@ func getOpenAPISpecWithURL(baseURL string) *OpenAPISpec {
|
||||
"/api/v1/tv/popular": map[string]interface{}{
|
||||
"get": map[string]interface{}{
|
||||
"summary": "Популярные сериалы",
|
||||
"description": "Получение списка популярных сериалов",
|
||||
"description": "Получение списка популярных сериалов из Kinopoisk коллекции TOP_POPULAR_ALL (для русского языка) или TMDB (для английского)",
|
||||
"tags": []string{"TV Series"},
|
||||
"parameters": []map[string]interface{}{
|
||||
{
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"description": "Номер страницы",
|
||||
},
|
||||
{
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"description": "Язык: ru-RU (Kinopoisk) или en-US (TMDB)",
|
||||
},
|
||||
},
|
||||
"responses": map[string]interface{}{
|
||||
@@ -1369,18 +1387,20 @@ func getOpenAPISpecWithURL(baseURL string) *OpenAPISpec {
|
||||
"/api/v1/tv/top-rated": map[string]interface{}{
|
||||
"get": map[string]interface{}{
|
||||
"summary": "Топ рейтинг сериалов",
|
||||
"description": "Получение списка сериалов с высоким рейтингом",
|
||||
"description": "Получение списка сериалов с высоким рейтингом из Kinopoisk коллекции TOP_250_TV_SHOWS (для русского языка) или TMDB (для английского)",
|
||||
"tags": []string{"TV Series"},
|
||||
"parameters": []map[string]interface{}{
|
||||
{
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"name": "page",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "integer", "default": "1"},
|
||||
"description": "Номер страницы",
|
||||
},
|
||||
{
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"name": "language",
|
||||
"in": "query",
|
||||
"schema": map[string]string{"type": "string", "default": "ru-RU"},
|
||||
"description": "Язык: ru-RU (Kinopoisk TOP_250_TV_SHOWS) или en-US (TMDB)",
|
||||
},
|
||||
},
|
||||
"responses": map[string]interface{}{
|
||||
|
||||
@@ -1,45 +1,30 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// GetLanguage extracts the lang parameter from request and returns it with default "ru"
|
||||
// Supports both "lang" and "language" query parameters
|
||||
// Valid values: "ru", "en"
|
||||
// Default: "ru"
|
||||
func GetLanguage(r *http.Request) string {
|
||||
// Check "lang" parameter first (our new standard)
|
||||
lang := r.URL.Query().Get("lang")
|
||||
|
||||
// Fall back to "language" for backward compatibility
|
||||
if lang == "" {
|
||||
lang = r.URL.Query().Get("language")
|
||||
}
|
||||
|
||||
// Default to "ru" if not specified
|
||||
if lang == "" {
|
||||
return "ru-RU"
|
||||
}
|
||||
|
||||
// Sanitize - remove any quotes or suspicious characters
|
||||
lang = strings.TrimSpace(lang)
|
||||
lang = strings.Trim(lang, "'\"")
|
||||
|
||||
if lang != r.URL.Query().Get("language") && lang != r.URL.Query().Get("lang") {
|
||||
log.Printf("[GetLanguage] Sanitized language parameter from %s to %s", r.URL.Query().Get("language"), lang)
|
||||
}
|
||||
|
||||
// Convert short codes to TMDB format
|
||||
switch lang {
|
||||
case "en":
|
||||
return "en-US"
|
||||
case "ru":
|
||||
return "ru-RU"
|
||||
default:
|
||||
// Return as-is if already in correct format
|
||||
return lang
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package handlers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -101,17 +100,12 @@ func (h *MovieHandler) Popular(w http.ResponseWriter, r *http.Request) {
|
||||
page := getIntQuery(r, "page", 1)
|
||||
language := GetLanguage(r)
|
||||
region := r.URL.Query().Get("region")
|
||||
|
||||
log.Printf("[Handler] Popular request: page=%d, language=%s, region=%s", page, language, region)
|
||||
|
||||
movies, err := h.movieService.GetPopular(page, language, region)
|
||||
if err != nil {
|
||||
log.Printf("[Handler] Popular error: %v", err)
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[Handler] Popular response: %d results", len(movies.Results))
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(models.APIResponse{
|
||||
@@ -124,17 +118,12 @@ func (h *MovieHandler) TopRated(w http.ResponseWriter, r *http.Request) {
|
||||
page := getIntQuery(r, "page", 1)
|
||||
language := GetLanguage(r)
|
||||
region := r.URL.Query().Get("region")
|
||||
|
||||
log.Printf("[Handler] TopRated request: page=%d, language=%s, region=%s", page, language, region)
|
||||
|
||||
movies, err := h.movieService.GetTopRated(page, language, region)
|
||||
if err != nil {
|
||||
log.Printf("[Handler] TopRated error: %v", err)
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[Handler] TopRated response: %d results", len(movies.Results))
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(models.APIResponse{
|
||||
|
||||
Reference in New Issue
Block a user