const { AuthSchema } = require('../models/model.auth')
const passport = require('passport')
const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const LocalStrategy = require('passport-local').Strategy
exports.passportSerialize = () => {
return passport.serializeUser(async (user, done) => {
if (user) {
const { _id } = user
const result = await AuthSchema.findById(_id).lean()
if (!result) return done(null, false)
return done(null, result._id)
}
return done(null, false)
})
}
exports.passportDeserialize = () => {
return passport.deserializeUser(async (id, done) => {
if (id) {
const user = await AuthSchema.findById(id).lean()
if (!user) return done(null, false)
return done(null, user)
}
return done(null, false)
})
}
exports.passportLocalStrategy = () => {
passport.use(
'local',
new LocalStrategy(async (username, password, done) => {
if (username && password) {
const user = await AuthSchema.find({ $or: [{ username }, { email: username }] }).lean()
const verify = AuthSchema.verifyPassword(password, user[0].password)
if (!verify) return done(null, false)
return done(null, user[0])
}
return done(null, false)
})
)
}
exports.passportJwtStrategy = () => {
passport.use(
'jwt',
new JwtStrategy(
{
secretOrKey: process.env.JWT_SECRET,
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
},
async ({ _id }, done) => {
try {
const user = await AuthSchema.findById(_id).lean()
if (!user) done(null, false)
done(null, user)
} catch (err) {
done(err, false)
}
}
)
)
}