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 series: SeriesSubscriptionJobDto = job.data;
|
||||||
const existingBooks = await this.library.findBooksFromSeries(series);
|
const existingBooks = await this.library.findBooksFromSeries(series);
|
||||||
const existingVolumes = existingBooks.map(b => b.volume);
|
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);
|
const books = await this.search(job, series, lastPublishedBook?.publishedAt);
|
||||||
|
|
||||||
let counter = 0;
|
let counter = 0;
|
||||||
|
@ -6,7 +6,7 @@ export class GoogleSearchContext extends SearchContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
generateQueryParams() {
|
generateQueryParams(): string {
|
||||||
const filterParams = ['maxResults', 'startIndex', 'orderBy'];
|
const filterParams = ['maxResults', 'startIndex', 'orderBy'];
|
||||||
const searchParams = ['intitle', 'inauthor', 'inpublisher', 'subject', 'isbn'];
|
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 resultsPerPage = this.params['maxResults'] ? parseInt(this.params['maxResults']) : 10;
|
||||||
const index = this.params['startIndex'] ? parseInt(this.params['startIndex']) : 0;
|
const index = this.params['startIndex'] ? parseInt(this.params['startIndex']) : 0;
|
||||||
|
|
||||||
const data = { ...this.params };
|
const data = { ...this.params };
|
||||||
data['startIndex'] = (index + resultsPerPage).toString();
|
data['startIndex'] = Math.max(0, index + resultsPerPage * pageChange).toString();
|
||||||
|
|
||||||
return new GoogleSearchContext(this.search, data);
|
return new GoogleSearchContext(this.search, data);
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ export abstract class SearchContext {
|
|||||||
this.params = params;
|
this.params = params;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract generateQueryParams();
|
abstract generateQueryParams(): string;
|
||||||
abstract next();
|
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[]> {
|
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(
|
return await firstValueFrom(
|
||||||
this.http.get('https://www.googleapis.com/books/v1/volumes?' + queryParams + searchQuery)
|
this.http.get('https://www.googleapis.com/books/v1/volumes?' + queryParams + searchQuery)
|
||||||
@ -46,7 +46,6 @@ export class GoogleService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return response.data.items
|
return response.data.items
|
||||||
//.filter(item => item.volumeInfo?.canonicalVolumeLink?.startsWith('https://play.google.com/store/books/details'))
|
|
||||||
.map(item => this.extract(item));
|
.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 { ProvidersService } from './providers.service';
|
||||||
import { BookSearchInputDto } from './dto/book-search-input.dto';
|
|
||||||
import { JwtAccessGuard } from 'src/auth/guards/jwt-access.guard';
|
import { JwtAccessGuard } from 'src/auth/guards/jwt-access.guard';
|
||||||
|
import { SimplifiedSearchContext } from './contexts/simplified-search-context';
|
||||||
|
|
||||||
@Controller('providers')
|
@Controller('providers')
|
||||||
export class ProvidersController {
|
export class ProvidersController {
|
||||||
@ -12,8 +12,10 @@ export class ProvidersController {
|
|||||||
@UseGuards(JwtAccessGuard)
|
@UseGuards(JwtAccessGuard)
|
||||||
@Get('search')
|
@Get('search')
|
||||||
async 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