2 Commits e5aa6549bf ... 08323c634d

Author SHA1 Message Date
  Owen Diffey 08323c634d feat: Add news published and newest query helpers 11 months ago
  Owen Diffey c088c1a358 feat: Set mongoose global configuration values 11 months ago
2 changed files with 87 additions and 30 deletions
  1. 9 0
      backend/src/modules/DataModule.ts
  2. 78 30
      backend/src/schemas/news.ts

+ 9 - 0
backend/src/modules/DataModule.ts

@@ -39,6 +39,15 @@ export default class DataModule extends BaseModule {
 
 		await mongoose.connect(mongoUrl);
 
+		mongoose.set({
+			runValidators: true,
+			sanitizeFilter: true,
+			strict: "throw",
+			strictQuery: "throw"
+		});
+
+		mongoose.SchemaTypes.String.set("trim", true);
+
 		await this.loadModels();
 
 		// @ts-ignore

+ 78 - 30
backend/src/schemas/news.ts

@@ -1,4 +1,11 @@
-import { Schema, SchemaTypes, Types } from "mongoose";
+import {
+	HydratedDocument,
+	Model,
+	QueryWithHelpers,
+	Schema,
+	SchemaTypes,
+	Types
+} from "mongoose";
 
 export enum NewsStatus {
 	DRAFT = "draft",
@@ -12,36 +19,77 @@ export interface NewsSchema {
 	status: NewsStatus;
 	showToNewUsers: boolean;
 	createdBy: Types.ObjectId;
-	createdAt: NativeDate;
 }
 
-export const schema = new Schema<NewsSchema>({
-	title: {
-		type: SchemaTypes.String,
-		required: true
-	},
-	markdown: {
-		type: SchemaTypes.String,
-		required: true
-	},
-	status: {
-		type: SchemaTypes.String,
-		enum: Object.values(NewsStatus),
-		default: NewsStatus.DRAFT,
-		required: true
-	},
-	showToNewUsers: {
-		type: SchemaTypes.Boolean,
-		default: false,
-		required: true
-	},
-	createdBy: {
-		type: SchemaTypes.ObjectId,
-		required: true
+export interface NewsQueryHelpers {
+	published(
+		this: QueryWithHelpers<
+			any,
+			HydratedDocument<NewsSchema>,
+			NewsQueryHelpers
+		>,
+		published?: boolean
+	): QueryWithHelpers<
+		HydratedDocument<NewsSchema>[],
+		HydratedDocument<NewsSchema>,
+		NewsQueryHelpers
+	>;
+	newest(
+		this: QueryWithHelpers<
+			any,
+			HydratedDocument<NewsSchema>,
+			NewsQueryHelpers
+		>,
+		showToNewUsers?: boolean
+	): QueryWithHelpers<
+		HydratedDocument<NewsSchema>[],
+		HydratedDocument<NewsSchema>,
+		NewsQueryHelpers
+	>;
+}
+
+export const schema = new Schema<
+	NewsSchema,
+	Model<NewsSchema, NewsQueryHelpers>,
+	{},
+	NewsQueryHelpers
+>(
+	{
+		title: {
+			type: SchemaTypes.String,
+			required: true
+		},
+		markdown: {
+			type: SchemaTypes.String,
+			required: true
+		},
+		status: {
+			type: SchemaTypes.String,
+			enum: Object.values(NewsStatus),
+			default: NewsStatus.DRAFT,
+			required: true
+		},
+		showToNewUsers: {
+			type: SchemaTypes.Boolean,
+			default: false,
+			required: true
+		},
+		createdBy: {
+			type: SchemaTypes.ObjectId,
+			required: true
+		}
 	},
-	createdAt: {
-		type: SchemaTypes.Date,
-		default: Date.now,
-		required: true
+	{
+		timestamps: true,
+		query: {
+			published() {
+				return this.where({ status: NewsStatus.PUBLISHED });
+			},
+			newest(showToNewUsers = false) {
+				const query = this.published().sort({ createdAt: "desc" });
+				if (showToNewUsers) return query.where({ showToNewUsers });
+				return query;
+			}
+		}
 	}
-});
+);