refactor(db/models): add more models

(band, private message and user)
This commit is contained in:
parent 1b14d2b702
commit 7299471a52
Signed by: tablet
GPG Key ID: 924A5F6AF051E87C
3 changed files with 344 additions and 0 deletions

32
models/band.ts Normal file

@ -0,0 +1,32 @@
import mongoose, { connect, PopulatedDoc, Document, Model} from "mongoose";
const {Schema, model} = mongoose
import SequenceFactory from "mongoose-sequence";
import { hasMigrated } from "../lib/dbconfig";
const AutoIncrement = SequenceFactory(mongoose);
export interface IBand {
_id: number;
name: string;
locked: boolean;
characters: string[]
}
const BandSchema = new mongoose.Schema<IBand>({
_id: {
type: Number
},
name: {
type: String
},
locked: {
type: Boolean,
default: false
},
characters: [{
type: String
}]
})
hasMigrated && BandSchema.plugin(AutoIncrement, {id: "band"})
export const Band: Model<IBand> = /* mongoose.models.Band || */ model<IBand>("Band", BandSchema, "bands")

55
models/privMsg.ts Normal file

@ -0,0 +1,55 @@
import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose";
import SequenceFactory from "mongoose-sequence";
import { hasMigrated } from "../lib/dbconfig";
import { IUser } from "./user";
const AutoIncrement = SequenceFactory(mongoose);
export interface IPrivMsg {
_id: number;
from: PopulatedDoc<IUser & Document>;
to: PopulatedDoc<IUser & Document>;
subject: string;
content: string;
sentAt: Date;
read: boolean;
deletedBy: {
sender: boolean;
recipient: boolean;
}
}
const PMSchema = new mongoose.Schema<IPrivMsg>({
_id: { type: Number},
from: {
type: Number,
ref: "User"
},
to: {
type: Number,
ref: "User"
},
subject: { type: String },
content: { type: String },
sentAt: {
type: Date,
default: new Date()
},
read: {
type: Boolean,
default: false
},
deletedBy: {
sender: {
type: Boolean,
default: false
},
recipient: {
type: Boolean,
default: false
}
}
})
hasMigrated && PMSchema.plugin(AutoIncrement, {id: "private_message"})
export const PrivMsg: Model<IPrivMsg> = /* mongoose.models.PrivMsg || */ mongoose.model("PrivMsg", PMSchema, "private_messages")

257
models/user.ts Normal file

@ -0,0 +1,257 @@
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 { IBand } from "./band";
import {IStory} from "./stories/index"
import { QuickMenuItem, QuickMenuSchema } from "./quickMenu";
const AutoIncrement = SequenceFactory(mongoose);
interface IIPLogEntry {
lastAccess: Date;
ip: string;
}
export interface IUser extends Document {
_id?: number;
username: string;
email: string;
password: string;
auth: {
emailVerified: boolean;
activationKey: string | null;
passwordResetToken: string | null;
}
ts: {
created: Date;
updated: Date;
}
ipLog: IIPLogEntry[];
lastLogin: Date;
lastVisit: Date;
profile: {
avatar?: string;
isAdmin: boolean;
nightMode: boolean;
bio: string;
location: string;
occupation: string;
website: string;
blog: string;
views: number;
lastWhere: string | null;
hidden: boolean;
disclaimer: string;
showEmail: boolean;
}
biffno: {
years: string[];
wins: number;
}
favs: {
authors: PopulatedDoc<IUser & Document>[];
stories: PopulatedDoc<IStory & Document>[];
}
subscriptions: {
authors: PopulatedDoc<IUser & Document>[];
bands: PopulatedDoc<IBand & Document>[];
stories: PopulatedDoc<IStory & Document>[];
}
//@ts-ignore SHUT UP
hiddenAuthors: PopulatedDoc<IUser & Document>[];
hiddenBands: PopulatedDoc<IBand & Document>[];
//@ts-ignore SHUT UP
blocked: PopulatedDoc<IUser & Document>[];
sessionId: string | null;
banned: boolean;
quickMenuConfig: QuickMenuItem[]
validPassword(password: string): boolean;
generateToken(jwtSecret: string): string;
}
// type iut = IUser;
interface UModel extends Model<IUser> {
generateHash(pwd: string): string;
}
const UserSchema = new mongoose.Schema<IUser, UModel>({
_id: {
type: Number
},
username: {
type: String
},
email: {
type: String
},
password: {
type: String
},
auth: {
emailVerified: {
type: Boolean,
default: false
},
activationKey: {
type: String
},
passwordResetToken: {
type: String,
default: null
}
},
ts: {
created: {
type: Date,
default: new Date()
},
updated: {
type: Date,
default: new Date()
}
},
ipLog: [{
ip: {
type: String
},
lastAccess: {
type: Date,
default: new Date()
}
}],
lastLogin: {
type: Date,
default: null
},
lastVisit: {
type: Date,
default: null
},
profile: {
avatar: {
type: String,
default: ""
},
isAdmin: {
type: Boolean,
default: false
},
nightMode: {
type: Boolean,
default: false
},
bio: {
type: String,
default: ""
},
location: {
type: String,
default: ""
},
occupation: {
type: String,
default: ""
},
website: {
type: String,
default: ""
},
blog: {
type: String,
default: ""
},
views: {
type: Number,
min: 0,
default: 0
},
lastWhere: {
type: String,
default: null
},
hidden: {
type: Boolean,
default: false
},
disclaimer: {
type: String,
default: ""
},
showEmail: {
type: Boolean,
default: false
}
},
biffno: {
years: [{
type: String
}],
wins: {
type: Number,
default: 0
}
},
favs: {
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"
}]
},
hiddenBands: [{
type: Number,
ref: "Band"
}],
hiddenAuthors: [{
type: Number,
ref: "User"
}],
blocked: [{
type: Number,
ref: "User"
}],
sessionId: {
type: String,
default: null
},
banned: {
type: Boolean,
default: false
},
quickMenuConfig: [QuickMenuSchema]
})
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.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<IUser, UModel>("User", UserSchema, "users")