fix(postit): normalize profile calendar and bank clear state

This commit is contained in:
Paul Schneider 2026-10-07 12:32:17 +01:00
commit 008295c8f6
Signed by: notazof
GPG key ID: AD4B9B545FBD7D12
3 changed files with 108 additions and 28 deletions

View file

@ -106,4 +106,41 @@ public class HomePageProviderFlowTests
Assert.NotNull(vm.SaveProfileCommand); Assert.NotNull(vm.SaveProfileCommand);
Assert.True(vm.SaveProfileCommand.CanExecute(null)); Assert.True(vm.SaveProfileCommand.CanExecute(null));
} }
[Fact]
public void UserProfilePage_builds_profile_payload_for_calendar_and_bank_values()
{
var vm = new UserProfilePageViewModel
{
UserName = "alice.new",
FullName = "Alice Example",
Address = "14 rue de l’Érable",
DedicatedGoogleCalendar = "calendar-123",
BankInfoSummary = "FR14 2004 1010 0505 0001 3M02 606"
};
var payload = vm.BuildProfileUpdateRequest();
Assert.Equal("alice.new", payload.UserName);
Assert.Equal("calendar-123", payload.GoogleCalendarId);
Assert.Equal("FR14 2004 1010 0505 0001 3M02 606", payload.BankInfoSummary);
}
[Fact]
public void UserProfilePage_turns_placeholder_values_into_empty_payload_fields()
{
var vm = new UserProfilePageViewModel
{
UserName = "alice.new",
FullName = "Alice Example",
Address = "14 rue de l’Érable",
DedicatedGoogleCalendar = "Non configuré",
BankInfoSummary = "Aucune information bancaire"
};
var payload = vm.BuildProfileUpdateRequest();
Assert.Equal(string.Empty, payload.GoogleCalendarId);
Assert.Equal(string.Empty, payload.BankInfoSummary);
}
} }

View file

@ -95,6 +95,31 @@ public partial class UserProfilePageViewModel : ViewModelBase
} }
} }
public ProfileUpdateRequest BuildProfileUpdateRequest()
{
static string NormalizeField(string? value, string placeholder)
{
if (string.IsNullOrWhiteSpace(value))
{
return string.Empty;
}
var trimmed = value.Trim();
return string.Equals(trimmed, placeholder, StringComparison.OrdinalIgnoreCase)
? string.Empty
: trimmed;
}
return new ProfileUpdateRequest
{
UserName = NormalizeField(UserName, "—"),
FullName = NormalizeField(FullName, "—"),
Address = NormalizeField(Address, "—"),
GoogleCalendarId = NormalizeField(DedicatedGoogleCalendar, "Non configuré"),
BankInfoSummary = NormalizeField(BankInfoSummary, "Aucune information bancaire")
};
}
[RelayCommand] [RelayCommand]
public async Task SaveProfileAsync() public async Task SaveProfileAsync()
{ {
@ -107,14 +132,7 @@ public partial class UserProfilePageViewModel : ViewModelBase
IsBusy = true; IsBusy = true;
try try
{ {
var payload = new ProfileUpdateRequest var payload = BuildProfileUpdateRequest();
{
UserName = string.IsNullOrWhiteSpace(UserName) ? string.Empty : UserName.Trim(),
FullName = string.IsNullOrWhiteSpace(FullName) ? string.Empty : FullName.Trim(),
Address = string.IsNullOrWhiteSpace(Address) ? string.Empty : Address.Trim(),
GoogleCalendarId = DedicatedGoogleCalendar == "Non configuré" ? string.Empty : DedicatedGoogleCalendar.Trim(),
BankInfoSummary = BankInfoSummary == "Aucune information bancaire" ? string.Empty : BankInfoSummary.Trim()
};
var endpoint = new Uri(new Uri(_api.Settings.ApiUrl.TrimEnd('/') + "/", UriKind.Absolute), "account/me").ToString(); var endpoint = new Uri(new Uri(_api.Settings.ApiUrl.TrimEnd('/') + "/", UriKind.Absolute), "account/me").ToString();
await _api.CallAsync(HttpMethod.Put, endpoint, payload).ConfigureAwait(true); await _api.CallAsync(HttpMethod.Put, endpoint, payload).ConfigureAwait(true);

View file

@ -116,35 +116,50 @@ namespace Yavsc.WebApi.Controllers
} }
} }
if (!string.IsNullOrWhiteSpace(request.FullName)) if (request.FullName is not null)
{ {
user.FullName = request.FullName.Trim(); user.FullName = request.FullName.Trim();
} }
if (!string.IsNullOrWhiteSpace(request.Address)) if (request.Address is not null)
{ {
if (user.PostalAddress is null) var trimmedAddress = request.Address.Trim();
if (string.IsNullOrWhiteSpace(trimmedAddress))
{ {
user.PostalAddress = new Yavsc.Models.Relationship.Location { Address = request.Address.Trim() }; user.PostalAddress = null;
}
else if (user.PostalAddress is null)
{
user.PostalAddress = new Yavsc.Models.Relationship.Location { Address = trimmedAddress };
} }
else else
{ {
user.PostalAddress.Address = request.Address.Trim(); user.PostalAddress.Address = trimmedAddress;
} }
} }
if (!string.IsNullOrWhiteSpace(request.GoogleCalendarId)) if (request.GoogleCalendarId is not null)
{ {
user.DedicatedGoogleCalendar = request.GoogleCalendarId.Trim(); user.DedicatedGoogleCalendar = request.GoogleCalendarId.Trim();
} }
if (!string.IsNullOrWhiteSpace(request.BankInfoSummary) && (user.BankInfo is null || user.BankInfo.Count == 0)) if (request.BankInfoSummary is not null)
{
var bankSummary = request.BankInfoSummary.Trim();
if (string.IsNullOrWhiteSpace(bankSummary))
{
if (user.BankInfo is not null)
{
user.BankInfo.Clear();
}
}
else if (user.BankInfo is null || user.BankInfo.Count == 0)
{ {
var bank = new Yavsc.Models.Bank.BankIdentity var bank = new Yavsc.Models.Bank.BankIdentity
{ {
UserId = uid, UserId = uid,
User = user, User = user,
IBAN = request.BankInfoSummary, IBAN = bankSummary,
BIC = string.Empty, BIC = string.Empty,
AccountNumber = string.Empty, AccountNumber = string.Empty,
BankCode = string.Empty, BankCode = string.Empty,
@ -155,6 +170,16 @@ namespace Yavsc.WebApi.Controllers
user.BankInfo ??= []; user.BankInfo ??= [];
user.BankInfo.Add(bank); user.BankInfo.Add(bank);
} }
else
{
var firstBank = user.BankInfo.First();
firstBank.IBAN = bankSummary;
firstBank.BIC = string.Empty;
firstBank.AccountNumber = string.Empty;
firstBank.BankCode = string.Empty;
firstBank.WicketCode = string.Empty;
}
}
await _dbContext.SaveChangesAsync(uid); await _dbContext.SaveChangesAsync(uid);
return Ok(new { status = "saved", fullName = user.FullName, address = user.PostalAddress?.Address, googleCalendarId = user.DedicatedGoogleCalendar }); return Ok(new { status = "saved", fullName = user.FullName, address = user.PostalAddress?.Address, googleCalendarId = user.DedicatedGoogleCalendar });