diff --git a/API/Controllers/PluginController.cs b/API/Controllers/PluginController.cs index 5f2d99ba3..b6162bb3a 100644 --- a/API/Controllers/PluginController.cs +++ b/API/Controllers/PluginController.cs @@ -32,6 +32,7 @@ namespace API.Controllers // NOTE: In order to log information about plugins, we need some Plugin Description information for each request // Should log into access table so we can tell the user var userId = await _unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey); + if (userId <= 0) return Unauthorized(); var user = await _unitOfWork.UserRepository.GetUserByIdAsync(userId); _logger.LogInformation("Plugin {PluginName} has authenticated with {UserName} ({UserId})'s API Key", pluginName, user.UserName, userId); return new UserDto diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index afc04c4e4..4e0b8291e 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -408,32 +408,6 @@ namespace API.Controllers return Ok(false); } - /// - /// Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read. - /// - /// This is built for Tachiyomi and is not expected to be called by any other place - /// - [HttpPost("mark-chapter-until-as-read")] - public async Task> MarkChaptersUntilAsRead(int seriesId, float chapterNumber) - { - var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Progress); - user.Progresses ??= new List(); - - var volumes = await _unitOfWork.VolumeRepository.GetVolumesForSeriesAsync(new List() { seriesId }, true); - foreach (var volume in volumes.OrderBy(v => v.Number)) - { - var chapters = volume.Chapters.OrderBy(c => float.Parse(c.Number)).Where(c => !c.IsSpecial && Parser.Parser.MaximumNumberFromRange(c.Range) <= chapterNumber); - _readerService.MarkChaptersAsRead(user, volume.SeriesId, chapters); - } - - _unitOfWork.UserRepository.Update(user); - - if (!_unitOfWork.HasChanges()) return Ok(true); - if (await _unitOfWork.CommitAsync()) return Ok(true); - - await _unitOfWork.RollbackAsync(); - return Ok(false); - } /// /// Returns a list of bookmarked pages for a given Chapter diff --git a/UI/Web/src/app/_models/series-filter.ts b/UI/Web/src/app/_models/series-filter.ts index 068054a27..51ddca214 100644 --- a/UI/Web/src/app/_models/series-filter.ts +++ b/UI/Web/src/app/_models/series-filter.ts @@ -68,4 +68,10 @@ export const mangaFormatFilters = [ value: MangaFormat.ARCHIVE, selected: false } -]; \ No newline at end of file +]; + +export interface FilterEvent { + filter: SeriesFilter; + isFirst: boolean; +} + diff --git a/UI/Web/src/app/all-series/all-series.component.ts b/UI/Web/src/app/all-series/all-series.component.ts index 51a37fc59..236fd1267 100644 --- a/UI/Web/src/app/all-series/all-series.component.ts +++ b/UI/Web/src/app/all-series/all-series.component.ts @@ -10,7 +10,7 @@ import { SeriesAddedEvent } from '../_models/events/series-added-event'; import { Library } from '../_models/library'; import { Pagination } from '../_models/pagination'; import { Series } from '../_models/series'; -import { SeriesFilter } from '../_models/series-filter'; +import { FilterEvent, SeriesFilter } from '../_models/series-filter'; import { ActionItem, Action } from '../_services/action-factory.service'; import { ActionService } from '../_services/action.service'; import { MessageHubService } from '../_services/message-hub.service'; @@ -105,9 +105,9 @@ export class AllSeriesComponent implements OnInit, OnDestroy { } } - updateFilter(data: SeriesFilter) { - this.filter = data; - if (this.pagination !== undefined && this.pagination !== null) { + updateFilter(data: FilterEvent) { + this.filter = data.filter; + if (this.pagination !== undefined && this.pagination !== null && !data.isFirst) { this.pagination.currentPage = 1; this.onPageChange(this.pagination); } else { diff --git a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts index 43ccc8378..ab3ec7df6 100644 --- a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts +++ b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts @@ -14,7 +14,7 @@ import { Language } from 'src/app/_models/metadata/language'; import { PublicationStatusDto } from 'src/app/_models/metadata/publication-status-dto'; import { Pagination } from 'src/app/_models/pagination'; import { Person, PersonRole } from 'src/app/_models/person'; -import { FilterItem, mangaFormatFilters, SeriesFilter, SortField } from 'src/app/_models/series-filter'; +import { FilterEvent, FilterItem, mangaFormatFilters, SeriesFilter, SortField } from 'src/app/_models/series-filter'; import { Tag } from 'src/app/_models/tag'; import { ActionItem } from 'src/app/_services/action-factory.service'; import { CollectionTagService } from 'src/app/_services/collection-tag.service'; @@ -69,7 +69,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy { @Input() filterSettings!: FilterSettings; @Output() itemClicked: EventEmitter = new EventEmitter(); @Output() pageChange: EventEmitter = new EventEmitter(); - @Output() applyFilter: EventEmitter = new EventEmitter(); + @Output() applyFilter: EventEmitter = new EventEmitter(); @ContentChild('cardItem') itemTemplate!: TemplateRef; @@ -99,6 +99,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy { updateApplied: number = 0; + private onDestory: Subject = new Subject(); get PersonRole(): typeof PersonRole { @@ -570,7 +571,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy { } apply() { - this.applyFilter.emit(this.filter); + this.applyFilter.emit({filter: this.filter, isFirst: this.updateApplied === 0}); this.updateApplied++; } diff --git a/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts b/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts index 02f897451..5eebc5bd3 100644 --- a/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts +++ b/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts @@ -13,7 +13,7 @@ import { CollectionTag } from 'src/app/_models/collection-tag'; import { SeriesAddedToCollectionEvent } from 'src/app/_models/events/series-added-to-collection-event'; import { Pagination } from 'src/app/_models/pagination'; import { Series } from 'src/app/_models/series'; -import { SeriesFilter } from 'src/app/_models/series-filter'; +import { FilterEvent, SeriesFilter } from 'src/app/_models/series-filter'; import { AccountService } from 'src/app/_services/account.service'; import { Action, ActionFactoryService, ActionItem } from 'src/app/_services/action-factory.service'; import { ActionService } from 'src/app/_services/action.service'; @@ -175,9 +175,9 @@ export class CollectionDetailComponent implements OnInit, OnDestroy { }); } - updateFilter(data: SeriesFilter) { - this.filter = data; - if (this.seriesPagination !== undefined && this.seriesPagination !== null) { + updateFilter(data: FilterEvent) { + this.filter = data.filter; + if (this.seriesPagination !== undefined && this.seriesPagination !== null && !data.isFirst) { this.seriesPagination.currentPage = 1; this.onPageChange(this.seriesPagination); } else { diff --git a/UI/Web/src/app/library-detail/library-detail.component.ts b/UI/Web/src/app/library-detail/library-detail.component.ts index 05e122913..ab465bf9e 100644 --- a/UI/Web/src/app/library-detail/library-detail.component.ts +++ b/UI/Web/src/app/library-detail/library-detail.component.ts @@ -10,7 +10,7 @@ import { SeriesAddedEvent } from '../_models/events/series-added-event'; import { Library } from '../_models/library'; import { Pagination } from '../_models/pagination'; import { Series } from '../_models/series'; -import { SeriesFilter } from '../_models/series-filter'; +import { FilterEvent, SeriesFilter } from '../_models/series-filter'; import { Action, ActionFactoryService, ActionItem } from '../_services/action-factory.service'; import { ActionService } from '../_services/action.service'; import { LibraryService } from '../_services/library.service'; @@ -138,10 +138,10 @@ export class LibraryDetailComponent implements OnInit, OnDestroy { } } - updateFilter(data: SeriesFilter) { - this.filter = data; + updateFilter(event: FilterEvent) { + this.filter = event.filter; const page = this.getPage(); - if (page === undefined || page === null) { + if (page === undefined || page === null || !event.isFirst) { this.pagination.currentPage = 1; this.onPageChange(this.pagination); } else { diff --git a/UI/Web/src/app/on-deck/on-deck.component.ts b/UI/Web/src/app/on-deck/on-deck.component.ts index 0d8d23ee5..a7bcbe5f1 100644 --- a/UI/Web/src/app/on-deck/on-deck.component.ts +++ b/UI/Web/src/app/on-deck/on-deck.component.ts @@ -7,7 +7,7 @@ import { FilterSettings } from '../cards/card-detail-layout/card-detail-layout.c import { KEY_CODES } from '../shared/_services/utility.service'; import { Pagination } from '../_models/pagination'; import { Series } from '../_models/series'; -import { SeriesFilter} from '../_models/series-filter'; +import { FilterEvent, SeriesFilter} from '../_models/series-filter'; import { Action } from '../_services/action-factory.service'; import { ActionService } from '../_services/action.service'; import { SeriesService } from '../_services/series.service'; @@ -63,9 +63,10 @@ export class OnDeckComponent implements OnInit { this.loadPage(); } - updateFilter(data: SeriesFilter) { - this.filter = data; - if (this.pagination !== undefined && this.pagination !== null) { + updateFilter(event: FilterEvent) { + this.filter = event.filter; + const page = this.getPage(); + if (page === undefined || page === null || !event.isFirst) { this.pagination.currentPage = 1; this.onPageChange(this.pagination); } else { diff --git a/UI/Web/src/app/recently-added/recently-added.component.ts b/UI/Web/src/app/recently-added/recently-added.component.ts index f7b6f146a..c7ec27d58 100644 --- a/UI/Web/src/app/recently-added/recently-added.component.ts +++ b/UI/Web/src/app/recently-added/recently-added.component.ts @@ -9,7 +9,7 @@ import { KEY_CODES } from '../shared/_services/utility.service'; import { SeriesAddedEvent } from '../_models/events/series-added-event'; import { Pagination } from '../_models/pagination'; import { Series } from '../_models/series'; -import { SeriesFilter } from '../_models/series-filter'; +import { FilterEvent, SeriesFilter } from '../_models/series-filter'; import { Action } from '../_services/action-factory.service'; import { ActionService } from '../_services/action.service'; import { MessageHubService } from '../_services/message-hub.service'; @@ -23,6 +23,7 @@ import { SeriesService } from '../_services/series.service'; templateUrl: './recently-added.component.html', styleUrls: ['./recently-added.component.scss'] }) + export class RecentlyAddedComponent implements OnInit, OnDestroy { isLoading: boolean = true; @@ -81,9 +82,10 @@ export class RecentlyAddedComponent implements OnInit, OnDestroy { this.loadPage(); } - applyFilter(data: SeriesFilter) { - this.filter = data; - if (this.pagination !== undefined && this.pagination !== null) { + applyFilter(event: FilterEvent) { + this.filter = event.filter; + const page = this.getPage(); + if (page === undefined || page === null || !event.isFirst) { this.pagination.currentPage = 1; this.onPageChange(this.pagination); } else {