Wir haben euch in einem vorigen Blogbeitrag SharePoint Berechtigungskonzept vereinfacht darstellen und verwalten gezeigt, wie wir Berechtigungen eines SharePoint-Projekts in unserem Excel Add-in „Management 4 SharePoint“ abbilden. Sobald wir allerdings große Projektstrukturen mit vielen Listen- und Ordnerberechtigungen verwalten mussten, lief unser Excel Add-in in ein Timeout. In diesem Beitrag teilen wir die Ursachen und unsere Lösung.
Ursachen des Timeout-Problems
Früher haben wir die Berechtigungen für alle Listen, Ordner und Rollen in einer flachen Liste in unserem Redux-State gespeichert. Im Permission-Objekt hielten wir die ID der Liste oder des Ordners (itemId), die ID der Rolle (groupId) sowie den Berechtigungswert (value) fest.
Datenmodell im Redux-State
export interface IPermission {
id: string;
value: PermissionType;
itemId: string;
groupId: string;
}
Wir speicherten die Berechtigungen in einem NormalizedObject-Format. Das Property byId enthielt alle Objekte, allIds listete deren IDs.
const initialState: INormalizedObject<IPermission> = {
byId: {},
allIds: [],
};
Performance-Kosten beim Schreiben
Mussten wir neue Berechtigungen im State speichern, erzeugten wir jedes Mal ein neues State-Objekt mit den hinzugefügten Einträgen:
function reduceAddPermissions(
state: INormalizedObject<IPermission>,
action: IAddPermissionsAction
): INormalizedObject<IPermission> {
const newPermissions: { [id: string]: IPermission } = {};
const newPermissionIds: string[] = [];
action.payload.forEach(permission => {
newPermissions[permission.id] = permission;
newPermissionIds.push(permission.id);
});
return {
byId: {
...state.byId,
...newPermissions,
},
allIds: [...state.allIds, ...newPermissionIds],
};
}
Ab etwa 6.000 Berechtigungen lief unser Excel Add-in aufgrund des immer größer werdenden States in ein Timeout. Für große SharePoint-Projektstrukturen war der Ansatz daher ungeeignet. Zusätzlich erforderten Anfragen eine ineffiziente Filterung über alle Berechtigungen hinweg:
const allPermissions: IPermission[] = Object.values(
(state.entities.permissions as INormalizedObject<IPermission>).byId
);
const permission = allPermissions.find(
entry => entry.itemId === list.id && entry.groupId === group.id
);
Lösung für viele Listen- und Ordnerberechtigungen
Um das Timeout-Problem zu lösen, haben wir die Speicherung komplett umgebaut und anstelle der flachen Liste eine Berechtigungsmatrix eingeführt. Diese besteht aus einem Array von Integer-Arrays. Für jede Liste oder jeden Ordner fügen wir ein Integer-Array hinzu, das die Berechtigungswerte pro Rolle enthält:
- 1 = Read
- 2 = Write
- 3 = Read + Write
- 4 = Delete
- 5 = Read + Delete
- 6 = Write + Delete
- 7 = Read + Write + Delete

Dadurch können wir Berechtigungen indiziert auslesen und sparen uns Filteroperationen über große Arrays.
export function getPermission(
list: IList,
groupIndex: number,
permissionMatrix: number[][],
appState: AppState
): number {
const globalListIndex = getGlobalListIndex(list.id, appState);
return permissionMatrix[globalListIndex][groupIndex];
}
Wir müssen lediglich die Position der abgefragten Liste berechnen und können anschließend mit einem Indexer die Berechtigung der gewünschten Gruppe auslesen. Die Berechtigungsmatrix löst nicht nur das Timeout-Problem für große SharePoint-Strukturen, sondern erhöht die Performance der gesamten Berechtigungsverwaltung in unserem Excel Add-in deutlich.
Hast du noch Fragen zu unserem Excel Add-in? Dann kontaktiere uns gern!