Create Library module. Moved book controller to library controller. Added series addition to library while adding all known volumes in background. Fixed Google search context.
This commit is contained in:
138
backend/nestjs-seshat-api/src/library/library.service.ts
Normal file
138
backend/nestjs-seshat-api/src/library/library.service.ts
Normal file
@ -0,0 +1,138 @@
|
||||
import { InjectQueue } from '@nestjs/bullmq';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Queue } from 'bullmq';
|
||||
import { PinoLogger } from 'nestjs-pino';
|
||||
import { BooksService } from 'src/books/books.service';
|
||||
import { CreateBookDto } from 'src/books/dto/create-book.dto';
|
||||
import { BookSearchResultDto } from 'src/providers/dto/book-search-result.dto';
|
||||
import { CreateSeriesDto } from 'src/series/dto/create-series.dto';
|
||||
import { SeriesSubscriptionDto } from 'src/series/dto/series-subscription.dto';
|
||||
import { SeriesService } from 'src/series/series.service';
|
||||
import { BookOriginType } from 'src/shared/enums/book_origin_type';
|
||||
|
||||
@Injectable()
|
||||
export class LibraryService {
|
||||
constructor(
|
||||
private readonly books: BooksService,
|
||||
private readonly series: SeriesService,
|
||||
@InjectQueue('library') private readonly jobs: Queue,
|
||||
private readonly logger: PinoLogger,
|
||||
) { }
|
||||
|
||||
|
||||
async addSeries(series: CreateSeriesDto) {
|
||||
const result = await this.series.addSeries(series);
|
||||
|
||||
this.logger.debug({
|
||||
class: LibraryService.name,
|
||||
method: this.addSubscription.name,
|
||||
series: series.providerSeriesId,
|
||||
msg: 'Series saved to database.',
|
||||
});
|
||||
|
||||
this.jobs.add('new_series', series);
|
||||
return {
|
||||
success: true,
|
||||
};
|
||||
}
|
||||
|
||||
async addSubscription(series: SeriesSubscriptionDto) {
|
||||
return await this.series.addSeriesSubscription({
|
||||
userId: series.userId,
|
||||
providerSeriesId: series.providerSeriesId,
|
||||
provider: series.provider,
|
||||
});
|
||||
}
|
||||
|
||||
async addBook(book: BookSearchResultDto) {
|
||||
this.logger.debug({
|
||||
class: LibraryService.name,
|
||||
method: this.addBook.name,
|
||||
book: book,
|
||||
msg: 'Saving book to database...',
|
||||
});
|
||||
|
||||
const bookData = await this.books.createBook({
|
||||
title: book.title,
|
||||
desc: book.desc,
|
||||
providerSeriesId: book.providerSeriesId,
|
||||
providerBookId: book.providerBookId,
|
||||
volume: book.volume,
|
||||
provider: book.provider,
|
||||
publishedAt: book.publishedAt,
|
||||
});
|
||||
const bookId = bookData.identifiers[0]['bookId'];
|
||||
|
||||
const tasks = [];
|
||||
|
||||
if (book.authors && book.authors.length > 0) {
|
||||
tasks.push(book.authors.map(author => this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.AUTHOR,
|
||||
value: author,
|
||||
})));
|
||||
}
|
||||
if (book.categories && book.categories.length > 0) {
|
||||
tasks.push(book.categories.map(category => this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.CATEGORY,
|
||||
value: category
|
||||
})));
|
||||
}
|
||||
if (book.language) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.LANGUAGE,
|
||||
value: book.language,
|
||||
}));
|
||||
}
|
||||
if (book.maturityRating) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.MATURITY_RATING,
|
||||
value: book.maturityRating,
|
||||
}));
|
||||
}
|
||||
if (book.thumbnail) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.PROVIDER_THUMBNAIL,
|
||||
value: book.thumbnail,
|
||||
}));
|
||||
}
|
||||
if (book.url) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.PROVIDER_URL,
|
||||
value: book.url,
|
||||
}));
|
||||
}
|
||||
|
||||
if ('ISBN_10' in book.industryIdentifiers) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.ISBN_10,
|
||||
value: book.industryIdentifiers['ISBN_10'],
|
||||
}));
|
||||
}
|
||||
|
||||
if ('ISBN_13' in book.industryIdentifiers) {
|
||||
tasks.push(this.books.addBookOrigin({
|
||||
bookId,
|
||||
type: BookOriginType.ISBN_10,
|
||||
value: book.industryIdentifiers['ISBN_13'],
|
||||
}));
|
||||
}
|
||||
|
||||
await Promise.all(tasks);
|
||||
|
||||
this.logger.info({
|
||||
class: LibraryService.name,
|
||||
method: this.addBook.name,
|
||||
book: book,
|
||||
msg: 'Book saved to database.',
|
||||
});
|
||||
|
||||
return bookId;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user