파란색 → require
빨간색 → 사용하는지 안하는지 부정확 / 물어볼 것
주황색 → 수정해야하는 부분
노랑색 → 폠이 코멘트 단 부분
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);
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
);
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
);
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
);
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);