파란색 → require

빨간색 → 사용하는지 안하는지 부정확 / 물어볼 것

주황색 → 수정해야하는 부분

노랑색 → 폠이 코멘트 단 부분

users(유저 정보)

import mongoose, { isValidObjectId } from "mongoose";
import { IUser } from "../interfaces/IUser";

const UserSchema = new mongoose.Schema({
  createDT: {
    // 유저 회원가입 일자
    type: Date,
    required: true,
    default: Date.now,
  },
  email: {
    // 유저 이메일
    type: String,
    unique: true,
    required: true,
  },
  password: {
    // 유저 비밀번호
    type: String,
    required: true,
  },
  nickname: {
    // 유저 닉네임
    type: String,
    required: true,
  },
  interest: {
    // 유저 관심분야
    type: [String],
    required: true,
  },
  marpolicy: {
    // 유저 이메일, 마케팅 수신 여부
    type: Boolean,
    required: false,
    default: false,
  },
  gender: {
    // 유저 성별
    type: Number,
    required: true,
  },
  challengeCNT: {
    // 신청할 때 받은 일주일 작성 개수 조건
    type: Number,
    required: false,
    default: 0,
  },
  conditionCNT: {
    // 챌린지 동안 일주일 작성 개수 조건
    type: Number,
    required: false,
    default: 0,
  },
  writingCNT: {
    // 챌린지 기간동안 유저가 작성한 회고 개수
    type: Number,
    require: true,
    default: 0,
  },
  badge: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Badge",
  },
  badgeCNT: {
    // 일반 배지
    type: Number,
    required: false,
    default: 0,
  },
  commentCNT: {
    // 내가 쓴 댓글 개수
    type: Number,
    required: true,
    default: 0,
  },
  likes: {
    // 좋아요한 게시글
    challengeLikes: {
      type: [mongoose.Schema.Types.ObjectId],
      ref: "Callenge",
    },
    concertLikes: {
      type: [mongoose.Schema.Types.ObjectId],
      ref: "Concert",
    },
  },
  scraps: {
    // 스크랩한 게시글
    challengeScraps: {
      type: [mongoose.Schema.Types.ObjectId],
      ref: "Callenge",
    },
    concertScraps: {
      type: [mongoose.Schema.Types.ObjectId],
      ref: "Concert",
    },
  },
  userType: {
    type: Number, // 0: normal, 1: admin
    required: true,
    default: 0,
  },
  img: {
    // 유저 프로필 이미지
    type: String,
    required: false,
    default:
      "<https://o2-server.s3.ap-northeast-2.amazonaws.com/origin/default_img_100%403x.jpg>",
  },
  isChallenge: {
    // 챌린지 참여 여부
    type: Boolean,
    required: true,
    default: false,
  },
  isRegist: {
    // 챌린지 신청 여부
    type: Boolean,
    required: true,
    default: false,
  },
  generation: {
    // 참여기수 참여시 갱신
    type: Number,
    required: true,
    default: 0,
  },
  emailCode: {
    // 이메일로 받은 인증번호
    type: String,
    required: false,
  },
});

export default mongoose.model<IUser & mongoose.Document>("User", UserSchema);

challenges(회고)

import mongoose from "mongoose";
import { IChallenge } from "../interfaces/IChallenge";
import validate from "mongoose-validator";

const textValidator = [
  validate({
    validator: "isLength",
    arguments: [1, 1000],
    message: "Text should be between 1 and 1000 characters",
  }),
];

const ChallengeSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now,
  },
  updatedAt: {
    type: Date,
    default: Date.now,
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    required: true,
  },
  good: {
    type: String,
    required: true,
    validate: textValidator,
  },
  learn: {
    type: String,
    required: true,
    validate: textValidator,
  },
  bad: {
    type: String,
    required: true,
    validate: textValidator,
  },
  likes: {
    type: Number,
    required: false,
    default: 0,
  },
  commentNum: {
    type: Number,
    required: false,
    default: 0,
  },
  scrapNum: {
    type: Number,
    required: false,
    default: 0,
  },
  generation: {
    type: Number,
    default: 0,
  },
  interest: {
    // 관심분야(해시태그)
    type: [String],
    required: true,
  },
  isDeleted: {
    // 삭제 여부
    type: Boolean,
    required: true,
    default: false,
  },
  comments: {
    type: [mongoose.Schema.Types.ObjectId],
    ref: "Comment",
    default: [],
  },
});

export default mongoose.model<IChallenge & mongoose.Document>(
  "Challenge",
  ChallengeSchema
);

concerts(콘서트)

import mongoose from "mongoose";
import { IConcert } from "../interfaces/IConcert";
const validate = require("mongoose-validator");

const textValidator = [
  validate({
    validator: "isLength",
    arguments: [1, 1000],
    message: "Text should be between 1 and 1000 characters",
  }),
];

const ConcertSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now,
  },
  updatedAt: {
    type: Date,
    default: Date.now,
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    required: true,
  },
  title: {
    type: String,
    required: true,
  },
  videoLink: {
    // 게시물 안에 들어갈 동영상 링크
    type: String,
    required: false,
    default:
      "<https://o2-server.s3.ap-northeast-2.amazonaws.com/origin/default_img_100%403x.jpg>",
  },
  imgThumbnail: {
    type: String,
    required: false,
    default:
      "<https://o2-server.s3.ap-northeast-2.amazonaws.com/origin/default_img_100%403x.jpg>",
  },
  text: {
    // 게시물 안에 들어갈 작성글
    type: String,
  },
  likes: {
    type: Number,
    required: true,
    default: 0,
  },
  commentNum: {
    type: Number,
    required: true,
    default: 0,
  },
  scrapNum: {
    type: Number,
    required: true,
    default: 0,
  },
  interest: {
    // 관심분야
    type: [String],
    required: true,
  },
  hashtag: {
    //해시태그
    type: [String],
  },
  isDeleted: {
    // 삭제 여부
    type: Boolean,
    required: true,
    default: false,
  },
  comments: {
    type: [mongoose.Schema.Types.ObjectId],
    ref: "Comment",
    default: [],
  },
  isNotice: {
    type: Boolean,
    required: true,
    default: false,
  },
  authorNickname: {
    type: String,
    required: false,
  },
});

export default mongoose.model<IConcert & mongoose.Document>(
  "Concert",
  ConcertSchema
);

comment(댓글)

import mongoose from "mongoose";
import { IComment } from "../interfaces/IComment";

const CommentSchema = new mongoose.Schema({
  postModel: {
    type: String,
    required: true,
    enum: ["Challenge", "Concert", "Notice"],
  },
  post: {
    type: mongoose.Schema.Types.ObjectId,
    refPath: "postModel",
    required: true,
  },
  userID: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    required: true,
  },
  parentComment: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Comment",
    default: null,
  },
  childrenComment: {
    type: [mongoose.Schema.Types.ObjectId],
    ref: "Comment",
    default: [],
  },
  text: {
    type: String,
    required: [true, "text is required!"],
  },
  isDeleted: {
    type: Boolean,
    default: false,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
  updatedAt: {
    type: Date,
    default: Date.now,
  },
});

export default mongoose.model<IComment & mongoose.Document>(
  "Comment",
  CommentSchema
);

게시판 - 댓글 기능 만들기 1 (쓰기, 보기)

admins(관리자)

import mongoose from "mongoose";
import { IAdmin } from "../interfaces/IAdmin";

const AdminSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
  },
  registerStartDT: {
    type: Date,
    required: true,
  },
  registerEndDT: {
    type: Date,
    required: true,
  },
  challengeStartDT: {
    type: Date,
    required: true,
  },
  challengeEndDT: {
    type: Date,
    required: true,
  },
  generation: {
    type: Number,
    required: true,
  },
  limitNum: {
    type: Number,
    required: true,
  },
  img: {
    type: String,
    required: false,
    default:
      "<https://o2-server.s3.ap-northeast-2.amazonaws.com/origin/default_img_100%403x.jpg>",
  },
  createdDT: {
    type: Date,
    required: true,
    default: Date.now,
  },
  applyNum: {
    type: Number,
    required: true,
    default: 0,
  },
});

export default mongoose.model<IAdmin & mongoose.Document>("Admin", AdminSchema);