2026-03-03 12:36:05 +00:00

130 lines
3.1 KiB
JavaScript

const Trip = require("../models/trip-model");
const EnrolledTripsModel = require("../models/enrolled-trips-model");
const catchAsync = require("../utils/catch-async");
const AppError = require("../utils/app-error");
const APIFeatures = require("../utils/api-features");
const { addCoins } = require("../utils/coins");
const schedule = require("node-schedule");
const User = require("../models/user-model");
exports.createTrip = catchAsync(async (req, res, next) => {
console.log(req.body);
try {
req.body.createdBy = req.user._id;
const trip = await Trip.create(req.body);
addCoins(req.user, 50);
const endDate = new Date(trip.enddate);
const job = schedule.scheduleJob(endDate, function () {
EnrolledTripsModel.find({ tripId: trip._id })
.populate("UserId")
.then((enrolledUsers) => {
enrolledUsers.forEach(async (obj) => {
let user = obj.userId;
user = await User.findById(user._id);
console.log("Updating coins for user: " + user.email);
console.log("Previoud coins: " + user.coins);
addCoins(user, 10);
});
});
});
res.status(201).json({
status: "success",
data: trip,
});
} catch (error) {
console.log(error);
return next(new AppError(`Can't create trip`, 400));
}
});
exports.getTripsByName = catchAsync(async (req, res, next) => {
const { text } = req.query;
const regexTitle = new RegExp(text, "i");
console.log(regexTitle);
const features = new APIFeatures(Trip.find({ title: regexTitle }), req.query);
const trips = await features.query;
res.status(200).json({
status: "success",
results: trips.length,
data: trips,
});
});
exports.getTripById = catchAsync(async (req, res, next) => {
const { id } = req.params;
const trip = await Trip.findById(id);
if (!trip) {
return next(new AppError("No trip found with this Id.", 404));
}
res.status(200).json({
status: "success",
data: trip,
});
});
exports.getAllTrips = catchAsync(async (req, res, next) => {
// const features = new APIFeatures(Trip.find(), req.query)
// .filter()
// .sort()
// .fieldLimit()
// .pagination();
// const trips = await features.query;
const trips = await Trip.find().populate("createdBy");
res.status(200).json({
status: "success",
results: trips.length,
data: trips,
});
});
exports.updateTrip = catchAsync(async (req, res, next) => {
const { id } = req.params;
const updatedTrip = await Trip.findByIdAndUpdate(id, req.body, {
new: true,
runValidators: true,
});
if (!updatedTrip) {
return next(new AppError("No tour found with this Id.", 404));
}
res.status(200).json({
status: "success",
data: updatedTrip,
});
});
exports.deleteTrip = catchAsync(async (req, res, next) => {
const { id } = req.params;
const trip = await Trip.findByIdAndDelete(id);
if (!trip) {
return next(new AppError("No trip found with that Id", 404));
}
res.status(204).json({
status: "success",
});
});
exports.myTrips = catchAsync(async (req, res, next) => {
const trips = await Trip.find({ createdBy: req.user._id }).populate(
"createdBy"
);
res.status(200).json({
status: "success",
results: trips.length,
data: trips,
});
});