ソースを参照

refactor: beginning of station changes with sequalize refactor

Kristian Vos 9 ヶ月 前
コミット
89f8ed188f
31 ファイル変更383 行追加235 行削除
  1. 1 3
      backend/src/modules/DataModule.ts
  2. 2 1
      backend/src/modules/DataModule/CreateJob.ts
  3. 169 0
      backend/src/modules/DataModule/models/Station.ts
  4. 0 0
      backend/src/modules/DataModule/models/Station/StationAutofillMode.ts
  5. 0 0
      backend/src/modules/DataModule/models/Station/StationPrivacy.ts
  6. 0 0
      backend/src/modules/DataModule/models/Station/StationRequestsAccess.ts
  7. 0 0
      backend/src/modules/DataModule/models/Station/StationTheme.ts
  8. 0 0
      backend/src/modules/DataModule/models/Station/StationType.ts
  9. 0 0
      backend/src/modules/DataModule/models/Station/config.ts
  10. 2 1
      backend/src/modules/DataModule/models/Station/events/StationCreatedEvent.ts
  11. 2 1
      backend/src/modules/DataModule/models/Station/events/StationDeletedEvent.ts
  12. 2 1
      backend/src/modules/DataModule/models/Station/events/StationUpdatedEvent.ts
  13. 0 0
      backend/src/modules/DataModule/models/Station/getData.ts
  14. 2 1
      backend/src/modules/DataModule/models/Station/jobs/Create.ts
  15. 2 1
      backend/src/modules/DataModule/models/Station/jobs/DeleteById.ts
  16. 2 1
      backend/src/modules/DataModule/models/Station/jobs/DeleteManyById.ts
  17. 2 1
      backend/src/modules/DataModule/models/Station/jobs/FindById.ts
  18. 2 1
      backend/src/modules/DataModule/models/Station/jobs/FindManyById.ts
  19. 2 1
      backend/src/modules/DataModule/models/Station/jobs/GetData.ts
  20. 5 9
      backend/src/modules/DataModule/models/Station/jobs/Index.ts
  21. 2 1
      backend/src/modules/DataModule/models/Station/jobs/UpdateById.ts
  22. 159 0
      backend/src/modules/DataModule/models/Station/schema.ts
  23. 0 15
      backend/src/modules/DataModule/models/news/listeners/NewsUpdatedListener.ts
  24. 0 159
      backend/src/modules/DataModule/models/stations/schema.ts
  25. 2 4
      backend/src/modules/DataModule/permissions/modelPermissions/doesModelExist.ts
  26. 4 4
      backend/src/modules/DataModule/permissions/modelPermissions/isDj.ts
  27. 2 5
      backend/src/modules/DataModule/permissions/modelPermissions/isLoggedIn.ts
  28. 8 7
      backend/src/modules/DataModule/permissions/modelPermissions/isOwner.ts
  29. 4 7
      backend/src/modules/DataModule/permissions/modelPermissions/isPrivate.ts
  30. 3 4
      backend/src/modules/DataModule/permissions/modelPermissions/isPublic.ts
  31. 4 7
      backend/src/modules/DataModule/permissions/modelPermissions/isUnlisted.ts

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

@@ -169,9 +169,7 @@ export class DataModule extends BaseModule {
 
 		// TODO move to a better spot and improve
 		try {
-			await this._sequelize.query(
-				`DROP TABLE IF EXISTS "minifiedUsers"` 
-			);
+			await this._sequelize.query(`DROP TABLE IF EXISTS "minifiedUsers"`);
 		} catch (err) {}
 		await this._sequelize.query(
 			`CREATE OR REPLACE VIEW "minifiedUsers" AS SELECT _id, username, name, role FROM users`

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

@@ -1,6 +1,7 @@
 import Joi from "joi";
-import DataModuleJob from "./DataModuleJob";
 import ObjectID from "bson-objectid";
+import DataModuleJob from "./DataModuleJob";
+
 export default abstract class CreateJob extends DataModuleJob {
 	protected static _payloadSchema = Joi.object({
 		query: Joi.object().min(1).required()

+ 169 - 0
backend/src/modules/DataModule/models/Station.ts

@@ -0,0 +1,169 @@
+import {
+	DataTypes,
+	Model,
+	InferAttributes,
+	InferCreationAttributes,
+	CreationOptional
+} from "sequelize";
+import { ObjectIdType } from "@/modules/DataModule";
+import { StationType } from "./Station/StationType";
+import { StationTheme } from "./Station/StationTheme";
+import { StationPrivacy } from "./Station/StationPrivacy";
+
+export class Station extends Model<
+	InferAttributes<Station>,
+	InferCreationAttributes<Station>
+> {
+	declare _id: CreationOptional<ObjectIdType>;
+
+	declare name: string;
+
+	declare type: StationType;
+
+	declare displayName: string;
+
+	declare description: string;
+
+	declare paused: CreationOptional<boolean>;
+
+	// TODO currentSong
+
+	declare currentSongIndex: CreationOptional<number>;
+
+	declare timePaused: CreationOptional<number>;
+
+	declare pausedAt: CreationOptional<Date>;
+
+	declare startedAt: CreationOptional<Date>;
+
+	declare playlist: ObjectIdType;
+
+	declare privacy: CreationOptional<StationPrivacy>;
+
+	// TODO queue
+
+	declare owner: CreationOptional<ObjectIdType>;
+
+	// TODO requests
+
+	// TODO autofill
+
+	declare theme: CreationOptional<StationTheme>;
+
+	// TODO blacklist
+
+	// TODO djs
+
+	declare skipVoteThreshold: CreationOptional<number>;
+
+	declare createdAt: CreationOptional<Date>;
+
+	declare updatedAt: CreationOptional<Date>;
+}
+
+// TODO validation
+export const schema = {
+	_id: {
+		type: DataTypes.OBJECTID,
+		primaryKey: true,
+		allowNull: false
+	},
+	name: {
+		type: DataTypes.STRING,
+		allowNull: false,
+		unique: true
+	},
+	type: {
+		type: DataTypes.ENUM(...Object.values(StationType)),
+		allowNull: false
+	},
+	displayName: {
+		type: DataTypes.STRING,
+		allowNull: false,
+		unique: true
+	},
+	description: {
+		type: DataTypes.STRING,
+		allowNull: false
+	},
+	paused: {
+		type: DataTypes.BOOLEAN,
+		defaultValue: false,
+		allowNull: false
+	},
+	// // TODO currentSong
+	// currentSongIndex: {
+	// 	type: DataTypes.NUMBER,
+	// 	defaultValue: 0,
+	// 	allowNull: false
+	// },
+	// timePaused: {
+	// 	type: DataTypes.NUMBER,
+	// 	defaultValue: 0,
+	// 	allowNull: false
+	// },
+	// pausedAt: {
+	// 	type: DataTypes.NUMBER,
+	// 	defaultValue: 0,
+	// 	allowNull: false
+	// },
+	// startedAt: {
+	// 	type: DataTypes.NUMBER,
+	// 	defaultValue: 0,
+	// 	allowNull: false
+	// },
+	// playlist: {
+	// 	type: DataTypes.OBJECTID,
+	// 	allowNull: false
+	// },
+	privacy: {
+		type: DataTypes.ENUM(...Object.values(StationPrivacy)),
+		defaultValue: StationPrivacy.PRIVATE,
+		allowNull: false
+	},
+	// // TODO queue
+	// owner: { // Only used for community stations
+	// 	type: DataTypes.OBJECTID
+	// },
+	// // TODO requests
+	// // TODO autofill
+	theme: {
+		type: DataTypes.ENUM(...Object.values(StationTheme)),
+		defaultValue: StationTheme.BLUE,
+		allowNull: false
+	},
+	// // TODO blacklist
+	// // TODO djs
+	// skipVoteThreshold: {
+	// 	type: DataTypes.NUMBER,
+	// 	defaultValue: 50,
+	// 	allowNull: false
+	// },
+
+	createdAt: DataTypes.DATE,
+	updatedAt: DataTypes.DATE,
+	_name: {
+		type: DataTypes.VIRTUAL,
+		get() {
+			return `stations`;
+		}
+	}
+};
+
+export const options = {};
+
+export const setup = async () => {
+	// Station.afterSave(async record => {});
+
+	// Station.afterDestroy(async record => {});
+
+	Station.addHook("afterFind", (station, options) => {
+		console.log("AFTER FIND STATION", station, options);
+	});
+};
+
+export const setupAssociations = () => {
+	// TODO
+};
+
+export default Station;

+ 0 - 0
backend/src/modules/DataModule/models/stations/StationAutofillMode.ts → backend/src/modules/DataModule/models/Station/StationAutofillMode.ts


+ 0 - 0
backend/src/modules/DataModule/models/stations/StationPrivacy.ts → backend/src/modules/DataModule/models/Station/StationPrivacy.ts


+ 0 - 0
backend/src/modules/DataModule/models/stations/StationRequestsAccess.ts → backend/src/modules/DataModule/models/Station/StationRequestsAccess.ts


+ 0 - 0
backend/src/modules/DataModule/models/stations/StationTheme.ts → backend/src/modules/DataModule/models/Station/StationTheme.ts


+ 0 - 0
backend/src/modules/DataModule/models/stations/StationType.ts → backend/src/modules/DataModule/models/Station/StationType.ts


+ 0 - 0
backend/src/modules/DataModule/models/stations/config.ts → backend/src/modules/DataModule/models/Station/config.ts


+ 2 - 1
backend/src/modules/DataModule/models/stations/events/StationCreatedEvent.ts → backend/src/modules/DataModule/models/Station/events/StationCreatedEvent.ts

@@ -1,8 +1,9 @@
 import ModelCreatedEvent from "@/modules/DataModule/ModelCreatedEvent";
 import isAdmin from "@/modules/DataModule/permissions/isAdmin";
+import Station from "../../Station";
 
 export default abstract class StationCreatedEvent extends ModelCreatedEvent {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasPermission = isAdmin;
 }

+ 2 - 1
backend/src/modules/DataModule/models/stations/events/StationDeletedEvent.ts → backend/src/modules/DataModule/models/Station/events/StationDeletedEvent.ts

@@ -4,9 +4,10 @@ import isPublic from "@/modules/DataModule/permissions/modelPermissions/isPublic
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
 import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isAdmin from "@/modules/DataModule/permissions/isAdmin";
+import Station from "../../Station";
 
 export default abstract class StationDeletedEvent extends ModelDeletedEvent {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasPermission = isAdmin;
 

+ 2 - 1
backend/src/modules/DataModule/models/stations/events/StationUpdatedEvent.ts → backend/src/modules/DataModule/models/Station/events/StationUpdatedEvent.ts

@@ -4,9 +4,10 @@ import isUnlisted from "@/modules/DataModule/permissions/modelPermissions/isUnli
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
 import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isAdmin from "@/modules/DataModule/permissions/isAdmin";
+import Station from "../../Station";
 
 export default abstract class StationUpdatedEvent extends ModelUpdatedEvent {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasPermission = isAdmin;
 

+ 0 - 0
backend/src/modules/DataModule/models/stations/getData.ts → backend/src/modules/DataModule/models/Station/getData.ts


+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/Create.ts → backend/src/modules/DataModule/models/Station/jobs/Create.ts

@@ -1,8 +1,9 @@
 import CreateJob from "@/modules/DataModule/CreateJob";
 import isLoggedIn from "@/modules/DataModule/permissions/modelPermissions/isLoggedIn";
+import Station from "../../Station";
 
 export default class Create extends CreateJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = isLoggedIn;
 }

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/DeleteById.ts → backend/src/modules/DataModule/models/Station/jobs/DeleteById.ts

@@ -1,8 +1,9 @@
 import DeleteByIdJob from "@/modules/DataModule/DeleteByIdJob";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
+import Station from "../../Station";
 
 export default class DeleteById extends DeleteByIdJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = isOwner;
 }

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/DeleteManyById.ts → backend/src/modules/DataModule/models/Station/jobs/DeleteManyById.ts

@@ -1,8 +1,9 @@
 import DeleteManyByIdJob from "@/modules/DataModule/DeleteManyByIdJob";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
+import Station from "../../Station";
 
 export default class DeleteManyById extends DeleteManyByIdJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = isOwner;
 }

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/FindById.ts → backend/src/modules/DataModule/models/Station/jobs/FindById.ts

@@ -3,9 +3,10 @@ import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isPublic from "@/modules/DataModule/permissions/modelPermissions/isPublic";
 import isUnlisted from "@/modules/DataModule/permissions/modelPermissions/isUnlisted";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
+import Station from "../../Station";
 
 export default class FindById extends FindByIdJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = [
 		isOwner,

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/FindManyById.ts → backend/src/modules/DataModule/models/Station/jobs/FindManyById.ts

@@ -3,9 +3,10 @@ import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isPublic from "@/modules/DataModule/permissions/modelPermissions/isPublic";
 import isUnlisted from "@/modules/DataModule/permissions/modelPermissions/isUnlisted";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
+import Station from "../../Station";
 
 export default class FindManyById extends FindManyByIdJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = [
 		isOwner,

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/GetData.ts → backend/src/modules/DataModule/models/Station/jobs/GetData.ts

@@ -1,5 +1,6 @@
 import GetDataJob from "@/modules/DataModule/GetDataJob";
+import Station from "../../Station";
 
 export default class GetData extends GetDataJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 }

+ 5 - 9
backend/src/modules/DataModule/models/stations/jobs/Index.ts → backend/src/modules/DataModule/models/Station/jobs/Index.ts

@@ -1,15 +1,13 @@
-import { HydratedDocument } from "mongoose";
 import { forEachIn } from "@common/utils/forEachIn";
 import Joi from "joi";
-import DataModule from "@/modules/DataModule";
 import DataModuleJob from "@/modules/DataModule/DataModuleJob";
 import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
 import isPublic from "@/modules/DataModule/permissions/modelPermissions/isPublic";
-import { StationModel, StationSchema } from "../schema";
+import Station from "../../Station";
 
 export default class Index extends DataModuleJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasPermission = true;
 
@@ -18,15 +16,13 @@ export default class Index extends DataModuleJob {
 	});
 
 	protected async _execute() {
-		const model = await DataModule.getModel<StationModel>(
-			this.getModelName()
-		);
+		const model = this.getModel();
 
-		const data = await model.find();
+		const data = await model.findAll();
 
 		const user = await this._context.getUser().catch(() => null);
 
-		const stations: HydratedDocument<StationSchema>[] = [];
+		const stations: Station[] = [];
 
 		await forEachIn(data, async station => {
 			if (

+ 2 - 1
backend/src/modules/DataModule/models/stations/jobs/UpdateById.ts → backend/src/modules/DataModule/models/Station/jobs/UpdateById.ts

@@ -1,9 +1,10 @@
 import UpdateByIdJob from "@/modules/DataModule/UpdateByIdJob";
 import isDj from "@/modules/DataModule/permissions/modelPermissions/isDj";
 import isOwner from "@/modules/DataModule/permissions/modelPermissions/isOwner";
+import Station from "../../Station";
 
 export default class UpdateById extends UpdateByIdJob {
-	protected static _modelName = "stations";
+	protected static _model = Station;
 
 	protected static _hasModelPermission = [isOwner, isDj];
 }

+ 159 - 0
backend/src/modules/DataModule/models/Station/schema.ts

@@ -0,0 +1,159 @@
+// import { Model, Schema, SchemaOptions, SchemaTypes, Types } from "mongoose";
+// import { GetData } from "@/modules/DataModule/plugins/getData";
+// import { BaseSchema } from "@/modules/DataModule/types/Schemas";
+// import { StationType } from "./StationType";
+// import { StationPrivacy } from "./StationPrivacy";
+// import { StationTheme } from "./StationTheme";
+// import { StationRequestsAccess } from "./StationRequestsAccess";
+// import { StationAutofillMode } from "./StationAutofillMode";
+// import config from "./config";
+
+// export interface StationSchema extends BaseSchema {
+// 	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 interface StationModel extends Model<StationSchema>, GetData {}
+
+// export const schema = new Schema<StationSchema, StationModel>(
+// 	{
+// 		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,
+// 			ref: "minifiedUsers",
+// 			required: false
+// 		},
+// 		djs: [{ type: SchemaTypes.ObjectId, ref: "users" }],
+// 		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)
+// 			}
+// 		}
+// 	},
+// 	config
+// );
+
+// export type StationSchemaType = typeof schema;
+
+// export type StationSchemaOptions = SchemaOptions<StationSchema>;

+ 0 - 15
backend/src/modules/DataModule/models/news/listeners/NewsUpdatedListener.ts

@@ -1,15 +0,0 @@
-// import NewsUpdatedEvent from "../events/NewsUpdatedEvent";
-
-// export default abstract class NewsUpdatedListener {
-// 	protected static _event = NewsUpdatedEvent;
-
-//     public static getName() {
-//         return "NewsUpdatedListener";
-//     }
-
-//     protected async _onEvent() {
-//         console.log("On event");
-//     }
-
-// 	// protected static _hasPermission = isAdmin;
-// }

+ 0 - 159
backend/src/modules/DataModule/models/stations/schema.ts

@@ -1,159 +0,0 @@
-import { Model, Schema, SchemaOptions, SchemaTypes, Types } from "mongoose";
-import { GetData } from "@/modules/DataModule/plugins/getData";
-import { BaseSchema } from "@/modules/DataModule/types/Schemas";
-import { StationType } from "./StationType";
-import { StationPrivacy } from "./StationPrivacy";
-import { StationTheme } from "./StationTheme";
-import { StationRequestsAccess } from "./StationRequestsAccess";
-import { StationAutofillMode } from "./StationAutofillMode";
-import config from "./config";
-
-export interface StationSchema extends BaseSchema {
-	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 interface StationModel extends Model<StationSchema>, GetData {}
-
-export const schema = new Schema<StationSchema, StationModel>(
-	{
-		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,
-			ref: "minifiedUsers",
-			required: false
-		},
-		djs: [{ type: SchemaTypes.ObjectId, ref: "users" }],
-		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)
-			}
-		}
-	},
-	config
-);
-
-export type StationSchemaType = typeof schema;
-
-export type StationSchemaOptions = SchemaOptions<StationSchema>;

+ 2 - 4
backend/src/modules/DataModule/permissions/modelPermissions/doesModelExist.ts

@@ -1,10 +1,8 @@
-import { HydratedDocument, Schema } from "mongoose";
+import { Model } from "sequelize";
 
 /**
  * Simply used to check if the provided model exists.
  * Used for events/jobs where any user is allowed to access it,
  * as long as a valid object id was provided.
  */
-export default <ModelSchemaType extends Schema>(
-	model: HydratedDocument<ModelSchemaType>
-) => !!model;
+export default (model: Model) => !!model;

+ 4 - 4
backend/src/modules/DataModule/permissions/modelPermissions/isDj.ts

@@ -1,6 +1,6 @@
-import { HydratedDocument } from "mongoose";
-import { StationSchema } from "../../models/stations/schema";
 import User from "../../models/User";
+import Station from "../../models/Station";
 
-export default (model: HydratedDocument<StationSchema>, user?: User) =>
-	model && user && model.djs.includes(user._id);
+export default (model: Station, user?: User) => false;
+// TODO
+// model && user && model.djs.includes(user._id);

+ 2 - 5
backend/src/modules/DataModule/permissions/modelPermissions/isLoggedIn.ts

@@ -1,7 +1,4 @@
-import { HydratedDocument, Schema } from "mongoose";
+import { Model } from "sequelize";
 import User from "../../models/User";
 
-export default <ModelSchemaType extends Schema>(
-	model: HydratedDocument<ModelSchemaType>,
-	user?: User
-) => !!user;
+export default (model: Model, user?: User) => !!user;

+ 8 - 7
backend/src/modules/DataModule/permissions/modelPermissions/isOwner.ts

@@ -1,21 +1,22 @@
-import { HydratedDocument } from "mongoose";
+import { Model } from "sequelize";
 import User from "../../models/User";
 
 export default (
-	model:
-		| (HydratedDocument<any> & { owner?: any })
-		| (HydratedDocument<any> & { createdBy?: any }),
+	model: (Model & { owner?: any }) | (Model & { createdBy?: any }),
 	user?: User
 ) => {
 	if (!user || !model) return false;
 
 	let ownerAttribute;
 
-	if (model.schema.path("createdBy")) ownerAttribute = "createdBy";
-	else if (model.schema.path("owner")) ownerAttribute = "owner";
+	if (model.dataValues.hasOwnProperty("createdBy"))
+		ownerAttribute = "createdBy";
+	else if (model.dataValues.hasOwnProperty("owner")) ownerAttribute = "owner";
 
 	if (ownerAttribute)
-		return model.get(ownerAttribute)?.toString() === user._id.toString();
+		return (
+			model.dataValues[ownerAttribute].toString() === user._id.toString()
+		);
 
 	return false;
 };

+ 4 - 7
backend/src/modules/DataModule/permissions/modelPermissions/isPrivate.ts

@@ -1,8 +1,5 @@
-import { HydratedDocument, Schema } from "mongoose";
-import { StationPrivacy } from "@/modules/DataModule/models/stations/StationPrivacy";
+import { StationPrivacy } from "@/modules/DataModule/models/Station/StationPrivacy";
+import Station from "../../models/Station";
 
-export default <
-	ModelSchemaType extends Schema & { privacy?: StationPrivacy.PRIVATE }
->(
-	model: HydratedDocument<ModelSchemaType>
-) => model && model?.privacy === StationPrivacy.PRIVATE;
+export default (model: Station) =>
+	model && model?.privacy === StationPrivacy.PRIVATE;

+ 3 - 4
backend/src/modules/DataModule/permissions/modelPermissions/isPublic.ts

@@ -1,6 +1,5 @@
-import { HydratedDocument } from "mongoose";
-import { StationPrivacy } from "@/modules/DataModule/models/stations/StationPrivacy";
-import { StationSchema } from "../../models/stations/schema";
+import { StationPrivacy } from "@/modules/DataModule/models/Station/StationPrivacy";
+import Station from "../../models/Station";
 
-export default (model: HydratedDocument<StationSchema>) =>
+export default (model: Station) =>
 	model && model?.privacy === StationPrivacy.PUBLIC;

+ 4 - 7
backend/src/modules/DataModule/permissions/modelPermissions/isUnlisted.ts

@@ -1,8 +1,5 @@
-import { HydratedDocument, Schema } from "mongoose";
-import { StationPrivacy } from "@/modules/DataModule/models/stations/StationPrivacy";
+import { StationPrivacy } from "@/modules/DataModule/models/Station/StationPrivacy";
+import Station from "../../models/Station";
 
-export default <
-	ModelSchemaType extends Schema & { privacy?: StationPrivacy.UNLISTED }
->(
-	model: HydratedDocument<ModelSchemaType>
-) => model && model?.privacy === StationPrivacy.UNLISTED;
+export default (model: Station) =>
+	model && model?.privacy === StationPrivacy.UNLISTED;