
* Added ReadingList age rating from all series and started on some unit tests for the new flows. * Wrote more unit tests for Reading Lists * Added ability to restrict user accounts to a given age rating via admin edit user modal and invite user. This commit contains all basic code, but no query modifications. * When updating a reading list's title via UI, explicitly check if there is an existing RL with the same title. * Refactored Reading List calculation to work properly in the flows it's invoked from. * Cleaned up an unused method * Promoted Collections no longer show tags where a Series exists within them that is above the user's age rating. * Collection search now respects age restrictions * Series Detail page now checks if the user has explicit access (as a user might bypass with direct url access) * Hooked up age restriction for dashboard activity streams. * Refactored some methods from Series Controller and Library Controller to a new Search Controller to keep things organized * Updated Search to respect age restrictions * Refactored all the Age Restriction queries to extensions * Related Series no longer show up if they are out of the age restriction * Fixed a bad mapping for the update age restriction api * Fixed a UI state change after updating age restriction * Fixed unit test * Added a migration for reading lists * Code cleanup
116 lines
3.8 KiB
TypeScript
116 lines
3.8 KiB
TypeScript
import { HttpClient } from '@angular/common/http';
|
|
import { Injectable } from '@angular/core';
|
|
import { of } from 'rxjs';
|
|
import { map, take } from 'rxjs/operators';
|
|
import { environment } from 'src/environments/environment';
|
|
import { JumpKey } from '../_models/jumpbar/jump-key';
|
|
import { Library, LibraryType } from '../_models/library';
|
|
import { SearchResultGroup } from '../_models/search/search-result-group';
|
|
import { DirectoryDto } from '../_models/system/directory-dto';
|
|
|
|
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class LibraryService {
|
|
|
|
baseUrl = environment.apiUrl;
|
|
|
|
private libraryNames: {[key:number]: string} | undefined = undefined;
|
|
private libraryTypes: {[key: number]: LibraryType} | undefined = undefined;
|
|
|
|
constructor(private httpClient: HttpClient) {}
|
|
|
|
getLibraryNames() {
|
|
if (this.libraryNames != undefined) {
|
|
return of(this.libraryNames);
|
|
}
|
|
return this.httpClient.get<Library[]>(this.baseUrl + 'library').pipe(map(l => {
|
|
this.libraryNames = {};
|
|
l.forEach(lib => {
|
|
if (this.libraryNames !== undefined) {
|
|
this.libraryNames[lib.id] = lib.name;
|
|
}
|
|
});
|
|
return this.libraryNames;
|
|
}));
|
|
}
|
|
|
|
getLibraryName(libraryId: number) {
|
|
if (this.libraryNames != undefined && this.libraryNames.hasOwnProperty(libraryId)) {
|
|
return of(this.libraryNames[libraryId]);
|
|
}
|
|
return this.httpClient.get<Library[]>(this.baseUrl + 'library').pipe(map(l => {
|
|
this.libraryNames = {};
|
|
l.forEach(lib => {
|
|
if (this.libraryNames !== undefined) {
|
|
this.libraryNames[lib.id] = lib.name;
|
|
}
|
|
});
|
|
return this.libraryNames[libraryId];
|
|
}));
|
|
}
|
|
|
|
listDirectories(rootPath: string) {
|
|
let query = '';
|
|
if (rootPath !== undefined && rootPath.length > 0) {
|
|
query = '?path=' + encodeURIComponent(rootPath);
|
|
}
|
|
|
|
return this.httpClient.get<DirectoryDto[]>(this.baseUrl + 'library/list' + query);
|
|
}
|
|
|
|
getJumpBar(libraryId: number) {
|
|
return this.httpClient.get<JumpKey[]>(this.baseUrl + 'library/jump-bar?libraryId=' + libraryId);
|
|
}
|
|
|
|
getLibraries() {
|
|
return this.httpClient.get<Library[]>(this.baseUrl + 'library');
|
|
}
|
|
|
|
getLibrariesForMember() {
|
|
return this.httpClient.get<Library[]>(this.baseUrl + 'library/libraries');
|
|
}
|
|
|
|
updateLibrariesForMember(username: string, selectedLibraries: Library[]) {
|
|
return this.httpClient.post(this.baseUrl + 'library/grant-access', {username, selectedLibraries});
|
|
}
|
|
|
|
scan(libraryId: number, force = false) {
|
|
return this.httpClient.post(this.baseUrl + 'library/scan?libraryId=' + libraryId + '&force=' + force, {});
|
|
}
|
|
|
|
analyze(libraryId: number) {
|
|
return this.httpClient.post(this.baseUrl + 'library/analyze?libraryId=' + libraryId, {});
|
|
}
|
|
|
|
refreshMetadata(libraryId: number, forceUpdate = false) {
|
|
return this.httpClient.post(this.baseUrl + 'library/refresh-metadata?libraryId=' + libraryId + '&force=' + forceUpdate, {});
|
|
}
|
|
|
|
create(model: {name: string, type: number, folders: string[]}) {
|
|
return this.httpClient.post(this.baseUrl + 'library/create', model);
|
|
}
|
|
|
|
delete(libraryId: number) {
|
|
return this.httpClient.delete(this.baseUrl + 'library/delete?libraryId=' + libraryId, {});
|
|
}
|
|
|
|
update(model: {name: string, folders: string[], id: number}) {
|
|
return this.httpClient.post(this.baseUrl + 'library/update', model);
|
|
}
|
|
|
|
getLibraryType(libraryId: number) {
|
|
if (this.libraryTypes != undefined && this.libraryTypes.hasOwnProperty(libraryId)) {
|
|
return of(this.libraryTypes[libraryId]);
|
|
}
|
|
return this.httpClient.get<LibraryType>(this.baseUrl + 'library/type?libraryId=' + libraryId).pipe(map(l => {
|
|
if (this.libraryTypes === undefined) {
|
|
this.libraryTypes = {};
|
|
}
|
|
|
|
this.libraryTypes[libraryId] = l;
|
|
return this.libraryTypes[libraryId];
|
|
}));
|
|
}
|
|
}
|