浏览代码

feat(Station): Added requests access setting and removed queue lock

Owen Diffey 3 年之前
父节点
当前提交
4f68665a5c

+ 8 - 5
backend/logic/actions/stations.js

@@ -817,7 +817,6 @@ export default {
 						displayName: station.displayName,
 						name: station.name,
 						privacy: station.privacy,
-						locked: station.locked,
 						requests: station.requests,
 						playMode: station.playMode,
 						owner: station.owner,
@@ -945,7 +944,6 @@ export default {
 						displayName: station.displayName,
 						name: station.name,
 						privacy: station.privacy,
-						locked: station.locked,
 						requests: station.requests,
 						playMode: station.playMode,
 						owner: station.owner,
@@ -1795,11 +1793,16 @@ export default {
 
 				(station, next) => {
 					if (!station) return next("Station not found.");
+					if (!station.requests.enabled) return next("Requests are disabled in this station.");
 
-					if (station.locked) {
+					if (
+						station.requests.access === "owner" ||
+						(station.requests.access === "user" && station.privacy === "private")
+					) {
 						return userModel.findOne({ _id: session.userId }, (err, user) => {
+							if (err) return next(err);
 							if (user.role !== "admin" && station.owner !== session.userId)
-								return next("Only owners and admins can add songs to a locked queue.");
+								return next("You do not have permission to add songs to queue.");
 							return next(null, station);
 						});
 					}
@@ -1929,7 +1932,7 @@ export default {
 						}
 					});
 
-					if (totalSongs > station.requests.limit)
+					if (totalSongs >= station.requests.limit)
 						return next(`The max amount of songs per user is ${station.requests.limit}.`);
 
 					return next(null, song);

+ 1 - 1
backend/logic/db/schemas/station.js

@@ -25,7 +25,6 @@ export default {
 	startedAt: { type: Number, default: 0, required: true },
 	playlist: { type: mongoose.Schema.Types.ObjectId, required: true },
 	privacy: { type: String, enum: ["public", "unlisted", "private"], default: "private" },
-	locked: { type: Boolean, default: false },
 	queue: [
 		{
 			_id: { type: mongoose.Schema.Types.ObjectId, required: true },
@@ -43,6 +42,7 @@ export default {
 	owner: { type: String },
 	requests: {
 		enabled: { type: Boolean, default: true },
+		access: { type: String, enum: ["owner", "user"], default: "owner" },
 		limit: { type: Number, min: 1, max: 50, default: 3 }
 	},
 	playMode: { type: String, enum: ["random", "sequential"], default: "random" },

+ 1 - 5
frontend/src/components/Request.vue

@@ -28,11 +28,7 @@
 					Autorequest
 				</button>
 			</div>
-			<div
-				class="tab"
-				v-show="tab === 'songs'"
-				v-if="isOwnerOrAdmin() || !station.locked"
-			>
+			<div class="tab" v-show="tab === 'songs'">
 				<div class="musare-songs">
 					<label class="label"> Search for a song on Musare </label>
 					<div class="control is-grouped input-with-button">

+ 12 - 1
frontend/src/components/modals/EditPlaylist/index.vue

@@ -114,7 +114,18 @@
 										<template #tippyActions>
 											<i
 												class="material-icons add-to-queue-icon"
-												v-if="!station.locked"
+												v-if="
+													station.requests.enabled &&
+													(station.requests.access ===
+														'user' ||
+														(station.requests
+															.access ===
+															'owner' &&
+															(userRole ===
+																'admin' ||
+																station.owner ===
+																	userId)))
+												"
 												@click="
 													addSongToQueue(
 														element.youtubeId

+ 0 - 5
frontend/src/components/modals/ManageStation/Tabs/Settings.vue

@@ -220,11 +220,6 @@ export default {
 	mounted() {
 		this.local = {
 			...this.station,
-			requests: {
-				enabled: this.station.requests.enabled,
-				access: "owner",
-				limit: this.station.requests.limit
-			},
 			autofill: {
 				enabled: true,
 				limit: 30,

+ 10 - 12
frontend/src/components/modals/ManageStation/index.vue

@@ -100,10 +100,7 @@
 								Autofill
 							</button>
 							<button
-								v-if="
-									station.requests.enabled &&
-									(isAllowedToParty() || isOwnerOrAdmin())
-								"
+								v-if="canRequest()"
 								class="button is-default"
 								:class="{ selected: tab === 'request' }"
 								ref="request-tab"
@@ -132,10 +129,7 @@
 							v-show="tab === 'autofill'"
 						/>
 						<request
-							v-if="
-								station.requests.enabled &&
-								(isAllowedToParty() || isOwnerOrAdmin())
-							"
+							v-if="canRequest()"
 							class="tab"
 							v-show="tab === 'request'"
 							:sector="sector"
@@ -234,7 +228,7 @@ export default {
 	watch: {
 		// eslint-disable-next-line
 		"station.requests": function (requests) {
-			if (this.tab === "request" && requests && !requests.enabled) {
+			if (this.tab === "request" && !this.canRequest()) {
 				if (this.isOwnerOrAdmin()) this.showTab("settings");
 				else this.closeModal("manageStation");
 			}
@@ -510,11 +504,15 @@ export default {
 		isOwnerOrAdmin() {
 			return this.isOwner() || this.isAdmin();
 		},
-		isAllowedToParty() {
+		canRequest() {
 			return (
 				this.station &&
-				(!this.station.locked || this.isOwnerOrAdmin()) &&
-				this.loggedIn
+				this.loggedIn &&
+				this.station.requests &&
+				this.station.requests.enabled &&
+				(this.station.requests.access === "user" ||
+					(this.station.requests.access === "owner" &&
+						this.isOwnerOrAdmin()))
 			);
 		},
 		removeStation() {

+ 33 - 5
frontend/src/pages/Station/Sidebar/index.vue

@@ -16,7 +16,7 @@
 				Users
 			</button>
 			<button
-				v-if="station.requests && station.requests.enabled && loggedIn"
+				v-if="canRequest()"
 				class="button is-default"
 				:class="{ selected: tab === 'request' }"
 				@click="showTab('request')"
@@ -24,7 +24,9 @@
 				Request
 			</button>
 			<button
-				v-else-if="station.requests && station.requests.enabled"
+				v-else-if="
+					!loggedIn && station.requests && station.requests.enabled
+				"
 				class="button is-default"
 				content="Login to request songs"
 				v-tippy="{ theme: 'info' }"
@@ -35,7 +37,7 @@
 		<queue class="tab" v-show="tab === 'queue'" />
 		<users class="tab" v-show="tab === 'users'" />
 		<request
-			v-if="station.requests && station.requests.enabled && loggedIn"
+			v-if="canRequest()"
 			v-show="tab === 'request'"
 			class="tab requests-tab"
 			sector="station"
@@ -63,12 +65,14 @@ export default {
 		station: state => state.station.station,
 		users: state => state.station.users,
 		userCount: state => state.station.userCount,
-		loggedIn: state => state.user.auth.loggedIn
+		userId: state => state.user.auth.userId,
+		loggedIn: state => state.user.auth.loggedIn,
+		role: state => state.user.auth.role
 	}),
 	watch: {
 		// eslint-disable-next-line
 		"station.requests": function (requests) {
-			if (this.tab === "request" && requests && !requests.enabled)
+			if (this.tab === "request" && !this.canRequest())
 				this.showTab("queue");
 		}
 	},
@@ -81,6 +85,30 @@ export default {
 			this.tab = this.$route.query.tab;
 	},
 	methods: {
+		isOwner() {
+			return (
+				this.loggedIn &&
+				this.station &&
+				this.userId === this.station.owner
+			);
+		},
+		isAdmin() {
+			return this.loggedIn && this.role === "admin";
+		},
+		isOwnerOrAdmin() {
+			return this.isOwner() || this.isAdmin();
+		},
+		canRequest() {
+			return (
+				this.station &&
+				this.loggedIn &&
+				this.station.requests &&
+				this.station.requests.enabled &&
+				(this.station.requests.access === "user" ||
+					(this.station.requests.access === "owner" &&
+						this.isOwnerOrAdmin()))
+			);
+		},
 		...mapActions("modalVisibility", ["openModal"])
 	}
 };

+ 0 - 2
frontend/src/pages/Station/index.vue

@@ -1887,7 +1887,6 @@ export default {
 							name,
 							description,
 							privacy,
-							locked,
 							owner,
 							privatePlaylist,
 							includedPlaylists,
@@ -1912,7 +1911,6 @@ export default {
 							displayName,
 							description,
 							privacy,
-							locked,
 							owner,
 							privatePlaylist,
 							includedPlaylists,