diff options
Diffstat (limited to 'Blog')
| -rw-r--r-- | Blog/Components/Pages/BRP.razor | 13 | ||||
| -rw-r--r-- | Blog/Components/Pages/BRP.razor.cs | 5 | ||||
| -rw-r--r-- | Blog/Components/Pages/BrpTestData.razor | 16 | ||||
| -rw-r--r-- | Blog/Components/_Shared/JsonRender.razor | 24 | ||||
| -rw-r--r-- | Blog/Models/RaadpleegMetBurgerservicenummer.cs | 24 | ||||
| -rw-r--r-- | Blog/Program.cs | 15 | ||||
| -rw-r--r-- | Blog/Services/BrpService.cs | 23 | ||||
| -rw-r--r-- | Blog/wwwroot/app.css | 20 |
8 files changed, 112 insertions, 28 deletions
diff --git a/Blog/Components/Pages/BRP.razor b/Blog/Components/Pages/BRP.razor index 6595d3a..89c8510 100644 --- a/Blog/Components/Pages/BRP.razor +++ b/Blog/Components/Pages/BRP.razor | |||
| @@ -1,8 +1,17 @@ | |||
| 1 | @page "/BRP/{BSN}" | 1 | @page "/BRP/{BSN}" |
| 2 | @using System.Text.Json | ||
| 3 | <PageTitle>BRP</PageTitle> | 2 | <PageTitle>BRP</PageTitle> |
| 4 | 3 | ||
| 5 | <main> | 4 | <main> |
| 6 | <JsonRender Element="Entry?.RootElement"></JsonRender> | 5 | <div> |
| 6 | <details> | ||
| 7 | <summary><h1>Request</h1></summary> | ||
| 8 | <JsonRender Element="RequestBody?.RootElement"></JsonRender> | ||
| 9 | </details> | ||
| 10 | </div> | ||
| 11 | <div> | ||
| 12 | <h1>Response</h1> | ||
| 13 | <JsonRender Element="Entry?.RootElement"> | ||
| 14 | </JsonRender> | ||
| 15 | </div> | ||
| 7 | </main> | 16 | </main> |
| 8 | 17 | ||
diff --git a/Blog/Components/Pages/BRP.razor.cs b/Blog/Components/Pages/BRP.razor.cs index e7298a9..1398a01 100644 --- a/Blog/Components/Pages/BRP.razor.cs +++ b/Blog/Components/Pages/BRP.razor.cs | |||
| @@ -2,7 +2,6 @@ using System.Text.Json; | |||
| 2 | using System.Text.RegularExpressions; | 2 | using System.Text.RegularExpressions; |
| 3 | using Blog.Services; | 3 | using Blog.Services; |
| 4 | using Microsoft.AspNetCore.Components; | 4 | using Microsoft.AspNetCore.Components; |
| 5 | using Microsoft.AspNetCore.Mvc; | ||
| 6 | 5 | ||
| 7 | namespace Blog.Components.Pages; | 6 | namespace Blog.Components.Pages; |
| 8 | 7 | ||
| @@ -13,12 +12,14 @@ public partial class BRP : ComponentBase | |||
| 13 | 12 | ||
| 14 | [Inject] | 13 | [Inject] |
| 15 | public required BrpService Service { get; set; } | 14 | public required BrpService Service { get; set; } |
| 15 | |||
| 16 | private JsonDocument RequestBody { get; set; } | ||
| 16 | 17 | ||
| 17 | private JsonDocument Entry { get; set; } | 18 | private JsonDocument Entry { get; set; } |
| 18 | 19 | ||
| 19 | protected override async Task OnInitializedAsync() | 20 | protected override async Task OnInitializedAsync() |
| 20 | { | 21 | { |
| 21 | Entry = await Service.GetBrpEntryAsync(BSN).ConfigureAwait(true); | 22 | (RequestBody, Entry) = await Service.GetBrpEntryAsync(BSN).ConfigureAwait(true); |
| 22 | await base.OnInitializedAsync(); | 23 | await base.OnInitializedAsync(); |
| 23 | } | 24 | } |
| 24 | 25 | ||
diff --git a/Blog/Components/Pages/BrpTestData.razor b/Blog/Components/Pages/BrpTestData.razor index 1b6240e..bbaab8c 100644 --- a/Blog/Components/Pages/BrpTestData.razor +++ b/Blog/Components/Pages/BrpTestData.razor | |||
| @@ -2,11 +2,13 @@ | |||
| 2 | <PageTitle>BRP Test Data</PageTitle> | 2 | <PageTitle>BRP Test Data</PageTitle> |
| 3 | 3 | ||
| 4 | <main> | 4 | <main> |
| 5 | @foreach (var entry in Entries) | 5 | <div class="two-column"> |
| 6 | { | 6 | @foreach (var entry in Entries) |
| 7 | <div> | 7 | { |
| 8 | <NavLink href=@($"/BRP/{@entry.bsn}")>@entry.bsn</NavLink> | 8 | <div> |
| 9 | @entry.naam | 9 | <NavLink href=@($"/BRP/{@entry.bsn}")>@entry.bsn</NavLink> |
| 10 | </div> | 10 | @entry.naam |
| 11 | } | 11 | </div> |
| 12 | } | ||
| 13 | </div> | ||
| 12 | </main> \ No newline at end of file | 14 | </main> \ No newline at end of file |
diff --git a/Blog/Components/_Shared/JsonRender.razor b/Blog/Components/_Shared/JsonRender.razor index 17e08a1..45b1825 100644 --- a/Blog/Components/_Shared/JsonRender.razor +++ b/Blog/Components/_Shared/JsonRender.razor | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | [Parameter] | 5 | [Parameter] |
| 6 | public JsonElement? Element { get; set; } | 6 | public JsonElement? Element { get; set; } |
| 7 | |||
| 7 | } | 8 | } |
| 8 | @if (Element is { } element) | 9 | @if (Element is { } element) |
| 9 | { | 10 | { |
| @@ -14,7 +15,7 @@ | |||
| 14 | <ul> | 15 | <ul> |
| 15 | @foreach (var property in element.EnumerateObject()) | 16 | @foreach (var property in element.EnumerateObject()) |
| 16 | { | 17 | { |
| 17 | <li> | 18 | <li class="dash"> |
| 18 | <span class="name">@property.Name</span> | 19 | <span class="name">@property.Name</span> |
| 19 | <JsonRender Element="property.Value"/> | 20 | <JsonRender Element="property.Value"/> |
| 20 | </li> | 21 | </li> |
| @@ -45,6 +46,27 @@ | |||
| 45 | { | 46 | { |
| 46 | <span>@value</span> | 47 | <span>@value</span> |
| 47 | } | 48 | } |
| 49 | |||
| 50 | break; | ||
| 51 | } | ||
| 52 | case JsonValueKind.Null: | ||
| 53 | { | ||
| 54 | <span>Null</span> | ||
| 55 | break; | ||
| 56 | } | ||
| 57 | case JsonValueKind.True: | ||
| 58 | { | ||
| 59 | <span class="json-true">True</span> | ||
| 60 | break; | ||
| 61 | } | ||
| 62 | case JsonValueKind.False: | ||
| 63 | { | ||
| 64 | <span class="json-false">False</span> | ||
| 65 | break; | ||
| 66 | } | ||
| 67 | case JsonValueKind.Number: | ||
| 68 | { | ||
| 69 | <span class="json-number">@element.GetDouble()</span> | ||
| 48 | break; | 70 | break; |
| 49 | } | 71 | } |
| 50 | } | 72 | } |
diff --git a/Blog/Models/RaadpleegMetBurgerservicenummer.cs b/Blog/Models/RaadpleegMetBurgerservicenummer.cs new file mode 100644 index 0000000..785cf82 --- /dev/null +++ b/Blog/Models/RaadpleegMetBurgerservicenummer.cs | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | namespace Blog.Models; | ||
| 2 | |||
| 3 | public record RaadpleegMetBurgerservicenummer | ||
| 4 | { | ||
| 5 | private const string _type = "RaadpleegMetBurgerservicenummer"; | ||
| 6 | private static readonly string[] _fields = | ||
| 7 | [ | ||
| 8 | "aNummer", "adressering", "burgerservicenummer", "datumEersteInschrijvingGBA", | ||
| 9 | "datumInschrijvingInGemeente", "europeesKiesrecht", "geboorte", "gemeenteVanInschrijving", | ||
| 10 | "geslacht", "gezag", "immigratie", "indicatieCurateleRegister", "kinderen", "leeftijd", "naam", | ||
| 11 | "nationaliteiten", "ouders", "overlijden", "partners", "uitsluitingKiesrecht", "verblijfplaats", | ||
| 12 | "verblijfstitel", "verblijfplaatsBinnenland", "adresseringBinnenland" | ||
| 13 | ]; | ||
| 14 | |||
| 15 | |||
| 16 | public string Type => _type; | ||
| 17 | public string[] Fields => _fields; | ||
| 18 | public string[] Burgerservicenummer { get; init; } | ||
| 19 | |||
| 20 | public RaadpleegMetBurgerservicenummer(string bsn) | ||
| 21 | { | ||
| 22 | Burgerservicenummer = [ bsn ]; | ||
| 23 | } | ||
| 24 | } \ No newline at end of file | ||
diff --git a/Blog/Program.cs b/Blog/Program.cs index a6b9c39..893d226 100644 --- a/Blog/Program.cs +++ b/Blog/Program.cs | |||
| @@ -4,11 +4,19 @@ using Blog.Services; | |||
| 4 | var builder = WebApplication.CreateBuilder(args); | 4 | var builder = WebApplication.CreateBuilder(args); |
| 5 | 5 | ||
| 6 | // Add services to the container. | 6 | // Add services to the container. |
| 7 | builder.Services.AddRazorComponents(); | 7 | builder.Services.AddRazorComponents() |
| 8 | .AddInteractiveServerComponents(); | ||
| 8 | 9 | ||
| 9 | builder.Services.AddHttpClient(); | 10 | builder.Services.AddHttpClient(); |
| 10 | builder.Services.AddHybridCache(); | 11 | builder.Services.AddHybridCache(); |
| 11 | builder.Services.AddSingleton<BrpService>(); | 12 | builder.Services.AddHttpClient<BrpService>( |
| 13 | client => | ||
| 14 | { | ||
| 15 | client.BaseAddress = new Uri("https://brp.bes.is/"); | ||
| 16 | }); | ||
| 17 | |||
| 18 | // builder.Services.AddTransient<BrpService>(); | ||
| 19 | // builder.Services.AddTransient<NsService>(); | ||
| 12 | 20 | ||
| 13 | var app = builder.Build(); | 21 | var app = builder.Build(); |
| 14 | 22 | ||
| @@ -25,6 +33,7 @@ app.UseHttpsRedirection(); | |||
| 25 | app.UseAntiforgery(); | 33 | app.UseAntiforgery(); |
| 26 | 34 | ||
| 27 | app.MapStaticAssets(); | 35 | app.MapStaticAssets(); |
| 28 | app.MapRazorComponents<App>(); | 36 | app.MapRazorComponents<App>() |
| 37 | .AddInteractiveServerRenderMode(); | ||
| 29 | 38 | ||
| 30 | app.Run(); \ No newline at end of file | 39 | app.Run(); \ No newline at end of file |
diff --git a/Blog/Services/BrpService.cs b/Blog/Services/BrpService.cs index e2e23c0..c3eed5a 100644 --- a/Blog/Services/BrpService.cs +++ b/Blog/Services/BrpService.cs | |||
| @@ -4,7 +4,7 @@ using Microsoft.Extensions.Caching.Hybrid; | |||
| 4 | 4 | ||
| 5 | namespace Blog.Services; | 5 | namespace Blog.Services; |
| 6 | 6 | ||
| 7 | public class BrpService(HybridCache cache, IHttpClientFactory httpClientFactory) | 7 | public class BrpService(HybridCache cache, HttpClient client) |
| 8 | { | 8 | { |
| 9 | public async Task<BRPEntry[]> GetBrpEntriesAsync(CancellationToken cancellationToken = default) | 9 | public async Task<BRPEntry[]> GetBrpEntriesAsync(CancellationToken cancellationToken = default) |
| 10 | { | 10 | { |
| @@ -21,7 +21,7 @@ public class BrpService(HybridCache cache, IHttpClientFactory httpClientFactory) | |||
| 21 | .ConfigureAwait(false); | 21 | .ConfigureAwait(false); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | public async Task<JsonDocument> GetBrpEntryAsync(string bsn, CancellationToken cancellationToken = default) | 24 | public async Task<(JsonDocument request, JsonDocument response)> GetBrpEntryAsync(string bsn, CancellationToken cancellationToken = default) |
| 25 | { | 25 | { |
| 26 | return await cache.GetOrCreateAsync( | 26 | return await cache.GetOrCreateAsync( |
| 27 | $"brp/{bsn}", | 27 | $"brp/{bsn}", |
| @@ -31,21 +31,20 @@ public class BrpService(HybridCache cache, IHttpClientFactory httpClientFactory) | |||
| 31 | .ConfigureAwait(false); | 31 | .ConfigureAwait(false); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | private async Task<JsonDocument> FetchBrpEntryAsync(string bsn, CancellationToken cancellationToken) | 34 | private async Task<(JsonDocument request, JsonDocument response)> FetchBrpEntryAsync(string bsn, CancellationToken cancellationToken) |
| 35 | { | 35 | { |
| 36 | var client = httpClientFactory.CreateClient("brp"); | ||
| 37 | var response = await client.PostAsJsonAsync( | 36 | var response = await client.PostAsJsonAsync( |
| 38 | "https://brp.bes.is/haalcentraal/api/brp/personen", | 37 | "haalcentraal/api/brp/personen", |
| 39 | new | 38 | new RaadpleegMetBurgerservicenummer(bsn), |
| 40 | { | ||
| 41 | type = "RaadpleegMetBurgerservicenummer", | ||
| 42 | burgerservicenummer = new[] { bsn }, | ||
| 43 | fields = new[] {"aNummer","adressering","burgerservicenummer","datumEersteInschrijvingGBA","datumInschrijvingInGemeente","europeesKiesrecht","geboorte","gemeenteVanInschrijving","geslacht","gezag","immigratie","indicatieCurateleRegister","kinderen","leeftijd","naam","nationaliteiten","ouders","overlijden","partners","uitsluitingKiesrecht","verblijfplaats","verblijfstitel","verblijfplaatsBinnenland","adresseringBinnenland"}, | ||
| 44 | }, | ||
| 45 | cancellationToken) | 39 | cancellationToken) |
| 46 | .ConfigureAwait(false); | 40 | .ConfigureAwait(false); |
| 47 | 41 | ||
| 48 | await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); | 42 | await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); |
| 49 | return await JsonDocument.ParseAsync(stream, cancellationToken: cancellationToken).ConfigureAwait(false); | 43 | var responseDocument = await JsonDocument.ParseAsync(stream, cancellationToken: cancellationToken).ConfigureAwait(false); |
| 44 | |||
| 45 | await using var requestStream = await response.RequestMessage!.Content!.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); | ||
| 46 | var requestDocument = await JsonDocument.ParseAsync(requestStream, cancellationToken: cancellationToken).ConfigureAwait(false); | ||
| 47 | |||
| 48 | return (requestDocument, responseDocument); | ||
| 50 | } | 49 | } |
| 51 | } \ No newline at end of file | 50 | } \ No newline at end of file |
diff --git a/Blog/wwwroot/app.css b/Blog/wwwroot/app.css index 038f76e..d5dd2b4 100644 --- a/Blog/wwwroot/app.css +++ b/Blog/wwwroot/app.css | |||
| @@ -39,7 +39,7 @@ h1:focus { | |||
| 39 | 39 | ||
| 40 | * { | 40 | * { |
| 41 | box-sizing: border-box; | 41 | box-sizing: border-box; |
| 42 | font-size: calc(1rem + 0.5vw); | 42 | font-size: calc(1rem + 0.4vw); |
| 43 | font-family: monospace; | 43 | font-family: monospace; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| @@ -48,6 +48,7 @@ h1:focus { | |||
| 48 | --white: #fafafa; | 48 | --white: #fafafa; |
| 49 | --error: #da0000; | 49 | --error: #da0000; |
| 50 | --info: #669aba; | 50 | --info: #669aba; |
| 51 | --green: #5fbb5d; | ||
| 51 | 52 | ||
| 52 | --ratio: 1.5; | 53 | --ratio: 1.5; |
| 53 | --s0: 1rem; | 54 | --s0: 1rem; |
| @@ -248,6 +249,10 @@ footer > ul { | |||
| 248 | columns: 2; | 249 | columns: 2; |
| 249 | } | 250 | } |
| 250 | 251 | ||
| 252 | .two-column { | ||
| 253 | columns: 2; | ||
| 254 | } | ||
| 255 | |||
| 251 | legend::before { | 256 | legend::before { |
| 252 | content: "( "; | 257 | content: "( "; |
| 253 | } | 258 | } |
| @@ -298,3 +303,16 @@ span.name { | |||
| 298 | li.dash { | 303 | li.dash { |
| 299 | list-style-type: "- "; | 304 | list-style-type: "- "; |
| 300 | } | 305 | } |
| 306 | |||
| 307 | .json-true { | ||
| 308 | color: var(--green); | ||
| 309 | } | ||
| 310 | |||
| 311 | .json-false { | ||
| 312 | color: var(--error); | ||
| 313 | } | ||
| 314 | |||
| 315 | .json-number { | ||
| 316 | color: var(--info); | ||
| 317 | } | ||
| 318 | |||