Initial commit: JDE Scoping Tool migration project

Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
This commit is contained in:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
@@ -0,0 +1,24 @@
namespace JdeScoping.DataAccess.Exceptions;
/// <summary>
/// Exception thrown when a database connection fails.
/// </summary>
public class ConnectionException : DataAccessException
{
/// <summary>
/// The data source identifier (e.g., "JDE", "CMS", "LotFinderDB").
/// </summary>
public string? DataSource { get; }
/// <summary>
/// Initializes a new instance of the <see cref="ConnectionException"/> class.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="dataSource">The data source that failed to connect.</param>
/// <param name="inner">The inner exception.</param>
public ConnectionException(string message, string? dataSource, Exception? inner = null)
: base(message, operation: "CreateConnection", repository: dataSource, inner: inner)
{
DataSource = dataSource;
}
}
@@ -0,0 +1,35 @@
namespace JdeScoping.DataAccess.Exceptions;
/// <summary>
/// Base exception for all data access layer errors.
/// </summary>
public class DataAccessException : Exception
{
/// <summary>
/// The operation that was being performed when the exception occurred.
/// </summary>
public string? Operation { get; }
/// <summary>
/// The repository where the exception occurred.
/// </summary>
public string? Repository { get; }
/// <summary>
/// Initializes a new instance of the <see cref="DataAccessException"/> class.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="operation">The operation that was being performed.</param>
/// <param name="repository">The repository where the error occurred.</param>
/// <param name="inner">The inner exception.</param>
public DataAccessException(
string message,
string? operation = null,
string? repository = null,
Exception? inner = null)
: base(message, inner)
{
Operation = operation;
Repository = repository;
}
}
@@ -0,0 +1,31 @@
namespace JdeScoping.DataAccess.Exceptions;
/// <summary>
/// Exception thrown when a database operation times out.
/// </summary>
public class DataAccessTimeoutException : DataAccessException
{
/// <summary>
/// The configured timeout value in seconds.
/// </summary>
public int TimeoutSeconds { get; }
/// <summary>
/// Initializes a new instance of the <see cref="DataAccessTimeoutException"/> class.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="timeoutSeconds">The configured timeout value in seconds.</param>
/// <param name="operation">The operation that was being performed.</param>
/// <param name="repository">The repository where the error occurred.</param>
/// <param name="inner">The inner exception.</param>
public DataAccessTimeoutException(
string message,
int timeoutSeconds,
string? operation = null,
string? repository = null,
Exception? inner = null)
: base(message, operation, repository, inner)
{
TimeoutSeconds = timeoutSeconds;
}
}
@@ -0,0 +1,31 @@
namespace JdeScoping.DataAccess.Exceptions;
/// <summary>
/// Exception thrown when a database query fails.
/// </summary>
public class QueryException : DataAccessException
{
/// <summary>
/// The name of the query that failed.
/// </summary>
public string? QueryName { get; }
/// <summary>
/// Initializes a new instance of the <see cref="QueryException"/> class.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="queryName">The name of the query that failed.</param>
/// <param name="operation">The operation that was being performed.</param>
/// <param name="repository">The repository where the error occurred.</param>
/// <param name="inner">The inner exception.</param>
public QueryException(
string message,
string? queryName,
string? operation = null,
string? repository = null,
Exception? inner = null)
: base(message, operation, repository, inner)
{
QueryName = queryName;
}
}