mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-04 04:57:51 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* global axios */
 | 
						|
import { DataManager } from '../helper/CacheHelper/DataManager';
 | 
						|
import ApiClient from './ApiClient';
 | 
						|
 | 
						|
class CacheEnabledApiClient extends ApiClient {
 | 
						|
  constructor(resource, options = {}) {
 | 
						|
    super(resource, options);
 | 
						|
    this.dataManager = new DataManager(this.accountIdFromRoute);
 | 
						|
  }
 | 
						|
 | 
						|
  // eslint-disable-next-line class-methods-use-this
 | 
						|
  get cacheModelName() {
 | 
						|
    throw new Error('cacheModelName is not defined');
 | 
						|
  }
 | 
						|
 | 
						|
  get(cache = false) {
 | 
						|
    if (cache) {
 | 
						|
      return this.getFromCache();
 | 
						|
    }
 | 
						|
 | 
						|
    return this.getFromNetwork();
 | 
						|
  }
 | 
						|
 | 
						|
  getFromNetwork() {
 | 
						|
    return axios.get(this.url);
 | 
						|
  }
 | 
						|
 | 
						|
  // eslint-disable-next-line class-methods-use-this
 | 
						|
  extractDataFromResponse(response) {
 | 
						|
    return response.data.payload;
 | 
						|
  }
 | 
						|
 | 
						|
  // eslint-disable-next-line class-methods-use-this
 | 
						|
  marshallData(dataToParse) {
 | 
						|
    return { data: { payload: dataToParse } };
 | 
						|
  }
 | 
						|
 | 
						|
  async getFromCache() {
 | 
						|
    try {
 | 
						|
      // IDB is not supported in Firefox private mode: https://bugzilla.mozilla.org/show_bug.cgi?id=781982
 | 
						|
      await this.dataManager.initDb();
 | 
						|
    } catch {
 | 
						|
      return this.getFromNetwork();
 | 
						|
    }
 | 
						|
 | 
						|
    const { data } = await axios.get(
 | 
						|
      `/api/v1/accounts/${this.accountIdFromRoute}/cache_keys`
 | 
						|
    );
 | 
						|
    const cacheKeyFromApi = data.cache_keys[this.cacheModelName];
 | 
						|
    const isCacheValid = await this.validateCacheKey(cacheKeyFromApi);
 | 
						|
 | 
						|
    let localData = [];
 | 
						|
    if (isCacheValid) {
 | 
						|
      localData = await this.dataManager.get({
 | 
						|
        modelName: this.cacheModelName,
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    if (localData.length === 0) {
 | 
						|
      return this.refetchAndCommit(cacheKeyFromApi);
 | 
						|
    }
 | 
						|
 | 
						|
    return this.marshallData(localData);
 | 
						|
  }
 | 
						|
 | 
						|
  async refetchAndCommit(newKey = null) {
 | 
						|
    const response = await this.getFromNetwork();
 | 
						|
 | 
						|
    try {
 | 
						|
      await this.dataManager.initDb();
 | 
						|
 | 
						|
      this.dataManager.replace({
 | 
						|
        modelName: this.cacheModelName,
 | 
						|
        data: this.extractDataFromResponse(response),
 | 
						|
      });
 | 
						|
 | 
						|
      await this.dataManager.setCacheKeys({
 | 
						|
        [this.cacheModelName]: newKey,
 | 
						|
      });
 | 
						|
    } catch {
 | 
						|
      // Ignore error
 | 
						|
    }
 | 
						|
 | 
						|
    return response;
 | 
						|
  }
 | 
						|
 | 
						|
  async validateCacheKey(cacheKeyFromApi) {
 | 
						|
    if (!this.dataManager.db) {
 | 
						|
      await this.dataManager.initDb();
 | 
						|
    }
 | 
						|
 | 
						|
    const cachekey = await this.dataManager.getCacheKey(this.cacheModelName);
 | 
						|
    return cacheKeyFromApi === cachekey;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export default CacheEnabledApiClient;
 |