diff --git a/models/band.ts b/models/band.ts new file mode 100644 index 0000000..e4d57ea --- /dev/null +++ b/models/band.ts @@ -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({ + _id: { + type: Number + }, + name: { + type: String + }, + locked: { + type: Boolean, + default: false + }, + characters: [{ + type: String + }] +}) + +hasMigrated && BandSchema.plugin(AutoIncrement, {id: "band"}) +export const Band: Model = /* mongoose.models.Band || */ model("Band", BandSchema, "bands") diff --git a/models/privMsg.ts b/models/privMsg.ts new file mode 100644 index 0000000..0f5cc88 --- /dev/null +++ b/models/privMsg.ts @@ -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; + to: PopulatedDoc; + subject: string; + content: string; + sentAt: Date; + read: boolean; + deletedBy: { + sender: boolean; + recipient: boolean; + } +} +const PMSchema = new mongoose.Schema({ + _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 = /* mongoose.models.PrivMsg || */ mongoose.model("PrivMsg", PMSchema, "private_messages") diff --git a/models/user.ts b/models/user.ts new file mode 100644 index 0000000..479fcd8 --- /dev/null +++ b/models/user.ts @@ -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[]; + stories: PopulatedDoc[]; + } + subscriptions: { + authors: PopulatedDoc[]; + bands: PopulatedDoc[]; + stories: PopulatedDoc[]; + } + //@ts-ignore SHUT UP + hiddenAuthors: PopulatedDoc[]; + hiddenBands: PopulatedDoc[]; + //@ts-ignore SHUT UP + blocked: PopulatedDoc[]; + sessionId: string | null; + banned: boolean; + quickMenuConfig: QuickMenuItem[] + validPassword(password: string): boolean; + generateToken(jwtSecret: string): string; +} +// type iut = IUser; +interface UModel extends Model { + generateHash(pwd: string): string; +} + +const UserSchema = new mongoose.Schema({ + _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("User", UserSchema, "users")