175 lines
4.0 KiB
JavaScript
175 lines
4.0 KiB
JavaScript
const { Booking, User, GymClass } = require('../models');
|
|
|
|
// @desc Get all bookings
|
|
// @route GET /api/bookings
|
|
// @access Public
|
|
exports.getBookings = async (req, res) => {
|
|
try {
|
|
const bookings = await Booking.findAll({
|
|
include: [
|
|
{
|
|
model: User,
|
|
attributes: ['id', 'name', 'email']
|
|
},
|
|
{
|
|
model: GymClass
|
|
}
|
|
]
|
|
});
|
|
|
|
res.status(200).json(bookings);
|
|
} catch (error) {
|
|
console.error('Error in getBookings:', error);
|
|
res.status(500).json({
|
|
message: 'Error retrieving bookings',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
// @desc Get bookings by user ID
|
|
// @route GET /api/bookings/user/:userId
|
|
// @access Public
|
|
exports.getBookingsByUser = async (req, res) => {
|
|
try {
|
|
const bookings = await Booking.findAll({
|
|
where: { userId: req.params.userId },
|
|
include: [
|
|
{
|
|
model: User,
|
|
attributes: ['id', 'name', 'email']
|
|
},
|
|
{
|
|
model: GymClass
|
|
}
|
|
]
|
|
});
|
|
|
|
res.status(200).json(bookings);
|
|
} catch (error) {
|
|
console.error('Error in getBookingsByUser:', error);
|
|
res.status(500).json({
|
|
message: 'Error retrieving user bookings',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
// @desc Create new booking
|
|
// @route POST /api/bookings
|
|
// @access Public
|
|
exports.createBooking = async (req, res) => {
|
|
try {
|
|
const { userId, gymClassId } = req.body;
|
|
|
|
// Check if user exists
|
|
const user = await User.findByPk(userId);
|
|
if (!user) {
|
|
return res.status(404).json({
|
|
message: 'User not found'
|
|
});
|
|
}
|
|
|
|
// Check if class exists
|
|
const gymClass = await GymClass.findByPk(gymClassId);
|
|
if (!gymClass) {
|
|
return res.status(404).json({
|
|
message: 'Class not found'
|
|
});
|
|
}
|
|
|
|
// Check if class has available capacity
|
|
if (gymClass.currentBookings >= gymClass.maxCapacity) {
|
|
return res.status(409).json({
|
|
message: 'No hay plazas disponibles'
|
|
});
|
|
}
|
|
|
|
// Create booking
|
|
const booking = await Booking.create({
|
|
userId,
|
|
gymClassId,
|
|
status: 'confirmed',
|
|
bookingDate: new Date()
|
|
});
|
|
|
|
// Update class capacity
|
|
gymClass.currentBookings += 1;
|
|
await gymClass.save();
|
|
|
|
// Return booking with associations
|
|
const fullBooking = await Booking.findByPk(booking.id, {
|
|
include: [
|
|
{
|
|
model: User,
|
|
attributes: ['id', 'name', 'email']
|
|
},
|
|
{
|
|
model: GymClass
|
|
}
|
|
]
|
|
});
|
|
|
|
res.status(201).json(fullBooking);
|
|
} catch (error) {
|
|
console.error('Error in createBooking:', error);
|
|
res.status(500).json({
|
|
message: 'Error creating booking',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
// @desc Cancel booking
|
|
// @route PUT /api/bookings/:id/cancel
|
|
// @access Public
|
|
exports.cancelBooking = async (req, res) => {
|
|
try {
|
|
const booking = await Booking.findByPk(req.params.id);
|
|
|
|
if (!booking) {
|
|
return res.status(404).json({
|
|
message: 'Booking not found'
|
|
});
|
|
}
|
|
|
|
// Check if booking is already canceled
|
|
if (booking.status !== 'confirmed') {
|
|
return res.status(400).json({
|
|
message: 'Booking is not in confirmed status'
|
|
});
|
|
}
|
|
|
|
// Update booking status
|
|
booking.status = 'cancelled';
|
|
await booking.save();
|
|
|
|
// Update class capacity
|
|
const gymClass = await GymClass.findByPk(booking.gymClassId);
|
|
if (gymClass) {
|
|
gymClass.currentBookings -= 1;
|
|
await gymClass.save();
|
|
}
|
|
|
|
// Return updated booking with associations
|
|
const updatedBooking = await Booking.findByPk(booking.id, {
|
|
include: [
|
|
{
|
|
model: User,
|
|
attributes: ['id', 'name', 'email']
|
|
},
|
|
{
|
|
model: GymClass
|
|
}
|
|
]
|
|
});
|
|
|
|
res.status(200).json(updatedBooking);
|
|
} catch (error) {
|
|
console.error('Error in cancelBooking:', error);
|
|
res.status(500).json({
|
|
message: 'Error cancelling booking',
|
|
error: error.message
|
|
});
|
|
}
|
|
}; |