public ApiResponse IsOrmInstalled([FromRoute] string name, [FromQuery] string projectName, [FromQuery] string dbSourceName, [FromQuery] bool forceRecheck) { try { if (!ControllerHelper.GetProjectAndApp(projectName, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } if (!dbSource.GetEndpoint(name, out var endpoint, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } if (!forceRecheck && endpoint.IsOrmInstalled) { return(ApiResponse.Payload(null)); } var missingDeps = endpoint.CheckForMissingOrmPreRequisitesOnDatabase(); endpoint.IsOrmInstalled = missingDeps == null; SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Payload(missingDeps)); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse UninstallOrm([FromRoute] string name, [FromQuery] string projectName, [FromQuery] string dbSourceName) { try { if (!ControllerHelper.GetProjectAndApp(projectName, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } if (!dbSource.GetEndpoint(name, out var endpoint, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } var success = endpoint.UnInstallOrm(); if (success) { endpoint.IsOrmInstalled = false; SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal("Failed to uninstall ORM")); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse AddJsFile([FromQuery] string project, [FromRoute] string name, [FromQuery] string jsFileName) // TODO: Change from jsFilename to jsFileGuid? { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } var ret = app.AddJsFile(jsFileName); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); //?!GeneratorThreadDispatcher.SetOutputFilesDirty(cs); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse AddUpdateConnection([FromRoute] string endpoint, [FromQuery] string projectName, [FromQuery] string dbSourceName, [FromBody] Newtonsoft.Json.Linq.JObject json ) { try { bool isMetadata = (bool)json["isMetadata"].ToObject(typeof(bool)); string dataSource = json["dataSource"].ToString(); string catalog = json["catalog"].ToString(); string username = json["username"].ToString(); string password = json["password"].ToString(); int? port = json["port"].ToObject(typeof(int?)) as int?; bool integratedSecurity = json["authType"].ToString() == "100"; if (integratedSecurity) { username = password = null; } if (!port.HasValue) { port = 1433; } if (!ControllerHelper.GetProjectAndApp(projectName, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } if (!dbSource.GetEndpoint(endpoint, out var ep, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } CommonReturnValueWithApplication ret = null; if (isMetadata) { ret = ep.UpdateMetadataConnection(dataSource, catalog, username, password, port.Value); } else { ret = ep.UpdateExecConnection(dataSource, catalog, username, password, port.Value); } if (!ret.IsSuccess) { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } WorkSpawner.RestartWorker(ep); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse Post([FromRoute] string name, [FromQuery] string project, [FromQuery] string dbSourceName) { try { if (!ControllerHelper.GetProjectAndApp(project, dbSourceName, out var proj, out var app, out var resp)) { return(resp); } var ret = app.AddEndpoint(name); if (ret.IsSuccess) { app.GetEndpoint(name, out var endpoint, out var _); WorkSpawner.CreateNewWorker(endpoint); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse ClearCache([FromRoute] string endpoint, [FromQuery] string projectName, [FromQuery] string dbSource) { try { if (!ControllerHelper.GetProjectAndApp(projectName, dbSource, out var proj, out var dbs, out var resp)) { return(resp); } if (!dbs.GetEndpoint(endpoint, out var ep, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } if (ep.ClearCache()) { SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal("Failed to clear cache. Check session log for errors.")); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse CreateRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromBody] Newtonsoft.Json.Linq.JObject json) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } var type = (RuleType)int.Parse(json["Type"].ToString()); string value = json["Value"].ToString(); if (file == null) { // DB-level var ret = app.AddRule(type, value); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); WorkSpawner.SetRulesDirty(app); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } else { var jsFile = app.GetJsFile(file); if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } var ret = jsFile.AddRule(type, value); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); WorkSpawner.SetRulesDirty(app, jsFile); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse UpdateApplication([FromBody] string name, [FromQuery] string oldName, [FromQuery] string project, [FromQuery] string jsNamespace, [FromQuery] int?defaultRuleMode) { try { if (!ControllerHelper.GetProjectAndApp(project, oldName, out var proj, out var app, out var resp)) { return(resp); } var anotherExisting = proj.GetApplication(name); if (anotherExisting != null) { return(ApiResponse.ExclamationModal($"The application \"{ name }\" already exists on project \" { project }\".")); } var ret = app.Update(name, jsNamespace, defaultRuleMode); if (!ret.IsSuccess) { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } Hubs.WorkerMonitor.Instance.NotifyObservers(); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse SavePluginConfig([FromQuery] string project, [FromRoute] string name, [FromBody] List <dynamic> pluginList) { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } var ret = app.UpdatePluginList(pluginList); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse DeleteEndpoint([FromRoute] string name, [FromQuery] string project, [FromQuery] string dbSourceName) { try { if (!ControllerHelper.GetProjectAndApp(project, dbSourceName, out var proj, out var app, out var resp)) { return(resp); } if (!app.GetEndpoint(name, out var endpoint, out var resp2)) { return(ApiResponse.ExclamationModal($"The endpoint '{name}' not found.")); } var ret = app.DeleteEndpoint(name); if (ret.IsSuccess) { WorkSpawner.RemoveEndpoint(endpoint); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse DeleteJsFile([FromQuery] string project, [FromRoute] string name, [FromRoute] string file) { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } var existing = app.GetJsFile(file); if (existing == null) { return(ApiResponse.ExclamationModal($"The output file \"{file}\" does not exist in \"{project}/{name}\"")); } app.JsFiles.Remove(existing); SettingsInstance.SaveSettingsToFile(); //!GeneratorThreadDispatcher.SetOutputFilesDirty(cs); return(ApiResponse.Success()); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
} // Run private async Task ProcessAsync(SqlConnection con, string connectionString) { var changesCount = await OrmDAL.GetRoutineListCntAsync(con, this.MaxRowDate); if (changesCount > 0) { last0Cnt = null; // commented out changes line, happens too frequently with just 1 change //this.log.Info($"{ changesCount } change(s) found using row date { this.MaxRowDate }"); this.Status = $"{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} - { changesCount } change(s) found using rowdate { this.MaxRowDate}"; var changesList = await GetAndProcessRoutineChangesAsync(con, connectionString, changesCount); if (changesList?.Count > 0) { // call save for final changes await this.Endpoint.SaveCacheAsync(); this.GenerateOutputFiles(this.Endpoint, changesList); // save "settings" to persist JsFile version changes SettingsInstance.SaveSettingsToFile(); } }// if changeCount > 0 else { if (last0Cnt == null) { last0Cnt = DateTime.Now; } // only update status if we've been receiving 0 changes for a while if (DateTime.Now.Subtract(last0Cnt.Value).TotalSeconds > 30) { last0Cnt = DateTime.Now; this.Status = $"{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} - no changes found"; } // handle the case where the output files no longer exist but we have also not seen any changes on the DB again // TODO: !!! // dbSource.JsFiles.forEach(jsFile => // { // let path = dbSource.outputFilePath(jsFile); // if (!fs.existsSync(path)) // { // this.progress('Generating ' + jsFile.Filename); // JsFileGenerator.generateJsFile(dbSource, jsFile); // //!this.IsRulesDirty = false; // //!this.IsOutputFilesDirty = false; // dbSource.LastUpdateDate = new Date(); // } // }); } } // Process
public ApiResponse UpdateRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromRoute] string ruleId, [FromBody] Newtonsoft.Json.Linq.JObject json) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } var type = (RuleType)int.Parse(json["Type"].ToString()); string value = json["Value"].ToString(); CommonReturnValue ret; JsFile jsFile = null; if (file == null) { // DB-level ret = app.UpdateRule(ruleId, value); } else { jsFile = app.GetJsFile(file); // TODO: Move check and error message down to App api? if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } ret = jsFile.UpdateRule(ruleId, value); } if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); if (jsFile == null) { WorkSpawner.SetRulesDirty(app); } else { WorkSpawner.SetRulesDirty(app, jsFile); } return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse DeleteRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromRoute] string ruleId) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } if (file == null) { // DB level var ret = app.DeleteRule(ruleId); if (ret.IsSuccess) { WorkSpawner.SetRulesDirty(app); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } else { var jsFile = app.GetJsFile(file); if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } var ret = jsFile.DeleteRule(ruleId); if (ret.IsSuccess) { WorkSpawner.SetRulesDirty(app, jsFile); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse Delete([FromBody] string name) { var ret = SettingsInstance.Instance.DeleteProject(name); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } }
public ApiResponse UpdateProject([FromRoute] string name, [FromBody] string newName) // TODO: clean up interface...get some consistency { var ret = SettingsInstance.Instance.UpdateProject(name, newName); if (ret.IsSuccess) { Hubs.WorkerMonitor.Instance.NotifyObservers(); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } }
public ApiResponse SetupSharedMetadata([FromRoute] string endpointName, [FromQuery(Name = "project")] string projectName, [FromQuery(Name = "app")] string appName, [FromQuery(Name = "srcEndpointId")] string shareFromEndpointId) { try { if (!ControllerHelper.GetProjectAndAppAndEndpoint(projectName, appName, endpointName, out var project, out var app, out var endpoint, out var resp)) { return(resp); } var shareDependencies = Settings.SettingsInstance.Instance .ProjectList .SelectMany(p => p.Applications) .SelectMany(a => a.Endpoints) .Where(ep => ep.PullMetadataFromEndpointId?.Equals(endpoint.Id, StringComparison.Ordinal) ?? false) .Select(ep => ep.Pedigree) ; if (shareDependencies.Count() > 0) { return(ApiResponse.ExclamationModal($"This endpoint cannot be configured with metadata sharing while other endpoints dependent on it. The following endpoint(s) share metadata from this endpoint:<p>{string.Join("<br>", shareDependencies.ToArray())}</p>")); } var srcEndpoint = Settings.SettingsInstance.Instance.ProjectList.SelectMany(p => p.Applications).SelectMany(a => a.Endpoints).FirstOrDefault(ep => ep.Id.Equals(shareFromEndpointId, StringComparison.Ordinal)); if (srcEndpoint == null) { return(ApiResponse.ExclamationModal($"Failed to find source endpoint with id: {shareFromEndpointId ?? "(null)"}")); } else if (srcEndpoint == endpoint) { return(ApiResponse.ExclamationModal($"Endpoint cannot share with itself")); } endpoint.ShareMetadaFrom(srcEndpoint); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse ClearSharedMetadata([FromRoute] string endpointName, [FromQuery(Name = "project")] string projectName, [FromQuery(Name = "app")] string appName) { try { if (!ControllerHelper.GetProjectAndAppAndEndpoint(projectName, appName, endpointName, out var project, out var app, out var endpoint, out var resp)) { return(resp); } endpoint.ShareMetadaFrom(null); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse CreateApplication([FromBody] string name, [FromQuery] string project, [FromQuery] string jsNamespace, [FromQuery] int?defaultRuleMode) { try { if (string.IsNullOrWhiteSpace(name)) { return(ApiResponse.ExclamationModal("Please provide a valid application name.")); } if (!defaultRuleMode.HasValue) { return(ApiResponse.ExclamationModal("Please specify the default rule mode.")); } if (!ControllerHelper.GetProject(project, out var proj, out var resp)) { return(resp); } var existing = proj.GetApplication(name); if (existing != null) { return(ApiResponse.ExclamationModal($"The application \"{ name }\" already exists on project \" { project }\".")); } var ret = proj.AddApplication(name, jsNamespace, defaultRuleMode.Value); if (!ret.IsSuccess) { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse UpdateEndpoint([FromRoute] string name, [FromBody] string newName, [FromQuery] string project, [FromQuery] string dbSourceName) { if (!ControllerHelper.GetProjectAndApp(project, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } var ret = dbSource.UpdateEndpoint(name, newName); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); Hubs.WorkerMonitor.Instance.NotifyObservers(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } }
public ApiResponse EnableDisableMetadataCapturing([FromRoute] string name, [FromQuery(Name = "project")] string projectName, [FromQuery(Name = "dbSource")] string dbSourceName, [FromQuery] bool enable) { try { if (!ControllerHelper.GetProjectAndApp(projectName, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } if (!dbSource.GetEndpoint(name, out var endpoint, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } if (!enable) { var shareDependencies = Settings.SettingsInstance.Instance .ProjectList .SelectMany(p => p.Applications) .SelectMany(a => a.Endpoints) .Where(ep => ep.PullMetadataFromEndpointId?.Equals(endpoint.Id, StringComparison.Ordinal) ?? false) .Select(ep => ep.Pedigree) ; if (shareDependencies.Count() > 0) { return(ApiResponse.ExclamationModal($"Cannot disable metadata capturing on this endpoint while other endpoints depend on it. The following endpoint(s) share metadata from this endpoint:<p>{string.Join("<br>", shareDependencies.ToArray())}</p>")); } } endpoint.DisableMetadataCapturing = !enable; SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse UpdateJsFile([FromQuery] string project, [FromRoute] string name, [FromQuery] string oldName, [FromQuery] string newName) { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } //!if (!newName.ToLower().EndsWith(".js")) newName += ".js"; // TODO: All validation needs to be move OM API var existing = app.JsFiles.FirstOrDefault(js => js.Filename.Equals(oldName, StringComparison.OrdinalIgnoreCase)); if (existing == null) { return(ApiResponse.ExclamationModal($"The output file \"{oldName}\" does not exist in \"{project}/{name}\"")); } var existingNewName = app.JsFiles.FirstOrDefault(js => js.Filename.Equals(newName, StringComparison.OrdinalIgnoreCase)); if (existingNewName != null) { return(ApiResponse.ExclamationModal($"The output file \"{newName}\" already exists in \"{project}/{name}\"")); } existing.Filename = newName; SettingsInstance.SaveSettingsToFile(); //!GeneratorThreadDispatcher.SetOutputFilesDirty(cs); return(ApiResponse.Success()); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse UpdateWhitelist([FromQuery] string project, [FromRoute] string name, [FromQuery] string whitelist, [FromQuery] bool allowAllPrivate) { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } app.WhitelistAllowAllPrivateIPs = allowAllPrivate; if (whitelist != null) { var ar = whitelist.Split('\n').Select(w => w.Trim()).Where(w => !string.IsNullOrEmpty(w)); if (ar.Count() > 0) { app.WhitelistedDomainsCsv = string.Join(",", ar); } else { app.WhitelistedDomainsCsv = null; } } else { app.WhitelistedDomainsCsv = null; } SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse DeleteApplication([FromQuery] string project, string name) { try { if (!ControllerHelper.GetProjectAndApp(project, name, out var proj, out var app, out var resp)) { return(resp); } if (proj.DeleteApplication(app)) { SettingsInstance.SaveSettingsToFile(); //!WorkSpawner.RemoveApplication(cs); TODO: Move to endpoint } return(ApiResponse.Success()); } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public BackgroundWorker InstallOrm() { var missing = CheckForMissingOrmPreRequisitesOnDatabase(); if (string.IsNullOrEmpty(missing)) { return(null); } var sqlScriptPath = Path.GetFullPath("./resources/install-orm.sql"); var installSqlScript = File.ReadAllText(sqlScriptPath, System.Text.Encoding.UTF8); //https://stackoverflow.com/a/18597052 var statements = Regex.Split(installSqlScript, @"^[\s]*GO[\s]*\d*[\s]*(?:--.*)?$", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase); var statementsToExec = statements.Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => x.Trim(' ', '\r', '\n')); using (var con = new SqlConnection()) { con.ConnectionString = this.MetadataConnection.ConnectionStringDecrypted; con.Open(); var trans = con.BeginTransaction(); try { foreach (var st in statementsToExec) { var cmd = new SqlCommand(); cmd.Connection = con; cmd.Transaction = trans; cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = st; cmd.CommandTimeout = 80; cmd.ExecuteNonQuery(); } trans.Commit(); } catch (Exception ex) { if (trans != null) { trans.Rollback(); } SessionLog.Exception(ex); } con.Close(); BackgroundWorker backgroundWorker = null; backgroundWorker = BackgroundTask.Queue($"{GetBgTaskKey()}.ORM_INIT", $"{Application.Project.Name}/{Application.Name}/{this.Name} ORM initilisation", () => { // try // { using (var conInit = new SqlConnection()) { con.FireInfoMessageEventOnUserErrors = true; conInit.ConnectionString = this.MetadataConnection.ConnectionStringDecrypted; conInit.Open(); var cmdInit = new SqlCommand(); cmdInit.Connection = conInit; cmdInit.CommandText = "ormv2.Init"; cmdInit.CommandTimeout = 600; conInit.InfoMessage += (sender, e) => { if (!backgroundWorker.IsDone && double.TryParse(e.Message, out var p)) { backgroundWorker.Progress = p; Hubs.BackgroundTaskMonitor.Instance.NotifyOfChange(backgroundWorker); } }; cmdInit.ExecuteScalar(); WorkSpawner.HandleOrmInstalled(this); SettingsInstance.SaveSettingsToFile(); return(true); } // } // catch (Exception ex) // { // return ex; // //return ex; // } }); return(backgroundWorker); } }