Employee Roster is a .NET 10 Blazor Server application for managing client employee rosters with an Excel-based workflow.
The primary workflow is:
- Select a client and download the current roster.
- Edit roster data in Excel (
.xlsx). - Upload the workbook for validation.
- Review warnings/errors and proposed changes.
- Submit validated changes.
The app currently applies adds and updates from validated uploads. It does not perform roster deactivation through upload apply.
- Framework: .NET 10 (
net10.0) - UI: Blazor Server + MudBlazor
- Application pattern: request/handler dispatching (CQRS-style dispatcher)
- Data access:
- EF Core SQL Server persistence (
EmployeeRoster.Persistence) - Optional Snowflake-backed persistence (
EmployeeRoster.Persistence.Snowflake)
- EF Core SQL Server persistence (
- Employee directory integration: Snowflake provider with a local development stub option
- Auth: Windows Negotiate authentication + policy-based authorization
- Logging: Serilog (console + SQL Server sink for error events)
EmployeeRoster.WebApp- host app, Blazor components/pages, startup pipeline, API endpointsEmployeeRoster.Application- use cases, contracts, dispatcher, validation orchestration, mappingEmployeeRoster.Domain- domain model, entities, enums, business behaviorEmployeeRoster.Excel- Excel import/export servicesEmployeeRoster.Persistence- EF Core persistence and repository/unit-of-work implementationEmployeeRoster.Persistence.Snowflake- Snowflake persistence implementationEmployeeRoster.Snowflake- Snowflake employee directory integration + stub implementation
EmployeeRoster.WebApp.TestsEmployeeRoster.Application.TestsEmployeeRoster.Domain.TestsEmployeeRoster.Excel.TestsEmployeeRoster.Persistence.TestsEmployeeRoster.Persistence.Snowflake.TestsEmployeeRoster.Snowflake.Tests
/- roster page (client selection, roster grid, download, upload)/admin- client and identifier type administration/status/{code}- status page for errors like 403/404
GET /api/roster/{clientId:int}/download- downloads roster export for a client
Default upload settings (from appsettings.json):
MaxUploadBytes:5242880(5 MB)AllowedContentTypes:application/vnd.openxmlformats-officedocument.spreadsheetml.sheetAllowedExtensions:.xlsx
Upload processing includes validation results, duplicate detection (SHA-256 hash), and token-based staging. Staged upload data is stored in memory with a 30-minute TTL.
ConnectionStrings:EmployeeRoster
EmployeeDirectory:Provider- Set to
Stubin development to avoid Snowflake dependency for directory lookups.
- Set to
ConnectionStrings:Snowflake- Required when
EmployeeDirectory:Provideris notStub.
- Required when
Persistence:Provider- Default path uses SQL Server persistence.
- Set to
Snowflaketo use Snowflake persistence.
ConnectionStrings:EmployeeRosterSnowflake- Required when
Persistence:Provider=Snowflake.
- Required when
Use user-secrets for local credentials (do not commit credentials to source control):
dotnet user-secrets --project src/EmployeeRoster.WebApp init
dotnet user-secrets --project src/EmployeeRoster.WebApp set "ConnectionStrings:EmployeeRoster" "<your-sql-connection-string>"
dotnet user-secrets --project src/EmployeeRoster.WebApp set "EmployeeDirectory:Provider" "Stub"If using Snowflake integrations locally:
dotnet user-secrets --project src/EmployeeRoster.WebApp set "ConnectionStrings:Snowflake" "<your-snowflake-connection-string>"
# only if Snowflake persistence is enabled
dotnet user-secrets --project src/EmployeeRoster.WebApp set "ConnectionStrings:EmployeeRosterSnowflake" "<your-snowflake-persistence-connection-string>"dotnet restore EmployeeRoster.slnx
dotnet build EmployeeRoster.slnx -c Release
dotnet test EmployeeRoster.slnx -c ReleaseRun the app:
dotnet run --project src/EmployeeRoster.WebAppHot reload:
dotnet watch --project src/EmployeeRoster.WebApp runThis repository should only contain placeholder and non-sensitive configuration. Before publishing:
- Keep all real credentials in user-secrets, environment variables, or a secure secret manager.
- Verify no publish profiles with credentials are committed.
- Run a full secret scan on current files and Git history (history scanning is required separately).
- Rotate any credential that may ever have been committed.
No license file is currently defined in this repository. Add one before public release if needed.