/* --Description :cloud function called to copy app from default db */ //-- Export Modules import mongoose from 'mongoose'; import { _SCHEMASchema } from '../models/schemaClass.js'; import { _RoleSchema } from '../models/RoleClass.js'; import { _RolejoinSchema } from '../models/RoleJoin.js'; import { _UserjoinSchema } from '../models/UserJoin.js'; import { w_appinfoSchema } from '../models/appInfoclass.js'; import { w_formV3Schema } from '../models/w_formv3class.js'; import { w_menuSchema } from '../models/w_menuclass.js'; import { w_reportSchema } from '../models/w_reportclass.js'; import { DashboardSchema } from '../models/w_dashboardclass.js'; import { DBFunctionSchema } from '../models/DBFunctionClass.js'; import { orgAppsSchema } from '../models/orgApps.js'; import axios from 'axios'; export async function InstallApp(request) { try { // console.log("sess ", request) //--function to get the userid from session token const sess = request.headers['sessiontoken']; const serverUrl = process.env.SERVER_URL; const appId = process.env.APP_ID; const user = await axios.get(serverUrl + '/users/me', { headers: { 'X-Parse-Application-Id': appId, 'X-Parse-Session-Token': sess, }, }); if (user.data && user.data.objectId) { var originalappname = request.params.appname; var appname = originalappname + '_'; //externalInstallation should be true for migrate from server2 to server3 data //externalInstallation should be false for migrate from default db to client db data const externalInstallation = request.params.externalSrc; // var chkbaseurl = request.params.baseurl; // console.log('baseurl ' + chkbaseurl); var organization = request.params.organization; // var dbName = request.params.dbName; var UserId = request.params.UserId; //--check if value of connection string is blank or variable if (organization == '') { return Promise.reject('Error:please provide organization'); } if (originalappname == '') { return Promise.reject('Error:please provide appname'); } const options = { useNewUrlParser: true }; const baseDb = process.env.MONGODB_URI; // get client db from baseDb const getDbUrl = async orgName => { try { const db = await mongoose.createConnection(baseDb, options).asPromise(); const orgAppsModel = db.model('orgApps', orgAppsSchema); const res = await orgAppsModel.findOne({ appName: orgName }); console.log('dburl ', res.parseServer.databaseURI); return res.parseServer.databaseURI; } catch (err) { console.log('result not found in getroleanduser ', err); return 'result not found!'; } }; const dbUrl = await getDbUrl(organization); // targetConString = client db // var targetConString = `mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/${dbName}?authSource=admin&replicaSet=qik-server-prod-db&tls=true`; const targetConString = dbUrl; // sourceConString = default db var sourceConString; if (externalInstallation) { sourceConString = 'mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/heroku_vcjcwn64?authSource=admin&replicaSet=qik-server-prod-db&tls=true'; } else { sourceConString = 'mongodb+srv://doadmin:k0Nn4Q8L96vq715s@qik-server-prod-db-5054d37b.mongo.ondigitalocean.com/defaultDJIC?authSource=admin&replicaSet=qik-server-prod-db&tls=true'; } if (targetConString == sourceConString) { return Promise.reject("Error:Soure and target database server can't be same"); } const randomId = function (length) { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; const charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; }; const appRoleId = randomId(10); try { let Trg_SCHEMASmodel; let Src_SCHEMASmodel; let appId; let defaultRoles; let Trg__RoleModel; let msg; let status; let trg_w_appinfomodel; try { const db = await mongoose.createConnection(targetConString, options).asPromise(); trg_w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); const res = await trg_w_appinfomodel.find({ appname: originalappname, }); if (res.length > 0) { msg = 'App is already exists'; status = 137; } else { await getAppInfo(); } } catch (err) { console.log('err is checking app exists', err); return Promise.reject('err is checking app exists'); } // try { // const db = await mongoose.createConnection(targetConString, options).asPromise(); // Trg_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); // const res = await Trg_SCHEMASmodel.find({ _id: { $regex: '.*' + appname + '.*' } }); // if (res.length > 0) { // msg = 'App is already exists'; // status = 137; // } else { // await getAppInfo(); // } // } catch (err) { // console.log('err is checking app exists', err); // return Promise.reject('err is checking app exists'); // } async function getAppInfo() { console.log('getAppInfo '); try { const db = await mongoose.createConnection(sourceConString, options).asPromise(); const w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); const res = await w_appinfomodel.find({ appname: originalappname, }); // console.log('getAppInfo ', res); appId = res[0]['_id']; const parseRes = JSON.parse(JSON.stringify(res)); if (parseRes[0].settings && parseRes[0].settings.length > 0) { defaultRoles = parseRes[0].settings.map(x => { return { _id: randomId(10), name: x.role, _wperm: ['*'], _rperm: ['*'], _acl: { '*': { r: true, w: true } }, _created_at: new Date(), _updated_at: new Date(), }; }); // console.log('defaultRoles ', defaultRoles); } // console.log(appId); await saveAppInfo(res); } catch (err) { console.log('err in getAppData', err); } } async function saveAppInfo(res) { console.log('saveAppInfo'); try { const db = await mongoose.createConnection(targetConString, options).asPromise(); // trg_w_appinfomodel = db.model('w_appinfo', w_appinfoSchema); const appInfoRes = await trg_w_appinfomodel.collection.insertMany(res); // console.log('saveAppInfo ', appInfoRes); console.log('app info inserted'); await getAppFunctions(); } catch (err) { console.log('err in saveAppData', err); } } async function getAppFunctions() { console.log('getAppFunctions'); try { var appIdpointer = 'w_appinfo$' + appId; const db = await mongoose.createConnection(sourceConString, options).asPromise(); const DBFunctionModel = db.model('w_DBFunctions', DBFunctionSchema); const dbFnRes = await DBFunctionModel.find({ _p_appId: appIdpointer }); await saveAppFunctions(dbFnRes); } catch (err) { console.log('err is get app function', err); return Promise.reject('err is get app functions'); } } async function saveAppFunctions(res) { console.log('saveAppFunctions'); if (res.length > 0) { try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const DBFunctionModel = db.model('w_DBFunctions', DBFunctionSchema); const src_res = await DBFunctionModel.collection.insertMany(res); console.log('app functions inserted'); } catch (err) { console.log('err in save app functions', err); } } await getAppDashboard(); } async function getAppDashboard() { try { var appIdpointer = 'w_appinfo$' + appId; const db = await mongoose.createConnection(sourceConString, options).asPromise(); const w_Dashboardmodel = db.model('w_dashboard', DashboardSchema); const dashboardRes = await w_Dashboardmodel.find({ _p_appId: appIdpointer }); await saveAppDashboard(dashboardRes); } catch (err) { console.log('err is get app dashboards', err); } } async function saveAppDashboard(res) { if (res.length > 0) { try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const w_Dashboardmodel = db.model('w_dashboard', DashboardSchema); const src_res = await w_Dashboardmodel.collection.insertMany(res); console.log('app dashboard inserted'); } catch (err) { console.log('err in save app dashboards', err); } } await getAppForms(); } async function getAppForms() { try { var appIdpointer = 'w_appinfo$' + appId; const db = await mongoose.createConnection(sourceConString, options).asPromise(); const w_formV3model = db.model('w_formV3', w_formV3Schema); const formsRes = await w_formV3model.find({ _p_appId: appIdpointer }); await saveAppForms(formsRes); } catch (err) { console.log('err is get app forms', err); } } async function saveAppForms(res) { if (res.length > 0) { try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const w_formV3model = db.model('w_formV3', w_formV3Schema); const src_res = await w_formV3model.collection.insertMany(res); console.log('app forms inserted'); } catch (err) { console.log('err in save app forms', err); } } await getAppReports(); } async function getAppReports() { try { var appIdpointer = 'w_appinfo$' + appId; const db = await mongoose.createConnection(sourceConString, options).asPromise(); const w_reportmodel = db.model('w_Filter', w_reportSchema); const reportsRes = await w_reportmodel.find({ _p_appId: appIdpointer }); await saveAppReports(reportsRes); } catch (err) { console.log('err is get app reports', err); } } async function saveAppReports(res) { if (res.length > 0) { try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const w_reportmodel = db.model('w_Filter', w_reportSchema); const src_res = await w_reportmodel.collection.insertMany(res); console.log('app reports inserted'); } catch (err) { console.log('err in save app reports', err); } } await getAppMenu(); } async function getAppMenu() { try { var appIdpointer = 'w_appinfo$' + appId; const db = await mongoose.createConnection(sourceConString, options).asPromise(); const w_menumodel = db.model('w_menu', w_menuSchema); const menuRes = await w_menumodel.find({ _p_appId: appIdpointer }); await saveAppMenu(menuRes); } catch (err) { console.log('err is get app menus', err); } } async function saveAppMenu(res) { if (res.length > 0) { try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const w_menumodel = db.model('w_menu', w_menuSchema); const src_res = await w_menumodel.collection.insertMany(res); console.log('app menus inserted'); } catch (err) { console.log('err in save app menus', err); } } await saveAppRole(); } async function saveAppRole(res) { const date = new Date(); const appRole = appname + 'appeditor'; const role = [ { _id: appRoleId, name: appRole, _wperm: [`${UserId}`], _rperm: ['*', `${UserId}`], _acl: { UserId: { w: true, r: true }, '*': { r: true } }, _created_at: date, _updated_at: date, }, ...defaultRoles, ]; try { const db = await mongoose.createConnection(targetConString, options).asPromise(); Trg__RoleModel = db.model('_Role', _RoleSchema); const src_res = await Trg__RoleModel.collection.insertMany(role); console.log('app editor role inserted'); await saveJoinAppRole(); } catch (err) { console.log('err in save app editor role', err); } } async function saveJoinAppRole() { const OrgRole = organization + '_org'; let OrgRoleId; try { const db = await mongoose.createConnection(targetConString, options).asPromise(); // const _RoleModel = db.model('_Role', _RoleSchema); const src_res = await Trg__RoleModel.find({ name: OrgRole }); // console.log('src_res ', src_res); OrgRoleId = src_res[0]._id; } catch (err) { console.log('err in get org Role Id', err); } const userJoinRole = [{ owningId: appRoleId, relatedId: UserId }]; try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const _UserJoinRolemodel = db.model('_Join:users:_Role', _UserjoinSchema); const userJoinRes = await _UserJoinRolemodel.collection.insertMany(userJoinRole); console.log('User Join role inserted'); } catch (err) { console.log('err in User Join role', err); } const roleJoinRole = [{ owningId: OrgRoleId, relatedId: appRoleId }]; try { const db = await mongoose.createConnection(targetConString, options).asPromise(); const _RoleJoinRolemodel = db.model('_Join:roles:_Role', _RolejoinSchema); const roleJoinRes = await _RoleJoinRolemodel.collection.insertMany(roleJoinRole); console.log('Role Join role inserted'); await getAppSchemas(); } catch (err) { console.log('err in Role Join role', err); } } async function getAppSchemas() { console.log('getAppSchemas'); try { const db = await mongoose.createConnection(sourceConString, options).asPromise(); Src_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); const schemaRes = await Src_SCHEMASmodel.find({ _id: { $regex: '.*' + appname + '.*' }, }); await saveAppSchemas(schemaRes); } catch (err) { console.log('err in get app schema', err); } } async function saveAppSchemas(res) { if (res.length > 0) { console.log('saveAppSchemas'); try { const db = await mongoose.createConnection(targetConString, options).asPromise(); Trg_SCHEMASmodel = db.model('_SCHEMA', _SCHEMASchema); const src_res = await Trg_SCHEMASmodel.collection.insertMany(res); console.log('app schema inserted'); msg = 'app installed successfully'; status = 200; } catch (err) { console.log('err in save app schemas', err); } } msg = 'app installed successfully'; status = 200; } const message = { message: msg, status: status }; return message; } catch (err) { console.log('Exeption in query ', err); console.log(err); return 'Error:Exeption in query'; } } } catch (err) { return Promise.reject('Invalid session token!'); } }