refactor(db/models): add more models
(band, private message and user)
This commit is contained in:
parent
1b14d2b702
commit
7299471a52
32
models/band.ts
Normal file
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
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
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")
|
Loading…
Reference in New Issue
Block a user