✅ Schema 생성
Subscriber 스키마를 생성해 준다. 구독을 하기 위해선 구독을 받는 사람(userTo)과 구독을 하는 사람(userFrom)이 있기 때문에 만들어주었고, 구독을 언제 했는지 자동으로 생성 시간과 업데이트 시간을 생성해 준다.
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const subscriberSchema = mongoose.Schema(
{
userTo: {
type: Schema.Types.ObjectId,
ref: "User",
},
userFrom: {
type: Schema.Types.ObjectId,
ref: "User",
},
},
{ timestamps: true }
);
const Subscriber = mongoose.model("Subscriber", subscriberSchema);
module.exports = { Subscriber };
✅ 초기 세팅
express와 모델을 가져와준다.
const express = require("express");
const router = express.Router();
const { Subscriber } = require("../models/Subscriber");
✅ 구독자 수 가져오기
구독자 수를 가져오기 위해선, 구독자(userFrom)는 상관없이 구독받는(userTo) 사람 정보만 알면 된다. Subscriber 모델에서 구독받는 사람(userTo)을 찾고 구독자 수(subscribe.length)를 클라이언트로 보내준다.
// 구독자 수 가져오기
router.post("/subscribeNumber", (req, res) => {
Subscriber.find({ userTo: req.body.userTo }).exec((err, subscribe) => {
if (err) return res.status(400).send(err);
return res
.status(200)
.json({ success: true, subscribeNumber: subscribe.length });
});
});
✅ 구독 중인지 확인
구독 중인지 확인하려면 구독자(userFrom)와 구독받는 사람(userTo) 두 정보가 필요하다. 만약 구독 중이면 subscribe에 값이 들어가 있을 것이고 length는 0이 아닐 것이다. 이럴 경우엔 result를 true로 바꿔줘 subscribed 되어있다고 클라이언트에 보내준다.
// 구독 중인지 확인
router.post("/subscribed", (req, res) => {
Subscriber.find({
userTo: req.body.userTo,
userFrom: req.body.userFrom,
}).exec((err, subscribe) => {
// 구독 중이면 subscribe에 값이 들어감
if (err) return res.status(400).send(err);
let result = false;
if (subscribe.length !== 0) {
result = true;
}
res.status(200).json({ success: true, subscribed: result });
});
});
✅ 구독 취소
구독을 취소하기 위해선 아까와 같이 구독자(userFrom)와 구독받는 사람(userTo)의 정보가 필요한데, Subscriber 모델에서 findOneAndDelete 메서드를 통해 해당하는 연결을 찾아 삭제해 준다.
// 구독 취소
router.post("/unSubscribe", (req, res) => {
Subscriber.findOneAndDelete({
userTo: req.body.userTo,
userFrom: req.body.userFrom,
}).exec((err, doc) => {
if (err) return res.status(400).json({ success: false, err });
res.status(200).json({ success: true, doc });
});
});
✅ 구독
요청받은 body로 새로운 구독 정보를 생성하여 DB에 저장해 준다.
router.post("/subscribe", (req, res) => {
const subscribe = new Subscriber(req.body);
subscribe.save((err, doc) => {
if (err) return res.json({ success: false, err });
res.status(200).json({ success: true });
});
});
MongoDB를 보면 구독 성공한 것을 볼 수 있다!
✅ 전체 코드
// subscribe.js
const express = require("express");
const router = express.Router();
const { Subscriber } = require("../models/Subscriber");
const { auth } = require("../middleware/auth");
// 구독자 수 가져오기
router.post("/subscribeNumber", (req, res) => {
Subscriber.find({ userTo: req.body.userTo }).exec((err, subscribe) => {
if (err) return res.status(400).send(err);
return res
.status(200)
.json({ success: true, subscribeNumber: subscribe.length });
});
});
// 구독 중인지 확인
router.post("/subscribed", (req, res) => {
Subscriber.find({
userTo: req.body.userTo,
userFrom: req.body.userFrom,
}).exec((err, subscribe) => {
// 구독 중이면 subscribe에 값이 들어감
if (err) return res.status(400).send(err);
let result = false;
if (subscribe.length !== 0) {
result = true;
}
res.status(200).json({ success: true, subscribed: result });
});
});
// 구독 취소
router.post("/unSubscribe", (req, res) => {
Subscriber.findOneAndDelete({
userTo: req.body.userTo,
userFrom: req.body.userFrom,
}).exec((err, doc) => {
if (err) return res.status(400).json({ success: false, err });
res.status(200).json({ success: true, doc });
});
});
// 구독
router.post("/subscribe", (req, res) => {
const subscribe = new Subscriber(req.body);
subscribe.save((err, doc) => {
if (err) return res.json({ success: false, err });
res.status(200).json({ success: true });
});
});
module.exports = router;
'🍞 Back-End > Node.js' 카테고리의 다른 글
[Node.js] multer를 이용하여 React 파일 업로드 구현하기 (0) | 2022.12.28 |
---|---|
[Node.js] 로그인, 로그아웃, 회원가입 구현 with MongoDB (0) | 2022.12.24 |
[Node.js] methods와 statics 차이 (0) | 2022.12.18 |
[Node.js] 비밀 정보 보호하기 (github에 올리지 않기) (0) | 2022.12.18 |
[Node.js] 개발 서버 실행과 빌드 (2) | 2022.09.30 |