Skip to content

Commit 509056c

Browse files
authored
providers (#73)
1 parent ed891bf commit 509056c

7 files changed

Lines changed: 757 additions & 4 deletions

File tree

sake/src/lib/server/application/composition.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ import { MetadataAggregatorService } from '$lib/server/application/services/Meta
8888
import { ExternalBookMetadataService } from '$lib/server/application/services/ExternalBookMetadataService';
8989
import { GoogleBooksMetadataProvider } from '$lib/server/infrastructure/metadata-providers/googleBooksMetadataProvider';
9090
import { OpenLibraryMetadataProvider } from '$lib/server/infrastructure/metadata-providers/openLibraryMetadataProvider';
91+
import { createMetadataProviders } from '$lib/server/infrastructure/metadata-providers/metadataProviderFactory';
92+
import { getActivatedMetadataProviders } from '$lib/server/config/activatedMetadataProviders';
93+
import { SearchMetadataCandidatesUseCase } from '$lib/server/application/use-cases/SearchMetadataCandidatesUseCase';
9194
import { ManagedBookCoverService } from '$lib/server/application/services/ManagedBookCoverService';
9295
import { GetLibraryCoverUseCase } from '$lib/server/application/use-cases/GetLibraryCoverUseCase';
9396
import { ImportLibraryBookCoverUseCase } from '$lib/server/application/use-cases/ImportLibraryBookCoverUseCase';
@@ -125,6 +128,9 @@ export const externalBookMetadataService = new ExternalBookMetadataService(
125128
baselineMetadataAggregator
126129
);
127130

131+
export const activatedMetadataProviders = createMetadataProviders(getActivatedMetadataProviders());
132+
export const activatedMetadataAggregator = new MetadataAggregatorService(activatedMetadataProviders);
133+
128134
export const downloadBookUseCase = new DownloadBookUseCase(
129135
zlibraryClient,
130136
bookRepository,
@@ -297,3 +303,7 @@ export const updateShelfRulesUseCase = new UpdateShelfRulesUseCase(shelfReposito
297303
export const reorderShelvesUseCase = new ReorderShelvesUseCase(shelfRepository);
298304
export const deleteShelfUseCase = new DeleteShelfUseCase(shelfRepository);
299305
export const setBookShelvesUseCase = new SetBookShelvesUseCase(bookRepository, shelfRepository);
306+
export const searchMetadataCandidatesUseCase = new SearchMetadataCandidatesUseCase(
307+
activatedMetadataAggregator,
308+
bookRepository
309+
);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import type { BookRepositoryPort } from '$lib/server/application/ports/BookRepositoryPort';
2+
import type { MetadataQuery } from '$lib/server/application/ports/MetadataProviderPort';
3+
import {
4+
MetadataAggregatorService,
5+
type MetadataAggregatorResult
6+
} from '$lib/server/application/services/MetadataAggregatorService';
7+
import { apiError, apiOk, type ApiResult } from '$lib/server/http/api';
8+
9+
export interface SearchMetadataCandidatesInput {
10+
bookId?: number;
11+
query?: MetadataQuery;
12+
}
13+
14+
export type SearchMetadataCandidatesResult = MetadataAggregatorResult;
15+
16+
export class SearchMetadataCandidatesUseCase {
17+
constructor(
18+
private readonly aggregator: MetadataAggregatorService,
19+
private readonly bookRepository: BookRepositoryPort
20+
) {}
21+
22+
async execute(
23+
input: SearchMetadataCandidatesInput
24+
): Promise<ApiResult<SearchMetadataCandidatesResult>> {
25+
if (input.bookId == null && input.query == null) {
26+
return apiError('Either bookId or query must be provided', 400);
27+
}
28+
29+
let query: MetadataQuery;
30+
31+
if (input.bookId != null) {
32+
const book = await this.bookRepository.getById(input.bookId);
33+
if (!book) {
34+
return apiError('Book not found', 404);
35+
}
36+
query = {
37+
title: book.title,
38+
author: book.author ?? null,
39+
isbn: book.identifier ?? null,
40+
language: book.language ?? null,
41+
googleBooksId: book.google_books_id ?? null,
42+
openLibraryKey: book.open_library_key ?? null,
43+
...input.query
44+
};
45+
} else {
46+
query = input.query!;
47+
}
48+
49+
const result = await this.aggregator.lookup(query);
50+
return apiOk(result);
51+
}
52+
}

0 commit comments

Comments
 (0)