From 95e9d9c3f0b20186fb737376c9330eb80a7ca8de Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Wed, 21 Sep 2022 10:53:25 +0000
Subject: [PATCH] Biest #994

Closes #994 and #1551

Merge request studip/studip!999
---
 resources/vue/courseware-dashboard-app.js     |  5 +--
 resources/vue/courseware-index-app.js         |  5 +--
 resources/vue/courseware-manager-app.js       |  4 ++-
 .../vue/store/courseware/courseware.module.js | 31 +++++++++++++++----
 4 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/resources/vue/courseware-dashboard-app.js b/resources/vue/courseware-dashboard-app.js
index 608341b8897..5ddaf344ff1 100644
--- a/resources/vue/courseware-dashboard-app.js
+++ b/resources/vue/courseware-dashboard-app.js
@@ -5,7 +5,7 @@ import CoursewareModule from './store/courseware/courseware.module';
 import CoursewareStructureModule from './store/courseware/structure.module';
 import axios from 'axios';
 
-const mountApp = (STUDIP, createApp, element) => {
+const mountApp = async (STUDIP, createApp, element) => {
     const getHttpClient = () =>
         axios.create({
             baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true),
@@ -42,6 +42,7 @@ const mountApp = (STUDIP, createApp, element) => {
                     'folders',
                     'users',
                     'institutes',
+                    'institute-memberships',
                     'semesters',
                     'sem-classes',
                     'sem-types',
@@ -68,7 +69,7 @@ const mountApp = (STUDIP, createApp, element) => {
     }
 
     store.dispatch('setUserId', STUDIP.USER_ID);
-    store.dispatch('users/loadById', { id: STUDIP.USER_ID });
+    await store.dispatch('users/loadById', { id: STUDIP.USER_ID });
     store.dispatch('setHttpClient', httpClient);
     store.dispatch('coursewareContext', {
         id: entry_id,
diff --git a/resources/vue/courseware-index-app.js b/resources/vue/courseware-index-app.js
index 3d95d7dcd81..e39d053b966 100644
--- a/resources/vue/courseware-index-app.js
+++ b/resources/vue/courseware-index-app.js
@@ -9,7 +9,7 @@ import Vuex from 'vuex';
 import axios from 'axios';
 import { mapResourceModules } from '@elan-ev/reststate-vuex';
 
-const mountApp = (STUDIP, createApp, element) => {
+const mountApp = async (STUDIP, createApp, element) => {
     const getHttpClient = () =>
         axios.create({
             baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true),
@@ -105,6 +105,7 @@ const mountApp = (STUDIP, createApp, element) => {
                     'status-groups',
                     'users',
                     'institutes',
+                    'institute-memberships',
                     'semesters',
                     'sem-classes',
                     'sem-types',
@@ -117,7 +118,7 @@ const mountApp = (STUDIP, createApp, element) => {
 
     store.dispatch('setUrlHelper', STUDIP.URLHelper);
     store.dispatch('setUserId', STUDIP.USER_ID);
-    store.dispatch('users/loadById', {id: STUDIP.USER_ID});
+    await store.dispatch('users/loadById', {id: STUDIP.USER_ID});
     store.dispatch('setHttpClient', httpClient);
 
     store.dispatch('coursewareContext', {
diff --git a/resources/vue/courseware-manager-app.js b/resources/vue/courseware-manager-app.js
index fccea2beb5e..8d6454a3a37 100644
--- a/resources/vue/courseware-manager-app.js
+++ b/resources/vue/courseware-manager-app.js
@@ -6,7 +6,7 @@ import axios from 'axios';
 import { mapResourceModules } from '@elan-ev/reststate-vuex';
 
 
-const mountApp = (STUDIP, createApp, element) => {
+const mountApp = async (STUDIP, createApp, element) => {
     const getHttpClient = () =>
         axios.create({
             baseURL: STUDIP.URLHelper.getURL(`jsonapi.php/v1`, {}, true),
@@ -41,6 +41,7 @@ const mountApp = (STUDIP, createApp, element) => {
                     'status-groups',
                     'users',
                     'institutes',
+                    'institute-memberships',
                     'semesters',
                     'sem-classes',
                     'sem-types',
@@ -69,6 +70,7 @@ const mountApp = (STUDIP, createApp, element) => {
 
     store.dispatch('setUrlHelper', STUDIP.URLHelper);
     store.dispatch('setUserId', STUDIP.USER_ID);
+    await store.dispatch('users/loadById', {id: STUDIP.USER_ID});
     store.dispatch('setHttpClient', httpClient);
     store.dispatch('coursewareContext', {
         id: entry_id,
diff --git a/resources/vue/store/courseware/courseware.module.js b/resources/vue/store/courseware/courseware.module.js
index a211103ffcf..f8387604d60 100644
--- a/resources/vue/store/courseware/courseware.module.js
+++ b/resources/vue/store/courseware/courseware.module.js
@@ -1075,20 +1075,39 @@ export const actions = {
     },
 
     async loadTeacherStatus({ dispatch, rootGetters, state, commit, getters }, userId) {
-        let user = rootGetters['users/byId']({ id: userId });
-        if (!user) {
-            await dispatch('users/loadById', { id: userId });
-            user = rootGetters['users/byId']({ id: userId });
-        }
+        const user = rootGetters['users/byId']({ id: userId });
 
         if (user.attributes.permission === 'root') {
             commit('setUserIsTeacher', true);
             return;
         }
+        if (user.attributes.permission === 'admin') {
+            await dispatch('courses/loadById', { id: state.context.id });
+            const course = rootGetters['courses/byId']({id: state.context.id });
+            const instituteId = course.relationships.institute.data.id;
+
+            const parent = { type: 'users', id: `${userId}` };
+            const relationship = 'institute-memberships';
+            const options = {};
+            await dispatch('institute-memberships/loadRelated', { parent, relationship, options }, { root: true });
+            const instituteMemberships = rootGetters['institute-memberships/all'];
+            const instituteMembership = instituteMemberships.filter(membership => membership.relationships.institute.data.id === instituteId);
+
+            if (instituteMembership.length > 0 && instituteMembership[0].attributes.permission === 'admin') {
+                commit('setUserIsTeacher', true);
+                return;
+            }
+        }
 
         const membershipId = `${state.context.id}_${userId}`;
+        try {
+            await dispatch('course-memberships/loadById', { id: membershipId });
+        } catch (error) {
+            console.error(`Could not find course membership for ${membershipId}.`);
+            commit('setUserIsTeacher', false);
 
-        await dispatch('course-memberships/loadById', { id: membershipId });
+            return false;
+        }
         const membership = rootGetters['course-memberships/byId']({ id: membershipId });
         if (membership) {
             let editingLevel = 'tutor';
-- 
GitLab