diff --git a/models/stories/chapter.ts b/models/stories/chapter.ts new file mode 100644 index 0000000..a970459 --- /dev/null +++ b/models/stories/chapter.ts @@ -0,0 +1,65 @@ +import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose"; +import { IBand } from "../band"; +export interface IChapter { + title: string; + summary: string; + id?: number; + // index: number; + words?: number; + notes: string; + genre: string[]; + bands: PopulatedDoc[]; + characters: string[]; + relationships: string[][]; + nsfw: boolean; + loggedInOnly: boolean; + hidden: boolean; + posted: Date; + reviews: number +} + +export const Chapter = new mongoose.Schema({ + title: { + type: String, + default: "" + }, + id: { + type: Number + }, + summary: { + type: String + }, + words: { + type: Number + }, + notes: { + type: String + }, + genre: [{ + type: String + }], + bands: [{ + type: Number, + ref: "Band" + }], + reviews: { + type: Number + }, + characters: [{ type: String }], + relationships: [{ type: String }], + nsfw: { + type: Boolean + }, + loggedInOnly: { + type: Boolean, + default: true + }, + hidden: { + type: Boolean, + default: false + }, + posted: { + type: Date, + default: new Date() + } +}) diff --git a/models/stories/draft.ts b/models/stories/draft.ts new file mode 100644 index 0000000..8634d8a --- /dev/null +++ b/models/stories/draft.ts @@ -0,0 +1,96 @@ +import { hasMigrated } from "../../lib/dbconfig"; +import { IBand } from "../../models/band"; +import { IFicmas } from "../../models/challenges/ficmas"; +import { IChallenge } from "../../models/challenges/gen"; +import { IUser } from "../../models/user"; +import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose"; +import SequenceFactory from "mongoose-sequence"; + +const AutoIncrement = SequenceFactory(mongoose); + +export interface IDraft { + _id?: number, + title: string; + chaptertitle: string; + updatedAt: Date; + author: PopulatedDoc; + notes: string; + genre: string[]; + bands: PopulatedDoc[]; + characters: string[]; + relationships: string[]; + summary: string; + nsfw: boolean; + hidden: boolean; + loggedInOnly: boolean; + oneshot: boolean; + challenge: PopulatedDoc; + ficmas: PopulatedDoc; +} + +const DraftSchema = new Schema({ + title: { + type: String + }, + _id: { + type: Number + }, + chaptertitle: { + type: String, + }, + updatedAt: { + type: Date, + default: new Date() + }, + author: { + type: Number, + ref: "User" + }, + notes: { + type: String + }, + genre: [{ + type: String + }], + bands: [{ + type: Number, + ref: "Band" + }], + characters: [{ + type: String + }], + relationships: [{ + type: String + }], + nsfw: { + type: Boolean + }, + summary: { + type: String + }, + hidden: { + type: Boolean, + default: false + }, + loggedInOnly: { + type: Boolean + }, + oneshot: { + type: Boolean, + default: false + }, + challenge: { + type: Number, + ref: "Challenge", + default: null + }, + ficmas: { + type: Number, + ref: "Ficmas", + default: null + } +}) + +hasMigrated && DraftSchema.plugin(AutoIncrement, {id: "drafts"}) + +export const Draft: Model = /* mongoose.models.Draft || */ mongoose.model("Draft", DraftSchema, "drafts") diff --git a/models/stories/index.ts b/models/stories/index.ts new file mode 100644 index 0000000..679c857 --- /dev/null +++ b/models/stories/index.ts @@ -0,0 +1,86 @@ +import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose"; +import SequenceFactory from "mongoose-sequence"; + +const AutoIncrement = SequenceFactory(mongoose); + +import { Chapter, IChapter } from "./chapter"; +import {IUser} from "../../models/user"; +import { Ficmas, IFicmas } from "../../models/challenges/ficmas"; +import { IChallenge, Challenge } from "../../models/challenges/gen"; +import { hasMigrated } from "../../lib/dbconfig"; + +export interface IStory extends Document { + _id?: number; + title: string; + author: PopulatedDoc; + chapters: IChapter[] + recs: number; + favs: number; + reviews: number; + views: number; + completed: boolean; + challenge: PopulatedDoc | null; + ficmas: PopulatedDoc | null; + downloads: number; + lastUpdate: Date; + posted: Date; +} + +const StorySchema = new mongoose.Schema({ + _id: { + type: Number + }, + title: { + type: String + }, + author: { + type: Number, + ref: "User" + }, + chapters: [Chapter], + recs: { + type: Number, + default: 0 + }, + favs: { + type: Number, + default: 0 + }, + reviews: { + type: Number, + default: 0 + }, + views: { + type: Number, + default: 0 + }, + completed: { + type: Boolean, + default: false + }, + challenge: { + type: Number, + ref: "Challenge", + default: null + }, + ficmas: { + type: Number, + ref: "Ficmas", + default: null + }, + downloads: { + type: Number, + default: 0 + }, + lastUpdate: { + type: Date, + default: new Date() + }, + posted: { + type: Date, + default: new Date() + } +}) +hasMigrated && Chapter.plugin(AutoIncrement, {id: "chapterid", inc_field: "id"}) +hasMigrated && StorySchema.plugin(AutoIncrement, {id: "storyid"}) +export const Story: Model = /* mongoose.models.Story || */ mongoose.model("Story", StorySchema, "stories") diff --git a/models/stories/review.ts b/models/stories/review.ts new file mode 100644 index 0000000..01496f8 --- /dev/null +++ b/models/stories/review.ts @@ -0,0 +1,69 @@ +import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose"; +import SequenceFactory from "mongoose-sequence"; +import { hasMigrated } from "~/lib/dbconfig"; +import { populate, populateSelected } from "~/lib/functions"; +import { IUser } from "~/models/user"; + +const AutoIncrement = SequenceFactory(mongoose); + +export interface IReview { + _id: number; + text: string; + leftOn: number; + whichChapter: number; + author: PopulatedDoc; + datePosted: Date; + replyingTo: PopulatedDoc | null; + replies: PopulatedDoc[] +} +const CommentSchema = new mongoose.Schema({ + _id: { + type: Number + }, + text: { + type: String + }, + leftOn: { + type: Number + }, + whichChapter: { + type: Number + }, + author: { + type: Number, + ref: "User" + }, + datePosted: { + type: Date, + default: new Date() + }, + replyingTo: { + default: null, + type: Number, + ref: "Review" + }, + replies: [{ + default: null, + type: Number, + ref: "Review" + }] +}) + +CommentSchema.virtual('story', { + ref: 'Story', + localField: 'leftOn', + foreignField: '_id', + justOne: true, +}); + +CommentSchema + .pre('findOne', populate('replies')) + .pre('find', populate('replies')) + .pre("findOne", populate("commentAuthor")) + .pre("find", populate("commentAuthor")) + .pre("findOne", populateSelected("replyingTo", "-replies")) + .pre("find", populateSelected("replyingTo", "-replies")); + +hasMigrated && CommentSchema.plugin(AutoIncrement, {id: "reviews"}) + +export const Review: Model = /* mongoose.models.Review || */ mongoose.model("Review", CommentSchema, "reviews")