Files
neomovies-api/pkg/services/movie.go

123 lines
3.2 KiB
Go
Raw Normal View History

2025-08-07 13:47:42 +00:00
package services
import (
"context"
"strconv"
"go.mongodb.org/mongo-driver/bson"
2025-08-11 11:36:23 +03:00
"go.mongodb.org/mongo-driver/bson/primitive"
2025-08-07 13:47:42 +00:00
"go.mongodb.org/mongo-driver/mongo"
"neomovies-api/pkg/models"
)
type MovieService struct {
db *mongo.Database
tmdb *TMDBService
}
func NewMovieService(db *mongo.Database, tmdb *TMDBService) *MovieService {
return &MovieService{
db: db,
tmdb: tmdb,
}
}
func (s *MovieService) Search(query string, page int, language, region string, year int) (*models.TMDBResponse, error) {
return s.tmdb.SearchMovies(query, page, language, region, year)
}
func (s *MovieService) GetByID(id int, language string) (*models.Movie, error) {
return s.tmdb.GetMovie(id, language)
}
func (s *MovieService) GetPopular(page int, language, region string) (*models.TMDBResponse, error) {
return s.tmdb.GetPopularMovies(page, language, region)
}
func (s *MovieService) GetTopRated(page int, language, region string) (*models.TMDBResponse, error) {
return s.tmdb.GetTopRatedMovies(page, language, region)
}
func (s *MovieService) GetUpcoming(page int, language, region string) (*models.TMDBResponse, error) {
return s.tmdb.GetUpcomingMovies(page, language, region)
}
func (s *MovieService) GetNowPlaying(page int, language, region string) (*models.TMDBResponse, error) {
return s.tmdb.GetNowPlayingMovies(page, language, region)
}
func (s *MovieService) GetRecommendations(id, page int, language string) (*models.TMDBResponse, error) {
return s.tmdb.GetMovieRecommendations(id, page, language)
}
func (s *MovieService) GetSimilar(id, page int, language string) (*models.TMDBResponse, error) {
return s.tmdb.GetSimilarMovies(id, page, language)
}
func (s *MovieService) AddToFavorites(userID string, movieID string) error {
collection := s.db.Collection("users")
2025-08-11 11:36:23 +03:00
objID, err := primitive.ObjectIDFromHex(userID)
if err != nil {
return err
}
filter := bson.M{"_id": objID}
2025-08-07 13:47:42 +00:00
update := bson.M{
"$addToSet": bson.M{"favorites": movieID},
}
2025-08-11 11:36:23 +03:00
_, err = collection.UpdateOne(context.Background(), filter, update)
2025-08-07 13:47:42 +00:00
return err
}
func (s *MovieService) RemoveFromFavorites(userID string, movieID string) error {
collection := s.db.Collection("users")
2025-08-11 11:36:23 +03:00
objID, err := primitive.ObjectIDFromHex(userID)
if err != nil {
return err
}
filter := bson.M{"_id": objID}
2025-08-07 13:47:42 +00:00
update := bson.M{
"$pull": bson.M{"favorites": movieID},
}
2025-08-11 11:36:23 +03:00
_, err = collection.UpdateOne(context.Background(), filter, update)
2025-08-07 13:47:42 +00:00
return err
}
func (s *MovieService) GetFavorites(userID string, language string) ([]models.Movie, error) {
collection := s.db.Collection("users")
var user models.User
2025-08-11 11:36:23 +03:00
objID, err := primitive.ObjectIDFromHex(userID)
if err != nil {
return nil, err
}
err = collection.FindOne(context.Background(), bson.M{"_id": objID}).Decode(&user)
2025-08-07 13:47:42 +00:00
if err != nil {
return nil, err
}
var movies []models.Movie
for _, movieIDStr := range user.Favorites {
movieID, err := strconv.Atoi(movieIDStr)
if err != nil {
continue
}
movie, err := s.tmdb.GetMovie(movieID, language)
if err != nil {
continue
}
movies = append(movies, *movie)
}
return movies, nil
}
func (s *MovieService) GetExternalIDs(id int) (*models.ExternalIDs, error) {
return s.tmdb.GetMovieExternalIDs(id)
}