Advertisement
Halakul

Untitled

Jun 21st, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. export default class ResourceConsumption {
  2.  
  3.   //@ngInject
  4.   constructor($resource, $http, vpcDomainConsumptionAuth, TokenStore) {
  5.     this.$http = $http;
  6.  
  7.     this.vpcDomainConsumptionAuth = vpcDomainConsumptionAuth;
  8.     this.TokenStore = TokenStore;
  9.  
  10.     this.UUID_ANCHOR = 'UUID_FIELD';
  11.  
  12.     const URL = `/v1/resource/sel_project/${this.UUID_ANCHOR}/metric/:type/measures`;
  13.     const PARAMS = {
  14.       uuid: '@uuid',
  15.       type: '@type'
  16.     };
  17.     let ACTIONS = {
  18.       query: {
  19.         method: 'GET',
  20.         isArray: true
  21.       },
  22.       getResourceInfo: {
  23.         method: 'GET',
  24.         url: `/v1/resource/sel_project/${this.UUID_ANCHOR}`
  25.       }
  26.     };
  27.  
  28.     this.prepareActions(ACTIONS);
  29.  
  30.     return $resource(URL, PARAMS, ACTIONS);
  31.   }
  32.  
  33.   prepareActions(actions) {
  34.     let that = this;
  35.  
  36.     Object.keys(actions).forEach(key => {
  37.       let action = actions[key];
  38.       let then = action.then;
  39.  
  40.       action.interceptor = {
  41.         responseError: (resp) => {
  42.           if (resp.status !== 401) return resp;
  43.           const projectId = this.parseUuid(action.url, resp.config.url);
  44.  
  45.           return this.TokenStore.requestResellToken({projectId}, true, false)
  46.             .then(token => {
  47.               return this.$http({
  48.                 method: resp.config.method,
  49.                 url: resp.config.url,
  50.                 headers: {
  51.                   'X-Auth-Token': token
  52.                 }
  53.               })
  54.             });
  55.         }
  56.       };
  57.  
  58.  
  59.       // action выполняется только после выполнения then.
  60.       action.then = function (resolve, reject) {
  61.         let infoPromise = that.vpcDomainConsumptionAuth.getInfo();
  62.         let tokenPromise = that.TokenStore.requestResellToken({projectId: this.params.uuid}, false, false);
  63.  
  64.         return Promise.all([infoPromise, tokenPromise]).then(
  65.           ([{url}, token]) => {
  66.             let uuid = this.params.uuid;
  67.             delete this.params.uuid;
  68.  
  69.             this.url = url + this.url.replace(that.UUID_ANCHOR, uuid);
  70.             this.headers = Object.assign(this.headers, {'X-Auth-Token': token + '1'});
  71.             // Конструкция this.then = then || null позволяет выполнить заданный ранее then и избежать зацикливания.
  72.             this.then = then || null;
  73.             resolve(this);
  74.           },
  75.           reject);
  76.       }
  77.     });
  78.  
  79.     return actions;
  80.   }
  81.  
  82.   parseUuid(mask, url) {
  83.     const position = mask.indexOf(this.UUID_ANCHOR);
  84.     const maskPieces = mask.split(this.UUID_ANCHOR);
  85.  
  86.     switch (position) {
  87.       case 0:
  88.         return url.split(maskPieces[1])[0];
  89.       case mask.length - this.UUID_ANCHOR.length:
  90.         return url.split(maskPieces[0])[1];
  91.       default:
  92.         return url.split(maskPieces[1])[0].split(maskPieces[0])[1];
  93.     }
  94.   }
  95.  
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement