forked from MyZubster-Ecosystem/myzubster
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlant.js
More file actions
123 lines (117 loc) 路 2.6 KB
/
Copy pathPlant.js
File metadata and controls
123 lines (117 loc) 路 2.6 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
const mongoose = require('mongoose');
const PlantSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
scientificName: {
type: String,
trim: true
},
species: {
type: String,
required: true,
trim: true
},
family: {
type: String,
trim: true
},
genus: {
type: String,
trim: true
},
type: {
type: String,
enum: ['tree', 'shrub', 'herb', 'vine', 'succulent', 'aquatic', 'other'],
default: 'other'
},
height: {
type: Number,
min: 0
},
bloomSeason: {
type: String,
enum: ['spring', 'summer', 'autumn', 'winter', 'year-round'],
default: 'year-round'
},
registeredBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
location: {
lat: { type: Number },
lng: { type: Number },
address: { type: String, trim: true },
city: { type: String, trim: true },
country: { type: String, trim: true }
},
verified: {
type: Boolean,
default: false
},
verifiedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
verifiedAt: {
type: Date
},
imageUrl: {
type: String
},
images: [{
url: String,
caption: String,
uploadedAt: { type: Date, default: Date.now }
}],
notes: {
type: String,
trim: true
},
conservationStatus: {
type: String,
enum: ['least-concern', 'vulnerable', 'endangered', 'critically-endangered', 'extinct-in-wild', 'unknown'],
default: 'unknown'
},
isEdible: {
type: Boolean,
default: false
},
isMedicinal: {
type: Boolean,
default: false
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
// Middleware pre-save per aggiornare updatedAt
PlantSchema.pre('save', function(next) {
this.updatedAt = new Date();
next();
});
// Virtual field: expose location as gps for frontend compatibility
PlantSchema.virtual('gps').get(function() {
if (this.location && typeof this.location.lat === 'number' && typeof this.location.lng === 'number') {
return { lat: this.location.lat, lng: this.location.lng };
}
return null;
});
// Ensure virtuals are included in JSON responses
PlantSchema.set('toJSON', { virtuals: true });
PlantSchema.set('toObject', { virtuals: true });
// Indici per ricerche rapide
PlantSchema.index({ name: 'text', scientificName: 'text', species: 'text' });
PlantSchema.index({ species: 1 });
PlantSchema.index({ family: 1 });
PlantSchema.index({ verified: 1 });
PlantSchema.index({ createdAt: -1 });
module.exports = mongoose.model('Plant', PlantSchema);