diff --git a/server/schema/User.ts b/server/schema/User.ts new file mode 100644 index 0000000..55ac9bb --- /dev/null +++ b/server/schema/User.ts @@ -0,0 +1,65 @@ +import { Schema, model } from 'mongoose'; + +export type validOAuthType = 'KAKAO' | 'NONE'; +const validOAuthTypeList: validOAuthType[] = ['KAKAO', 'NONE']; + +interface IUser { + _id: number; + + oauthID?: bigint; + id: string; + email: string; + + oauthType: validOAuthType; + oauthInfo?: object; + tokenValidUntil?: Date; + + userSalt: string; + hashedPassword: string; + + allowThirdPartyUse: boolean; + + userName: string; + allowServerAction?: Map; + penalty?: Map; + + picture?: string; + useImgSvr?: boolean; + + regDate: Date; + deleteAfter?: Date; +} + +export const User = new Schema({ + _id: { type: Number, required: true }, + + oauthID: { type: BigInt, required: false }, + id: { type: String, required: true }, + email: { type: String, required: true }, + + oauthType: { type: String, required: true, enum: validOAuthTypeList }, + oauthInfo: { type: Object, required: false }, + tokenValidUntil: { type: Date, required: false }, + + userSalt: { type: String, required: true }, + hashedPassword: { type: String, required: true }, + + allowThirdPartyUse: { type: Boolean, required: true }, + + userName: { type: String, required: true }, + allowServerAction: { type: Map, required: false, of: Number }, + penalty: { type: Map, required: false, of: Date }, + + picture: { type: String, required: false }, + useImgSvr: { type: Boolean, required: false }, + + regDate: { type: Date, required: true }, + deleteAfter: { type: Date, required: false }, +}) + .index({ id: 1 }, { unique: true }) + .index({ email: 1 }, { unique: true }) + .index({ oauthID: 1 }, { unique: true, sparse: true }) + .index({ deleteAfter: 1 }) + ; + +export default model('User', User); \ No newline at end of file