Browse Source

feat: Add basic station schema

Owen Diffey 11 months ago
parent
commit
1474ba5806
3 changed files with 174 additions and 1 deletions
  1. 2 1
      backend/src/modules/DataModule.ts
  2. 170 0
      backend/src/schemas/station.ts
  3. 2 0
      backend/src/types/Models.ts

+ 2 - 1
backend/src/modules/DataModule.ts

@@ -132,8 +132,9 @@ export default class DataModule extends BaseModule {
 	 */
 	private async loadModels() {
 		this.models = {
-			abc: await this.loadModel("abc")
+			abc: await this.loadModel("abc"),
 			//			station: await this.loadModel("station")
+			station: await this.loadModel("station")
 		};
 	}
 

+ 170 - 0
backend/src/schemas/station.ts

@@ -0,0 +1,170 @@
+import { Schema, SchemaTypes, Types } from "mongoose";
+
+export enum StationType {
+	OFFICIAL = "official",
+	COMMUNITY = "community"
+}
+
+export enum StationPrivacy {
+	PUBLIC = "public",
+	UNLISTED = "unlisted",
+	PRIVATE = "private"
+}
+
+export enum StationTheme {
+	BLUE = "blue",
+	PURPLE = "purple",
+	TEAL = "teal",
+	ORANGE = "orange",
+	RED = "red"
+}
+
+export enum StationRequestsAccess {
+	OWNER = "owner",
+	USER = "user"
+}
+
+export enum StationAutofillMode {
+	RANDOM = "random",
+	SEQUENTIAL = "sequential"
+}
+
+export interface StationSchema {
+	type: StationType;
+	name: string;
+	displayName: string;
+	description: string;
+	privacy: StationPrivacy;
+	theme: StationTheme;
+	owner?: Types.ObjectId;
+	djs: Types.ObjectId[];
+	currentSong?: Types.ObjectId;
+	currentSongIndex?: number;
+	startedAt?: NativeDate;
+	paused: boolean;
+	timePaused: number;
+	pausedAt?: NativeDate;
+	playlist: Types.ObjectId;
+	queue: Types.ObjectId[];
+	blacklist: Types.ObjectId[];
+	requests?: {
+		enabled: boolean;
+		access: StationRequestsAccess;
+		limit: number;
+	};
+	autofill?: {
+		enabled: boolean;
+		playlists: Types.ObjectId[];
+		limit: number;
+		mode: StationAutofillMode;
+	};
+}
+
+export const schema = new Schema<StationSchema>({
+	type: {
+		type: SchemaTypes.String,
+		enum: Object.values(StationType),
+		required: true
+	},
+	name: {
+		type: SchemaTypes.String,
+		unique: true,
+		minLength: 2,
+		maxLength: 16,
+		required: true
+	},
+	displayName: {
+		type: SchemaTypes.String,
+		unique: true,
+		minLength: 2,
+		maxLength: 32,
+		required: true
+	},
+	description: {
+		type: SchemaTypes.String,
+		minLength: 2,
+		maxLength: 128,
+		required: true
+	},
+	privacy: {
+		type: SchemaTypes.String,
+		default: StationPrivacy.PRIVATE,
+		enum: Object.values(StationPrivacy),
+		required: true
+	},
+	theme: {
+		type: SchemaTypes.String,
+		default: StationTheme.BLUE,
+		enum: Object.values(StationTheme),
+		required: true
+	},
+	owner: {
+		type: SchemaTypes.ObjectId,
+		required: false
+	},
+	djs: [{ type: SchemaTypes.ObjectId }],
+	currentSong: {
+		type: SchemaTypes.ObjectId,
+		required: false
+	},
+	currentSongIndex: {
+		type: SchemaTypes.Number,
+		required: false
+	},
+	startedAt: {
+		type: SchemaTypes.Date,
+		required: false
+	},
+	paused: {
+		type: SchemaTypes.Boolean,
+		default: false
+	},
+	timePaused: {
+		type: SchemaTypes.Number,
+		default: 0
+	},
+	pausedAt: {
+		type: SchemaTypes.Date,
+		required: false
+	},
+	playlist: {
+		type: SchemaTypes.ObjectId
+	},
+	queue: [{ type: SchemaTypes.ObjectId }],
+	blacklist: [{ type: SchemaTypes.ObjectId }],
+	requests: {
+		enabled: {
+			type: SchemaTypes.Boolean,
+			default: true
+		},
+		access: {
+			type: SchemaTypes.String,
+			default: StationRequestsAccess.OWNER,
+			enum: Object.values(StationRequestsAccess)
+		},
+		limit: {
+			type: SchemaTypes.Number,
+			default: 5,
+			min: 1,
+			max: 50
+		}
+	},
+	autofill: {
+		enabled: {
+			type: SchemaTypes.Boolean,
+			default: true
+		},
+		playlists: [{ type: SchemaTypes.ObjectId }],
+		limit: {
+			type: SchemaTypes.Number,
+			default: 30,
+			min: 1,
+			max: 50
+		},
+		mode: {
+			type: SchemaTypes.String,
+			default: StationAutofillMode.RANDOM,
+			enum: Object.values(StationAutofillMode)
+		}
+	}
+});

+ 2 - 0
backend/src/types/Models.ts

@@ -1,8 +1,10 @@
 import { Model, InferSchemaType, Schema } from "mongoose";
 import { AbcSchema } from "../schemas/abc";
+import { StationSchema } from "../schemas/station";
 
 export type Schemas = {
 	abc: Schema<AbcSchema>;
+	station: Schema<StationSchema>;
 };
 
 export type Models = Record<