Commit: 02ee2ad
Parent: 736a0cc

Accept phone numer in multiple formats

Mårten Åsberg committed on 2026-05-28 at 13:33
MatDenDagen/Components/Pages/Submission.razor +2 -67
diff --git a/MatDenDagen/Components/Pages/Submission.razor b/MatDenDagen/Components/Pages/Submission.razor
index 48b9022..1f076ce 100644
@@ -1,18 +1,10 @@
@page "/submission"
@using MatDenDagen.Infrastructure.Storage.BlobStorage
@using MatDenDagen.Infrastructure.Storage.Database
@using MatDenDagen.Models
@using Microsoft.AspNetCore.Http
@using Microsoft.EntityFrameworkCore
@inject TimeProvider timeProvider
@inject BlobStorageService blobService
@inject QuestionnaireContext questionnaireContext
@inject NavigationManager navigationManager
@layout MainLayout
<div class="submission-page">
<h1>Skicka in ditt svar</h1>
<div class="cookbook-intro card">
<p>Fyll i dina svar på frågorna nedan, skriv så mycket eller lite du vill på varje fråga, eller skippa frågor du
inte har något svar till.</p>
@@ -22,7 +14,6 @@
{
<div class="success-message card">
<h2>Tack för ditt svar!</h2>
<p>Ditt svar har skickats in och vi ser fram emot att planera en underbar matupplevelse tillsammans.</p>
</div>
}
@@ -46,7 +37,7 @@
<div class="form-group card">
<label>
<span class="form-label">Telefonnummer (obligatoriskt)</span>
<input type="text" name="phoneNumber" required placeholder="072XXXXXXX" class="form-input" />
<input type="text" name="phoneNumber" required placeholder="07XXXXXXXX" class="form-input" />
</label>
</div>
@@ -84,59 +75,3 @@
</form>
}
</div>
@code {
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private bool success = false;
private List<Question> questions = [];
private string? errorMessage = null;
protected override async Task OnInitializedAsync()
{
questions = await questionnaireContext.Questions.ToListAsync(HttpContext.RequestAborted);
if (HttpContext?.Request.Method != "POST")
return;
var form = HttpContext.Request.Form;
var phoneNumber = form["phoneNumber"].ToString();
var participant = await questionnaireContext.Participants
.SingleOrDefaultAsync(p => p.PhoneNumber == phoneNumber, HttpContext.RequestAborted);
if (participant is null)
{
errorMessage = "Okänt telefonnummer. Var god kontakta administratören för att registrera ditt telefonnummer.";
return;
}
var uploads = new List<Upload>();
foreach (var file in form.Files)
{
await using var stream = file.OpenReadStream();
var result = await blobService.SaveBlob(stream, HttpContext.RequestAborted);
uploads.Add(new Upload { Id = result.Id, Name = file.FileName });
}
questionnaireContext.Submissions.Add(new()
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
Answers = questions.Select(q => new Answer
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
QuestionId = q.Id,
Text = form[$"answer[{q.Id}]"].ToString()
}).ToList(),
Uploads = uploads,
Participant = participant.Id
});
await questionnaireContext.SaveChangesAsync(HttpContext.RequestAborted);
success = true;
}
}
MatDenDagen/Components/Pages/Submission.razor.cs +100 -0
diff --git a/MatDenDagen/Components/Pages/Submission.razor.cs b/MatDenDagen/Components/Pages/Submission.razor.cs
new file mode 100644
index 0000000..8432527
@@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using MatDenDagen.Infrastructure.Storage.BlobStorage;
using MatDenDagen.Infrastructure.Storage.Database;
using MatDenDagen.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
namespace MatDenDagen.Components.Pages;
public partial class Submission(
TimeProvider timeProvider,
BlobStorageService blobService,
QuestionnaireContext questionnaireContext
)
{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private bool success = false;
private List<Question> questions = [];
private string? errorMessage = null;
protected override async Task OnInitializedAsync()
{
questions = await questionnaireContext.Questions.ToListAsync(
HttpContext?.RequestAborted ?? CancellationToken.None
);
if (HttpContext?.Request.Method is not "POST")
return;
var form = HttpContext.Request.Form;
var phoneNumber = form["phoneNumber"].FirstOrDefault();
if (phoneNumber is null)
{
errorMessage = "Telefonnummer är obligatoriskt.";
return;
}
List<string> phoneNumberVariants = [phoneNumber, nonDigits.Replace(phoneNumber, "")];
if (phoneNumber.StartsWith("+46"))
{
phoneNumberVariants.Add(phoneNumber[3..]);
phoneNumberVariants.Add(nonDigits.Replace(phoneNumber[3..], ""));
}
var participant = await questionnaireContext.Participants.SingleOrDefaultAsync(
p => phoneNumberVariants.Contains(p.PhoneNumber),
HttpContext.RequestAborted
);
if (participant is null)
{
errorMessage =
"Okänt telefonnummer. Var god kontakta administratören för att registrera ditt telefonnummer.";
return;
}
var uploads = new List<Upload>();
foreach (var file in form.Files)
{
await using var stream = file.OpenReadStream();
var result = await blobService.SaveBlob(stream, HttpContext.RequestAborted);
uploads.Add(new Upload { Id = result.Id, Name = file.FileName });
}
questionnaireContext.Submissions.Add(
new()
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
Answers =
[
.. questions.Select(q => new Answer
{
Id = Guid.CreateVersion7(timeProvider.GetUtcNow()),
QuestionId = q.Id,
Text = form[$"answer[{q.Id}]"].ToString(),
}),
],
Uploads = uploads,
Participant = participant.Id,
}
);
await questionnaireContext.SaveChangesAsync(HttpContext.RequestAborted);
success = true;
}
[GeneratedRegex(@"[^\d]+")]
private partial Regex nonDigits { get; }
}