All files / lib/aws-operations mobile-project-export-manager.js

25.53% Statements 12/47
0% Branches 0/20
0% Functions 0/8
25.53% Lines 12/47
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92                          11x 11x 11x 11x 11x   11x 11x 11x 11x 11x 11x                                                                                                                                 11x    
/* 
 * Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is located at
 *
 *     http://aws.amazon.com/apache2.0/
 *
 * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
 * and limitations under the License.
*/
"use strict";
const fs = require('fs-extra')
const https = require('https')
const chalk = require('chalk')
const ora = require('ora')
const extract = require('extract-zip')
 
const awsConfigManager = require('./aws-config-manager.js')
const awsClient = require('./aws-client.js')
const awsExceptionHandler = require('./aws-exception-handler.js')
const dfops = require('../utils/directory-file-ops.js')
const pathManager = require('../utils/awsmobilejs-path-manager.js')
const awsmobileJSConstant = require('../utils/awsmobilejs-constant.js')
 
function retrieveYaml(projectInfo, callback) {
    if(projectInfo){
        if(projectInfo.BackendProjectID && projectInfo.BackendProjectID.length > 0){
            awsConfigManager.checkAWSConfig(function(awsDetails){
                let mobile = awsClient.Mobile(awsDetails)
                let param = {
                    projectId: projectInfo.BackendProjectID
                }
                let spinner = ora('retrieving backend project specification')
                spinner.start()
                mobile.exportProject(param, function(err,data){
                    spinner.stop()
                    if(err){
                        console.log(chalk.red('failed to retrieve yaml for project ' + projectInfo.BackendProjectName))
                        awsExceptionHandler.handleMobileException(err)
                    }else{
                        if(data && data.downloadUrl){
                            downloadCurrentBackendProjectSpec(data.downloadUrl, projectInfo, callback)
                        }else{
                            console.log(chalk.red('no backend project yaml available'))
                            if(callback){
                                callback()
                            }
                        }
                    }
                })
            })
        }else{
            console.log(chalk.red('backend project unknown'))
        }
    }
}
 
function downloadCurrentBackendProjectSpec(downloadUrl, projectInfo, callback) { 
    let tempExtractDirPath = pathManager.getYmlExtractTempDirPath(projectInfo.ProjectPath)
    let tempZipFilePath = pathManager.getYmlTempZipFilePath(projectInfo.ProjectPath)
    let tempZipFile = fs.createWriteStream(tempZipFilePath)
    let request = https.get(downloadUrl, function(response) {
        response.pipe(tempZipFile)
        .on('close',()=>{
            extract(tempZipFilePath, {dir: tempExtractDirPath}, function (err) {
                let ymlFilePath = dfops.findFile(tempExtractDirPath, awsmobileJSConstant.BackendProjectYamlFileName)
                if(ymlFilePath){
                    let destinationPath = pathManager.getCurrentBackendYamlFilePath(projectInfo.ProjectPath)
                    fs.copy(ymlFilePath, destinationPath, function (err) {
                        if (err) {
                            console.log(chalk.red('Failed to retrive project yml file: ' + err.message.trim()))
                        }else{
                            console.log('awsmobile project\'s specifications logged at: ' + 
                            chalk.blue(pathManager.getCurrentBackendYamlFilePath_Relative(projectInfo.ProjectPath)))
                            fs.removeSync(tempExtractDirPath) 
                            fs.removeSync(tempZipFilePath)
                            if(callback){
                                callback()
                            }
                        }
                    })
                }
            })
        })
    })
}
 
module.exports = {
    retrieveYaml
}