| |
| const mongoose = require('mongoose'); |
| const Play = require('../models/Play'); |
| const TheatreGroup = require('../models/TheatreGroup'); |
| const Venue = require('../models/Venue'); |
| const Critic = require('../models/Critic'); |
| const Actor = require('../models/Actor'); |
| const Workshop = require('../models/Workshop'); |
|
|
| |
| |
| |
| async function getKannadaPlays(req, res) { |
| try { |
| const plays = await Play.find({ language: { $regex: '^kannada$', $options: 'i' } }) |
| .populate('venues', 'name location') |
| .populate('theatreGroup', 'name') |
| .populate('actors', 'name') |
| .populate('ratings.critic', 'name'); |
| return res.status(200).json(plays); |
| } catch (err) { |
| console.error('getKannadaPlays:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getGroupWithMaxPlays(req, res) { |
| try { |
| const result = await TheatreGroup.aggregate([ |
| { $project: { name: 1, playCount: { $size: { $ifNull: ['$plays', []] } } } }, |
| { $sort: { playCount: -1 } }, |
| { $limit: 1 } |
| ]); |
| return res.status(200).json(result[0] || null); |
| } catch (err) { |
| console.error('getGroupWithMaxPlays:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getVenuesWithMoreThan3Plays(req, res) { |
| try { |
| const venues = await Venue.aggregate([ |
| { $addFields: { playCount: { $size: { $ifNull: ['$plays', []] } } } }, |
| { $match: { playCount: { $gt: 3 } } } |
| ]); |
| return res.status(200).json(venues); |
| } catch (err) { |
| console.error('getVenuesWithMoreThan3Plays:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getCriticsReviewedMoreThan5(req, res) { |
| try { |
| const critics = await Critic.aggregate([ |
| { $project: { name: 1, reviewCount: { $size: { $ifNull: ['$reviews', []] } } } }, |
| { $match: { reviewCount: { $gt: 5 } } } |
| ]); |
| return res.status(200).json(critics); |
| } catch (err) { |
| console.error('getCriticsReviewedMoreThan5:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| |
| async function getAvgRatingPerGenre(req, res) { |
| try { |
| const result = await Play.aggregate([ |
| |
| { $unwind: { path: '$ratings', preserveNullAndEmptyArrays: false } }, |
| { $group: { _id: '$genre', avgRating: { $avg: '$ratings.score' }, count: { $sum: 1 } } }, |
| { $project: { genre: '$_id', avgRating: { $round: ['$avgRating', 2] }, ratingCount: '$count', _id: 0 } }, |
| { $sort: { avgRating: -1 } } |
| ]); |
| return res.status(200).json(result); |
| } catch (err) { |
| console.error('getAvgRatingPerGenre:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getPlaysWithBothAwards(req, res) { |
| try { |
| const plays = await Play.find({ awards: { $all: ['Best Play', 'Best Script'] } }) |
| .populate('theatreGroup', 'name') |
| .populate('venues', 'name location') |
| .populate('actors', 'name'); |
| return res.status(200).json(plays); |
| } catch (err) { |
| console.error('getPlaysWithBothAwards:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getActorsInMultiplePlays(req, res) { |
| try { |
| |
| const actors = await Actor.find({ 'plays.1': { $exists: true } }).select('name plays'); |
| return res.status(200).json(actors); |
| } catch (err) { |
| console.error('getActorsInMultiplePlays:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getGenresWithMostPlays(req, res) { |
| try { |
| const result = await Play.aggregate([ |
| { $group: { _id: '$genre', playCount: { $sum: 1 } } }, |
| { $project: { genre: '$_id', playCount: 1, _id: 0 } }, |
| { $sort: { playCount: -1 } } |
| ]); |
| return res.status(200).json(result); |
| } catch (err) { |
| console.error('getGenresWithMostPlays:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getWorkshopsWithMoreThan50(req, res) { |
| try { |
| const workshops = await Workshop.find({ participantCount: { $gt: 50 } }); |
| return res.status(200).json(workshops); |
| } catch (err) { |
| console.error('getWorkshopsWithMoreThan50:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| |
| async function getCriticsAlwaysBelow5(req, res) { |
| try { |
| const critics = await Critic.find({ |
| reviews: { $exists: true, $ne: [] }, |
| |
| $nor: [{ reviews: { $elemMatch: { score: { $gte: 5 } } } }] |
| }).select('name reviews'); |
| return res.status(200).json(critics); |
| } catch (err) { |
| console.error('getCriticsAlwaysBelow5:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getPlaysInMultipleVenues(req, res) { |
| try { |
| const plays = await Play.find({ 'venues.1': { $exists: true } }) |
| .populate('venues', 'name location') |
| .populate('theatreGroup', 'name') |
| .populate('actors', 'name'); |
| return res.status(200).json(plays); |
| } catch (err) { |
| console.error('getPlaysInMultipleVenues:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| |
| |
| |
| async function getGroupsWithNoAwards(req, res) { |
| try { |
| const groups = await TheatreGroup.find({ |
| $or: [{ awards: { $exists: false } }, { awards: { $eq: [] } }] |
| }).select('name plays awards'); |
| return res.status(200).json(groups); |
| } catch (err) { |
| console.error('getGroupsWithNoAwards:', err); |
| return res.status(500).json({ error: 'Server error', message: err.message }); |
| } |
| } |
|
|
| module.exports = { |
| getKannadaPlays, |
| getGroupWithMaxPlays, |
| getVenuesWithMoreThan3Plays, |
| getCriticsReviewedMoreThan5, |
| getAvgRatingPerGenre, |
| getPlaysWithBothAwards, |
| getActorsInMultiplePlays, |
| getGenresWithMostPlays, |
| getWorkshopsWithMoreThan50, |
| getCriticsAlwaysBelow5, |
| getPlaysInMultipleVenues, |
| getGroupsWithNoAwards |
| }; |
|
|