Skip to content
11 changes: 11 additions & 0 deletions api/fe.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const { generateScript } = require('../forward_engineering/api/generateScript');
const { generateViewScript } = require('../forward_engineering/api/generateViewScript');
const { generateContainerScript } = require('../forward_engineering/api/generateContainerScript');
const { isDropInStatements } = require('../forward_engineering/api/isDropInStatements');

module.exports = {
generateScript,
generateViewScript,
generateContainerScript,
isDropInStatements,
};
1 change: 1 addition & 0 deletions esbuild.package.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const RELEASE_FOLDER_PATH = path.join(DEFAULT_RELEASE_FOLDER_PATH, `${packageDat
esbuild
.build({
entryPoints: [
path.resolve(__dirname, 'api', 'fe.js'),
path.resolve(__dirname, 'forward_engineering', 'api.js'),
path.resolve(__dirname, 'forward_engineering', 'ddlProvider.js'),
path.resolve(__dirname, 'forward_engineering', 'dbtProvider.js'),
Expand Down
118 changes: 14 additions & 104 deletions forward_engineering/api.js
Original file line number Diff line number Diff line change
@@ -1,107 +1,17 @@
const { commentDropStatements } = require('./helpers/commentDropStatements');
const { DROP_STATEMENTS } = require('./helpers/constants');
const { connect, getExternalBrowserUrl } = require('../reverse_engineering/api');
const { logInfo } = require('../reverse_engineering/helpers/logInfo');
const applyToInstanceHelper = require('./helpers/applyToInstanceHelper');
const { applyToInstance } = require('./api/applyToInstance');
const { generateContainerScript } = require('./api/generateContainerScript');
const { generateScript } = require('./api/generateScript');
const { generateViewScript } = require('./api/generateViewScript');
const { getExternalBrowserUrl } = require('./api/getExternalBrowserUrl');
const { isDropInStatements } = require('./api/isDropInStatements');
const { testConnection } = require('./api/testConnection');

module.exports = {
generateScript(data, logger, callback, app) {
try {
const {
getAlterContainersScripts,
getAlterCollectionsScripts,
getAlterViewScripts,
} = require('./helpers/alterScriptFromDeltaHelper');

const collection = JSON.parse(data.jsonSchema);
if (!collection) {
throw new Error(
'"comparisonModelCollection" is not found. Alter script can be generated only from Delta model',
);
}

const containersScripts = getAlterContainersScripts(collection, app, data.options);
const collectionsScripts = getAlterCollectionsScripts(collection, app, data.options);
const viewScripts = getAlterViewScripts(collection, app, data.options);
const script = [...containersScripts, ...collectionsScripts, ...viewScripts].join('\n\n');

const applyDropStatements = data.options?.additionalOptions?.some(
option => option.id === 'applyDropStatements' && option.value,
);
callback(null, applyDropStatements ? script : commentDropStatements(script));
} catch (error) {
logger.log(
'error',
{ message: error.message, stack: error.stack },
'Azure Synapse Forward-Engineering Error',
);

callback({ message: error.message, stack: error.stack });
}
},
generateViewScript(data, logger, callback, app) {
callback(new Error('Forward-Engineering of delta model on view level is not supported'));
},
generateContainerScript(data, logger, callback, app) {
try {
data.jsonSchema = data.collections[0];
this.generateScript(data, logger, callback, app);
} catch (error) {
logger.log(
'error',
{ message: error.message, stack: error.stack },
'Azure Synapse Server Forward-Engineering Error',
);

callback({ message: error.message, stack: error.stack });
}
},
isDropInStatements(data, logger, callback, app) {
try {
const cb = (error, script = '') =>
callback(
error,
DROP_STATEMENTS.some(statement => script.includes(statement)),
);

if (data.level === 'container') {
this.generateContainerScript(data, logger, cb, app);
} else {
this.generateScript(data, logger, cb, app);
}
} catch (e) {
callback({ message: e.message, stack: e.stack });
}
},

async testConnection(connectionInfo, logger, callback, app) {
try {
logInfo('Test connection', connectionInfo, logger);
if (connectionInfo.authMethod === 'Azure Active Directory (MFA)') {
await getExternalBrowserUrl(connectionInfo, logger, callback);
} else {
await connect(connectionInfo, logger);
}
callback(null);
} catch (error) {
logger.log('error', { message: error.message, stack: error.stack, error }, 'Test connection');
callback({ message: error.message, stack: error.stack });
}
},

async applyToInstance(connectionInfo, logger, callback, app) {
logger.clear();
logInfo('Apply To Instance', connectionInfo, logger);

try {
await applyToInstanceHelper.applyToInstance(connectionInfo, logger, app);
callback(null);
} catch (error) {
callback(error);
}
},

async getExternalBrowserUrl(connectionInfo, logger, cb, app) {
return getExternalBrowserUrl(connectionInfo, logger, cb, app);
},
applyToInstance,
generateContainerScript,
generateScript,
generateViewScript,
getExternalBrowserUrl,
isDropInStatements,
testConnection,
};
18 changes: 18 additions & 0 deletions forward_engineering/api/applyToInstance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const applyToInstanceHelper = require('../helpers/applyToInstanceHelper');
const { logInfo } = require('../../reverse_engineering/helpers/logInfo');

async function applyToInstance(connectionInfo, logger, callback, app) {
logger.clear();
logInfo('Apply To Instance', connectionInfo, logger);

try {
await applyToInstanceHelper.applyToInstance(connectionInfo, logger, app);
callback(null);
} catch (error) {
callback(error);
}
}

module.exports = {
applyToInstance,
};
20 changes: 20 additions & 0 deletions forward_engineering/api/generateContainerScript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const { generateScript } = require('./generateScript');

function generateContainerScript(data, logger, callback, app) {
try {
data.jsonSchema = data.collections[0];
generateScript(data, logger, callback, app);
} catch (error) {
logger.log(
'error',
{ message: error.message, stack: error.stack },
'Azure Synapse Server Forward-Engineering Error',
);

callback({ message: error.message, stack: error.stack });
}
}

module.exports = {
generateContainerScript,
};
35 changes: 35 additions & 0 deletions forward_engineering/api/generateScript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const {
getAlterContainersScripts,
getAlterCollectionsScripts,
getAlterViewScripts,
} = require('../helpers/alterScriptFromDeltaHelper');
const { commentDropStatements } = require('../helpers/commentDropStatements');

function generateScript(data, logger, callback, app) {
try {
const collection = JSON.parse(data.jsonSchema);
if (!collection) {
throw new Error(
'"comparisonModelCollection" is not found. Alter script can be generated only from Delta model',
);
}

const containersScripts = getAlterContainersScripts(collection, app, data.options);
const collectionsScripts = getAlterCollectionsScripts(collection, app, data.options);
const viewScripts = getAlterViewScripts(collection, app, data.options);
const script = [...containersScripts, ...collectionsScripts, ...viewScripts].join('\n\n');

const applyDropStatements = data.options?.additionalOptions?.some(
option => option.id === 'applyDropStatements' && option.value,
);
callback(null, applyDropStatements ? script : commentDropStatements(script));
} catch (error) {
logger.log('error', { message: error.message, stack: error.stack }, 'Azure Synapse Forward-Engineering Error');

callback({ message: error.message, stack: error.stack });
}
}

module.exports = {
generateScript,
};
7 changes: 7 additions & 0 deletions forward_engineering/api/generateViewScript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function generateViewScript(data, logger, callback, app) {
callback(new Error('Forward-Engineering of delta model on view level is not supported'));
}

module.exports = {
generateViewScript,
};
9 changes: 9 additions & 0 deletions forward_engineering/api/getExternalBrowserUrl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const revEngApi = require('../../reverse_engineering/api');

async function getExternalBrowserUrl(connectionInfo, logger, cb, app) {
return revEngApi.getExternalBrowserUrl(connectionInfo, logger, cb, app);
}

module.exports = {
getExternalBrowserUrl,
};
25 changes: 25 additions & 0 deletions forward_engineering/api/isDropInStatements.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const { DROP_STATEMENTS } = require('../helpers/constants');
const { generateContainerScript } = require('./generateContainerScript');
const { generateScript } = require('./generateScript');

function isDropInStatements(data, logger, callback, app) {
try {
const cb = (error, script = '') =>
callback(
error,
DROP_STATEMENTS.some(statement => script.includes(statement)),
);

if (data.level === 'container') {
generateContainerScript(data, logger, cb, app);
} else {
generateScript(data, logger, cb, app);
}
} catch (e) {
callback({ message: e.message, stack: e.stack });
}
}

module.exports = {
isDropInStatements,
};
21 changes: 21 additions & 0 deletions forward_engineering/api/testConnection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const { logInfo } = require('../../reverse_engineering/helpers/logInfo');
const { getExternalBrowserUrl, connect } = require('../../reverse_engineering/api');

async function testConnection(connectionInfo, logger, callback, app) {
try {
logInfo('Test connection', connectionInfo, logger);
if (connectionInfo.authMethod === 'Azure Active Directory (MFA)') {
await getExternalBrowserUrl(connectionInfo, logger, callback);
} else {
await connect(connectionInfo, logger);
}
callback(null);
} catch (error) {
logger.log('error', { message: error.message, stack: error.stack, error }, 'Test connection');
callback({ message: error.message, stack: error.stack });
}
}

module.exports = {
testConnection,
};
Loading