Bläddra i källkod

feat: Added moderator user role

Owen Diffey 2 år sedan
förälder
incheckning
d01d085324

+ 1 - 1
backend/logic/db/index.js

@@ -14,7 +14,7 @@ const REQUIRED_DOCUMENT_VERSIONS = {
 	report: 6,
 	song: 9,
 	station: 8,
-	user: 3,
+	user: 4,
 	youtubeApiRequest: 1,
 	youtubeVideo: 1,
 	ratings: 1,

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

@@ -2,7 +2,7 @@ import mongoose from "mongoose";
 
 export default {
 	username: { type: String, required: true },
-	role: { type: String, default: "default", required: true },
+	role: { type: String, default: "user", enum: ["user", "moderator", "admin"], required: true },
 	email: {
 		verified: { type: Boolean, default: false, required: true },
 		verificationToken: String,
@@ -48,5 +48,5 @@ export default {
 		anonymousSongRequests: { type: Boolean, default: false, required: true },
 		activityWatch: { type: Boolean, default: false, required: true }
 	},
-	documentVersion: { type: Number, default: 3, required: true }
+	documentVersion: { type: Number, default: 4, required: true }
 };

+ 55 - 0
backend/logic/migration/migrations/migration23.js

@@ -0,0 +1,55 @@
+import async from "async";
+
+/**
+ * Migration 23
+ *
+ * Migration for renaming default user role from default to user
+ *
+ * @param {object} MigrationModule - the MigrationModule
+ * @returns {Promise} - returns promise
+ */
+export default async function migrate(MigrationModule) {
+	const userModel = await MigrationModule.runJob("GET_MODEL", { modelName: "user" }, this);
+
+	return new Promise((resolve, reject) => {
+		async.waterfall(
+			[
+				next => {
+					this.log("INFO", `Migration 23. Finding users with document version 3.`);
+					userModel.find({ documentVersion: 3 }, (err, users) => {
+						if (err) next(err);
+						else {
+							async.eachLimit(
+								users.map(user => user._doc),
+								1,
+								(user, next) => {
+									userModel.updateOne(
+										{ _id: user._id },
+										{
+											$set: {
+												role: user.role === "default" ? "user" : user.role,
+												documentVersion: 4
+											}
+										},
+										next
+									);
+								},
+								err => {
+									this.log("INFO", `Migration 23. Users found: ${users.length}.`);
+									next(err);
+								}
+							);
+						}
+					});
+				}
+			],
+			err => {
+				if (err) {
+					reject(new Error(err));
+				} else {
+					resolve();
+				}
+			}
+		);
+	});
+}

+ 2 - 1
frontend/src/components/modals/EditUser.vue

@@ -212,7 +212,8 @@ onBeforeUnmount(() => {
 					<div class="control is-grouped">
 						<div class="control is-expanded select">
 							<select v-model="user.role">
-								<option>default</option>
+								<option>user</option>
+								<option>moderator</option>
 								<option>admin</option>
 							</select>
 						</div>

+ 2 - 1
frontend/src/pages/Admin/Users/index.vue

@@ -154,7 +154,8 @@ const filters = ref(<TableFilter[]>[
 		defaultFilterType: "exact",
 		dropdown: [
 			["admin", "Admin"],
-			["default", "Default"]
+			["moderator", "Moderator"],
+			["user", "User"]
 		]
 	},
 	{

+ 16 - 0
frontend/src/pages/Profile/index.vue

@@ -83,6 +83,11 @@ onMounted(() => {
 								v-if="user.role === 'admin'"
 								>admin</span
 							>
+							<span
+								class="role moderator"
+								v-if="user.role === 'moderator'"
+								>moderator</span
+							>
 						</div>
 						<div class="username-row">
 							<h2 class="username">@{{ user.username }}</h2>
@@ -91,6 +96,13 @@ onMounted(() => {
 								v-if="user.role === 'admin' && !user.name"
 								>admin</span
 							>
+							<span
+								class="role moderator"
+								v-else-if="
+									user.role === 'moderator' && !user.name
+								"
+								>moderator</span
+							>
 						</div>
 					</div>
 				</div>
@@ -286,6 +298,10 @@ onMounted(() => {
 		&.admin {
 			background-color: var(--dark-red);
 		}
+
+		&.moderator {
+			background-color: var(--blue);
+		}
 	}
 
 	.username {