CCCPaste
const jwt=require('jsonwebtoken');
const bcrypt=require('bcrypt');
const {TOKEN_SECRET, COOKIE_NAME}= require('../config')

const userService=require('../services/userService');

module.exports=()=> function(req, res, next){
if (parseToken(req,res)){

req.auth={
async register(username,password){
const token= await register(username, password);
res.cookie(COOKIE_NAME, token)
},
async login(username, password){
const token=await login(username, password);
res.cookie(COOKIE_NAME,token);
},
logout(){
res.clearCookie(COOKIE_NAME);
}
};


next();
}
};


async function register(username, password){
//adapt params and validate
const existing=await userService.getUserByUsername(username);
if (existing){
throw new Error ('Username is taken!');
}

const hashedPassword=await bcrypt.hash(password, 10);
const user=await userService.createUser(username, hashedPassword);

//logi user
return generateToken(user);
}

async function login(username,password){
const user=await userService.getUserByUsername(username);
console.log(user)
if (!user){
throw new Error ('No such user');
}

const hasMatch=await bcrypt.compare(password, user.hashedPassword);
console.log(password, user.hashedPassword)
if (!hasMatch){
throw new Error ('Incorrect password!')
}

return generateToken(user);

}

function generateToken(userData){
return jwt.sign({
_id:userData._id,
username:userData.username
}, TOKEN_SECRET);

}

function parseToken(req,res){
const token=req.cookies[COOKIE_NAME];
if (token){
try {
const userData=jwt.verify(token, TOKEN_SECRET);
req.user=userData;
} catch (err) {
res.clearCookie(COOKIE_NAME);
res.redirect('/auth/login');

return false;
}
}
return true;
}