From 15b292a6f715503c88abe5abf070597814c25f4e Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 3 Jan 2026 08:09:00 -0500 Subject: [PATCH] feat(core): add shared auth models for encrypted login --- .../Models/Auth/EncryptedLoginRequest.cs | 7 ++++ .../JdeScoping.Core/Models/Auth/LoginModel.cs | 15 +++++++ .../Models/Auth/LoginResultModel.cs | 14 +++++++ .../Models/Auth/PublicKeyResponse.cs | 7 ++++ .../Fetchers/MockDataFetcher.cs | 40 ------------------- 5 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs create mode 100644 NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs create mode 100644 NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs create mode 100644 NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs delete mode 100644 NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs diff --git a/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs b/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs new file mode 100644 index 0000000..b9f9f59 --- /dev/null +++ b/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs @@ -0,0 +1,7 @@ +namespace JdeScoping.Core.Models.Auth; + +/// +/// Encrypted login payload sent from client to API. +/// +/// Base64-encoded RSA-encrypted JSON of LoginModel +public record EncryptedLoginRequest(string EncryptedData); diff --git a/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs b/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs new file mode 100644 index 0000000..172e342 --- /dev/null +++ b/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace JdeScoping.Core.Models.Auth; + +/// +/// Login credentials model shared by Client and API. +/// +public class LoginModel +{ + [Required(ErrorMessage = "Username is required")] + public string Username { get; set; } = string.Empty; + + [Required(ErrorMessage = "Password is required")] + public string Password { get; set; } = string.Empty; +} diff --git a/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs b/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs new file mode 100644 index 0000000..4b73ceb --- /dev/null +++ b/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs @@ -0,0 +1,14 @@ +using JdeScoping.Core.Models; + +namespace JdeScoping.Core.Models.Auth; + +/// +/// Result returned from login API endpoint. +/// +/// Whether authentication succeeded +/// Error message if failed +/// User info if successful +public record LoginResultModel( + bool Success, + string? ErrorMessage, + UserInfo? User); diff --git a/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs b/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs new file mode 100644 index 0000000..92a12be --- /dev/null +++ b/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs @@ -0,0 +1,7 @@ +namespace JdeScoping.Core.Models.Auth; + +/// +/// Server's RSA public key for client-side encryption. +/// +/// PEM-encoded RSA public key +public record PublicKeyResponse(string PublicKeyPem); diff --git a/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs b/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs deleted file mode 100644 index c9c2344..0000000 --- a/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Runtime.CompilerServices; -using JdeScoping.DataSync.Contracts; -using Microsoft.Extensions.Logging; - -namespace JdeScoping.DataSync.Fetchers; - -/// -/// Base class for mock data fetchers used during development. -/// Returns empty results - real implementations will query source databases. -/// -/// The entity type being fetched. -public abstract class MockDataFetcher : IDataFetcher where TEntity : class -{ - /// - /// Logger instance. - /// - protected readonly ILogger Logger; - - /// - /// Initializes a new instance of the class. - /// - protected MockDataFetcher(ILogger logger) - { - Logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - /// - public virtual async IAsyncEnumerable FetchAsync( - DateTime? minimumDt, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - Logger.LogWarning( - "MockDataFetcher<{EntityType}> returning empty results. Implement real fetcher for production.", - typeof(TEntity).Name); - - // Return empty enumerable - real implementations will query source databases - await Task.CompletedTask; - yield break; - } -}