From a10ea43800dc21be0ee121d97ba202246cc2f3fe Mon Sep 17 00:00:00 2001
From: "thomas.blanc.2@etu.univ-amu.fr" <gltron3000@gmail.com>
Date: Sun, 24 May 2020 15:44:24 +0200
Subject: [PATCH] Users role change support

---
 src/api.js                  | 22 ++++++++++++++++++----
 src/components/Comments.vue |  2 +-
 src/views/Account.vue       |  2 +-
 src/views/Admin.vue         | 19 +++++++++++++++++++
 src/views/Model.vue         |  2 +-
 5 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/src/api.js b/src/api.js
index cb1a088..de66b97 100644
--- a/src/api.js
+++ b/src/api.js
@@ -33,7 +33,7 @@ export const api = {
   },
   async getUser () {
     const token = await localStorage.getItem('token')
-    const url = serverurl + 'user'
+    const url = serverurl + 'users'
     try {
       const response = await fetch(url, { headers: { Authorization: 'Bearer ' + token } })
       return await response.json()
@@ -88,7 +88,7 @@ export const api = {
   },
   async getUserList () {
     const token = await localStorage.getItem('token')
-    const url = serverurl + 'user/list'
+    const url = serverurl + 'users/list'
     try {
       const response = await fetch(url, { headers: { Authorization: 'Bearer ' + token } })
       return await response.json()
@@ -187,7 +187,7 @@ export const api = {
   },
   async removeUser (id) {
     const token = await localStorage.getItem('token')
-    const url = serverurl + 'user' + '?id=' + id
+    const url = serverurl + 'users' + '?id=' + id
     try {
       await fetch(url, {
         method: 'DELETE',
@@ -222,7 +222,7 @@ export const api = {
     }
   },
   async register (username, email, password) {
-    const url = serverurl + 'user/signup'
+    const url = serverurl + 'users/signup'
     try {
       const response = await fetch(
         url, {
@@ -376,5 +376,19 @@ export const api = {
     } catch (error) {
       return false
     }
+  },
+  async setAdmin (id) {
+    const url = serverurl + 'users/setAdmin' + '?id=' + id
+    const token = await localStorage.getItem('token')
+    const response = await fetch(url, {
+      headers: {
+        Authorization: 'Bearer ' + token
+      }
+    })
+    try {
+      return await response.json()
+    } catch (error) {
+      return null
+    }
   }
 }
diff --git a/src/components/Comments.vue b/src/components/Comments.vue
index 6f375ce..2980c1b 100644
--- a/src/components/Comments.vue
+++ b/src/components/Comments.vue
@@ -48,7 +48,7 @@ export default {
 
     const userRole = await localStorage.getItem('user_role')
     if (userRole) this.isLoggedIn = true
-    if (userRole === 'ROLE_ADMIN') this.isAdmin = true
+    if (userRole === 'ADMIN') this.isAdmin = true
   },
   methods: {
     async postComment () {
diff --git a/src/views/Account.vue b/src/views/Account.vue
index dbcc632..95cd414 100644
--- a/src/views/Account.vue
+++ b/src/views/Account.vue
@@ -21,7 +21,7 @@
         </b-button>
 
         <b-button
-         v-if="account.role == 'ROLE_ADMIN'"
+         v-if="account.role == 'ADMIN'"
          icon-left="cctv"
          type="is-info"
          tag="router-link"
diff --git a/src/views/Admin.vue b/src/views/Admin.vue
index 505e8ce..89a20ea 100644
--- a/src/views/Admin.vue
+++ b/src/views/Admin.vue
@@ -78,7 +78,12 @@
                 {{ props.row.email }}
               </b-table-column>
 
+              <b-table-column field="role" label="Role" sortable>
+                {{ props.row.role }}
+              </b-table-column>
+
               <b-table-column label="" centered>
+                <b-button class="actionButton" icon-left="cctv" type="is-success" @click="setAdminPrompt(props.row.id, props.row.username)" outlined/>
                 <b-button class="actionButton" icon-left="delete" type="is-danger" @click="removePrompt(props.row.id, props.row.username, 'user')" outlined/>
               </b-table-column>
             </template>
@@ -195,6 +200,20 @@ export default {
           this.modelList = await api.getModelList()
         }
       })
+    },
+    setAdminPrompt (id, name) {
+      this.$buefy.dialog.confirm({
+        message: 'Set admin role for ' + name + ' ?',
+        cancelText: 'Abort',
+        confirmText: 'Set',
+        type: 'is-success',
+        hasIcon: true,
+        onConfirm: async () => {
+          await api.setAdmin(id)
+          this.$buefy.toast.open(name + ' role has been changed')
+          this.userList = await api.getUserList()
+        }
+      })
     }
   }
 }
diff --git a/src/views/Model.vue b/src/views/Model.vue
index c147cc3..bdd1839 100644
--- a/src/views/Model.vue
+++ b/src/views/Model.vue
@@ -105,7 +105,7 @@ export default {
     if (parseInt(userId) === this.model.author.id) this.isAuthor = true
 
     const userRole = await localStorage.getItem('user_role')
-    if (userRole === 'ROLE_ADMIN') this.isAuthor = true
+    if (userRole === 'ADMIN') this.isAuthor = true
 
     this.downloadUrl = this.$serverurl + 'models/download?id=' + this.model.id
   },
-- 
GitLab