mirror of
https://gitlab.com/foxixus/neomovies-api.git
synced 2025-10-28 01:48:51 +05:00
Bug fix
This commit is contained in:
265
api/index.go
265
api/index.go
@@ -1,168 +1,173 @@
|
|||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/gorilla/handlers"
|
"github.com/gorilla/handlers"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
|
||||||
"neomovies-api/pkg/config"
|
"neomovies-api/pkg/config"
|
||||||
"neomovies-api/pkg/database"
|
"neomovies-api/pkg/database"
|
||||||
handlersPkg "neomovies-api/pkg/handlers"
|
handlersPkg "neomovies-api/pkg/handlers"
|
||||||
"neomovies-api/pkg/middleware"
|
"neomovies-api/pkg/middleware"
|
||||||
"neomovies-api/pkg/services"
|
"neomovies-api/pkg/services"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
globalDB *mongo.Database
|
globalDB *mongo.Database
|
||||||
globalCfg *config.Config
|
globalCfg *config.Config
|
||||||
initOnce sync.Once
|
initOnce sync.Once
|
||||||
initError error
|
initError error
|
||||||
)
|
)
|
||||||
|
|
||||||
func initializeApp() {
|
func initializeApp() {
|
||||||
// Загружаем переменные окружения (в Vercel они уже установлены)
|
// Загружаем переменные окружения (в Vercel они уже установлены)
|
||||||
if err := godotenv.Load(); err != nil {
|
if err := godotenv.Load(); err != nil {
|
||||||
log.Println("Warning: .env file not found (normal for Vercel)")
|
log.Println("Warning: .env file not found (normal for Vercel)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Инициализируем конфигурацию
|
// Инициализируем конфигурацию
|
||||||
globalCfg = config.New()
|
globalCfg = config.New()
|
||||||
|
|
||||||
// Подключаемся к базе данных
|
// Подключаемся к базе данных
|
||||||
var err error
|
var err error
|
||||||
globalDB, err = database.Connect(globalCfg.MongoURI)
|
globalDB, err = database.Connect(globalCfg.MongoURI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to connect to database: %v", err)
|
log.Printf("Failed to connect to database: %v", err)
|
||||||
initError = err
|
initError = err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("Successfully connected to database")
|
log.Println("Successfully connected to database")
|
||||||
}
|
}
|
||||||
|
|
||||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||||
// Инициализируем приложение один раз
|
// Инициализируем приложение один раз
|
||||||
initOnce.Do(initializeApp)
|
initOnce.Do(initializeApp)
|
||||||
|
|
||||||
// Проверяем, была ли ошибка инициализации
|
// Проверяем, была ли ошибка инициализации
|
||||||
if initError != nil {
|
if initError != nil {
|
||||||
log.Printf("Initialization error: %v", initError)
|
log.Printf("Initialization error: %v", initError)
|
||||||
http.Error(w, "Application initialization failed: "+initError.Error(), http.StatusInternalServerError)
|
http.Error(w, "Application initialization failed: "+initError.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Инициализируем сервисы
|
// Инициализируем сервисы
|
||||||
tmdbService := services.NewTMDBService(globalCfg.TMDBAccessToken)
|
tmdbService := services.NewTMDBService(globalCfg.TMDBAccessToken)
|
||||||
emailService := services.NewEmailService(globalCfg)
|
emailService := services.NewEmailService(globalCfg)
|
||||||
authService := services.NewAuthService(globalDB, globalCfg.JWTSecret, emailService)
|
authService := services.NewAuthService(globalDB, globalCfg.JWTSecret, emailService, globalCfg.BaseURL)
|
||||||
movieService := services.NewMovieService(globalDB, tmdbService)
|
movieService := services.NewMovieService(globalDB, tmdbService)
|
||||||
tvService := services.NewTVService(globalDB, tmdbService)
|
tvService := services.NewTVService(globalDB, tmdbService)
|
||||||
torrentService := services.NewTorrentService()
|
torrentService := services.NewTorrentService()
|
||||||
reactionsService := services.NewReactionsService(globalDB)
|
reactionsService := services.NewReactionsService(globalDB)
|
||||||
|
|
||||||
// Создаем обработчики
|
// Создаем обработчики
|
||||||
authHandler := handlersPkg.NewAuthHandler(authService)
|
authHandler := handlersPkg.NewAuthHandler(authService)
|
||||||
movieHandler := handlersPkg.NewMovieHandler(movieService)
|
movieHandler := handlersPkg.NewMovieHandler(movieService)
|
||||||
tvHandler := handlersPkg.NewTVHandler(tvService)
|
tvHandler := handlersPkg.NewTVHandler(tvService)
|
||||||
docsHandler := handlersPkg.NewDocsHandler()
|
docsHandler := handlersPkg.NewDocsHandler()
|
||||||
searchHandler := handlersPkg.NewSearchHandler(tmdbService)
|
searchHandler := handlersPkg.NewSearchHandler(tmdbService)
|
||||||
categoriesHandler := handlersPkg.NewCategoriesHandler(tmdbService)
|
categoriesHandler := handlersPkg.NewCategoriesHandler(tmdbService)
|
||||||
playersHandler := handlersPkg.NewPlayersHandler(globalCfg)
|
playersHandler := handlersPkg.NewPlayersHandler(globalCfg)
|
||||||
torrentsHandler := handlersPkg.NewTorrentsHandler(torrentService, tmdbService)
|
torrentsHandler := handlersPkg.NewTorrentsHandler(torrentService, tmdbService)
|
||||||
reactionsHandler := handlersPkg.NewReactionsHandler(reactionsService)
|
reactionsHandler := handlersPkg.NewReactionsHandler(reactionsService)
|
||||||
imagesHandler := handlersPkg.NewImagesHandler()
|
imagesHandler := handlersPkg.NewImagesHandler()
|
||||||
|
|
||||||
// Настраиваем маршруты
|
// Настраиваем маршруты
|
||||||
router := mux.NewRouter()
|
router := mux.NewRouter()
|
||||||
|
|
||||||
// Документация API на корневом пути
|
// Документация API на корневом пути
|
||||||
router.HandleFunc("/", docsHandler.ServeDocs).Methods("GET")
|
router.HandleFunc("/", docsHandler.ServeDocs).Methods("GET")
|
||||||
router.HandleFunc("/openapi.json", docsHandler.GetOpenAPISpec).Methods("GET")
|
router.HandleFunc("/openapi.json", docsHandler.GetOpenAPISpec).Methods("GET")
|
||||||
|
|
||||||
// API маршруты
|
// API маршруты
|
||||||
api := router.PathPrefix("/api/v1").Subrouter()
|
api := router.PathPrefix("/api/v1").Subrouter()
|
||||||
|
|
||||||
// Публичные маршруты
|
// Публичные маршруты
|
||||||
api.HandleFunc("/health", handlersPkg.HealthCheck).Methods("GET")
|
api.HandleFunc("/health", handlersPkg.HealthCheck).Methods("GET")
|
||||||
api.HandleFunc("/auth/register", authHandler.Register).Methods("POST")
|
api.HandleFunc("/auth/register", authHandler.Register).Methods("POST")
|
||||||
api.HandleFunc("/auth/login", authHandler.Login).Methods("POST")
|
api.HandleFunc("/auth/login", authHandler.Login).Methods("POST")
|
||||||
api.HandleFunc("/auth/verify", authHandler.VerifyEmail).Methods("POST")
|
api.HandleFunc("/auth/verify", authHandler.VerifyEmail).Methods("POST")
|
||||||
api.HandleFunc("/auth/resend-code", authHandler.ResendVerificationCode).Methods("POST")
|
api.HandleFunc("/auth/resend-code", authHandler.ResendVerificationCode).Methods("POST")
|
||||||
|
|
||||||
// Поиск
|
// Поиск
|
||||||
router.HandleFunc("/search/multi", searchHandler.MultiSearch).Methods("GET")
|
router.HandleFunc("/search/multi", searchHandler.MultiSearch).Methods("GET")
|
||||||
|
|
||||||
// Категории
|
// Категории
|
||||||
api.HandleFunc("/categories", categoriesHandler.GetCategories).Methods("GET")
|
api.HandleFunc("/categories", categoriesHandler.GetCategories).Methods("GET")
|
||||||
api.HandleFunc("/categories/{id}/movies", categoriesHandler.GetMoviesByCategory).Methods("GET")
|
api.HandleFunc("/categories/{id}/movies", categoriesHandler.GetMoviesByCategory).Methods("GET")
|
||||||
|
|
||||||
// Плееры
|
// Плееры
|
||||||
api.HandleFunc("/players/alloha/{imdb_id}", playersHandler.GetAllohaPlayer).Methods("GET")
|
api.HandleFunc("/players/alloha/{imdb_id}", playersHandler.GetAllohaPlayer).Methods("GET")
|
||||||
api.HandleFunc("/players/lumex/{imdb_id}", playersHandler.GetLumexPlayer).Methods("GET")
|
api.HandleFunc("/players/lumex/{imdb_id}", playersHandler.GetLumexPlayer).Methods("GET")
|
||||||
|
|
||||||
// Торренты
|
// Торренты
|
||||||
api.HandleFunc("/torrents/search/{imdbId}", torrentsHandler.SearchTorrents).Methods("GET")
|
api.HandleFunc("/torrents/search/{imdbId}", torrentsHandler.SearchTorrents).Methods("GET")
|
||||||
|
api.HandleFunc("/torrents/movies", torrentsHandler.SearchMovies).Methods("GET")
|
||||||
|
api.HandleFunc("/torrents/series", torrentsHandler.SearchSeries).Methods("GET")
|
||||||
|
api.HandleFunc("/torrents/anime", torrentsHandler.SearchAnime).Methods("GET")
|
||||||
|
api.HandleFunc("/torrents/seasons", torrentsHandler.GetAvailableSeasons).Methods("GET")
|
||||||
|
api.HandleFunc("/torrents/search", torrentsHandler.SearchByQuery).Methods("GET")
|
||||||
|
|
||||||
// Реакции (публичные)
|
// Реакции (публичные)
|
||||||
api.HandleFunc("/reactions/{mediaType}/{mediaId}/counts", reactionsHandler.GetReactionCounts).Methods("GET")
|
api.HandleFunc("/reactions/{mediaType}/{mediaId}/counts", reactionsHandler.GetReactionCounts).Methods("GET")
|
||||||
|
|
||||||
// Изображения (прокси для TMDB)
|
// Изображения (прокси для TMDB)
|
||||||
api.HandleFunc("/images/{size}/{path:.*}", imagesHandler.GetImage).Methods("GET")
|
api.HandleFunc("/images/{size}/{path:.*}", imagesHandler.GetImage).Methods("GET")
|
||||||
|
|
||||||
// Маршруты для фильмов
|
// Маршруты для фильмов
|
||||||
api.HandleFunc("/movies/search", movieHandler.Search).Methods("GET")
|
api.HandleFunc("/movies/search", movieHandler.Search).Methods("GET")
|
||||||
api.HandleFunc("/movies/popular", movieHandler.Popular).Methods("GET")
|
api.HandleFunc("/movies/popular", movieHandler.Popular).Methods("GET")
|
||||||
api.HandleFunc("/movies/top-rated", movieHandler.TopRated).Methods("GET")
|
api.HandleFunc("/movies/top-rated", movieHandler.TopRated).Methods("GET")
|
||||||
api.HandleFunc("/movies/upcoming", movieHandler.Upcoming).Methods("GET")
|
api.HandleFunc("/movies/upcoming", movieHandler.Upcoming).Methods("GET")
|
||||||
api.HandleFunc("/movies/now-playing", movieHandler.NowPlaying).Methods("GET")
|
api.HandleFunc("/movies/now-playing", movieHandler.NowPlaying).Methods("GET")
|
||||||
api.HandleFunc("/movies/{id}", movieHandler.GetByID).Methods("GET")
|
api.HandleFunc("/movies/{id}", movieHandler.GetByID).Methods("GET")
|
||||||
api.HandleFunc("/movies/{id}/recommendations", movieHandler.GetRecommendations).Methods("GET")
|
api.HandleFunc("/movies/{id}/recommendations", movieHandler.GetRecommendations).Methods("GET")
|
||||||
api.HandleFunc("/movies/{id}/similar", movieHandler.GetSimilar).Methods("GET")
|
api.HandleFunc("/movies/{id}/similar", movieHandler.GetSimilar).Methods("GET")
|
||||||
api.HandleFunc("/movies/{id}/external-ids", movieHandler.GetExternalIDs).Methods("GET")
|
api.HandleFunc("/movies/{id}/external-ids", movieHandler.GetExternalIDs).Methods("GET")
|
||||||
|
|
||||||
// Маршруты для сериалов
|
// Маршруты для сериалов
|
||||||
api.HandleFunc("/tv/search", tvHandler.Search).Methods("GET")
|
api.HandleFunc("/tv/search", tvHandler.Search).Methods("GET")
|
||||||
api.HandleFunc("/tv/popular", tvHandler.Popular).Methods("GET")
|
api.HandleFunc("/tv/popular", tvHandler.Popular).Methods("GET")
|
||||||
api.HandleFunc("/tv/top-rated", tvHandler.TopRated).Methods("GET")
|
api.HandleFunc("/tv/top-rated", tvHandler.TopRated).Methods("GET")
|
||||||
api.HandleFunc("/tv/on-the-air", tvHandler.OnTheAir).Methods("GET")
|
api.HandleFunc("/tv/on-the-air", tvHandler.OnTheAir).Methods("GET")
|
||||||
api.HandleFunc("/tv/airing-today", tvHandler.AiringToday).Methods("GET")
|
api.HandleFunc("/tv/airing-today", tvHandler.AiringToday).Methods("GET")
|
||||||
api.HandleFunc("/tv/{id}", tvHandler.GetByID).Methods("GET")
|
api.HandleFunc("/tv/{id}", tvHandler.GetByID).Methods("GET")
|
||||||
api.HandleFunc("/tv/{id}/recommendations", tvHandler.GetRecommendations).Methods("GET")
|
api.HandleFunc("/tv/{id}/recommendations", tvHandler.GetRecommendations).Methods("GET")
|
||||||
api.HandleFunc("/tv/{id}/similar", tvHandler.GetSimilar).Methods("GET")
|
api.HandleFunc("/tv/{id}/similar", tvHandler.GetSimilar).Methods("GET")
|
||||||
api.HandleFunc("/tv/{id}/external-ids", tvHandler.GetExternalIDs).Methods("GET")
|
api.HandleFunc("/tv/{id}/external-ids", tvHandler.GetExternalIDs).Methods("GET")
|
||||||
|
|
||||||
// Приватные маршруты (требуют авторизации)
|
// Приватные маршруты (требуют авторизации)
|
||||||
protected := api.PathPrefix("").Subrouter()
|
protected := api.PathPrefix("").Subrouter()
|
||||||
protected.Use(middleware.JWTAuth(globalCfg.JWTSecret))
|
protected.Use(middleware.JWTAuth(globalCfg.JWTSecret))
|
||||||
|
|
||||||
// Избранное
|
// Избранное
|
||||||
protected.HandleFunc("/favorites", movieHandler.GetFavorites).Methods("GET")
|
protected.HandleFunc("/favorites", movieHandler.GetFavorites).Methods("GET")
|
||||||
protected.HandleFunc("/favorites/{id}", movieHandler.AddToFavorites).Methods("POST")
|
protected.HandleFunc("/favorites/{id}", movieHandler.AddToFavorites).Methods("POST")
|
||||||
protected.HandleFunc("/favorites/{id}", movieHandler.RemoveFromFavorites).Methods("DELETE")
|
protected.HandleFunc("/favorites/{id}", movieHandler.RemoveFromFavorites).Methods("DELETE")
|
||||||
|
|
||||||
// Пользовательские данные
|
// Пользовательские данные
|
||||||
protected.HandleFunc("/auth/profile", authHandler.GetProfile).Methods("GET")
|
protected.HandleFunc("/auth/profile", authHandler.GetProfile).Methods("GET")
|
||||||
protected.HandleFunc("/auth/profile", authHandler.UpdateProfile).Methods("PUT")
|
protected.HandleFunc("/auth/profile", authHandler.UpdateProfile).Methods("PUT")
|
||||||
|
|
||||||
// Реакции (приватные)
|
// Реакции (приватные)
|
||||||
protected.HandleFunc("/reactions/{mediaType}/{mediaId}/my-reaction", reactionsHandler.GetMyReaction).Methods("GET")
|
protected.HandleFunc("/reactions/{mediaType}/{mediaId}/my-reaction", reactionsHandler.GetMyReaction).Methods("GET")
|
||||||
protected.HandleFunc("/reactions/{mediaType}/{mediaId}", reactionsHandler.SetReaction).Methods("POST")
|
protected.HandleFunc("/reactions/{mediaType}/{mediaId}", reactionsHandler.SetReaction).Methods("POST")
|
||||||
protected.HandleFunc("/reactions/{mediaType}/{mediaId}", reactionsHandler.RemoveReaction).Methods("DELETE")
|
protected.HandleFunc("/reactions/{mediaType}/{mediaId}", reactionsHandler.RemoveReaction).Methods("DELETE")
|
||||||
protected.HandleFunc("/reactions/my", reactionsHandler.GetMyReactions).Methods("GET")
|
protected.HandleFunc("/reactions/my", reactionsHandler.GetMyReactions).Methods("GET")
|
||||||
|
|
||||||
// CORS middleware
|
// CORS middleware
|
||||||
corsHandler := handlers.CORS(
|
corsHandler := handlers.CORS(
|
||||||
handlers.AllowedOrigins([]string{"*"}),
|
handlers.AllowedOrigins([]string{"*"}),
|
||||||
handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}),
|
handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}),
|
||||||
handlers.AllowedHeaders([]string{"Authorization", "Content-Type", "Accept", "Origin", "X-Requested-With"}),
|
handlers.AllowedHeaders([]string{"Authorization", "Content-Type", "Accept", "Origin", "X-Requested-With"}),
|
||||||
handlers.AllowCredentials(),
|
handlers.AllowCredentials(),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Обрабатываем запрос
|
// Обрабатываем запрос
|
||||||
corsHandler(router).ServeHTTP(w, r)
|
corsHandler(router).ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user