From 6598dfd3d602703120263b1aec7af50a3152a891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=98=99=E2=97=A6=20The=20Tablet=20=E2=9D=80=20GamerGirla?= =?UTF-8?q?ndCo=20=E2=97=A6=E2=9D=A7?= Date: Tue, 3 Oct 2023 01:02:05 -0400 Subject: [PATCH] refactor(db/models): add `notifyOnReviewReply` flag to user schema --- models/user.ts | 242 ++++++++++++++++++++++++++++--------------------- 1 file changed, 141 insertions(+), 101 deletions(-) diff --git a/models/user.ts b/models/user.ts index 479fcd8..d3e24b2 100644 --- a/models/user.ts +++ b/models/user.ts @@ -1,11 +1,17 @@ -import mongoose, { Schema, connect, PopulatedDoc, Document, Model } from "mongoose"; +import mongoose, { + Schema, + connect, + PopulatedDoc, + Document, + Model, +} from "mongoose"; import SequenceFactory from "mongoose-sequence"; import bcrypt from "bcryptjs"; import md5 from "blueimp-md5"; -import jwt from "jsonwebtoken" -import { hasMigrated } from "../lib/dbconfig"; +import jwt from "jsonwebtoken"; +import { hasMigrated } from "~/lib/dbconfig"; import { IBand } from "./band"; -import {IStory} from "./stories/index" +import { IStory } from "./stories/index"; import { QuickMenuItem, QuickMenuSchema } from "./quickMenu"; const AutoIncrement = SequenceFactory(mongoose); @@ -23,11 +29,11 @@ export interface IUser extends Document { emailVerified: boolean; activationKey: string | null; passwordResetToken: string | null; - } + }; ts: { created: Date; updated: Date; - } + }; ipLog: IIPLogEntry[]; lastLogin: Date; lastVisit: Date; @@ -45,20 +51,20 @@ export interface IUser extends Document { hidden: boolean; disclaimer: string; showEmail: boolean; - } + }; biffno: { years: string[]; wins: number; - } + }; favs: { authors: PopulatedDoc[]; stories: PopulatedDoc[]; - } + }; subscriptions: { authors: PopulatedDoc[]; bands: PopulatedDoc[]; stories: PopulatedDoc[]; - } + }; //@ts-ignore SHUT UP hiddenAuthors: PopulatedDoc[]; hiddenBands: PopulatedDoc[]; @@ -66,7 +72,8 @@ export interface IUser extends Document { blocked: PopulatedDoc[]; sessionId: string | null; banned: boolean; - quickMenuConfig: QuickMenuItem[] + quickMenuConfig: QuickMenuItem[]; + notifyOnReviewReply?: boolean; validPassword(password: string): boolean; generateToken(jwtSecret: string): string; } @@ -75,183 +82,216 @@ interface UModel extends Model { generateHash(pwd: string): string; } -const UserSchema = new mongoose.Schema({ +const UserSchema = new mongoose.Schema({ _id: { - type: Number + type: Number, }, username: { - type: String + type: String, }, email: { - type: String + type: String, }, password: { - type: String + type: String, }, auth: { emailVerified: { type: Boolean, - default: false + default: false, }, activationKey: { - type: String + type: String, }, passwordResetToken: { type: String, - default: null - } + default: null, + }, }, ts: { created: { type: Date, - default: new Date() + default: new Date(), }, updated: { type: Date, - default: new Date() - } - }, - ipLog: [{ - ip: { - type: String + default: new Date(), }, - lastAccess: { - type: Date, - default: new Date() - } - }], + }, + ipLog: [ + { + ip: { + type: String, + }, + lastAccess: { + type: Date, + default: new Date(), + }, + }, + ], lastLogin: { type: Date, - default: null + default: null, }, lastVisit: { type: Date, - default: null + default: null, }, profile: { avatar: { type: String, - default: "" + default: "", }, isAdmin: { type: Boolean, - default: false + default: false, }, nightMode: { type: Boolean, - default: false + default: false, }, bio: { type: String, - default: "" + default: "", }, location: { type: String, - default: "" + default: "", }, occupation: { type: String, - default: "" + default: "", }, website: { type: String, - default: "" + default: "", }, blog: { type: String, - default: "" + default: "", }, views: { type: Number, min: 0, - default: 0 + default: 0, }, lastWhere: { type: String, - default: null + default: null, }, hidden: { type: Boolean, - default: false + default: false, }, disclaimer: { type: String, - default: "" + default: "", }, showEmail: { type: Boolean, - default: false - } + default: false, + }, }, biffno: { - years: [{ - type: String - }], + years: [ + { + type: String, + }, + ], wins: { type: Number, - default: 0 - } + default: 0, + }, }, favs: { - authors: [{ - type: Number, - ref: "User" - }], - stories: [{ - type: Number, - ref: "Story" - }] + authors: [ + { + type: Number, + ref: "User", + }, + ], + stories: [ + { + type: Number, + ref: "Story", + }, + ], }, subscriptions: { - authors: [{ - type: Number, - ref: "User" - }], - stories: [{ - type: Number, - ref: "Story" - }], - bands: [{ - type: Number, - ref: "Band" - }] + authors: [ + { + type: Number, + ref: "User", + }, + ], + stories: [ + { + type: Number, + ref: "Story", + }, + ], + bands: [ + { + type: Number, + ref: "Band", + }, + ], }, - hiddenBands: [{ - type: Number, - ref: "Band" - }], - hiddenAuthors: [{ - type: Number, - ref: "User" - }], - blocked: [{ - type: Number, - ref: "User" - }], + hiddenBands: [ + { + type: Number, + ref: "Band", + }, + ], + hiddenAuthors: [ + { + type: Number, + ref: "User", + }, + ], + notifyOnReviewReply: { + type: Boolean, + default: true, + }, + blocked: [ + { + type: Number, + ref: "User", + }, + ], sessionId: { type: String, - default: null + default: null, }, banned: { type: Boolean, - default: false + default: false, }, - quickMenuConfig: [QuickMenuSchema] -}) + quickMenuConfig: [QuickMenuSchema], +}); -UserSchema.static("generateHash", function(password: string): string { +UserSchema.static("generateHash", function (password: string): string { return bcrypt.hashSync(password, bcrypt.genSaltSync(8)); }); -UserSchema.methods.validPassword = function(password: string): boolean { - return md5(password) === this.password || bcrypt.compareSync(password, this.password) || false; -} +UserSchema.methods.validPassword = function (password: string): boolean { + return ( + md5(password) === this.password || + bcrypt.compareSync(password, this.password) || + false + ); +}; -UserSchema.methods.generateToken = function(jwtKey: string): string { - let token = jwt.sign({id: this._id, isAdmin: this.profile.isAdmin}, jwtKey, { - expiresIn: '14 days' - }) - return token -} +UserSchema.methods.generateToken = function (jwtKey: string): string { + let token = jwt.sign( + { id: this._id, isAdmin: this.profile.isAdmin }, + jwtKey, + { + expiresIn: "14 days", + }, + ); + return token; +}; -hasMigrated && UserSchema.plugin(AutoIncrement, {id: "userid"}) -export const User = mongoose.model("User", UserSchema, "users") +hasMigrated && + UserSchema.plugin(AutoIncrement, { id: "userid", inc_field: "_id" }); +export const User = mongoose.model("User", UserSchema, "users");