1. ✅ Fixed Misleading Property Names
- File: WebApp/ChapterSettings.cs - Change: Renamed StateContainer.UserId to ScheduledTeams - Impact: Property name now accurately reflects what it stores 2. ✅ Added Structured Logging with Serilog - Packages Added: - Serilog.AspNetCore - Serilog.Sinks.Console - Serilog.Sinks.File - Files Modified: - Program.cs - Added Serilog configuration with console and file logging - appsettings.json - Added Serilog minimum log levels - appsettings.Development.json - Added Debug level logging for development - Benefits: - Structured log output for better parsing/analysis - Automatic file rotation (daily, 30 days retention) - Logs stored in logs/webapp-.txt - Better formatted console output 3. ✅ Added Global Error Handling - File Created: WebApp/Components/Shared/AppErrorBoundary.razor - File Modified: WebApp/Components/App.razor - Features: - Catches unhandled exceptions throughout the app - Shows detailed error info in Development environment - Shows user-friendly message in Production - Logs errors automatically - Provides "Return to Home" button 4. ✅ Enhanced Input Validation - File Modified: WebApp/Components/Login.razor - Validations Added: - Email: Required, valid email format, max 100 chars, regex validation - Password: Required, min 8 chars, max 100 chars - Benefits: - Client-side validation before submission - Clear error messages for users - Prevents invalid data submission
This commit is contained in:
@@ -13,7 +13,9 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<Routes @rendermode="InteractiveServer" />
|
||||
<AppErrorBoundary>
|
||||
<Routes @rendermode="InteractiveServer" />
|
||||
</AppErrorBoundary>
|
||||
|
||||
<script src="_framework/blazor.web.js"></script>
|
||||
<script src="@Assets["_content/MudBlazor/MudBlazor.min.js"]"></script>
|
||||
|
||||
@@ -98,8 +98,18 @@
|
||||
|
||||
private class LoginModel
|
||||
{
|
||||
[Required(ErrorMessage = "Email is required")]
|
||||
[EmailAddress(ErrorMessage = "Invalid email format")]
|
||||
[MaxLength(100, ErrorMessage = "Email must be less than 100 characters")]
|
||||
[RegularExpression(@"^[^@\s]+@[^@\s]+\.[^@\s]+$", ErrorMessage = "Please enter a valid email address")]
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
[Required(ErrorMessage = "Password is required")]
|
||||
[MinLength(8, ErrorMessage = "Password must be at least 8 characters")]
|
||||
[MaxLength(100, ErrorMessage = "Password must be less than 100 characters")]
|
||||
[DataType(DataType.Password)]
|
||||
public string Password { get; set; } = string.Empty;
|
||||
|
||||
public bool RememberMe { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
|
||||
<ErrorBoundary>
|
||||
<ChildContent>
|
||||
@ChildContent
|
||||
</ChildContent>
|
||||
<ErrorContent Context="ex">
|
||||
<MudContainer MaxWidth="MaxWidth.Medium" Class="mt-8">
|
||||
<MudPaper Elevation="3" Class="pa-6">
|
||||
<MudAlert Severity="Severity.Error" Variant="Variant.Filled">
|
||||
<MudText Typo="Typo.h5" Class="mb-2">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Error" Class="mr-2" />
|
||||
An Error Occurred
|
||||
</MudText>
|
||||
@if (ShowDetails)
|
||||
{
|
||||
<MudText Typo="Typo.body2" Class="mt-4">
|
||||
<strong>Error:</strong> @ex.Message
|
||||
</MudText>
|
||||
<MudText Typo="Typo.caption" Class="mt-2">
|
||||
<strong>Stack Trace:</strong>
|
||||
<pre style="overflow-x: auto;">@ex.StackTrace</pre>
|
||||
</MudText>
|
||||
}
|
||||
else
|
||||
{
|
||||
<MudText Typo="Typo.body2">
|
||||
Something went wrong. Please try refreshing the page or contact support if the problem persists.
|
||||
</MudText>
|
||||
}
|
||||
</MudAlert>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Primary"
|
||||
Class="mt-4"
|
||||
OnClick="@(() => Navigation.NavigateTo("/", forceLoad: true))">
|
||||
Return to Home
|
||||
</MudButton>
|
||||
</MudPaper>
|
||||
</MudContainer>
|
||||
</ErrorContent>
|
||||
</ErrorBoundary>
|
||||
|
||||
@code {
|
||||
[Parameter] public RenderFragment? ChildContent { get; set; }
|
||||
[Inject] private IWebHostEnvironment Environment { get; set; } = default!;
|
||||
[Inject] private NavigationManager Navigation { get; set; } = default!;
|
||||
[Inject] private ILogger<AppErrorBoundary> Logger { get; set; } = default!;
|
||||
|
||||
private bool ShowDetails => Environment.IsDevelopment();
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
Logger.LogError("Error boundary triggered");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user