diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f180f912..f4c54563 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.x + dotnet-version: 8.x - name: Restore dependencies run: dotnet restore - name: Build diff --git a/Axuno.BackgroundTask.Test/Axuno.BackgroundTask.Tests.csproj b/Axuno.BackgroundTask.Test/Axuno.BackgroundTask.Tests.csproj index e5ff34af..5cd5cb99 100644 --- a/Axuno.BackgroundTask.Test/Axuno.BackgroundTask.Tests.csproj +++ b/Axuno.BackgroundTask.Test/Axuno.BackgroundTask.Tests.csproj @@ -1,27 +1,23 @@  - - - net6.0 - false - enable - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + net8.0 + false + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + \ No newline at end of file diff --git a/Axuno.BackgroundTask/Axuno.BackgroundTask.csproj b/Axuno.BackgroundTask/Axuno.BackgroundTask.csproj index b5b59794..b328d9f2 100644 --- a/Axuno.BackgroundTask/Axuno.BackgroundTask.csproj +++ b/Axuno.BackgroundTask/Axuno.BackgroundTask.csproj @@ -1,26 +1,22 @@  - - - Axuno.BackgroundTask - net6.0 - true - 1591 - enable - - - - - <_Parameter1>$(AssemblyName).Tests - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + Axuno.BackgroundTask + net8.0 + true + 1591 + enable + + + + <_Parameter1>$(AssemblyName).Tests + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Axuno.Tools.Tests/Axuno.Tools.Tests.csproj b/Axuno.Tools.Tests/Axuno.Tools.Tests.csproj index 131f21c4..7fc7e842 100644 --- a/Axuno.Tools.Tests/Axuno.Tools.Tests.csproj +++ b/Axuno.Tools.Tests/Axuno.Tools.Tests.csproj @@ -1,45 +1,38 @@ - - - net6.0 - enable - enable - false - enable - - - - - - - - - - <_Parameter1>$(AssemblyName).Tests - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + net8.0 + enable + enable + false + enable + + + + + + + + <_Parameter1>$(AssemblyName).Tests + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + \ No newline at end of file diff --git a/Axuno.Tools/Axuno.Tools.csproj b/Axuno.Tools/Axuno.Tools.csproj index aebbfd24..a0e1723b 100644 --- a/Axuno.Tools/Axuno.Tools.csproj +++ b/Axuno.Tools/Axuno.Tools.csproj @@ -1,28 +1,24 @@  - - - Axuno.Tools - net6.0 - latest - enable - true - 1591 - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - <_Parameter1>$(AssemblyName).Tests - - - - + + Axuno.Tools + net8.0 + latest + enable + true + 1591 + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + <_Parameter1>$(AssemblyName).Tests + + + \ No newline at end of file diff --git a/Axuno.Web/Axuno.Web.csproj b/Axuno.Web/Axuno.Web.csproj index 3257a79d..eb630447 100644 --- a/Axuno.Web/Axuno.Web.csproj +++ b/Axuno.Web/Axuno.Web.csproj @@ -1,20 +1,16 @@  - - - Axuno.Web - net6.0 - true - 1591 - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + Axuno.Web + net8.0 + true + 1591 + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index cf8671c0..6ff2cb13 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,9 +7,9 @@ Copyright 2011-$(CurrentYear) axuno gGmbH https://github.com/axuno/Volleyball-League true - 6.8.0 - 6.8.0 - 6.0.0.0 + 7.0.0 + 7.0.0 + 7.0.0.0 latest enable true diff --git a/League.Demo/League.Demo.csproj b/League.Demo/League.Demo.csproj index af07183c..32c1ecad 100644 --- a/League.Demo/League.Demo.csproj +++ b/League.Demo/League.Demo.csproj @@ -1,55 +1,47 @@ - - - League.Demo - net6.0 - en - - en;de - enable - - - - - - - - - - - - - - - - - - ViewNames.tt - True - True - - - - - - true - PreserveNewest - - - true - PreserveNewest - - - - - - ViewNames.cs - TextTemplatingFileGenerator - - - - - - - - + + League.Demo + net8.0 + en + + en;de + enable + $(NoWarn);NETSDK1206 + + + + + + + + + + + + + + ViewNames.tt + True + True + + + + + true + PreserveNewest + + + true + PreserveNewest + + + + + ViewNames.cs + TextTemplatingFileGenerator + + + + + + \ No newline at end of file diff --git a/League.Tests/Identity/UserStoreTests.cs b/League.Tests/Identity/UserStoreTests.cs index 46784289..f5b51de6 100644 --- a/League.Tests/Identity/UserStoreTests.cs +++ b/League.Tests/Identity/UserStoreTests.cs @@ -235,9 +235,9 @@ await Assert.MultipleAsync(async () => Assert.That(await _store.GetUserIdAsync(user, CancellationToken.None), Is.EqualTo(user.Id.ToString())); Assert.That(await _store.GetUserNameAsync(user, CancellationToken.None), Is.EqualTo(user.UserName)); - Assert.That(await _store.GetNormalizedUserNameAsync(user, CancellationToken.None), Is.EqualTo(user.UserName.ToUpperInvariant())); + Assert.That(await _store.GetNormalizedUserNameAsync(user, CancellationToken.None), Is.EqualTo(user.UserName?.ToUpperInvariant())); - Assert.That(await _store.GetNormalizedEmailAsync(user, CancellationToken.None), Is.EqualTo(user.Email.ToUpperInvariant())); + Assert.That(await _store.GetNormalizedEmailAsync(user, CancellationToken.None), Is.EqualTo(user.Email?.ToUpperInvariant())); }); } diff --git a/League.Tests/League.Tests.csproj b/League.Tests/League.Tests.csproj index b5efc8fb..4725fed3 100644 --- a/League.Tests/League.Tests.csproj +++ b/League.Tests/League.Tests.csproj @@ -1,35 +1,34 @@  - - - net6.0 - enable - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - + + net8.0 + enable + $(NoWarn);NETSDK1206 + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + \ No newline at end of file diff --git a/League.sln b/League.sln index 4b9aad94..8ac14122 100644 --- a/League.sln +++ b/League.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.32014.148 @@ -25,7 +25,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TournamentManager.Tests", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "League.Demo", "League.Demo\League.Demo.csproj", "{D44B54A5-FBDC-4446-BB94-901DA3FB4DA2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Axuno.Tools.Tests", "Axuno.Tools.Tests\Axuno.Tools.Tests.csproj", "{247EDA91-EAE4-4580-9C26-E6C3AB91C2D9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Axuno.Tools.Tests", "Axuno.Tools.Tests\Axuno.Tools.Tests.csproj", "{247EDA91-EAE4-4580-9C26-E6C3AB91C2D9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/League/Areas/Admin/Controllers/Impersonation.cs b/League/Areas/Admin/Controllers/Impersonation.cs index f03863d7..f7e80ad4 100644 --- a/League/Areas/Admin/Controllers/Impersonation.cs +++ b/League/Areas/Admin/Controllers/Impersonation.cs @@ -79,7 +79,10 @@ public async Task Stop() if (originalUserId != null) { var appUser = await _signInManager.UserManager.FindByIdAsync(originalUserId); - await _signInManager.SignInAsync(appUser, true); + if (appUser != null) + await _signInManager.SignInAsync(appUser, true); + else + await _signInManager.SignOutAsync(); } else { diff --git a/League/Controllers/Account.cs b/League/Controllers/Account.cs index c6cea74b..caa95a59 100644 --- a/League/Controllers/Account.cs +++ b/League/Controllers/Account.cs @@ -138,7 +138,7 @@ public async Task SignIn(SignInViewModel model, string? returnUrl return View(model); } - var result = await _signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, lockoutOnFailure: true); + var result = await _signInManager.PasswordSignInAsync(user.UserName ?? string.Empty, model.Password, model.RememberMe, lockoutOnFailure: true); if (result.Succeeded) { @@ -194,7 +194,7 @@ public async Task CreateAccount(CreateAccountViewModel model, str ModelState.AddModelError(nameof(CreateAccountViewModel.Captcha), _localizer["Math task result was incorrect"].Value); } - if (await _signInManager.UserManager.FindByEmailAsync(model.Email) != null) + if (model.Email == null || await _signInManager.UserManager.FindByEmailAsync(model.Email) != null) { ModelState.AddModelError(nameof(CreateAccountViewModel.Email), _localizer["This email is not available for a new account"].Value); } @@ -269,7 +269,7 @@ public async Task Register(RegisterViewModel model, CancellationT PhoneNumberConfirmed = false }; - var result = await _signInManager.UserManager.CreateAsync(user, model.Password); + var result = await _signInManager.UserManager.CreateAsync(user, model.Password!); if (result.Succeeded) { @@ -424,10 +424,9 @@ public async Task ForgotPassword(ForgotPasswordViewModel model) if (model.EmailOrUsername != null && model.EmailOrUsername.Contains('@')) { user = await _signInManager.UserManager.FindByEmailAsync(model.EmailOrUsername); + user ??= await _signInManager.UserManager.FindByNameAsync(model.EmailOrUsername); } - - user ??= await _signInManager.UserManager.FindByNameAsync(model.EmailOrUsername); - + if (user == null || (!await _signInManager.UserManager.IsEmailConfirmedAsync(user) && _signInManager.UserManager.Options.SignIn.RequireConfirmedEmail)) { _logger.LogInformation("No account found for '{User}'.", model.EmailOrUsername); @@ -472,10 +471,9 @@ public async Task ResetPassword(ResetPasswordViewModel model) if (model.EmailOrUsername != null && model.EmailOrUsername.Contains('@')) { user = await _signInManager.UserManager.FindByEmailAsync(model.EmailOrUsername); + user ??= await _signInManager.UserManager.FindByNameAsync(model.EmailOrUsername); } - - user ??= await _signInManager.UserManager.FindByNameAsync(model.EmailOrUsername); - + if (user == null) { _logger.LogInformation("No account found for '{User}'.", model.EmailOrUsername); @@ -483,7 +481,7 @@ public async Task ResetPassword(ResetPasswordViewModel model) await Task.Delay(5000); return View(); } - var result = await _signInManager.UserManager.ResetPasswordAsync(user, model.Code.Base64UrlDecode(), model.Password); + var result = await _signInManager.UserManager.ResetPasswordAsync(user, model.Code.Base64UrlDecode() ?? string.Empty, model.Password ?? string.Empty); if (result.Succeeded) { return Redirect(TenantLink.Action(nameof(Message), nameof(Account), new { messageTypeText = MessageType.PasswordChanged })!); @@ -544,7 +542,7 @@ private async Task IsExternalLoginStoredAsync(ExternalLoginInfo info) } private async Task FindExistingUserAsync(ExternalLoginInfo info) { - if (User.Identity?.IsAuthenticated ?? false) + if ((User.Identity?.IsAuthenticated ?? false) && User.Identity.Name != null) { return await _signInManager.UserManager.FindByNameAsync(User.Identity.Name); } @@ -574,7 +572,7 @@ private static ExternalSignConfirmationViewModel CreateExternalSignInConfirmatio { return new ExternalSignConfirmationViewModel { - Email = principal.FindFirstValue(ClaimTypes.Email), + Email = principal.FindFirstValue(ClaimTypes.Email) ?? string.Empty, Gender = string.Empty, FirstName = principal.FindFirstValue(ClaimTypes.GivenName) ?? string.Empty, LastName = principal.FindFirstValue(ClaimTypes.Surname) ?? string.Empty @@ -639,6 +637,12 @@ private async Task UpdateUserFromExternalLogin(ApplicationUser user, ExternalLog /// The of the email. private async Task SendCodeByEmail(ApplicationUser user, EmailPurpose purpose) { + if (user.Email is null) + { + _logger.LogCritical("Unexpected missing Email for user {User}", user); + return; + } + string code; var deadline = DateTime.UtcNow.Add(_dataProtectionTokenProviderOptions.Value.TokenLifespan); // round down to full hours diff --git a/League/Controllers/Captcha.cs b/League/Controllers/Captcha.cs index 6a012bbb..2aac952b 100644 --- a/League/Controllers/Captcha.cs +++ b/League/Controllers/Captcha.cs @@ -25,9 +25,9 @@ private Task GetSvgContent() // Change the response headers to output an un-cached image. HttpContext.Response.Clear(); - HttpContext.Response.Headers.Add("Expires", DateTime.UtcNow.Date.AddDays(-1).ToString("R")); - HttpContext.Response.Headers.Add("Cache-Control", "no-store, no-cache, must-revalidate"); - HttpContext.Response.Headers.Add("Pragma", "no-cache"); + HttpContext.Response.Headers.Append("Expires", DateTime.UtcNow.Date.AddDays(-1).ToString("R")); + HttpContext.Response.Headers.Append("Cache-Control", "no-store, no-cache, must-revalidate"); + HttpContext.Response.Headers.Append("Pragma", "no-cache"); HttpContext.Response.ContentType = "image/svg+xml"; return Task.FromResult(Content(ci.Image)); diff --git a/League/Controllers/Manage.cs b/League/Controllers/Manage.cs index 30505ad2..0a53bd63 100644 --- a/League/Controllers/Manage.cs +++ b/League/Controllers/Manage.cs @@ -76,7 +76,7 @@ public async Task Index() ManageMessage = TempData.Get(nameof(ManageMessage)) }; // Display phone numbers in the format of the current region - model.ApplicationUser.PhoneNumber = _phoneNumberService.Format(model.ApplicationUser.PhoneNumber, + model.ApplicationUser.PhoneNumber = _phoneNumberService.Format(model.ApplicationUser.PhoneNumber ?? string.Empty, _regionInfo.TwoLetterISORegionName); model.ApplicationUser.PhoneNumber2 = _phoneNumberService.Format(model.ApplicationUser.PhoneNumber2, _regionInfo.TwoLetterISORegionName); @@ -195,7 +195,7 @@ public async Task ConfirmNewPrimaryEmail(string id, string code, } // ChangeEmailAsync also sets EmailConfirmed = true - var result = await _userManager.ChangeEmailAsync(user, e.Base64UrlDecode(), code.Base64UrlDecode()); + var result = await _userManager.ChangeEmailAsync(user, e.Base64UrlDecode()!, code.Base64UrlDecode()!); if (result != IdentityResult.Success) { TempData.Put(nameof(ManageMessage), new ManageMessage { AlertType = SiteAlertTagHelper.AlertType.Danger, MessageId = MessageId.ChangeEmailFailure }); @@ -287,7 +287,7 @@ public async Task ChangePassword(ChangePasswordViewModel model) return PartialView(ViewNames.Manage._ChangePasswordModalPartial, model); } var user = await GetCurrentUserAsync(); - if (user != null) + if (user != null && model is { CurrentPassword: not null, NewPassword: not null }) { if (!await _userManager.CheckPasswordAsync(user, model.CurrentPassword)) { @@ -328,7 +328,7 @@ public async Task SetPassword(SetPasswordViewModel model) } var user = await GetCurrentUserAsync(); - if (user != null) + if (user != null && model.NewPassword != null) { var result = await _userManager.AddPasswordAsync(user, model.NewPassword); if (result.Succeeded) diff --git a/League/Controllers/Ranking.cs b/League/Controllers/Ranking.cs index 56d6fdf0..0054951b 100644 --- a/League/Controllers/Ranking.cs +++ b/League/Controllers/Ranking.cs @@ -121,7 +121,7 @@ public async Task AllTimeTeam(long? id, CancellationToken cancell private async Task> GetRankingListCached(CancellationToken cancellationToken) { - return await _memoryCache.GetOrCreateAsync( + var rankingList = await _memoryCache.GetOrCreateAsync( string.Join("_", _tenantContext.Identifier, typeof(Ranking).FullName, nameof(RankingListRow)), cache => { @@ -134,11 +134,16 @@ private async Task> GetRankingListCached(CancellationToken cancellationToken); } ); + + if (rankingList != null) return rankingList; + + _logger.LogCritical("Could not get or create round leg periods"); + return new List(); } private async Task> GetRoundLegPeriodsCached(List rankingList, CancellationToken cancellationToken) { - return await _memoryCache.GetOrCreateAsync( + var roundLegPeriods = await _memoryCache.GetOrCreateAsync( string.Join("_", _tenantContext.Identifier, typeof(Ranking).FullName, nameof(RoundLegPeriodRow)), cache => { @@ -152,6 +157,10 @@ private async Task> GetRoundLegPeriodsCached(List(); } private Dictionary GetChartFileInfos(IEnumerable roundIds) diff --git a/League/Controllers/Role.cs b/League/Controllers/Role.cs index b5de950d..031e7fa9 100644 --- a/League/Controllers/Role.cs +++ b/League/Controllers/Role.cs @@ -146,7 +146,7 @@ public async Task Add([FromForm] RoleAddModel model, Cancellation new { model.ReturnUrl })); } - var newTeamMember = await _signInManager.UserManager.FindByEmailAsync(model.UserEmail); + var newTeamMember = model.UserEmail != null ? await _signInManager.UserManager.FindByEmailAsync(model.UserEmail) : null; if (newTeamMember != null) { await _signInManager.UserManager.AddClaimAsync(newTeamMember, new Claim(model.ClaimType, model.TeamId.ToString())); diff --git a/League/Controllers/Team.cs b/League/Controllers/Team.cs index 916e2c5d..2fbf80a7 100644 --- a/League/Controllers/Team.cs +++ b/League/Controllers/Team.cs @@ -71,7 +71,14 @@ public async Task List(CancellationToken cancellationToken) public async Task MyTeam(long? id, CancellationToken cancellationToken) { // make sure that any changes are immediately reflected in the user's application cookie - await _signInManager.RefreshSignInAsync(await _signInManager.UserManager.FindByIdAsync(User.FindFirstValue(ClaimTypes.NameIdentifier))); + var appUser = await _signInManager.UserManager.GetUserAsync(User); + if (appUser != null) + await _signInManager.RefreshSignInAsync(appUser); + else + { + await _signInManager.SignOutAsync(); + return Redirect(TenantLink.Action(nameof(MyTeam), nameof(Team), new { id = default(long?) })!); + } var userTeamIds = GetUserClaimTeamIds(); // As admin, any selected team will be returned as "my team" diff --git a/League/Controllers/TeamApplication.cs b/League/Controllers/TeamApplication.cs index 9fd96d75..6c52e8b1 100644 --- a/League/Controllers/TeamApplication.cs +++ b/League/Controllers/TeamApplication.cs @@ -767,6 +767,11 @@ private async Task AddManagerToTeamEntity(TeamEntity teamEntity, CancellationTok } // make sure that any changes are immediately reflected in the user's application cookie - await _signInManager.RefreshSignInAsync(await _signInManager.UserManager.FindByIdAsync(User.FindFirstValue(ClaimTypes.NameIdentifier))); + var userName = User.FindFirstValue(ClaimTypes.NameIdentifier); + var appUser = userName != null ? await _signInManager.UserManager.FindByIdAsync(userName) : null; + if (appUser != null) + await _signInManager.RefreshSignInAsync(appUser); + else + await _signInManager.SignOutAsync(); } } diff --git a/League/Identity/ApplicationUser.cs b/League/Identity/ApplicationUser.cs index 183e7e65..82582677 100644 --- a/League/Identity/ApplicationUser.cs +++ b/League/Identity/ApplicationUser.cs @@ -5,7 +5,7 @@ namespace League.Identity; /// Represents a custom user in the AspNetCore Identity system public class ApplicationUser : IdentityUser, IIdentity { - public override string UserName + public override string? UserName { get { @@ -14,7 +14,7 @@ public override string UserName set { - Name = value; + Name = value ?? string.Empty; } } diff --git a/League/Identity/MultilanguageIdentityErrorDescriber.cs b/League/Identity/MultilanguageIdentityErrorDescriber.cs index 9cdbf19d..e70ed9fb 100644 --- a/League/Identity/MultilanguageIdentityErrorDescriber.cs +++ b/League/Identity/MultilanguageIdentityErrorDescriber.cs @@ -63,21 +63,21 @@ public override IdentityError LoginAlreadyAssociated() }; } - public override IdentityError InvalidUserName(string userName) + public override IdentityError InvalidUserName(string? userName) { return new IdentityError { Code = nameof(InvalidUserName), - Description = _localizer[nameof(InvalidUserName), userName] + Description = _localizer[nameof(InvalidUserName), userName ?? string.Empty] }; } - public override IdentityError InvalidEmail(string email) + public override IdentityError InvalidEmail(string? email) { return new IdentityError { Code = nameof(InvalidEmail), - Description = _localizer[nameof(InvalidEmail), email] + Description = _localizer[nameof(InvalidEmail), email ?? string.Empty] }; } @@ -99,12 +99,12 @@ public override IdentityError DuplicateEmail(string email) }; } - public override IdentityError InvalidRoleName(string role) + public override IdentityError InvalidRoleName(string? role) { return new IdentityError { Code = nameof(InvalidRoleName), - Description = _localizer[nameof(InvalidRoleName), role] + Description = _localizer[nameof(InvalidRoleName), role ?? string.Empty] }; } diff --git a/League/Identity/RoleStore.cs b/League/Identity/RoleStore.cs index 9beee7e7..10687eb0 100644 --- a/League/Identity/RoleStore.cs +++ b/League/Identity/RoleStore.cs @@ -141,15 +141,15 @@ public async Task FindByNameAsync(string normalizedRoleName, Ca return new ApplicationRole { Id = roleEntity.Id, Name = roleEntity.Name }; } #nullable enable annotations - public Task GetNormalizedRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) + public Task GetNormalizedRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) { if (role == null) throw new ArgumentNullException(nameof(role)); - return Task.FromResult(_keyNormalizer.NormalizeName(role.Name)); + return Task.FromResult(_keyNormalizer.NormalizeName(role.Name)); } - public Task SetNormalizedRoleNameAsync(ApplicationRole role, string normalizedName, CancellationToken cancellationToken) + public Task SetNormalizedRoleNameAsync(ApplicationRole role, string? normalizedName, CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -162,20 +162,21 @@ public Task GetRoleIdAsync(ApplicationRole role, CancellationToken cance return Task.FromResult(role.Id.ToString()); } - public Task GetRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) + public Task GetRoleNameAsync(ApplicationRole role, CancellationToken cancellationToken) { - if (role == null) - throw new ArgumentNullException(nameof(role)); + ArgumentNullException.ThrowIfNull(role); - return Task.FromResult(role.Name); + return Task.FromResult(role.Name); } - public Task SetRoleNameAsync(ApplicationRole role, string roleName, CancellationToken cancellationToken) + public Task SetRoleNameAsync(ApplicationRole role, string? roleName, CancellationToken cancellationToken) { - if (role == null) - throw new ArgumentNullException(nameof(role)); + ArgumentNullException.ThrowIfNull(role); + + if (string.IsNullOrEmpty(roleName)) + throw new ArgumentNullException(nameof(roleName), @"Null or empty"); - role.Name = roleName ?? throw new ArgumentNullException(nameof(roleName)); + role.Name = roleName; return Task.CompletedTask; } diff --git a/League/Identity/UserStore.cs b/League/Identity/UserStore.cs index eef66e72..a6397c68 100644 --- a/League/Identity/UserStore.cs +++ b/League/Identity/UserStore.cs @@ -148,7 +148,7 @@ public async Task FindByNameAsync(string normalizedUserName, Ca { cancellationToken.ThrowIfCancellationRequested(); if (string.IsNullOrEmpty(normalizedUserName)) - throw new ArgumentNullException(nameof(normalizedUserName), "Null or empty"); + throw new ArgumentNullException(nameof(normalizedUserName), @"Null or empty"); var userEntity = await _appDb.UserRepository.GetLoginUserByUserNameAsync(normalizedUserName, cancellationToken); if (userEntity == null) return null; @@ -158,7 +158,7 @@ public async Task FindByNameAsync(string normalizedUserName, Ca return user; } #nullable enable annotations - public Task GetNormalizedUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetNormalizedUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -174,7 +174,7 @@ public Task GetUserIdAsync(ApplicationUser user, CancellationToken cance return Task.FromResult(user.Id.ToString()); } - public Task GetUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetUserNameAsync(ApplicationUser user, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -182,26 +182,26 @@ public Task GetUserNameAsync(ApplicationUser user, CancellationToken can return Task.FromResult(user.UserName); } - public Task SetNormalizedUserNameAsync(ApplicationUser user, string normalizedName, + public Task SetNormalizedUserNameAsync(ApplicationUser user, string? normalizedName, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(normalizedName)) - throw new ArgumentNullException(nameof(normalizedName), "Null or empty"); + throw new ArgumentNullException(nameof(normalizedName), @"Null or empty"); user.NormalizedUserName = _keyNormalizer.NormalizeName(normalizedName); return Task.CompletedTask; } - public Task SetUserNameAsync(ApplicationUser user, string userName, CancellationToken cancellationToken) + public Task SetUserNameAsync(ApplicationUser user, string? userName, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(userName)) - throw new ArgumentNullException(nameof(userName), "Null or empty"); + throw new ArgumentNullException(nameof(userName), @"Null or empty"); user.UserName = userName; SetNormalizedUserNameAsync(user, userName, cancellationToken); @@ -251,13 +251,13 @@ public async Task UpdateAsync(ApplicationUser user, Cancellation #endregion #region ** IUserEmailStore ** - public Task SetEmailAsync(ApplicationUser user, string email, CancellationToken cancellationToken) + public Task SetEmailAsync(ApplicationUser user, string? email, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(email)) - throw new ArgumentNullException(nameof(email), "Null or empty"); + throw new ArgumentNullException(nameof(email), @"Null or empty"); user.Email = email; SetNormalizedEmailAsync(user, email, cancellationToken); @@ -265,7 +265,7 @@ public Task SetEmailAsync(ApplicationUser user, string email, CancellationToken return Task.CompletedTask; } - public Task GetEmailAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetEmailAsync(ApplicationUser user, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -299,7 +299,7 @@ public async Task FindByEmailAsync(string normalizedEmail, Canc cancellationToken.ThrowIfCancellationRequested(); if (string.IsNullOrEmpty(normalizedEmail)) - throw new ArgumentNullException(nameof(normalizedEmail), "Null or empty"); + throw new ArgumentNullException(nameof(normalizedEmail), @"Null or empty"); var userEntity = await _appDb.UserRepository.GetLoginUserByEmailAsync(normalizedEmail, cancellationToken); if (userEntity == null) return null; @@ -309,7 +309,7 @@ public async Task FindByEmailAsync(string normalizedEmail, Canc return user; } #nullable enable annotations - public Task GetNormalizedEmailAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetNormalizedEmailAsync(ApplicationUser user, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -317,14 +317,14 @@ public Task GetNormalizedEmailAsync(ApplicationUser user, CancellationTo return Task.FromResult(user.NormalizedEmail); } - public Task SetNormalizedEmailAsync(ApplicationUser user, string normalizedEmail, + public Task SetNormalizedEmailAsync(ApplicationUser user, string? normalizedEmail, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(normalizedEmail)) - throw new ArgumentNullException(nameof(normalizedEmail), "Null or empty"); + throw new ArgumentNullException(nameof(normalizedEmail), @"Null or empty"); user.NormalizedEmail = _keyNormalizer.NormalizeEmail(normalizedEmail); return Task.CompletedTask; @@ -332,7 +332,7 @@ public Task SetNormalizedEmailAsync(ApplicationUser user, string normalizedEmail #endregion #region ** IUserPhoneNumberStore ** - public Task SetPhoneNumberAsync(ApplicationUser user, string phoneNumber, CancellationToken cancellationToken) + public Task SetPhoneNumberAsync(ApplicationUser user, string? phoneNumber, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -342,7 +342,7 @@ public Task SetPhoneNumberAsync(ApplicationUser user, string phoneNumber, Cancel return Task.CompletedTask; } - public Task GetPhoneNumberAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetPhoneNumberAsync(ApplicationUser user, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -376,7 +376,7 @@ public Task SetPhoneNumberConfirmedAsync(ApplicationUser user, bool confirmed, #endregion #region ** IUserPasswordStore ** - public Task SetPasswordHashAsync(ApplicationUser user, string passwordHash, CancellationToken cancellationToken) + public Task SetPasswordHashAsync(ApplicationUser user, string? passwordHash, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); @@ -410,7 +410,7 @@ public async Task AddToRoleAsync(ApplicationUser user, string roleName, Cancella throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(roleName)) - throw new ArgumentNullException(nameof(roleName), "Null or empty"); + throw new ArgumentNullException(nameof(roleName), @"Null or empty"); if (Constants.RoleName.GetTeamRelatedRoles().Contains(roleName)) { @@ -445,7 +445,7 @@ public async Task RemoveFromRoleAsync(ApplicationUser user, string roleName, Can throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(roleName)) - throw new ArgumentNullException(nameof(roleName), "Null or empty"); + throw new ArgumentNullException(nameof(roleName), @"Null or empty"); if (Constants.RoleName.GetTeamRelatedRoles().Contains(roleName)) { @@ -508,7 +508,7 @@ public async Task IsInRoleAsync(ApplicationUser user, string roleName, throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(roleName)) - throw new ArgumentNullException(nameof(roleName), "Null or empty"); + throw new ArgumentNullException(nameof(roleName), @"Null or empty"); var roles = await GetRolesAsync(user, cancellationToken); return roles.Any(r => r.Equals(roleName, StringComparison.InvariantCultureIgnoreCase)); @@ -827,12 +827,11 @@ public Task SetSecurityStampAsync(ApplicationUser user, string? stamp, Cancellat return Task.CompletedTask; } - public Task GetSecurityStampAsync(ApplicationUser user, CancellationToken cancellationToken) + public Task GetSecurityStampAsync(ApplicationUser user, CancellationToken cancellationToken) { - if (user == null) - throw new ArgumentNullException(nameof(user)); + ArgumentNullException.ThrowIfNull(user); - return Task.FromResult(user.SecurityStamp); + return Task.FromResult(user.SecurityStamp); } #endregion @@ -864,10 +863,10 @@ public async Task RemoveLoginAsync(ApplicationUser user, string loginProvider, s throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(loginProvider)) - throw new ArgumentNullException(nameof(loginProvider), "Null or empty"); + throw new ArgumentNullException(nameof(loginProvider), @"Null or empty"); if (string.IsNullOrEmpty(providerKey)) - throw new ArgumentNullException(nameof(providerKey), "Null or empty"); + throw new ArgumentNullException(nameof(providerKey), @"Null or empty"); try { @@ -900,10 +899,10 @@ public async Task> GetLoginsAsync(ApplicationUser user, Can public async Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(loginProvider)) - throw new ArgumentNullException(nameof(loginProvider), "Null or empty"); + throw new ArgumentNullException(nameof(loginProvider), @"Null or empty"); if (string.IsNullOrEmpty(providerKey)) - throw new ArgumentNullException(nameof(providerKey), "Null or empty"); + throw new ArgumentNullException(nameof(providerKey), @"Null or empty"); var userEntity = await _appDb.UserLoginRepository.GetUserByLoginAsync(loginProvider, providerKey, cancellationToken); if (userEntity == null) return null; @@ -922,29 +921,29 @@ public async Task FindByLoginAsync(string loginProvider, string throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(loginProvider)) - throw new ArgumentNullException(nameof(loginProvider), "Null or empty"); + throw new ArgumentNullException(nameof(loginProvider), @"Null or empty"); if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException(nameof(name), "Null or empty"); + throw new ArgumentNullException(nameof(name), @"Null or empty"); var userTokenEntity = await _appDb.UserTokenRepository.GetTokenAsync(user.Id, loginProvider, name, cancellationToken); return userTokenEntity?.Value; } - public async Task SetTokenAsync(ApplicationUser user, string loginProvider, string name, string value, + public async Task SetTokenAsync(ApplicationUser user, string loginProvider, string name, string? value, CancellationToken cancellationToken) { if (user == null) throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(loginProvider)) - throw new ArgumentNullException(nameof(loginProvider), "Null or empty"); + throw new ArgumentNullException(nameof(loginProvider), @"Null or empty"); if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException(nameof(name), "Null or empty"); + throw new ArgumentNullException(nameof(name), @"Null or empty"); if (string.IsNullOrEmpty(value)) - throw new ArgumentNullException(nameof(value), "Null or empty"); + throw new ArgumentNullException(nameof(value), @"Null or empty"); try { @@ -970,10 +969,10 @@ public async Task RemoveTokenAsync(ApplicationUser user, string loginProvider, s throw new ArgumentNullException(nameof(user)); if (string.IsNullOrEmpty(loginProvider)) - throw new ArgumentNullException(nameof(loginProvider), "Null or empty"); + throw new ArgumentNullException(nameof(loginProvider), @"Null or empty"); if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException(nameof(name), "Null or empty"); + throw new ArgumentNullException(nameof(name), @"Null or empty"); var msg = $"AuthenticationToken with name '{name}' for provider '{loginProvider}' and user id '{user.Id}' could not be removed"; try diff --git a/League/League.csproj b/League/League.csproj index a1a250ad..9b62a3a6 100644 --- a/League/League.csproj +++ b/League/League.csproj @@ -1,275 +1,260 @@  - - - Volleyball-League - net6.0 - League - League - ceea2bf6-8147-49b9-be85-26fca01f9ed3 - en - Volleyball-League - Volleyball League is an open source sports platform that brings everything necessary to organize and to run a league. + + Volleyball-League + net8.0 + League + League + ceea2bf6-8147-49b9-be85-26fca01f9ed3 + en + Volleyball-League + Volleyball League is an open source sports platform that brings everything necessary to organize and to run a league. Localizations for English and German are included. The library is in operation on platform https://volleyball-liga.de/ - MIT - https://github.com/axuno/Volleyball-League - Git - competition platform league asp-net sport volleyball net60 - - true - true - false - true - - en;de - enable - - $(NoWarn);AD0001 - - - - true - - / - - - - bin\Release\ - 3 - true - true - true - true - true - true - portable - true - DEBUG;TRACE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - true - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Never - - - - - - True - True - StatusCodes.resx - - - True - True - StatusDescriptions.resx - - - True - True - DataAnnotationResource.resx - - - True - True - ModelBindingMessageResource.resx - - - True - True - EmailResource.resx - - - _AddMemberModalPartial.resx - True - True - - - True - True - _AddMemberModalPartial.resx - - - True - True - _RemoveMemberModalPartial.resx - - - _TeamApplicationMessagesPartial.resx - True - True - - - True - True - _MyTeamMessagesPartial.resx - - - True - True - ViewNames.tt - - - - - - TextTemplatingFileGenerator - ViewNames.cs - - - - - - PublicResXFileCodeGenerator - - - PublicResXFileCodeGenerator - - - PublicResXFileCodeGenerator - StatusCodes.Designer.cs - - - PublicResXFileCodeGenerator - StatusDescriptions.Designer.cs - - - PublicResXFileCodeGenerator - DataAnnotationResource.Designer.cs - - - PublicResXFileCodeGenerator - ModelBindingMessageResource.Designer.cs - - - PublicResXFileCodeGenerator - EmailResource.Designer.cs - - - _RemoveMemberModalPartial.Designer.cs - PublicResXFileCodeGenerator - - - PublicResXFileCodeGenerator - _AddMemberModalPartial.Designer.cs - - - _TeamApplicationMessagesPartial.Designer.cs - PublicResXFileCodeGenerator - - - PublicResXFileCodeGenerator - _MyTeamMessagesPartial.Designer.cs - - - - - - - - - - - - - - - - - - - ES5 - React - AMD - True - False - False - - - False - True - True - - - - - - - Development - - - Production - - + MIT + https://github.com/axuno/Volleyball-League + Git + competition platform league asp-net sport volleyball net60 + + + true + true + false + true + + en;de + enable + + $(NoWarn);AD0001;NETSDK1206 + + + true + + / + + + bin\Release\ + 3 + true + true + true + true + true + true + portable + true + DEBUG;TRACE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + all + true + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Never + + + + + True + True + StatusCodes.resx + + + True + True + StatusDescriptions.resx + + + True + True + DataAnnotationResource.resx + + + True + True + ModelBindingMessageResource.resx + + + True + True + EmailResource.resx + + + _AddMemberModalPartial.resx + True + True + + + True + True + _AddMemberModalPartial.resx + + + True + True + _RemoveMemberModalPartial.resx + + + _TeamApplicationMessagesPartial.resx + True + True + + + True + True + _MyTeamMessagesPartial.resx + + + True + True + ViewNames.tt + + + + + TextTemplatingFileGenerator + ViewNames.cs + + + + + PublicResXFileCodeGenerator + + + PublicResXFileCodeGenerator + + + PublicResXFileCodeGenerator + StatusCodes.Designer.cs + + + PublicResXFileCodeGenerator + StatusDescriptions.Designer.cs + + + PublicResXFileCodeGenerator + DataAnnotationResource.Designer.cs + + + PublicResXFileCodeGenerator + ModelBindingMessageResource.Designer.cs + + + PublicResXFileCodeGenerator + EmailResource.Designer.cs + + + _RemoveMemberModalPartial.Designer.cs + PublicResXFileCodeGenerator + + + PublicResXFileCodeGenerator + _AddMemberModalPartial.Designer.cs + + + _TeamApplicationMessagesPartial.Designer.cs + PublicResXFileCodeGenerator + + + PublicResXFileCodeGenerator + _MyTeamMessagesPartial.Designer.cs + + + + + + + + + + + + + + + ES5 + React + AMD + True + False + False + + + False + True + True + + + + + + Development + + + Production + + \ No newline at end of file diff --git a/League/Models/ManageViewModels/RemoveLoginViewModel.cs b/League/Models/ManageViewModels/RemoveLoginViewModel.cs index 01e1a4e2..c1d04324 100644 --- a/League/Models/ManageViewModels/RemoveLoginViewModel.cs +++ b/League/Models/ManageViewModels/RemoveLoginViewModel.cs @@ -3,6 +3,6 @@ namespace League.Models.ManageViewModels; public class RemoveLoginViewModel { - public string? LoginProvider { get; set; } - public string? ProviderKey { get; set; } + public string LoginProvider { get; set; } = string.Empty; + public string ProviderKey { get; set; } = string.Empty; } diff --git a/TournamentManager/DAL/DatabaseGeneric/TournamentManager.DAL.DbGeneric.csproj b/TournamentManager/DAL/DatabaseGeneric/TournamentManager.DAL.DbGeneric.csproj index 145fa918..4685603c 100644 --- a/TournamentManager/DAL/DatabaseGeneric/TournamentManager.DAL.DbGeneric.csproj +++ b/TournamentManager/DAL/DatabaseGeneric/TournamentManager.DAL.DbGeneric.csproj @@ -1,17 +1,17 @@  - - net6.0 - TournamentManager.DAL.DbGeneric - TournamentManager.DAL - true - CA5362;CS1591 - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + net8.0 + TournamentManager.DAL.DbGeneric + TournamentManager.DAL + true + CA5362;CS1591 + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/TournamentManager/DAL/DatabaseSpecific/TournamentManager.DAL.DBSpecific.csproj b/TournamentManager/DAL/DatabaseSpecific/TournamentManager.DAL.DBSpecific.csproj index fa13c7a6..cba29670 100644 --- a/TournamentManager/DAL/DatabaseSpecific/TournamentManager.DAL.DBSpecific.csproj +++ b/TournamentManager/DAL/DatabaseSpecific/TournamentManager.DAL.DBSpecific.csproj @@ -1,16 +1,16 @@  - - net6.0 - TournamentManager.DAL.DBSpecific - TournamentManager.DAL.DatabaseSpecific - true - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + net8.0 + TournamentManager.DAL.DBSpecific + TournamentManager.DAL.DatabaseSpecific + true + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantConfigWatcherTests.cs b/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantConfigWatcherTests.cs index 81896350..68f6eabc 100644 --- a/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantConfigWatcherTests.cs +++ b/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantConfigWatcherTests.cs @@ -135,8 +135,8 @@ private TenantConfigWatcher GetTenantConfigWatcher() private IConfiguration CreateTenantStoreConfig() { // Configure connection strings per tenant - var connStr = new List>(); - _tenantNames.ForEach(t => connStr.Add(new KeyValuePair($"{ConnectionStrings}:{ConnKeyPrefix}{t}", $"{ConnValuePrefix}{t}"))); + var connStr = new List>(); + _tenantNames.ForEach(t => connStr.Add(new KeyValuePair($"{ConnectionStrings}:{ConnKeyPrefix}{t}", $"{ConnValuePrefix}{t}"))); // Build configuration var cb = new ConfigurationBuilder(); cb.AddInMemoryCollection(connStr); diff --git a/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantStoreTests.cs b/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantStoreTests.cs index 514223dc..51b90871 100644 --- a/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantStoreTests.cs +++ b/TournamentManager/TournamentManager.Tests/MultiTenancy/TenantStoreTests.cs @@ -18,8 +18,8 @@ public class TenantStoreTests public TenantStoreTests() { // Configure connection strings per tenant - var connStr = new List>(); - _tenantNames.ForEach(t => connStr.Add(new KeyValuePair($"{ConnectionStrings}:{ConnKeyPrefix}{t}", $"{ConnValuePrefix}{t}"))); + var connStr = new List>(); + _tenantNames.ForEach(t => connStr.Add(new KeyValuePair($"{ConnectionStrings}:{ConnKeyPrefix}{t}", $"{ConnValuePrefix}{t}"))); // Build configuration var cb = new ConfigurationBuilder(); cb.AddInMemoryCollection(connStr); diff --git a/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLogger.cs b/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLogger.cs index f53c0e37..4420c39e 100644 --- a/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLogger.cs +++ b/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLogger.cs @@ -97,7 +97,7 @@ public bool IsEnabled(LogLevel logLevel) /// /// /// Returns the instance of this logger. - public IDisposable BeginScope(TState state) + public IDisposable BeginScope(TState state) where TState : notnull { return this; } diff --git a/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLoggerOfT.cs b/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLoggerOfT.cs index 40d7b4c9..8b1d9d3f 100644 --- a/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLoggerOfT.cs +++ b/TournamentManager/TournamentManager.Tests/TestComponents/NUnitLoggerOfT.cs @@ -15,9 +15,9 @@ public NUnitLogger() : base(typeof(T).FullName ?? "(null)") { } /// - /// Gets a new instance of an . + /// Gets a new instance of a . /// - /// Returns a new instance of an . + /// Returns a new instance of a . public new ILogger Create() { return new NUnitLogger(); diff --git a/TournamentManager/TournamentManager.Tests/TournamentManager.Tests.csproj b/TournamentManager/TournamentManager.Tests/TournamentManager.Tests.csproj index d9ab9646..0ea9c836 100644 --- a/TournamentManager/TournamentManager.Tests/TournamentManager.Tests.csproj +++ b/TournamentManager/TournamentManager.Tests/TournamentManager.Tests.csproj @@ -1,38 +1,35 @@  - - - net6.0 - en - enable - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - + + net8.0 + en + enable + $(NoWarn);NETSDK1206 + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + \ No newline at end of file diff --git a/TournamentManager/TournamentManager/Data/UserRepository.cs b/TournamentManager/TournamentManager/Data/UserRepository.cs index 6d4ecf37..a06dd685 100644 --- a/TournamentManager/TournamentManager/Data/UserRepository.cs +++ b/TournamentManager/TournamentManager/Data/UserRepository.cs @@ -137,8 +137,10 @@ where username.Equals(u.UserName, StringComparison.InvariantCultureIgnoreCase) /// /// /// Returns true, if a user with the given email exists, else false. - public virtual async Task EmailExistsAsync(string email) + public virtual async Task EmailExistsAsync(string? email) { + if (email == null) return false; + email = email.ToLowerInvariant(); using var da = _dbContext.GetNewAdapter(); var metaData = new LinqMetaData(da); diff --git a/TournamentManager/TournamentManager/TournamentManager.csproj b/TournamentManager/TournamentManager/TournamentManager.csproj index 817b9450..a9ccecf4 100644 --- a/TournamentManager/TournamentManager/TournamentManager.csproj +++ b/TournamentManager/TournamentManager/TournamentManager.csproj @@ -1,170 +1,162 @@  - - - Tournament Manager - net6.0 - en - - en;de - 6.2.0 - 6.2.0 - true - 1591 - TournamentManager is the backend for Volleyball League. + + Tournament Manager + net8.0 + en + + en;de + 6.2.0 + 6.2.0 + true + $(NoWarn);1591;NETSDK1206 + TournamentManager is the backend for Volleyball League. Volleyball League is an open source sports platform that brings everything necessary to organize and to run a league. - - en;de - enable - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - Development - - - Production - - - - - True - True - FixtureValidatorResource.resx - - - True - True - UserEntityValidatorResource.resx - - - True - True - MatchResultPermissionValidatorResource.resx - - - True - True - MatchResultValidatorResource.resx - - - True - True - PhoneNumberValidatorResource.resx - - - True - True - SetsValidatorResource.resx - - - True - True - SingleSetValidatorResource.resx - - - True - True - TeamInRoundValidatorResource.resx - - - True - True - TeamValidatorResource.resx - - - True - True - TeamVenueValidatorResource.resx - - - True - True - VenueValidatorResource.resx - - - - - - ResXFileCodeGenerator - FixtureValidatorResource.Designer.cs - - - PublicResXFileCodeGenerator - UserEntityValidatorResource.Designer.cs - - - ResXFileCodeGenerator - MatchResultPermissionValidatorResource.Designer.cs - - - ResXFileCodeGenerator - MatchResultValidatorResource.Designer.cs - - - ResXFileCodeGenerator - PhoneNumberValidatorResource.Designer.cs - - - ResXFileCodeGenerator - SetsValidatorResource.Designer.cs - - - ResXFileCodeGenerator - SingleSetValidatorResource.Designer.cs - - - TeamInRoundValidatorResource.Designer.cs - ResXFileCodeGenerator - - - ResXFileCodeGenerator - TeamVenueValidatorResource.Designer.cs - - - VenueValidatorResource.Designer.cs - PublicResXFileCodeGenerator - - - PublicResXFileCodeGenerator - TeamValidatorResource.Designer.cs - - - - - - <_Parameter1>$(AssemblyName).Tests - - - <_Parameter1>$(AssemblyName).Play - - - - <_Parameter1>DynamicProxyGenAssembly2 - - - - + + en;de + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + Development + + + Production + + + + True + True + FixtureValidatorResource.resx + + + True + True + UserEntityValidatorResource.resx + + + True + True + MatchResultPermissionValidatorResource.resx + + + True + True + MatchResultValidatorResource.resx + + + True + True + PhoneNumberValidatorResource.resx + + + True + True + SetsValidatorResource.resx + + + True + True + SingleSetValidatorResource.resx + + + True + True + TeamInRoundValidatorResource.resx + + + True + True + TeamValidatorResource.resx + + + True + True + TeamVenueValidatorResource.resx + + + True + True + VenueValidatorResource.resx + + + + + ResXFileCodeGenerator + FixtureValidatorResource.Designer.cs + + + PublicResXFileCodeGenerator + UserEntityValidatorResource.Designer.cs + + + ResXFileCodeGenerator + MatchResultPermissionValidatorResource.Designer.cs + + + ResXFileCodeGenerator + MatchResultValidatorResource.Designer.cs + + + ResXFileCodeGenerator + PhoneNumberValidatorResource.Designer.cs + + + ResXFileCodeGenerator + SetsValidatorResource.Designer.cs + + + ResXFileCodeGenerator + SingleSetValidatorResource.Designer.cs + + + TeamInRoundValidatorResource.Designer.cs + ResXFileCodeGenerator + + + ResXFileCodeGenerator + TeamVenueValidatorResource.Designer.cs + + + VenueValidatorResource.Designer.cs + PublicResXFileCodeGenerator + + + PublicResXFileCodeGenerator + TeamValidatorResource.Designer.cs + + + + + <_Parameter1>$(AssemblyName).Tests + + + <_Parameter1>$(AssemblyName).Play + + + + <_Parameter1>DynamicProxyGenAssembly2 + + + \ No newline at end of file