New Series Relation - Edition (#1583)

* Moved UpdateRelatedSeries from controller to SeriesService.cs

* Added 2 tests.
- UpdateRelatedSeries_ShouldDeletePrequelRelation
- UpdateRelatedSeries_ShouldNotAllowDuplicates

* Some docs and codestyle nitpicks

* Simplified tests and made easier to read

* Added 'Editions' series relation

* Missing code to properly show the relations in the UI

* Create Service for GetRelatedServices

* Added unit test. Assert Edition, Prequel and Sequel do not return parent while others do

* fixed missing userRating

* Add requested changes:
- Rename one test
- Split one test into two tests
This commit is contained in:
ThePromidius 2022-10-17 15:11:12 +02:00 committed by GitHub
parent 8e79c3b839
commit 7d65dc0530
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 364 additions and 72 deletions

View file

@ -14,4 +14,5 @@ export interface RelatedSeries {
alternativeVersions: Array<Series>;
doujinshis: Array<Series>;
parent: Array<Series>;
}
editions: Array<Series>;
}

View file

@ -13,7 +13,8 @@ export enum RelationKind {
/**
* This is UI only. Backend will generate Parent series for everything but Prequel/Sequel
*/
Parent = 12
Parent = 12,
Edition = 13
}
export const RelationKinds = [
@ -26,6 +27,7 @@ export const RelationKinds = [
{text: 'Side Story', value: RelationKind.SideStory},
{text: 'Character', value: RelationKind.Character},
{text: 'Contains', value: RelationKind.Contains},
{text: 'Edition', value: RelationKind.Edition},
{text: 'Doujinshi', value: RelationKind.Doujinshi},
{text: 'Other', value: RelationKind.Other},
];
];

View file

@ -186,13 +186,13 @@ export class SeriesService {
return this.httpClient.get<RelatedSeries>(this.baseUrl + 'series/all-related?seriesId=' + seriesId);
}
updateRelationships(seriesId: number, adaptations: Array<number>, characters: Array<number>,
contains: Array<number>, others: Array<number>, prequels: Array<number>,
updateRelationships(seriesId: number, adaptations: Array<number>, characters: Array<number>,
contains: Array<number>, others: Array<number>, prequels: Array<number>,
sequels: Array<number>, sideStories: Array<number>, spinOffs: Array<number>,
alternativeSettings: Array<number>, alternativeVersions: Array<number>, doujinshis: Array<number>) {
return this.httpClient.post(this.baseUrl + 'series/update-related?seriesId=' + seriesId,
alternativeSettings: Array<number>, alternativeVersions: Array<number>, doujinshis: Array<number>, editions: Array<number>) {
return this.httpClient.post(this.baseUrl + 'series/update-related?seriesId=' + seriesId,
{seriesId, adaptations, characters, sequels, prequels, contains, others, sideStories, spinOffs,
alternativeSettings, alternativeVersions, doujinshis});
alternativeSettings, alternativeVersions, doujinshis, editions});
}
getSeriesDetail(seriesId: number) {

View file

@ -65,6 +65,7 @@ export class EditSeriesRelationComponent implements OnInit, OnDestroy {
this.setupRelationRows(relations.doujinshis, RelationKind.Doujinshi);
this.setupRelationRows(relations.contains, RelationKind.Contains);
this.setupRelationRows(relations.parent, RelationKind.Parent);
this.setupRelationRows(relations.editions, RelationKind.Edition);
this.cdRef.detectChanges();
});
@ -110,7 +111,7 @@ export class EditSeriesRelationComponent implements OnInit, OnDestroy {
this.cdRef.markForCheck();
}
updateSeries(event: Array<SearchResult | undefined>, relation: RelationControl) {
if (event[0] === undefined) {
relation.series = undefined;
@ -131,8 +132,8 @@ export class EditSeriesRelationComponent implements OnInit, OnDestroy {
seriesSettings.fetchFn = (searchFilter: string) => this.searchService.search(searchFilter).pipe(
map(group => group.series),
map(items => seriesSettings.compareFn(items, searchFilter)),
map(series => series.filter(s => s.seriesId !== this.series.id)),
);
map(series => series.filter(s => s.seriesId !== this.series.id)),
);
seriesSettings.compareFn = (options: SearchResult[], filter: string) => {
return options.filter(m => this.utilityService.filter(m.name, filter));
@ -165,10 +166,11 @@ export class EditSeriesRelationComponent implements OnInit, OnDestroy {
const alternativeSettings = this.relations.filter(item => (parseInt(item.formControl.value, 10) as RelationKind) === RelationKind.AlternativeSetting && item.series !== undefined).map(item => item.series!.id);
const alternativeVersions = this.relations.filter(item => (parseInt(item.formControl.value, 10) as RelationKind) === RelationKind.AlternativeVersion && item.series !== undefined).map(item => item.series!.id);
const doujinshis = this.relations.filter(item => (parseInt(item.formControl.value, 10) as RelationKind) === RelationKind.Doujinshi && item.series !== undefined).map(item => item.series!.id);
const editions = this.relations.filter(item => (parseInt(item.formControl.value, 10) as RelationKind) === RelationKind.Edition && item.series !== undefined).map(item => item.series!.id);
// NOTE: We can actually emit this onto an observable and in main parent, use mergeMap into the forkJoin
this.seriesService.updateRelationships(this.series.id, adaptations, characters, contains, others, prequels, sequels, sideStories, spinOffs, alternativeSettings, alternativeVersions, doujinshis).subscribe(() => {});
this.seriesService.updateRelationships(this.series.id, adaptations, characters, contains, others, prequels, sequels, sideStories, spinOffs, alternativeSettings, alternativeVersions, doujinshis, editions).subscribe(() => {});
}
}

View file

@ -33,6 +33,8 @@ export class RelationshipPipe implements PipeTransform {
return 'Spin Off';
case RelationKind.Parent:
return 'Parent';
case RelationKind.Edition:
return 'Edition'
default:
return '';
}

View file

@ -243,7 +243,7 @@ export class SeriesDetailComponent implements OnInit, OnDestroy, AfterContentChe
private downloadService: DownloadService, private actionService: ActionService,
public imageSerivce: ImageService, private messageHub: MessageHubService,
private readingListService: ReadingListService, public navService: NavService,
private offcanvasService: NgbOffcanvas, @Inject(DOCUMENT) private document: Document,
private offcanvasService: NgbOffcanvas, @Inject(DOCUMENT) private document: Document,
private changeDetectionRef: ChangeDetectorRef, private scrollService: ScrollService,
private deviceSerivce: DeviceService
) {
@ -453,7 +453,7 @@ export class SeriesDetailComponent implements OnInit, OnDestroy, AfterContentChe
this.seriesMetadata = metadata;
this.changeDetectionRef.markForCheck();
});
this.readingListService.getReadingListsForSeries(seriesId).subscribe(lists => {
this.readingLists = lists;
this.changeDetectionRef.markForCheck();
@ -482,16 +482,17 @@ export class SeriesDetailComponent implements OnInit, OnDestroy, AfterContentChe
this.relations = [
...relations.prequels.map(item => this.createRelatedSeries(item, RelationKind.Prequel)),
...relations.sequels.map(item => this.createRelatedSeries(item, RelationKind.Sequel)),
...relations.sideStories.map(item => this.createRelatedSeries(item, RelationKind.SideStory)),
...relations.sideStories.map(item => this.createRelatedSeries(item, RelationKind.SideStory)),
...relations.spinOffs.map(item => this.createRelatedSeries(item, RelationKind.SpinOff)),
...relations.adaptations.map(item => this.createRelatedSeries(item, RelationKind.Adaptation)),
...relations.contains.map(item => this.createRelatedSeries(item, RelationKind.Contains)),
...relations.characters.map(item => this.createRelatedSeries(item, RelationKind.Character)),
...relations.characters.map(item => this.createRelatedSeries(item, RelationKind.Character)),
...relations.others.map(item => this.createRelatedSeries(item, RelationKind.Other)),
...relations.alternativeSettings.map(item => this.createRelatedSeries(item, RelationKind.AlternativeSetting)),
...relations.alternativeVersions.map(item => this.createRelatedSeries(item, RelationKind.AlternativeVersion)),
...relations.doujinshis.map(item => this.createRelatedSeries(item, RelationKind.Doujinshi)),
...relations.parent.map(item => this.createRelatedSeries(item, RelationKind.Parent)),
...relations.editions.map(item => this.createRelatedSeries(item, RelationKind.Edition)),
];
if (this.relations.length > 0) {
this.hasRelations = true;
@ -690,7 +691,7 @@ export class SeriesDetailComponent implements OnInit, OnDestroy, AfterContentChe
this.series = s;
this.changeDetectionRef.detectChanges();
});
this.loadSeries(this.seriesId);
}