diff --git a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/EnvelopeDtos.cs b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/EnvelopeDtos.cs new file mode 100644 index 00000000..23d64f06 --- /dev/null +++ b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/EnvelopeDtos.cs @@ -0,0 +1,126 @@ +namespace EnvelopeGenerator.ReceiverUI.Web.Client.Api.Models; + +/// +/// Client-side DTOs for envelope display. These mirror the server-side +/// EnvelopeReceiverDto / EnvelopeDto / DocumentDto used by the existing +/// API endpoints, but expose only the fields the receiver UI actually needs. +/// JSON serialization is camelCase by default (System.Text.Json). +/// +public class EnvelopeReceiverDto +{ + public long EnvelopeId { get; set; } + public long ReceiverId { get; set; } + public string? Name { get; set; } + public bool HasPhoneNumber { get; set; } + public EnvelopeDto? Envelope { get; set; } + public ReceiverDto? Receiver { get; set; } +} + +public class EnvelopeDto +{ + public long Id { get; set; } + public string? Uuid { get; set; } + public string? Title { get; set; } + public string? Message { get; set; } + public bool ReadOnly { get; set; } + public bool UseAccessCode { get; set; } + public bool TFAEnabled { get; set; } + public DateTime AddedWhen { get; set; } + public SenderUserDto? User { get; set; } + public List? Documents { get; set; } +} + +public class SenderUserDto +{ + public string? Email { get; set; } + public string? Prename { get; set; } + public string? Name { get; set; } +} + +public class ReceiverDto +{ + public long Id { get; set; } + public string? EmailAddress { get; set; } + public string? Signature { get; set; } + public string? Prename { get; set; } + public string? Name { get; set; } +} + +public class DocumentDto +{ + public long Id { get; set; } + public string? Name { get; set; } + public List? Elements { get; set; } +} + +/// +/// Signature placement on a PDF document. Pixel/inch units follow the same +/// convention as the legacy PSPDFKit pipeline. +/// +public class DocumentElementDto +{ + public int Id { get; set; } + public int Page { get; set; } + public double Left { get; set; } + public double Top { get; set; } +} + +/// +/// Body for POST /api/readonly (share read-only link with another e-mail). +/// +public class ReadOnlyShareRequest +{ + public string ReceiverMail { get; set; } = string.Empty; + public DateTime DateValid { get; set; } +} + +/// +/// Returned by GET /api/annotation/elements. Each item describes a +/// signature placeholder the authenticated receiver must sign on the +/// current envelope. Coordinates are in PDF points relative to the page. +/// +public class SignatureElementDto +{ + public int Id { get; set; } + public int Page { get; set; } + public double X { get; set; } + public double Y { get; set; } + public double Width { get; set; } + public double Height { get; set; } + public bool Required { get; set; } + public string? Tooltip { get; set; } +} + +/// +/// Body of POST /api/annotation/blazor — mirrors the API-side +/// BlazorSignaturePayload. +/// +public class BlazorSignaturePayload +{ + public List Signatures { get; set; } = new(); +} + +public class BlazorSignatureEntry +{ + public int ElementId { get; set; } + /// Image as data URL (e.g. data:image/png;base64,...). + public string SignatureDataUrl { get; set; } = string.Empty; + public string? Position { get; set; } + public string? City { get; set; } + public DateTime SignedAt { get; set; } +} + +/// +/// Response of GET /api/tfa/{envelopeReceiverId}. The API serializes +/// the anonymous type in TfaRegistrationController.RegisterAsync; the +/// shape mirrored here is the camelCased JSON that crosses the wire. +/// +public class TfaRegistrationResponse +{ + public int EnvelopeId { get; set; } + public string? Uuid { get; set; } + public string? Signature { get; set; } + public DateTime? TfaRegDeadline { get; set; } + /// Base64-encoded PNG suitable for data:image/png;base64,.... + public string? TotpQR64 { get; set; } +} diff --git a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/ReceiverAuthDtos.cs b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/ReceiverAuthDtos.cs new file mode 100644 index 00000000..7bb2ae93 --- /dev/null +++ b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.Client/Api/Models/ReceiverAuthDtos.cs @@ -0,0 +1,53 @@ +namespace EnvelopeGenerator.ReceiverUI.Web.Client.Api.Models; + +/// +/// Mirrors EnvelopeGenerator.API.Models.ReceiverAuthResponse. +/// The Status string determines which fields are relevant. +/// Possible values: +/// requires_access_code, requires_tfa, show_document, +/// already_signed, rejected, not_found, expired, error. +/// +public class ReceiverAuthResponse +{ + public string Status { get; set; } = string.Empty; + public string? Title { get; set; } + public string? Message { get; set; } + public string? SenderEmail { get; set; } + public string? ReceiverName { get; set; } + public bool TfaEnabled { get; set; } + public bool HasPhoneNumber { get; set; } + public bool ReadOnly { get; set; } + + /// "sms" or "authenticator" when Status == "requires_tfa". + public string? TfaType { get; set; } + public DateTime? TfaExpiration { get; set; } + public string? ErrorMessage { get; set; } +} + +public class AccessCodeRequest +{ + public string AccessCode { get; set; } = string.Empty; + public bool PreferSms { get; set; } +} + +public class TfaCodeRequest +{ + public string Code { get; set; } = string.Empty; + /// "sms" or "authenticator". + public string Type { get; set; } = "authenticator"; +} + +/// +/// Status strings returned by . +/// +public static class ReceiverAuthStatus +{ + public const string RequiresAccessCode = "requires_access_code"; + public const string RequiresTfa = "requires_tfa"; + public const string ShowDocument = "show_document"; + public const string AlreadySigned = "already_signed"; + public const string Rejected = "rejected"; + public const string NotFound = "not_found"; + public const string Expired = "expired"; + public const string Error = "error"; +}