티스토리 뷰

📌 2020 07 21

  • Seller 등록을 구현하여 Seller로 등록된 유저에게만 Admin Product와 add Product 항목이 보이도록 수정함
    • Amazon 웹에서 착안한 아이디어 !

Seller 등록 및 취소 flow

  1. login이 되었을 때만 가능하다.
  2. Seller가 되기 위해서는 Seller name을 입력하도록 한다. 입력한 Seller name은 해당 User 데이터베이스에 저장된다
  3. Seller인 회원에게는 Seller를 취소할 것인가에 대한 항목을 보여준다.
  4. 취소하기위해서는 비밀번호로 인증해야한다. Seller를 취소하면 그동안 post 했던 모든 Product가 사라진다.
  • isLoggedIn과 함께 isSeller도 req.locals에 저장해준다.
app.use((req,res,next)=>{
   res.locals.isAuthenticated = req.session.isLoggedIn;
   res.locals.isSeller=undefined; // 먼저 undefined 할당해준다.
   if(req.user){ // 로그인이 되었다면 
    res.locals.isSeller = req.user.Seller; } // 로그인한 유저의 Seller정보로 할당해준다.
   res.locals.csrfToken=req.csrfToken();
   next();
});

seller authentication 라우팅 : seller만 접근할 수 있는 add product, admin product로의 접근을 차단한다.

exports.sellerCheck =(req,res,next)=>{
    if(!req.session.isLoggedIn){
        return res.redirect('/login');
    }
    else if(!req.user.Seller){
        return res.redirect('/sell');
    }
    next();
}

seller 등록 post 라우팅 : 유저 데이터에 입력받은 sellerName을 저장해준다.

exports.postSell=(req,res,next)=>{
    const sellerName = req.body.sellerName;
    User.findById(req.user._id)
    .then(user=>{
        user.Seller=sellerName; // 유저 데이터에 저장 
        return user.save();
    })
    .then(result=>{
        res.redirect('/admin/add-product'); 
        sendMail(email,'you are a Seller now!', SellerMessage); // 이메일 전송 
    })
    .catch(err=>next(err));
}

seller 취소 post 라우팅 : 먼저 비밀번호를 확인하고 비밀번호가 맞을 경우 Seller를 다시 undefined로 수정한뒤, 해당 user가 등록한 모든 Product를 삭제해준다.

exports.postSellDelete=(req,res,next)=>{ // seller 취소 
    const password=req.body.password;
    User.findById(req.user._id)
    .then(user=>{
        return bcrypt.compare(password,user.password) // 비밀번호 확인 
        .then(doMatch=>{ 
            if(doMatch){ // 비밀번호 맞을 경우
                user.Seller=undefined;
                return user.save()
                .then(result=>{
                    return Product.deleteMany({userId:user._id}); // 해당 유저가 등록한 상품 모두 삭제 
                })
            }
        })
    })
    .then(result=>{
        res.redirect('/sell');
    })
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함