using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NZWalks.API.Helper;
using NZWalks.API.Models;
using System.Net;
namespace NZWalks.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ConnectionController : ControllerBase
{
private readonly IConfiguration _configuration;
public ConnectionController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet("validate")]
public IActionResult ValidateAllConnections()
{
var hostname = Dns.GetHostName();
var connectionStrings = new List<ConnectionItem>();
var connSection = _configuration.GetSection("ConnectionStrings");
foreach (var conn in connSection.GetChildren())
{
var connStr = conn.Value ?? "";
bool hasPassword = connStr.ToLower().Contains("password=");
string status = "Validation Not Supported";
if (!hasPassword)
{
status = "Not Connected";
}
else if (conn.Key.ToLower().Contains("ApplicationDBContextConnection") || conn.Key.ToLower().Contains("acd"))
{
status = ConnectionChecker.IsSqlConnectionValid(connStr) ? "Connected" : "Invalid Connection";
}
else if (conn.Key.ToLower().Contains("oracle"))
{
status = ConnectionChecker.IsOracleConnectionValid(connStr) ? "Connected" : "Invalid Connection";
}
connectionStrings.Add(new ConnectionItem
{
Name = conn.Key,
ConnectionString = hasPassword ? ConnectionChecker.MaskPassword(connStr) : "Not Connected",
Status = status
});
}
// Check Excel File
var connectionChecker = new ConnectionChecker(_configuration);
var excelMessage = connectionChecker.CheckExcelFileModification();
connectionStrings.Add(new ConnectionItem
{
Name = "Excel File Check",
ConnectionString = _configuration.GetValue<string>("ExcelFileSettings:FilePath"),
Status = excelMessage
});
var response = new ConnectionResponse
{
Connections = connectionStrings,
StatusCode = 200,
Message = $"Connection validation complete. {excelMessage}",
ServerHostName = hostname
};
return Ok(response);
}
}
}
_______Model.cs_____namespace NZWalks.API.Models
{
public class ConnectionResponse
{
public List<ConnectionItem> Connections { get; set; }
public int StatusCode { get; set; }
public string Message { get; set; }
public string ServerHostName { get; set; }
public string ExcelFilePath { get; set; }
}
public class ConnectionItem
{
public string Name { get; set; }
public string ConnectionString { get; set; } // Will show "Not Connected" if password missing
public string Status { get; set; } // Connected / Not Connected / Invalid Connection
}
}
_____ConnectionChecker.cs________using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using NZWalks.API.Models;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace NZWalks.API.Helper
{
public class ConnectionChecker
{
private readonly IConfiguration _configuration;
public ConnectionChecker(IConfiguration configuration)
{
_configuration = configuration;
}
public static bool IsSqlConnectionValid(string connectionString)
{
var masked = MaskPassword(connectionString);
try
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
return true;
}
}
catch
{
return false;
}
}
public static bool IsOracleConnectionValid(string connectionString)
{
try
{
using (var conn = new Oracle.ManagedDataAccess.Client.OracleConnection(connectionString))
{
conn.Open();
return true;
}
}
catch
{
return false;
}
}
public static string MaskPassword(string connectionString)
{
var pattern = @"(password\s*=\s*)([^;]+)";
return Regex.Replace(connectionString, pattern, "$1***", RegexOptions.IgnoreCase);
}
public string CheckExcelFileModification()
{
var filePath = _configuration.GetValue<string>("ExcelFileSettings:FilePath");
var lastKnownStr = _configuration.GetValue<string>("ExcelFileSettings:LastKnownModified");
var excelMessage = "Excel File Not Found";
try
{
if (System.IO.File.Exists(filePath))
{
var lastModified = System.IO.File.GetLastWriteTime(filePath);
var lastKnownModified = DateTime.TryParse(lastKnownStr, out var knownTime) ? knownTime : DateTime.MinValue;
excelMessage = lastModified > knownTime ? "Excel File Modified" : "Excel File Not Modified";
}
}
catch
{
excelMessage = "Error Checking Excel File";
}
return excelMessage;
}
}
}
_________
appsetting.json
________
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"AppConnection": "Server=DESKTOP-N1BS508;Database=NZwalksDB;Trusted_Connection=True;User ID=Sa;Password=Admin@123;Encrypt=false; MultipleActiveResultSets=true",
"ApplicationDBContextConnection": "Server=(localdb)\\mssqllocaldb;Database=ASPDotCoreHandsOn;Trusted_Connection=True;MultipleActiveResultSets=true",
"AcdDB_connection": "Server=server1;Database=AcdDB;User Id=user;Password=pass;",
"oracle_connection": "Data Source=oracleHost;User Id=oracleUser;Password=oraclePass;",
"sql_connection": "Server=sqlHost;Database=SqlDB;User Id=sqlUser;Password=sqlPass;"
},
"ExcelFileSettings": {
"FilePath": "C:\\Files\\DataSheet.xlsx",
"LastKnownModified": "2024-01-01T00:00:00"
}
}
Comments
Post a Comment