using System.Data.Common;
using System.Data.OleDb;
using System.Runtime.Versioning;
using Campaign_Tracker.Server.LegacyData.Models;
namespace Campaign_Tracker.Server.LegacyData;
///
/// Read-only OleDb implementation for legacy Access-derived data.
/// All SQL is parameterized and validated as SELECT-only before execution.
///
[SupportedOSPlatform("windows")]
public sealed class OleDbLegacyDataAccess : ILegacyDataAccess
{
private readonly string _connectionString;
public OleDbLegacyDataAccess(string connectionString)
{
if (string.IsNullOrWhiteSpace(connectionString))
{
throw new ArgumentException("Legacy database connection string is required.", nameof(connectionString));
}
_connectionString = connectionString;
}
public async Task GetJurisdictionAsync(
string jCode,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT JCode, Name, Mailing_Address, CSZ, IMB, IMB_Digits
FROM Jurisdiction
WHERE Trim(JCode) = ?
""";
var results = await QueryAsync(sql, [jCode.Trim()], MapJurisdiction, cancellationToken);
return results.FirstOrDefault();
}
public Task> GetAllJurisdictionsAsync(
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT JCode, Name, Mailing_Address, CSZ, IMB, IMB_Digits
FROM Jurisdiction
ORDER BY JCode
""";
return QueryAsync(sql, [], MapJurisdiction, cancellationToken);
}
public async Task GetContactByIdAsync(
int id,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT ID, JURISCODE, ContactName, Title, Email, Phone1, Phone2,
MailingAddress, MailingAddress2, MailingAddress3,
BusinessAddress, BusinessAddress2, BusinessAddress3,
TownshipName, TownshipNum
FROM Contacts
WHERE ID = ?
""";
var results = await QueryAsync(sql, [id], MapContact, cancellationToken);
return results.FirstOrDefault();
}
public Task> GetContactsByJurisdictionAsync(
string jCode,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT ID, JURISCODE, ContactName, Title, Email, Phone1, Phone2,
MailingAddress, MailingAddress2, MailingAddress3,
BusinessAddress, BusinessAddress2, BusinessAddress3,
TownshipName, TownshipNum
FROM Contacts
WHERE Trim(JURISCODE) = ?
ORDER BY ID
""";
return QueryAsync(sql, [jCode.Trim()], MapContact, cancellationToken);
}
public async Task GetKitByIdAsync(
int id,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT ID, Jcode, JobNumber, JobType, Status, Filename, Cass, InkJetJob,
CreatedOn, ExportedToSnailWorks, LabelsPrinted, OfficeCopiesAmount,
InboundStid, OutboundStid
FROM Kit
WHERE ID = ?
""";
var results = await QueryAsync(sql, [id], MapKit, cancellationToken);
return results.FirstOrDefault();
}
public Task> GetKitsByJurisdictionAsync(
string jCode,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT ID, Jcode, JobNumber, JobType, Status, Filename, Cass, InkJetJob,
CreatedOn, ExportedToSnailWorks, LabelsPrinted, OfficeCopiesAmount,
InboundStid, OutboundStid
FROM Kit
WHERE Trim(Jcode) = ?
ORDER BY ID
""";
return QueryAsync(sql, [jCode.Trim()], MapKit, cancellationToken);
}
public Task> GetKitLabelsByKitAsync(
int kitId,
CancellationToken cancellationToken = default)
{
const string sql = """
SELECT ID, KitID, InBoundImb, InBoundImbDigits, InBoundSerial,
OutboundImb, OutboundImbDigits, OutboundSerial, SetNumber
FROM KitLabels
WHERE KitID = ?
ORDER BY ID
""";
return QueryAsync(sql, [kitId], MapKitLabel, cancellationToken);
}
private async Task> QueryAsync(
string sql,
IReadOnlyList