File size: 1,649 Bytes
9470e9f 6846b7d 9470e9f |
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 |
import mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
googleId: {
type: String,
required: true,
unique: true,
},
email: {
type: String,
required: true,
unique: true,
},
displayName: String,
firstName: String,
lastName: String,
username: {
type: String,
unique: true,
sparse: true, // 👈 THIS IS THE FIX
trim: true,
minlength: 3,
maxlength: 30,
},
role: { type: String, default: 'user' },
// Profile Details (Filled during Onboarding)
profile: {
isComplete: { type: Boolean, default: false },
college: { type: String, default: '' },
city: { type: String, default: '' },
gender: { type: String, enum: ['Male', 'Female', 'Non-binary', ''], default: '' },
relationshipStatus: { type: String, default: '' },
photos: [String], // Array of Cloudinary URLs
bio: { type: String, maxlength: 100 },
socials: {
instagram: { type: String, default: '' },
snapchat: { type: String, default: '' },
whatsapp: { type: String, default: '' } // Optional per Bible
}
},
// The Cragy Safety Engine
karma: {
type: Number,
default: 60, // Starts in "Normal" range (50-79)
min: 0,
max: 100
},
flags: {
nsfwCount: { type: Number, default: 0 },
reportsReceived: { type: Number, default: 0 },
isBanned: { type: Boolean, default: false }
},
// Social Layer
friends: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
friendRequests: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }]
}, { timestamps: true });
export default mongoose.model('User', userSchema); |