const { fn, col } = require("sequelize"); const db = require("../../models"); const MovieResolvers = { Query: { async getMovie(_, { id }) { try { const movie = await db.movie.findByPk(id, { include: [ { model: db.director, as: "director" }, { model: db.review, as: "reviews" }, { model: db.actor, as: "actors", through: { attributes: [] } }, { model: db.genre, as: "genres", through: { attributes: [] } }, ], }); if (!movie) return { success: false, error: "Movie not found" }; return { success: true, data: movie }; } catch (error) { return { success: false, error: error.message }; } }, async getAllMovies() { try { const movies = await db.movie.findAll({ include: [ { model: db.director, as: "director" }, { model: db.review, as: "reviews" }, { model: db.actor, as: "actors", through: { attributes: [] } }, { model: db.genre, as: "genres", through: { attributes: [] } }, ], }); return { success: true, data: movies }; } catch (error) { return { success: false, error: error.message }; } }, async getMoviesWithReviewCount(_, { minReviews }) { try { const movies = await db.movie.findAll({ // attributes: { // include: [[fn("COUNT", col("reviews.id")), "reviewCount"]], // }, include: [ { model: db.review, as: "reviews" }, { model: db.director, as: "director" }, { model: db.actor, as: "actors", through: { attributes: [] } }, { model: db.genre, as: "genres", through: { attributes: [] } }, ], // having: literal(`COUNT(reviews.id) > ${minReviews}`), }); const filtered = movies.filter( (m) => (m.reviews ? m.reviews.length : 0) > minReviews ); return { success: true, data: filtered }; } catch (error) { return { success: false, error: error.message }; } }, }, Mutation: { async createMovie(_, args) { try { const movie = await db.movie.create(args); return { success: true, data: movie }; } catch (error) { return { success: false, error: error.message }; } }, async updateMovie(_, { id, ...args }) { try { const movie = await db.movie.findByPk(id); if (!movie) return { success: false, error: "Movie not found" }; await movie.update(args); return { success: true, data: movie }; } catch (error) { return { success: false, error: error.message }; } }, async deleteMovie(_, { id }) { try { const movie = await db.movie.findByPk(id); if (!movie) return { success: false, error: "Movie not found" }; await movie.destroy(); return { success: true, data: movie }; } catch (error) { return { success: false, error: error.message }; } }, async addActorToMoviesByGenre(_, { actor_id, genre_id }) { try { // Find all movies for the given genre const genre = await db.genre.findByPk(genre_id, { include: [{ model: db.movie, as: "movies" }], }); if (!genre) return { success: false, error: "Genre not found" }; const movies = genre.movies; for (const movie of movies) { await db.movie_actor.findOrCreate({ where: { movie_id: movie.id, actor_id }, defaults: { movie_id: movie.id, actor_id }, }); } // Return updated movies const updatedMovies = await db.movie.findAll({ where: { id: movies.map((m) => m.id) }, include: [ { model: db.director, as: "director" }, { model: db.review, as: "reviews" }, { model: db.actor, as: "actors", through: { attributes: [] } }, { model: db.genre, as: "genres", through: { attributes: [] } }, ], }); return { success: true, data: updatedMovies }; } catch (error) { return { success: false, error: error.message }; } }, }, }; module.exports = MovieResolvers;