Mise en cache Graph Shared Computer Toolkit Microsoft

L’Graph Shared Computer Toolkit Microsoft prend en charge la mise en cache de certains appels API Graph Microsoft. Les appels sont mis en cache par entité, par exemple les personnes, les contacts, les photos. Cela permet à un composant de récupérer les données et d’autres composants de les réutiliser sans appeler Microsoft Graph.

Conseil

Pour plus d’informations sur les entités mises en cache par chaque composant, voir la documentation du composant.

Les bases de données créées par mgt pour la mise en cache sont précédées du préfixe mgt-. Les données de chaque entité sont stockées dans un magasin d’objets distinct. Pour inspecter le cache, utilisez l’onglet Application dans le panneau développeur (outils F12) : sous la section Stockage, cliquez sur l’onglet IndexedDB.

devtools indexedDB

Configuration du cache

Vous pouvez lire et écrire les options de cache via l’objet de classe CacheService.config statique. Il est formaté comme indiqué.

let config = {
  defaultInvalidationPeriod: number,
  isEnabled: boolean,
  people: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  photos: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  users: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  presence: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  groups: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  response: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  files: {
    invalidationPeriod: number,
    isEnabled: boolean
  },
  fileLists: {
    invalidationPeriod: number,
    isEnabled: boolean
  }
};

Les périodes d’invalidation de cache individuelles null sont par défaut dans l’objet de config et defaultInvalidationPeriod la valeur générale par défaut est 3 600 000 ms (60 minutes). N’importe quelle valeur passée dans config.x.invalidationPeriod remplacera defaultInvalidationPeriod.

Le magasin de présence est la seule exception et a une valeur par défaut de 300 000 ms, soit 5 minutes.

Exemples

Pour désactiver individuellement un magasin, isEnabled définissez simplement la valeur des propriétés de la config de ce magasin sur false :

import { CacheService } from '@microsoft/mgt';

CacheService.config.users.isEnabled = false;

La désactivation du cache n’effacera pas le cache.

La modification de la période d’invalidation est similaire :

import { CacheService } from '@microsoft/mgt';

CacheService.config.users.invalidationPeriod = 1800000;

Effacement du cache

Le cache est automatiquement effacé lorsque l’utilisateur se dénexe. Il peut également être effacé manuellement.

Plus vous effacerez tous les magasins dans le cache, clearCaches() CacheService plus la méthode de la classe effacera toutes les magasins conservées par CacheService.

import { CacheService } from '@microsoft/mgt';

CacheService.clearCaches();

Création de vos propres magasins de cache

Si vous souhaitez créer et remplir vos propres magasins de cache pour vos composants personnalisés, vous pouvez utiliser la CacheService classe statique.

CacheService.getCache(schema: CacheSchema, storeName: String);

Remarque : Le storeName référencement dans l’appel doit getCache() correspondre à l’un des magasins répertoriés dans votre CacheSchema objet.

L’objet CacheSchema est un dictionnaire avec les paires clé/valeur.

import { CacheSchema } from '@microsoft/mgt';
const cacheSchema: CacheSchema = {
  name: string,
  stores: {
    store1: {},
    store2: {},
    ...
  },
  version: number
};

L’exemple suivant illustre l’implémentation du cache.

import { CacheItem, CacheSchema, CacheService, CacheStore } from '@microsoft/mgt';

const cacheSchema: CacheSchema = {
  name: 'users',
  stores: {
    users: {},
    usersQuery: {}
  },
  version: 1
};

interface CacheUser extends CacheItem {
  user?: string;
}

// retrieves invalidation time from cache config
const getUserInvalidationTime = (): number =>
  CacheService.config.users.invalidationPeriod || CacheService.config.defaultInvalidationPeriod;

// checks for if cache is enabled
const usersCacheEnabled = (): boolean => CacheService.config.users.isEnabled && CacheService.config.isEnabled;

// declare the desired cache store
let cache: CacheStore<CacheUser>

// check if the cache is enabled
if (usersCacheEnabled()) {
  cache = CacheService.getCache<CacheUser>(cacheSchema, 'users');
  const user = await cache.getValue(query);

  // check if an item is retrieved, and if it's not expired
  if (user && getUserInvalidationTime() > Date.now() - user.timeCached) {
    return JSON.parse(user.user);
  }
}

// graph call
const graphRes = graph
  .api('me')
  .middlewareOptions(prepScopes('user.read'))
  .get();

// store graph result into the cache if cache is enabled
if (usersCacheEnabled()) {
  cache.putValue(userId, { user: JSON.stringify(graphRes) });
}