Wir haben euch in einem vorigen Blogbeitrag SharePoint Berechtigungskonzept vereinfacht darstellen und verwalten die Verwaltung der Berechtigungen eines SharePoint-Projektes in unserem Excel Add-In (Management 4 SharePoint – das Excel-AddIn zur Verwaltung deiner SharePoint Projekte) genauer erklärt. Mussten wir allerdings große Projektstrukturen mit vielen Listen- und Ordnerberechtigungen abbilden, lief unser Excel Add-In in ein Timeout-Problem. Wir möchten in diesem Beitrag die Ursachen und Lösungen für dieses Problem mit euch teilen.

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 haben wir uns die Id auf die zugehörige Liste oder den zugehörigen Ordner (Property itemId) und die Id der Rolle (Property groupId) gespeichert. Den Berechtigungswert (Read, Write, Delete) selbst haben wir im Property value gespeichert.

export interface IPermission {
    id: string;
    value: PermissionType
    itemId: string;
    groupId: string;
}

Wir haben die Berechtigungen in einem NormalizedObject-Format im Redux-State gespeichert. Dafür haben wir im Property “byId” alle Berechtigungs-Objekte und im Property “allIds” alle Ids der Berechtigungs-Objekte gespeichert.

const initialState: INormalizedObject<IPermission> = {
    byId: {},
    allIds: [],
};

Mussten wir neue Berechtigungen im State abspeichern, wurde jedes mal ein neues State-Objekt erzeugt, mit den neu gesetzten Berechtigungen:

function reduceAddPermissions(state: INormalizedObject<IPermission>, action: IAddPermissionsAction): INormalizedObject<IPermission> {
    let newPermissions: { [id: string]: IPermission } = {};
    let newPermissionsIds: string[] = [];

    action.payload.forEach(permission => {
        newPermissions[permission.id] = permission;
        newPermissionsIds.push(permission.id);
    });

    const newState = {
        byId: {
            ...state.byId,
            ...newPermissions,
        },
        allIds: [...state.allIds, ...newPermissionsIds],
    };

    return newState;
}

Ab zirka 6.000 vorhandenen Berechtigungen lief unser Excel Add-In in ein Timeout-Problem, aufgrund des zu großen States. Daher war die aktuelle Implementierung also ungeeignet für große SharePoint-Projektstrukturen mit vielen Listen- und Ordnerberechtigungen. Ein weiterer Nachteil dieser Lösung war, dass wir bei jedem Auslesen einer Berechtigung eine inperformante Filterung auf die gesamte Liste der Berechtigungen anwenden mussten.

let allPermissions: IPermission[] = Object.values((state.entities.permissions as INormalizedObject<IPermission>).byId);
 
let permission: IPermission = allPermissions.find(permission => permission.itemId === list.id && permission.groupId === group.id);

Lösung für viele Listen- und Ordnerberechtigungen

Um das Timeout-Problem unseres Excel Add-Ins zu lösen, haben wir die Speicherung der Berechtigungen im State umgebaut. Wir speichern die Berechtigungen jetzt nicht mehr in einer flachen Liste mit den Berechtigungs-Objekten sondern haben eine Berechtigungsmatrix erstellt. Diese wird als ein Array von Integer-Arrays abgebildet. Für jede Liste und jeden Ordner fügen wir ein Integer-Array in die Matrix hinzu. Das Integer-Array selbst beinhaltet die Berechtigungswerte (1=Read, 2=Write, 3=Read+Write, 4=Delete, 5=Read+Delete, 6=Write+Delete, 7=Read+Write+Delete) für jede Rolle.

Berechtigungsmatrix
Berechtigungsmatrix

Dadurch können die Berechtigungswerte auch viel performanter ausgelesen werden, da ein indizierter Zugriff möglich ist.

export function getPermission(list: IList, groupIndex: number, permissionMatrix: number[][], appState: AppState): number {
    const globalListIndex: number = getGlobalListIndex(list.id, appState);
    return permissionMatrix[globalListIndex][groupIndex];
}

Wir müssen uns lediglich die Position der abgefragten Liste berechnen und können dann mit einem Indexer die Berechtigung der abgefragten Grupppe auslesen. Durch die Berechtigungsmatrix haben wir eine Lösung für viele Listen- und Ordnerberechtigungen gefunden und haben zusätzlich noch eine enorme Verbesserung der Performance der gesamten Berechtigungs-Verwaltung in unserem Excel Add-In erreicht.

Hast du noch weitere Fragen zu unserem Excel Add-In? Dann kontaktiere uns noch heute, indem du auf den Button klickst!

Kontakt aufnehmen