Bläddra i källkod

feat(Activities): added preference whether to hide or show all activity

Signed-off-by: Jonathan <theflametrooper@gmail.com>
Jonathan 4 år sedan
förälder
incheckning
60a2837089

+ 23 - 14
backend/logic/actions/activities.js

@@ -17,15 +17,29 @@ export default {
 	 * @param {Function} cb - callback
 	 */
 	async getSet(session, userId, set, cb) {
-		const activityModel = await DBModule.runJob(
-			"GET_MODEL",
-			{
-				modelName: "activity"
-			},
-			this
-		);
+		const userModel = await DBModule.runJob("GET_MODEL", { modelName: "user" }, this);
+		const activityModel = await DBModule.runJob("GET_MODEL", { modelName: "activity" }, this);
+
 		async.waterfall(
 			[
+				next => {
+					// activities should only be viewed if public/owned by the user
+					if (session.userId !== userId) {
+						return userModel
+							.findById(userId)
+							.then(user => {
+								if (user) {
+									if (user.preferences.activityLogPublic) return next();
+									return next("User's activity log isn't public.");
+								}
+								return next("User does not exist.");
+							})
+							.catch(next);
+					}
+
+					return next();
+				},
+
 				next => {
 					activityModel
 						.find({ userId, hidden: false })
@@ -56,13 +70,8 @@ export default {
 	 * @param cb
 	 */
 	hideActivity: isLoginRequired(async function hideActivity(session, activityId, cb) {
-		const activityModel = await DBModule.runJob(
-			"GET_MODEL",
-			{
-				modelName: "activity"
-			},
-			this
-		);
+		const activityModel = await DBModule.runJob("GET_MODEL", { modelName: "activity" }, this);
+
 		async.waterfall(
 			[
 				next => {

+ 1 - 0
backend/logic/actions/punishments.js

@@ -17,6 +17,7 @@ CacheModule.runJob("SUB", {
 			room: "admin.punishments",
 			args: ["event:admin.punishment.added", data.punishment]
 		});
+
 		IOModule.runJob("SOCKETS_FROM_IP", { ip: data.ip }, this).then(sockets => {
 			sockets.forEach(socket => {
 				socket.disconnect(true);

+ 4 - 2
backend/logic/actions/users.js

@@ -21,7 +21,7 @@ const PlaylistsModule = moduleManager.modules.playlists;
 CacheModule.runJob("SUB", {
 	channel: "user.updatePreferences",
 	cb: res => {
-		IOModule.runJob("SOCKETS_FROM_USER", { userId: res.userId }).then(response => {
+		IOModule.runJob("SOCKETS_FROM_USER", { userId: res.userId }, this).then(response => {
 			response.sockets.forEach(socket => {
 				socket.emit("keep.event:user.preferences.changed", res.preferences);
 			});
@@ -714,6 +714,7 @@ export default {
 	 * @param {object} preferences - object containing preferences
 	 * @param {boolean} preferences.nightmode - whether or not the user is using the night mode theme
 	 * @param {boolean} preferences.autoSkipDisliked - whether to automatically skip disliked songs
+	 * @param {boolean} preferences.activityLogPublic - whether or not a user's activity log can be publicly viewed
 	 * @param {Function} cb - gets called with the result
 	 */
 	updatePreferences: isLoginRequired(async function updatePreferences(session, preferences, cb) {
@@ -728,7 +729,8 @@ export default {
 							$set: {
 								preferences: {
 									nightmode: preferences.nightmode,
-									autoSkipDisliked: preferences.autoSkipDisliked
+									autoSkipDisliked: preferences.autoSkipDisliked,
+									activityLogPublic: preferences.activityLogPublic
 								}
 							}
 						},

+ 2 - 1
backend/logic/db/schemas/user.js

@@ -43,7 +43,8 @@ export default {
 	preferences: {
 		orderOfPlaylists: [{ type: mongoose.Schema.Types.ObjectId }],
 		nightmode: { type: Boolean, default: false, required: true },
-		autoSkipDisliked: { type: Boolean, default: true, required: true }
+		autoSkipDisliked: { type: Boolean, default: true, required: true },
+		activityLogPublic: { type: Boolean, default: false, required: true }
 	},
 	documentVersion: { type: Number, default: 1, required: true }
 };

+ 4 - 2
frontend/src/App.vue

@@ -145,8 +145,9 @@ export default {
 			this.socket.emit("users.getPreferences", res => {
 				if (res.status === "success") {
 					this.changeAutoSkipDisliked(res.data.autoSkipDisliked);
-
 					this.changeNightmode(res.data.nightmode);
+					this.changeActivityLogPublic(res.data.activityLogPublic);
+
 					if (this.nightmode) this.enableNightMode();
 					else this.disableNightMode();
 				}
@@ -174,7 +175,8 @@ export default {
 		...mapActions("modalVisibility", ["closeCurrentModal"]),
 		...mapActions("user/preferences", [
 			"changeNightmode",
-			"changeAutoSkipDisliked"
+			"changeAutoSkipDisliked",
+			"changeActivityLogPublic"
 		])
 	}
 };

+ 5 - 0
frontend/src/main.js

@@ -166,6 +166,11 @@ lofig.get("serverDomain").then(serverDomain => {
 				"user/preferences/changeNightmode",
 				preferences.nightmode
 			);
+
+			store.dispatch(
+				"user/preferences/changeActivityLogPublic",
+				preferences.activityLogPublic
+			);
 		});
 	});
 });

+ 4 - 3
frontend/src/pages/Profile/tabs/Playlists.vue

@@ -14,7 +14,7 @@
 				{{
 					userId === myUserId
 						? "and manage your personal"
-						: `${user.name}'s`
+						: `${username}'s`
 				}}
 				playlists.
 			</p>
@@ -116,14 +116,15 @@ export default {
 			...mapState("modalVisibility", {
 				modals: state => state.modals.station
 			}),
-			myUserId: state => state.user.auth.userId
+			myUserId: state => state.user.auth.userId,
+			username: state => state.user.auth.username
 		}),
 		playlists: {
 			get() {
 				return this.$store.state.user.playlists.playlists;
 			},
 			set(playlists) {
-				this.$store.commit("user/playlists/getPlaylists", playlists);
+				this.$store.commit("user/playlists/setPlaylists", playlists);
 			}
 		}
 	},

+ 18 - 22
frontend/src/pages/Profile/tabs/RecentActivity.vue

@@ -74,30 +74,26 @@ export default {
 				);
 			}
 
-			// instead, check on backend
-			// user preference for showing/hiding all activities
-			if (this.myUserId === this.userId) {
-				this.socket.emit("activities.getSet", this.userId, 1, res => {
-					if (res.status === "success") {
-						// for (let a = 0; a < res.data.length; a += 1) {
-						// 	this.formatActivity(res.data[a], activity => {
-						// 		this.activities.unshift(activity);
-						// 	});
-						// }
-						this.getSetOfActivities({
-							activities: res.data,
-							set: 1
-						});
-					}
-				});
-
-				this.socket.on("event:activity.create", activity => {
-					console.log("activity created (socket event): ", activity);
-					this.formatActivity(activity, activity => {
-						this.activities.unshift(activity);
+			this.socket.emit("activities.getSet", this.userId, 1, res => {
+				if (res.status === "success") {
+					// for (let a = 0; a < res.data.length; a += 1) {
+					// 	this.formatActivity(res.data[a], activity => {
+					// 		this.activities.unshift(activity);
+					// 	});
+					// }
+					this.getSetOfActivities({
+						activities: res.data,
+						set: 1
 					});
+				}
+			});
+
+			this.socket.on("event:activity.create", activity => {
+				console.log("activity created (socket event): ", activity);
+				this.formatActivity(activity, activity => {
+					this.activities.unshift(activity);
 				});
-			}
+			});
 		});
 	},
 	methods: {

+ 24 - 5
frontend/src/pages/Settings/tabs/Preferences.vue

@@ -26,6 +26,17 @@
 				<p>Automatically vote to skip disliked songs</p>
 			</label>
 		</p>
+		<p class="control is-expanded checkbox-control">
+			<input
+				type="checkbox"
+				id="activityLogPublic"
+				v-model="localActivityLogPublic"
+			/>
+			<label for="activityLogPublic">
+				<span></span>
+				<p>Allow my activity log to be viewed publicly</p>
+			</label>
+		</p>
 		<transition name="saving-changes-transition" mode="out-in">
 			<button
 				class="button save-changes"
@@ -51,12 +62,14 @@ export default {
 	data() {
 		return {
 			localNightmode: false,
-			localAutoSkipDisliked: false
+			localAutoSkipDisliked: false,
+			localActivityLogPublic: false
 		};
 	},
 	computed: mapState({
 		nightmode: state => state.user.preferences.nightmode,
-		autoSkipDisliked: state => state.user.preferences.autoSkipDisliked
+		autoSkipDisliked: state => state.user.preferences.autoSkipDisliked,
+		activityLogPublic: state => state.user.preferences.activityLogPublic
 	}),
 	mounted() {
 		io.getSocket(socket => {
@@ -66,12 +79,15 @@ export default {
 				if (res.status === "success") {
 					this.localNightmode = res.data.nightmode;
 					this.localAutoSkipDisliked = res.data.autoSkipDisliked;
+					this.localActivityLogPublic = res.data.activityLogPublic;
 				}
 			});
 
 			socket.on("keep.event:user.preferences.changed", preferences => {
+				console.log("changed");
 				this.localNightmode = preferences.nightmode;
 				this.localAutoSkipDisliked = preferences.autoSkipDisliked;
+				this.localActivityLogPublic = preferences.activityLogPublic;
 			});
 		});
 	},
@@ -79,7 +95,8 @@ export default {
 		saveChanges() {
 			if (
 				this.localNightmode === this.nightmode &&
-				this.localAutoSkipDisliked === this.autoSkipDisliked
+				this.localAutoSkipDisliked === this.autoSkipDisliked &&
+				this.localActivityLogPublic === this.activityLogPublic
 			) {
 				new Toast({
 					content: "Please make a change before saving.",
@@ -95,7 +112,8 @@ export default {
 				"users.updatePreferences",
 				{
 					nightmode: this.localNightmode,
-					autoSkipDisliked: this.localAutoSkipDisliked
+					autoSkipDisliked: this.localAutoSkipDisliked,
+					activityLogPublic: this.localActivityLogPublic
 				},
 				res => {
 					if (res.status !== "success") {
@@ -115,7 +133,8 @@ export default {
 		},
 		...mapActions("user/preferences", [
 			"changeNightmode",
-			"changeAutoSkipDisliked"
+			"changeAutoSkipDisliked",
+			"changeActivityLogPublic"
 		])
 	}
 };

+ 8 - 1
frontend/src/store/modules/user.js

@@ -251,7 +251,8 @@ const modules = {
 		namespaced: true,
 		state: {
 			nightmode: false,
-			autoSkipDisliked: true
+			autoSkipDisliked: true,
+			activityLogPublic: false
 		},
 		actions: {
 			changeNightmode: ({ commit }, nightmode) => {
@@ -259,6 +260,9 @@ const modules = {
 			},
 			changeAutoSkipDisliked: ({ commit }, autoSkipDisliked) => {
 				commit("changeAutoSkipDisliked", autoSkipDisliked);
+			},
+			changeActivityLogPublic: ({ commit }, activityLogPublic) => {
+				commit("changeActivityLogPublic", activityLogPublic);
 			}
 		},
 		mutations: {
@@ -267,6 +271,9 @@ const modules = {
 			},
 			changeAutoSkipDisliked(state, autoSkipDisliked) {
 				state.autoSkipDisliked = autoSkipDisliked;
+			},
+			changeActivityLogPublic(state, activityLogPublic) {
+				state.activityLogPublic = activityLogPublic;
 			}
 		}
 	}