From e7618861e0cb8ab0c2956c5edced27ce2ffee594 Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Sun, 16 Apr 2023 19:28:21 -0500 Subject: [PATCH] Pre-Release Shakeout (#1932) * Allow users to setup an account with a fake email and the same username without hitting the validate username code. * Fixed a bug where opds url could have //. Fixed a bug where baseurl wasn't being used for invite link generation * Fixed enum mismatch causing age rating to display incorrectly on UI --- API.Tests/Services/ReadingListServiceTests.cs | 9 ++++++++ API/Controllers/AccountController.cs | 6 ++++- API/DTOs/UpdateLibraryDto.cs | 1 + API/Services/AccountService.cs | 5 +++++ API/Services/ReadingListService.cs | 2 +- API/Services/TaskScheduler.cs | 3 ++- API/config/appsettings.Development.json | 2 +- UI/Web/src/app/_models/metadata/age-rating.ts | 22 ++++++++++--------- .../invite-user/invite-user.component.ts | 1 + UI/Web/src/app/pipe/age-rating.pipe.ts | 2 ++ .../user-preferences.component.ts | 4 ++-- openapi.json | 3 ++- 12 files changed, 43 insertions(+), 17 deletions(-) diff --git a/API.Tests/Services/ReadingListServiceTests.cs b/API.Tests/Services/ReadingListServiceTests.cs index f7fe38573..050882052 100644 --- a/API.Tests/Services/ReadingListServiceTests.cs +++ b/API.Tests/Services/ReadingListServiceTests.cs @@ -1201,4 +1201,13 @@ public class ReadingListServiceTests } #endregion + #region CreateReadingListsFromSeries + + // [Fact] + // public async Task CreateReadingListsFromSeries_ShouldCreateFromSinglePair() + // { + // + // } + + #endregion } diff --git a/API/Controllers/AccountController.cs b/API/Controllers/AccountController.cs index 21b73f230..33ab1a1e4 100644 --- a/API/Controllers/AccountController.cs +++ b/API/Controllers/AccountController.cs @@ -647,7 +647,11 @@ public class AccountController : BaseApiController // Validate Password and Username var validationErrors = new List(); - validationErrors.AddRange(await _accountService.ValidateUsername(dto.Username)); + // This allows users that use a fake email with the same username to continue setting up the account + if (!dto.Username.Equals(dto.Email) && !user.UserName!.Equals(dto.Username)) + { + validationErrors.AddRange(await _accountService.ValidateUsername(dto.Username)); + } validationErrors.AddRange(await _accountService.ValidatePassword(user, dto.Password)); if (validationErrors.Any()) diff --git a/API/DTOs/UpdateLibraryDto.cs b/API/DTOs/UpdateLibraryDto.cs index 79fbe786e..46403ed81 100644 --- a/API/DTOs/UpdateLibraryDto.cs +++ b/API/DTOs/UpdateLibraryDto.cs @@ -24,5 +24,6 @@ public class UpdateLibraryDto public bool IncludeInSearch { get; init; } [Required] public bool ManageCollections { get; init; } + [Required] public bool ManageReadingLists { get; init; } } diff --git a/API/Services/AccountService.cs b/API/Services/AccountService.cs index 2ee6982d7..17f5e8110 100644 --- a/API/Services/AccountService.cs +++ b/API/Services/AccountService.cs @@ -7,6 +7,7 @@ using API.Constants; using API.Data; using API.Entities; using API.Errors; +using Kavita.Common; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; @@ -67,6 +68,10 @@ public class AccountService : IAccountService if (!string.IsNullOrEmpty(serverSettings.HostName)) { basePart = serverSettings.HostName; + if (!serverSettings.BaseUrl.Equals(Configuration.DefaultBaseUrl)) + { + basePart += serverSettings.BaseUrl.Substring(0, serverSettings.BaseUrl.Length - 1); + } } if (withHost) return $"{basePart}/registration/{routePart}?token={HttpUtility.UrlEncode(token)}&email={HttpUtility.UrlEncode(email)}"; diff --git a/API/Services/ReadingListService.cs b/API/Services/ReadingListService.cs index 0bb5147ad..c3d1bb57a 100644 --- a/API/Services/ReadingListService.cs +++ b/API/Services/ReadingListService.cs @@ -488,7 +488,7 @@ public class ReadingListService : IReadingListService } } - private IList> GeneratePairs(string filename, string storyArc, string storyArcNumbers) + private IEnumerable> GeneratePairs(string filename, string storyArc, string storyArcNumbers) { var data = new List>(); if (string.IsNullOrEmpty(storyArc)) return data; diff --git a/API/Services/TaskScheduler.cs b/API/Services/TaskScheduler.cs index 3cf6c9b43..457348698 100644 --- a/API/Services/TaskScheduler.cs +++ b/API/Services/TaskScheduler.cs @@ -61,7 +61,8 @@ public class TaskScheduler : ITaskScheduler public const string ScanLibrariesTaskId = "scan-libraries"; public const string ReportStatsTaskId = "report-stats"; - private static readonly ImmutableArray ScanTasks = ImmutableArray.Create("ScannerService", "ScanLibrary", "ScanLibraries", "ScanFolder", "ScanSeries"); + private static readonly ImmutableArray ScanTasks = + ImmutableArray.Create("ScannerService", "ScanLibrary", "ScanLibraries", "ScanFolder", "ScanSeries"); private static readonly Random Rnd = new Random(); diff --git a/API/config/appsettings.Development.json b/API/config/appsettings.Development.json index 2a9bbdd2c..cbf24d86b 100644 --- a/API/config/appsettings.Development.json +++ b/API/config/appsettings.Development.json @@ -2,5 +2,5 @@ "TokenKey": "super secret unguessable key", "Port": 5000, "IpAddresses": "", - "BaseUrl": "/" + "BaseUrl": "/test/" } \ No newline at end of file diff --git a/UI/Web/src/app/_models/metadata/age-rating.ts b/UI/Web/src/app/_models/metadata/age-rating.ts index cbb2e86a5..0d70f2644 100644 --- a/UI/Web/src/app/_models/metadata/age-rating.ts +++ b/UI/Web/src/app/_models/metadata/age-rating.ts @@ -4,16 +4,18 @@ export enum AgeRating { */ NotApplicable = -1, Unknown = 0, - AdultsOnly = 1, + RatingPending = 1, EarlyChildhood = 2, Everyone = 3, - Everyone10Plus = 4, - G = 5, - KidsToAdults = 6, - Mature = 7, - Mature15Plus = 8, - Mature17Plus = 9, - RatingPending = 10, - Teen = 11, - X18Plus = 12 + G = 4, + Everyone10Plus = 5, + PG = 6, + KidsToAdults = 7, + Teen = 8, + Mature15Plus = 9, + Mature17Plus = 10, + Mature = 11, + R18Plus = 12, + AdultsOnly = 13, + X18Plus = 14 } \ No newline at end of file diff --git a/UI/Web/src/app/admin/invite-user/invite-user.component.ts b/UI/Web/src/app/admin/invite-user/invite-user.component.ts index 0c4720505..5e87d7a1f 100644 --- a/UI/Web/src/app/admin/invite-user/invite-user.component.ts +++ b/UI/Web/src/app/admin/invite-user/invite-user.component.ts @@ -59,6 +59,7 @@ export class InviteUserComponent implements OnInit { } }, err => { this.isSending = false; + this.toastr.error(err) }); } diff --git a/UI/Web/src/app/pipe/age-rating.pipe.ts b/UI/Web/src/app/pipe/age-rating.pipe.ts index 97bdedcf6..80b81725b 100644 --- a/UI/Web/src/app/pipe/age-rating.pipe.ts +++ b/UI/Web/src/app/pipe/age-rating.pipe.ts @@ -32,6 +32,8 @@ export class AgeRatingPipe implements PipeTransform { case AgeRating.Teen: return of('Teen'); case AgeRating.X18Plus: return of('X18+'); case AgeRating.NotApplicable: return of('Not Applicable'); + case AgeRating.PG: return of('PG'); + case AgeRating.R18Plus: return of('R18+') } return of('Unknown'); diff --git a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts index 6f08adfd7..6c1baf1a5 100644 --- a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts +++ b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts @@ -257,10 +257,10 @@ export class UserPreferencesComponent implements OnInit, OnDestroy { transformKeyToOpdsUrl(key: string) { if (environment.production) { - return `${location.origin}${environment.apiUrl}opds/${key}`; + return `${location.origin}${environment.apiUrl}opds/${key}`.replace('//', '/'); } - return `${location.origin}${this.baseUrl}api/opds/${key}`; + return `${location.origin}${this.baseUrl}api/opds/${key}`.replace('//', '/'); } handleBackgroundColorChange() { diff --git a/openapi.json b/openapi.json index 35120074d..b4b3eeea3 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "GPL-3.0", "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" }, - "version": "0.7.1.36" + "version": "0.7.1.37" }, "servers": [ { @@ -14537,6 +14537,7 @@ "includeInRecommended", "includeInSearch", "manageCollections", + "manageReadingLists", "name", "type" ],