Vibed it... :(

This commit is contained in:
2025-08-09 14:34:48 +01:00
commit 5cf478feab
41 changed files with 23512 additions and 0 deletions

64
backend/models/Recipe.js Normal file
View File

@@ -0,0 +1,64 @@
const mongoose = require('mongoose');
const ingredientSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
amount: {
type: Number,
required: true
},
unit: {
type: String,
required: true
}
});
const recipeSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
description: {
type: String,
required: true
},
ingredients: [ingredientSchema],
instructions: [{
step: Number,
description: String
}],
servings: {
type: Number,
default: 4
},
prepTime: {
type: Number, // in minutes
required: true
},
cookTime: {
type: Number, // in minutes
required: true
},
category: {
type: String,
enum: ['breakfast', 'lunch', 'dinner', 'dessert', 'snack', 'appetizer'],
required: true
},
difficulty: {
type: String,
enum: ['easy', 'medium', 'hard'],
default: 'medium'
},
imageUrl: {
type: String,
default: ''
},
createdAt: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Recipe', recipeSchema);

49
backend/models/User.js Normal file
View File

@@ -0,0 +1,49 @@
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
trim: true,
minlength: 3,
maxlength: 30
},
email: {
type: String,
required: true,
unique: true,
trim: true,
lowercase: true
},
password: {
type: String,
required: true,
minlength: 6
},
createdAt: {
type: Date,
default: Date.now
}
});
// Hash password before saving
userSchema.pre('save', async function(next) {
if (!this.isModified('password')) return next();
try {
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
next();
} catch (error) {
next(error);
}
});
// Compare password method
userSchema.methods.comparePassword = async function(candidatePassword) {
return bcrypt.compare(candidatePassword, this.password);
};
module.exports = mongoose.model('User', userSchema);

View File

@@ -0,0 +1,55 @@
const mongoose = require('mongoose');
const userSelectionSchema = new mongoose.Schema({
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
selectedRecipes: [{
recipeId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Recipe',
required: true
},
quantity: {
type: Number,
default: 1,
min: 1
},
addedAt: {
type: Date,
default: Date.now
}
}],
aggregatedIngredients: [{
name: String,
totalAmount: Number,
unit: String,
recipes: [{
recipeId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Recipe'
},
recipeTitle: String,
amount: Number,
quantity: Number // recipe quantity multiplier
}]
}],
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
// Update the updatedAt field before saving
userSelectionSchema.pre('save', function(next) {
this.updatedAt = Date.now();
next();
});
module.exports = mongoose.model('UserSelection', userSelectionSchema);