taller-ionic/backend/controllers/bookingController.js
2025-04-24 12:44:46 -04:00

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
});
}
};