-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.js
More file actions
90 lines (78 loc) · 3.28 KB
/
Copy pathdatabase.js
File metadata and controls
90 lines (78 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
const mongoose = require('mongoose');
// MongoDB Connection URI
const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/ledgercore';
// Log the URI (masking password) to verify it's correctly loaded
const maskedUri = MONGODB_URI.replace(/:([^@]+)@/, ':****@');
console.log('Attempting to connect to MongoDB:', maskedUri);
mongoose.connect(MONGODB_URI, {
serverSelectionTimeoutMS: 5000, // Stay under 10s to see the real error
socketTimeoutMS: 45000,
})
.then(() => console.log('✅ Successfully connected to MongoDB'))
.catch(err => {
console.error('❌ MongoDB connection error:', err.message);
if (err.message.includes('password')) console.error('TIP: Check your database user password.');
if (err.message.includes('IP')) console.error('TIP: Ensure you added "Allow Access from Anywhere" in MongoDB Atlas.');
});
// Explicit event listeners for connection status
mongoose.connection.on('error', err => {
console.error('MongoDB connection event error:', err);
});
mongoose.connection.on('disconnected', () => {
console.warn('MongoDB disconnected. Reconnecting...');
});
// User Schema
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
role: { type: String, default: 'EMPLOYEE' },
phone: { type: String },
managerId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
created: { type: String },
uniqueId: { type: String },
profileImage: { type: String },
twoFactorEnabled: { type: Boolean, default: false }
});
// Expense Schema
const expenseSchema = new mongoose.Schema({
id: { type: String, required: true, unique: true }, // Keeping custom ID for frontend compatibility
employeeId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
name: { type: String, required: true },
amount: { type: Number, required: true },
category: { type: String, required: true },
date: { type: String, required: true },
status: { type: String, default: 'PENDING' }
});
// Budget Schema
const budgetSchema = new mongoose.Schema({
category: { type: String, required: true, unique: true },
limit: { type: Number, required: true }
});
// Notification Schema
const notificationSchema = new mongoose.Schema({
id: { type: String, required: true, unique: true },
recipientId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
message: { type: String, required: true },
date: { type: String, required: true },
read: { type: Boolean, default: false }
});
// Settings Schema
const settingsSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, // Can be null for global settings
sessionTimeout: { type: Number, default: 30 },
loginNotifications: { type: Boolean, default: true }
});
const User = mongoose.model('User', userSchema);
const Expense = mongoose.model('Expense', expenseSchema);
const Budget = mongoose.model('Budget', budgetSchema);
const Notification = mongoose.model('Notification', notificationSchema);
const Settings = mongoose.model('Settings', settingsSchema);
module.exports = {
User,
Expense,
Budget,
Notification,
Settings,
mongoose
};