Download backend/src/models/User.js from chainr-ai/CHAINR: direct link, hf CLI and curl.
- Browser
- Download file 1.35 kB
-
https://huggingface.co/chainr-ai/CHAINR/resolve/main/backend/src/models/User.js
- Command line
-
hf download hf://chainr-ai/CHAINR/backend/src/models/User.js
-
curl -L -o User.js https://huggingface.co/chainr-ai/CHAINR/resolve/main/backend/src/models/User.js
1.35 kB
| 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, | |
| lowercase: true, | |
| trim: true | |
| }, | |
| password: { | |
| type: String, | |
| required: true, | |
| minlength: 6 | |
| }, | |
| avatar: { | |
| type: String, | |
| default: null | |
| }, | |
| isActive: { | |
| type: Boolean, | |
| default: true | |
| }, | |
| lastSeen: { | |
| type: Date, | |
| default: Date.now | |
| } | |
| }, { | |
| timestamps: true | |
| }); | |
| // Hash password before saving | |
| userSchema.pre('save', async function(next) { | |
| if (!this.isModified('password')) return next(); | |
| try { | |
| const salt = await bcrypt.genSalt(12); | |
| 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); | |
| }; | |
| // Hide password in JSON output | |
| userSchema.methods.toJSON = function() { | |
| const user = this.toObject(); | |
| delete user.password; | |
| return user; | |
| }; | |
| module.exports = mongoose.model('User', userSchema); |