So I'm working a reservation system, or trying to. I have a start_block and end_block, ints representing reservable times in the day.
My Schema is as follows:
var ReservationSchema = new Schema({
rid: {type: Number},
day: {type: Date},
start_block: {type: Number},
end_block: {type: Number},
kind: {type: String},
agent: {type: Schema.Types.ObjectId, ref: 'User'},
primary_client: {type: Schema.Types.ObjectId, ref: 'User'},
secondary_clients: [{type: Schema.Types.ObjectId, ref: 'User'}],
created_date: {type: Date, default: Date.now},
updated_date: {type: Date, default: Date.now}
});
My Validation is as follows:
ReservationSchema.pre("validate", function (next, done) {
var self = this;
console.log("being validated");
mongoose.models["Reservation"]
.findOne({
$or: [
{start_block: {$gte: self.start_block, $lte: self.end_block}, rid: self.rid},
{end_block: {$gte: self.start_block, $lte: self.end_block}, rid: self.rid}
]
}, function (err, user) {
if (err) {
console.log(err);
done(err);
} else if (user) {
console.log("blocked!!!!");
self.invalidate("start_block", "Times overlap");
done(new Error("Times Slots Cannot Overlap"));
} else {
console.log("passed");
done();
}
});
next();
});
My seeding of types is here:
Reservation.find({}).remove(function(){
User.find({}).limit(1)
.exec(function (err, result) {
if(err) throw err;
var person = result[0];
if(person != null){
for(var i = 0; i <= 25; i++){
var start = Math.floor(Math.random() * 31) + 1;
Reservation.create({
rid: Math.floor(Math.random() * 6) + 1,
day: new Date("1985-10-06"),
start_block: start,
end_block: start + Math.floor(Math.random() * 1) + 2,
agent: person._id,
primary_client: person._id,
kind: "Reservation"
});
}
}
}
);
});
A portion of my output logs when seeding, various crazy console logs... being validated
{ [CastError: Cast to number failed for value "undefined" at path "end_block"]
message: 'Cast to number failed for value "undefined" at path "end_block"',
name: 'CastError',
type: 'number',
value: undefined,
path: 'end_block' }
being validated
being validated
{ [CastError: Cast to number failed for value "undefined" at path "end_block"]
message: 'Cast to number failed for value "undefined" at path "end_block"',
name: 'CastError',
type: 'number',
value: undefined,
path: 'end_block' }
passed
passed
Finally, the result is that the bookings still overlap when place on a div based table... Been trying to get this for quite a few hours and failed google searches have brought me here in hopes of brighter minds. Thank you!
Edit: Cleared up extra blank creation which cleaned up logs. But still can not figure out why every condition passes without finding a overlapping slot. There must be a logic issue. I've written it out and don't see it...
Here is what he overlap looks like...
Reservation 19 is overlapping two other reservations
I've rewritten my rules 100 times, here are what they look like now..
.findOne({
$or: [
{start_block: {$gte: self.start_block, $lt: self.end_block}, rid: self.rid},
{start_block: {$gt: self.start_block, $lte: self.end_block}, rid: self.rid},
{end_block: {$lte: self.start_block, $gt: self.end_block}, rid: self.rid},
{end_block: {$lt: self.start_block, $gte: self.end_block}, rid: self.rid}
]
}, function (err, user) {
if (err) {
console.log('error)');
console.log(err);
done(err);
} else if (user) {
console.log("blocked!!!!");
self.invalidate("start_block", "Times overlap");
done(new Error("Times Slots Cannot Overlap"));
} else {
console.log("passed");
done();
}
Aucun commentaire:
Enregistrer un commentaire