All files / lib/backend-operations ops-project.js

30.77% Statements 12/39
0% Branches 0/20
0% Functions 0/7
30.77% Lines 12/39
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 93 94 95 96 97                          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 chalk = require('chalk')
const moment = require('moment')
const ora = require('ora')
 
const backendSpecManager = require('./backend-spec-manager.js')
const backendContentManager = require('../aws-operations/mobile-api-content-generator.js')
const mobileProjectExport = require('../aws-operations/mobile-project-export-manager.js')
const awsMobileYamlOps = require('../aws-operations/mobile-yaml-ops.js')
const mobileProjectStates = require('../aws-operations/mobile-project-states.js')
const awsmobileJSConstant = require('../utils/awsmobilejs-constant.js')
const pathManager = require('../utils/awsmobilejs-path-manager.js')
 
//////////////////// build backend project ////////////////////
function build(projectInfo, backendProject, callback){
    if(isNewBuildNeeded(projectInfo)){
        console.log('   generating backend project content')
        backendContentManager.generateContents(projectInfo, backendProject, function(){
            console.log('   done')
            if(callback){
                callback(true)
            }
        })
    }else{
        if(callback){
            callback(false)
        }
    }
}
 
function isNewBuildNeeded(projectInfo){
    let result = false
 
    let backendContentZipFilePath = pathManager.getBackendContentZipFilePath(projectInfo.ProjectPath)
    if(fs.existsSync(backendContentZipFilePath)){
 
        let lastBackendBuildTime = moment(projectInfo.BackendLastBuildTime, awsmobileJSConstant.DateTimeFormatString)
        let lastBackendSpecModificationTime = moment(backendSpecManager.getLastModificationTime(projectInfo))
        let lastBackendBuildZipFileMTime = moment(fs.lstatSync(backendContentZipFilePath).mtime)
 
        result =!lastBackendBuildTime.isValid() || 
                !lastBackendSpecModificationTime.isValid() ||
                !lastBackendBuildZipFileMTime.isValid() ||
                lastBackendBuildZipFileMTime.isBefore(lastBackendSpecModificationTime) ||
                lastBackendBuildTime.isBefore(lastBackendSpecModificationTime) ||
                lastBackendBuildTime.isBefore(lastBackendBuildZipFileMTime) //user manually changed build
    }else{
        result = true
    }
 
    return result
}
 
//////////////////// sync backend project ////////////////////
function syncCurrentBackendInfo(projectInfo, backendDetails, awsDetails, callback){
    mobileProjectExport.retrieveYaml(projectInfo, function(){
        let currentBackendYamlFilePath = pathManager.getCurrentBackendYamlFilePath(projectInfo.ProjectPath)
        let backendProject = awsMobileYamlOps.readYamlFileSync(currentBackendYamlFilePath)
        if(callback){
            callback(backendProject)
        }
    })
}
 
function syncToDevBackend(projectInfo, backendProject, enabledFeatures){
    backendSpecManager.setBackendProjectObject(backendProject, projectInfo)
}
 
//////////////////// backend project state check ////////////////////
function isInNormalState(backendDetails){
    let result = false
    if(backendDetails && backendDetails.state){
        result = backendDetails.state == 'NORMAL'
    }
    return result
}
 
module.exports = {
    build,
    syncCurrentBackendInfo,
    syncToDevBackend, 
    isInNormalState
}