2023-08-12 14:28:29 +00:00
#! /usr/bin/env node
2023-08-12 13:36:18 +00:00
// @ts-check
const fs = require ( "fs" ) ;
const path = require ( "path" ) ;
const { execSync } = require ( "child_process" ) ;
require ( "dotenv" ) . config ( {
path : path . resolve ( process . cwd ( ) , ".env" ) ,
} ) ;
const datasquirel = require ( "../index" ) ;
const createDbFromSchema = require ( "./engine/createDbFromSchema" ) ;
if ( ! fs . existsSync ( path . resolve ( process . cwd ( ) , ".env" ) ) ) {
console . log ( ".env file not found" ) ;
process . exit ( ) ;
}
const { DSQL _HOST , DSQL _USER , DSQL _PASS , DSQL _DB _NAME , DSQL _KEY , DSQL _REF _DB _NAME , DSQL _FULL _SYNC , DSQL _ENCRYPTION _KEY , DSQL _ENCRYPTION _SALT } = process . env ;
if ( ! DSQL _HOST ? . match ( /./ ) ) {
console . log ( "DSQL_HOST is required in your `.env` file" ) ;
process . exit ( ) ;
}
if ( ! DSQL _USER ? . match ( /./ ) ) {
console . log ( "DSQL_USER is required in your `.env` file" ) ;
process . exit ( ) ;
}
if ( ! DSQL _PASS ? . match ( /./ ) ) {
console . log ( "DSQL_PASS is required in your `.env` file" ) ;
process . exit ( ) ;
}
const dbSchemaLocalFilePath = path . resolve ( process . cwd ( ) , "dsql.schema.json" ) ;
async function run ( ) {
let schemaData ;
if ( DSQL _KEY && DSQL _REF _DB _NAME ? . match ( /./ ) ) {
const dbSchemaDataResponse = await datasquirel . getSchema ( {
key : DSQL _KEY ,
database : DSQL _REF _DB _NAME || undefined ,
} ) ;
if ( ! dbSchemaDataResponse . payload || Array . isArray ( dbSchemaDataResponse . payload ) ) {
console . log ( "DSQL_KEY+DSQL_REF_DB_NAME => Error in fetching DB schema" ) ;
console . log ( dbSchemaDataResponse ) ;
process . exit ( ) ;
}
let fetchedDbSchemaObject = dbSchemaDataResponse . payload ;
if ( DSQL _DB _NAME ) fetchedDbSchemaObject . dbFullName = DSQL _DB _NAME ;
schemaData = [ fetchedDbSchemaObject ] ;
} else if ( DSQL _KEY ) {
const dbSchemaDataResponse = await datasquirel . getSchema ( {
key : DSQL _KEY ,
database : DSQL _REF _DB _NAME || undefined ,
} ) ;
if ( ! dbSchemaDataResponse . payload || ! Array . isArray ( dbSchemaDataResponse . payload ) ) {
console . log ( "DSQL_KEY => Error in fetching DB schema" ) ;
console . log ( dbSchemaDataResponse ) ;
process . exit ( ) ;
}
let fetchedDbSchemaObject = dbSchemaDataResponse . payload ;
// fetchedDbSchemaObject.forEach((db, index) => {
// db.dbFullName = db.dbFullName?.replace(/^datasquirel_user_\d+_/, "");
// });
schemaData = fetchedDbSchemaObject ;
} else if ( fs . existsSync ( dbSchemaLocalFilePath ) ) {
schemaData = JSON . parse ( fs . readFileSync ( dbSchemaLocalFilePath , "utf8" ) ) ;
} else {
console . log ( "No source for DB Schema. Please provide a local `dsql.schema.json` file, or provide `DSQL_KEY` and `DSQL_REF_DB_NAME` environment variables." ) ;
process . exit ( ) ;
}
if ( ! schemaData ) {
console . log ( "No schema found" ) ;
process . exit ( ) ;
}
if ( DSQL _FULL _SYNC ? . match ( /true/i ) ) {
fs . writeFileSync ( dbSchemaLocalFilePath , JSON . stringify ( schemaData [ 0 ] , null , 4 ) , "utf8" ) ;
}
console . log ( "Now generating and mapping databases ..." ) ;
// deepcode ignore reDOS: <please specify a reason of ignoring this>
await createDbFromSchema ( schemaData ) ;
console . log ( "Databases created Successfully!" ) ;
}
// let timeout;
// if (fs.existsSync(dbSchemaLocalFilePath)) {
// fs.watchFile(dbSchemaLocalFilePath, { interval: 1000 }, (curr, prev) => {
// clearTimeout(timeout);
// timeout = setTimeout(() => {
// console.log("`dsql.schema.json` file changed. Now syncing databases ...");
// run();
// }, 5000);
// });
// }
let interval ;
interval = setInterval ( ( ) => {
console . log ( "Syncing Databases ..." ) ;
run ( ) ;
} , 20000 ) ;
run ( ) ;