Advertisement
Guest User

Untitled

a guest
Aug 10th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.   sendFile(modelForm: any, form?: any) {
  3.  
  4.     // tudo que esta em this.appService, são serviços que retorna um obsevable do http do angular.
  5.  
  6.     // aqui eu começo convertendo o objeto do arquivo que pego do input
  7.     this.appService.convertFile(this.objFile)
  8.       .map(response => {
  9.         // o retorno de convertFile eu apenas monto essa estrutura mountData e coloco o arquivo em base64 em mountData.file.
  10.         let mountData = {
  11.           'file': response,
  12.           'terms': []
  13.         };
  14.         return mountData;
  15.       })
  16.      
  17.       // o .concatMap é executado em seguida recebendo como parametro o resultado do convertFile.
  18.       .concatMap(mountData => {
  19.         // novamente eu utilizo outro serviço que faz um GET, eu pego a lista de termos de uma determinada coleção.
  20.         return this.ciService.objectList('instance_ci_terms', 'collection_id=' + this.collectionChecked)
  21.           .map(
  22.             terms => {
  23.               // a lista de termos retornada do GET eu apenas insiro dentro de mountData.terms e retorno ela para o proximo concatMap.
  24.               mountData.terms = terms;
  25.               return mountData;
  26.             });
  27.       })
  28.  
  29.       // aqui novamente só vai ser executada depois do anterior finalizar e passar o retorno.
  30.       .concatMap(mountData => {
  31.         // aqui eu chamo o metodo que criei que vai pegar todos os termos que tem dentro de mountData.terms, e fazer um GET para pegar                 
  32.            todos os subtermos de cada termo.
  33.         return this.mountTermsSubterms(mountData);
  34.  
  35.       })
  36.    
  37.       // novamente vai receber o mountData com o arquivo em base64 e todos os terms e seus subtermos.
  38.       .concatMap(mountData => {
  39.         // novamente eu chamo o convertFile para converter nosso mountData, agora como ele não é um objeto file, então o segundo    
  40.             parametro tem que ser false.
  41.         return this.appService.convertFile(mountData, false);
  42.       })
  43.  
  44.       // Ao finalizar todo esse processo, chamaremos o Serviço de upload de arquivo.
  45.       .concatMap(response => {
  46.         // esse metodo getNewName só pega o nome atual do arquivo e insere um timestamp entre o nome e a ext.
  47.         let fileName = this.config.getNewName(this.objFile.name);
  48.         return this.appService.uploadFile(response, fileName);
  49.       })
  50.  
  51.       // para isso tudo funcionar eu preciso rodar o subscribe e ver foi tudo ok ou se aconteceu algum error durante esse processo.
  52.       .subscribe(
  53.         data => {
  54.  
  55.           this.messageService.success('Arquivo enviado com sucesso.');
  56.         },
  57.         error => {
  58.  
  59.           this.messageService.error('Ocorreu algum problema na durante o envio do arquivo.');
  60.           console.log(error, 'Error inside of sendFile');
  61.  
  62.         }
  63.       );
  64.   }
  65.  
  66.  
  67.  
  68.  
  69. // esse metodo pega uma lista de terms e monta ele da forma que a api aceita.
  70. ex:
  71. entrada: mountData = {
  72.   file: 'base64',
  73.   terms: [{obj term}, {obj term}, {obj term}]
  74. }
  75.  
  76. raida: mountData = {
  77.   file: 'base64',
  78.   terms: [
  79.     {
  80.       term_name: [
  81.         subterm_name,
  82.         subterm_name
  83.       ]
  84.     },
  85.     {
  86.       term_name: [
  87.         subterm_name,
  88.         subterm_name
  89.       ]
  90.     }
  91. }
  92.  
  93. mountTermsSubterms(mountData): Observable<any> {
  94.     let listTermsSubterms = []; // lista de termos montado que ira substituir os terms atuais em mountData.
  95.  
  96.     //aqui estou criando um observable que ira retornar o mountData atualizado e será finalizado apenas quando terminar os requests dos subtermos de cada termo.
  97.     let observableObj = Observable.create((observer: any) => {
  98.       Observable.from(mountData.terms).concatMap(term => {
  99.         return this.ciService.objectList('instance_ci_subterms', 'term_id=' + term['id'])
  100.         .map(
  101.           response => {
  102.             // eu mounto a estutura com o nome do termo e a lista de subtermos e retorno.
  103.  
  104.             let listSubterms = [];
  105.             for (let subterm of response) {
  106.               listSubterms.push(subterm.name);
  107.             }
  108.  
  109.             listTermsSubterms.push({[term['name']]: listSubterms});
  110.           })
  111.       })
  112.       .subscribe(
  113.         data => {
  114.           // aqui eu insiro a lista atualizada dentro do mountData
  115.           mountData.terms = listTermsSubterms;
  116.         },
  117.         error => {
  118.           console.log(error, 'Error inside of observableProcess')
  119.         },
  120.        
  121.         // esse metodo só é chamado se der tudo certo em todo processo, se der algum error ele não é chamado.
  122.         () => {
  123.           //aqui insiro o mountData atualizado para ser retornado e finalizo o observable.
  124.           observer.next(mountData);
  125.           observer.complete();
  126.         }
  127.       );
  128.     });
  129.  
  130.     return observableObj;
  131.   };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement