Changed library search via API to use search context.
This commit is contained in:
@ -54,7 +54,7 @@ export class LibraryConsumer extends WorkerHost {
|
||||
const series: SeriesSubscriptionJobDto = job.data;
|
||||
const existingBooks = await this.library.findBooksFromSeries(series);
|
||||
const existingVolumes = existingBooks.map(b => b.volume);
|
||||
const lastPublishedBook = existingBooks.sort((a, b) => b.publishedAt.getTime() - a.publishedAt.getTime())[0];
|
||||
const lastPublishedBook = existingBooks.reduce((a, b) => a.publishedAt.getTime() > b.publishedAt.getTime() ? a : b);
|
||||
const books = await this.search(job, series, lastPublishedBook?.publishedAt);
|
||||
|
||||
let counter = 0;
|
||||
|
@ -6,7 +6,7 @@ export class GoogleSearchContext extends SearchContext {
|
||||
}
|
||||
|
||||
|
||||
generateQueryParams() {
|
||||
generateQueryParams(): string {
|
||||
const filterParams = ['maxResults', 'startIndex', 'orderBy'];
|
||||
const searchParams = ['intitle', 'inauthor', 'inpublisher', 'subject', 'isbn'];
|
||||
|
||||
@ -120,12 +120,24 @@ export class GoogleSearchContext extends SearchContext {
|
||||
}
|
||||
}
|
||||
|
||||
next() {
|
||||
previous(pageCount: number = 1): GoogleSearchContext {
|
||||
if (pageCount > 0)
|
||||
return this.update(-pageCount);
|
||||
return this;
|
||||
}
|
||||
|
||||
next(pageCount: number = 1): GoogleSearchContext {
|
||||
if (pageCount > 0)
|
||||
return this.update(pageCount);
|
||||
return this;
|
||||
}
|
||||
|
||||
private update(pageChange: number): GoogleSearchContext {
|
||||
const resultsPerPage = this.params['maxResults'] ? parseInt(this.params['maxResults']) : 10;
|
||||
const index = this.params['startIndex'] ? parseInt(this.params['startIndex']) : 0;
|
||||
|
||||
const data = { ...this.params };
|
||||
data['startIndex'] = (index + resultsPerPage).toString();
|
||||
data['startIndex'] = Math.max(0, index + resultsPerPage * pageChange).toString();
|
||||
|
||||
return new GoogleSearchContext(this.search, data);
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ export abstract class SearchContext {
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
abstract generateQueryParams();
|
||||
abstract next();
|
||||
abstract generateQueryParams(): string;
|
||||
abstract previous(pageCount: number): SearchContext;
|
||||
abstract next(pageCount: number): SearchContext;
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
import { GoogleSearchContext } from "./google.search.context";
|
||||
import { SearchContext } from "./search.context";
|
||||
|
||||
export class SimplifiedSearchContext {
|
||||
values: { [key: string]: string };
|
||||
|
||||
constructor(values: { [key: string]: string }) {
|
||||
this.values = values;
|
||||
}
|
||||
|
||||
toSearchContext(): SearchContext | null {
|
||||
const provider = this.values['provider']?.toString().toLowerCase();
|
||||
const search = this.values['search']?.toString();
|
||||
const valuesCopy = { ...this.values };
|
||||
delete valuesCopy['provider'];
|
||||
delete valuesCopy['search'];
|
||||
|
||||
if (provider == 'google') {
|
||||
return new GoogleSearchContext(search, valuesCopy)
|
||||
}
|
||||
console.log('abc4')
|
||||
return null;
|
||||
}
|
||||
}
|
@ -12,7 +12,7 @@ export class GoogleService {
|
||||
) { }
|
||||
|
||||
async searchRaw(searchQuery: string): Promise<BookSearchResultDto[]> {
|
||||
const queryParams = 'langRestrict=en&printType=books&maxResults=10&fields=items(kind,id,volumeInfo(title,description,authors,publisher,publishedDate,industryIdentifiers,language,categories,maturityRating,imageLinks,canonicalVolumeLink,seriesInfo))&q=';
|
||||
const queryParams = 'langRestrict=en&printType=books&maxResults=20&fields=items(kind,id,volumeInfo(title,description,authors,publisher,publishedDate,industryIdentifiers,language,categories,maturityRating,imageLinks,canonicalVolumeLink,seriesInfo))&q=';
|
||||
|
||||
return await firstValueFrom(
|
||||
this.http.get('https://www.googleapis.com/books/v1/volumes?' + queryParams + searchQuery)
|
||||
@ -46,7 +46,6 @@ export class GoogleService {
|
||||
}
|
||||
|
||||
return response.data.items
|
||||
//.filter(item => item.volumeInfo?.canonicalVolumeLink?.startsWith('https://play.google.com/store/books/details'))
|
||||
.map(item => this.extract(item));
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Body, Controller, Get, UseGuards } from '@nestjs/common';
|
||||
import { Controller, Get, Query, UseGuards } from '@nestjs/common';
|
||||
import { ProvidersService } from './providers.service';
|
||||
import { BookSearchInputDto } from './dto/book-search-input.dto';
|
||||
import { JwtAccessGuard } from 'src/auth/guards/jwt-access.guard';
|
||||
import { SimplifiedSearchContext } from './contexts/simplified-search-context';
|
||||
|
||||
@Controller('providers')
|
||||
export class ProvidersController {
|
||||
@ -12,8 +12,10 @@ export class ProvidersController {
|
||||
@UseGuards(JwtAccessGuard)
|
||||
@Get('search')
|
||||
async Search(
|
||||
@Body() body: BookSearchInputDto,
|
||||
@Query() context,
|
||||
) {
|
||||
return await this.providers.searchRaw(body.provider, body.query);
|
||||
const simplified = new SimplifiedSearchContext(context);
|
||||
const searchContext = simplified.toSearchContext();
|
||||
return await this.providers.search(searchContext);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user