postit: persist settings save and apply ApiUrl changes without restart #51

Merged
notazof merged 25 commits from feat/estimate into main 2026-09-06 21:05:58 +01:00
2 changed files with 43 additions and 1 deletions
Showing only changes of commit c2574ac1d4 - Show all commits

correctif UTC sur le POST/PUT RDV
All checks were successful
Dotnet build and test / build (pull_request) Successful in 6m15s
Forgejo Release / release (push) Successful in 12m29s

Paul Schneider 2026-09-06 19:48:51 +01:00
Signed by: notazof
GPG key ID: 1DD5D838E5343B06

View file

@ -112,4 +112,35 @@ public sealed class RdvQueryApiControllerTests : IClassFixture<ApiWebServerFixtu
Assert.NotNull(created); Assert.NotNull(created);
Assert.Equal("alice", created!.ClientId); Assert.Equal("alice", created!.ClientId);
} }
[Fact]
public async Task PostQuery_accepts_local_datetime_and_persists_as_utc()
{
_fixture.ResetAndSeedRdvQueryGraph();
using var http = NewClient(subject: "alice");
var localEventDate = DateTime.Now.AddDays(2);
var createPayload = new
{
ActivityCode = "dev",
PerformerId = "alice",
Consent = true,
EventDate = localEventDate,
Location = new
{
Address = "3 rue du Test",
Latitude = 48.8568,
Longitude = 2.3524,
},
Reason = "Rendez-vous date locale",
Status = QueryStatus.Inserted,
};
var createResponse = await http.PostAsJsonAsync("/api/v1/billing/Rdv", createPayload, TestContext.Current.CancellationToken);
Assert.Equal(HttpStatusCode.Created, createResponse.StatusCode);
var created = await createResponse.Content.ReadFromJsonAsync<RdvQuery>(TestContext.Current.CancellationToken);
Assert.NotNull(created);
Assert.Equal(DateTimeKind.Utc, created!.EventDate.Kind);
}
} }

View file

@ -67,6 +67,7 @@ public class RdvQueryApiController : Controller
var uid = User.GetUserId(); var uid = User.GetUserId();
// Security: the caller always posts for themselves. // Security: the caller always posts for themselves.
query.ClientId = uid; query.ClientId = uid;
query.EventDate = EnsureUtc(query.EventDate);
ModelState.Remove("Client"); ModelState.Remove("Client");
ModelState.Remove("ClientId"); ModelState.Remove("ClientId");
@ -140,7 +141,7 @@ public class RdvQueryApiController : Controller
existing.ActivityCode = query.ActivityCode; existing.ActivityCode = query.ActivityCode;
existing.PerformerId = query.PerformerId; existing.PerformerId = query.PerformerId;
existing.Consent = query.Consent; existing.Consent = query.Consent;
existing.EventDate = query.EventDate; existing.EventDate = EnsureUtc(query.EventDate);
existing.LocationType = query.LocationType; existing.LocationType = query.LocationType;
existing.Reason = query.Reason; existing.Reason = query.Reason;
existing.Status = query.Status; existing.Status = query.Status;
@ -206,4 +207,14 @@ public class RdvQueryApiController : Controller
{ {
return _context.RdvQueries.Any(e => e.Id == id); return _context.RdvQueries.Any(e => e.Id == id);
} }
private static DateTime EnsureUtc(DateTime value)
{
return value.Kind switch
{
DateTimeKind.Utc => value,
DateTimeKind.Local => value.ToUniversalTime(),
_ => DateTime.SpecifyKind(value, DateTimeKind.Utc)
};
}
} }