using System.ComponentModel.DataAnnotations; using EnotaryoPH.Data; using EnotaryoPH.Data.Entities; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace EnotaryoPH.Web.Pages.Participant.Registration { public class IndexModel : PageModel { private readonly NotaryoDBContext _notaryoDBContext; private readonly ISignInService _signInService; public IndexModel(NotaryoDBContext notaryoDBContext, ISignInService signInService) { _notaryoDBContext = notaryoDBContext; _signInService = signInService; } public async Task OnGetAsync() { if (string.IsNullOrEmpty(InvitationCode)) { return NotFound(); } var invitationCodeGuid = InvitationCode.ToGuidFromBase64(); var signatory = _notaryoDBContext.TransactionSignatories .Include(e => e.Transaction) .FirstOrDefault(e => e.InvitationCode == invitationCodeGuid.ToString() && (e.Status == nameof(SignatoryStatus.New) || e.Status == nameof(SignatoryStatus.Registered))); if (signatory == null) { return NotFound(); } var existingUser = _notaryoDBContext.Users.FirstOrDefault(e => e.Email.Equals(signatory.Email, StringComparison.CurrentCultureIgnoreCase)); if (existingUser != null) { signatory.Status = nameof(SignatoryStatus.Registered); signatory.UserID = existingUser.UserID; _notaryoDBContext.Update(signatory); _notaryoDBContext.SaveChanges(); await _signInService.SignInAsync(new UserLogin { Email = existingUser.Email, Role = existingUser.Role, User_UID = existingUser.User_UID.Value }); return Redirect($"Steps/UploadIdentification/{signatory.Transaction.Transaction_UID}"); } TransactionSignatory_UID = signatory.TransactionSignatory_UID.GetValueOrDefault(); return Page(); } public async Task OnPostAsync() { if (!ModelState.IsValid) { return Page(); } if (TransactionSignatory_UID == Guid.Empty) { ModelState.AddModelError(nameof(TransactionSignatory_UID), "TransactionSignatory_UID is missing."); return Page(); } var signatory = _notaryoDBContext.TransactionSignatories .FirstOrDefault(e => e.TransactionSignatory_UID == TransactionSignatory_UID && e.Status == nameof(SignatoryStatus.New)); if (signatory == null) { return BadRequest(); } var newUser = new User { BirthDate = new DateTime(Year.Value, Month.Value, Day.Value, 0, 0, 0, DateTimeKind.Utc), CreatedOn = DateTime.UtcNow, Email = signatory.Email, Firstname = Firstname, Lastname = Lastname, Middlename = Middlename, PhoneNumber = PhoneNumber, Prefix = Prefix, Role = signatory.Type, Suffix = Suffix, User_UID = Guid.CreateVersion7(DateTime.UtcNow), PasswordHash = "secret" }; _notaryoDBContext.Add(newUser); signatory.User = newUser; signatory.Status = nameof(SignatoryStatus.Registered); _notaryoDBContext.Update(signatory); _notaryoDBContext.SaveChanges(); await _signInService.SignInAsync(new UserLogin { Email = newUser.Email, Role = newUser.Role, User_UID = newUser.User_UID.Value }); return Redirect($"Steps/UploadIdentification/{signatory.Transaction.Transaction_UID}"); } [BindProperty(SupportsGet = true)] public string InvitationCode { get; set; } [BindProperty] public Guid TransactionSignatory_UID { get; set; } [BindProperty, Required] public int? Year { get; set; } [BindProperty, Required] public int? Month { get; set; } [BindProperty, Required] public int? Day { get; set; } [BindProperty, Required] public string PhoneNumber { get; set; } [BindProperty, Required] public string Firstname { get; set; } [BindProperty, Required] public string Lastname { get; set; } [BindProperty] public string? Middlename { get; set; } [BindProperty] public string? Suffix { get; set; } [BindProperty] public string? Prefix { get; set; } } }