diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/controller/BookController.java b/booklore-api/src/main/java/com/adityachandel/booklore/controller/BookController.java index 0e358c1c9..f20edc333 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/controller/BookController.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/controller/BookController.java @@ -2,6 +2,7 @@ package com.adityachandel.booklore.controller; import com.adityachandel.booklore.model.dto.BookDTO; import com.adityachandel.booklore.model.dto.BookViewerSettingDTO; +import com.adityachandel.booklore.model.dto.BookWithNeighborsDTO; import com.adityachandel.booklore.model.dto.response.GoogleBooksMetadata; import com.adityachandel.booklore.model.dto.request.SetMetadataRequest; import com.adityachandel.booklore.service.BooksService; diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java b/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java index 7caaa3820..0159c3015 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java @@ -1,8 +1,10 @@ package com.adityachandel.booklore.controller; import com.adityachandel.booklore.model.dto.BookDTO; +import com.adityachandel.booklore.model.dto.BookWithNeighborsDTO; import com.adityachandel.booklore.model.dto.LibraryDTO; import com.adityachandel.booklore.model.dto.request.CreateLibraryRequest; +import com.adityachandel.booklore.service.BooksService; import com.adityachandel.booklore.service.LibraryService; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; @@ -19,6 +21,7 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; public class LibraryController { private LibraryService libraryService; + private BooksService booksService; @PostMapping public ResponseEntity createLibraryNew(@RequestBody CreateLibraryRequest request) { @@ -46,6 +49,11 @@ public class LibraryController { return ResponseEntity.ok(libraryService.getLibraries(page, size)); } + @GetMapping("/{libraryId}/book/{bookId}/withNeighbors") + public ResponseEntity getBookWithNeighbours(@PathVariable long libraryId, @PathVariable long bookId) { + return ResponseEntity.ok(booksService.getBookWithNeighbours(libraryId, bookId)); + } + @GetMapping("/{libraryId}/book/{bookId}") public ResponseEntity getBook(@PathVariable long libraryId, @PathVariable long bookId) { return ResponseEntity.ok(libraryService.getBook(libraryId, bookId)); diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/BookWithNeighborsDTO.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/BookWithNeighborsDTO.java new file mode 100644 index 000000000..145e6e358 --- /dev/null +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/BookWithNeighborsDTO.java @@ -0,0 +1,12 @@ +package com.adityachandel.booklore.model.dto; + +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class BookWithNeighborsDTO { + private BookDTO currentBook; + private Long previousBookId; + private Long nextBookId; +} diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/repository/BookRepository.java b/booklore-api/src/main/java/com/adityachandel/booklore/repository/BookRepository.java index 7e00fce56..0f8972fd1 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/repository/BookRepository.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/repository/BookRepository.java @@ -27,5 +27,9 @@ public interface BookRepository extends JpaRepository, JpaSpecificat Page findByLastReadTimeIsNotNull(Pageable pageable); Page findByAddedOnIsNotNull(Pageable pageable); + + Optional findFirstByLibraryIdAndIdLessThanOrderByIdDesc(Long libraryId, Long currentBookId); + + Optional findFirstByLibraryIdAndIdGreaterThanOrderByIdAsc(Long libraryId, Long currentBookId); } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java index 5c51d5a84..1bdac075f 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java @@ -2,6 +2,7 @@ package com.adityachandel.booklore.service; import com.adityachandel.booklore.config.AppProperties; import com.adityachandel.booklore.model.dto.BookDTO; +import com.adityachandel.booklore.model.dto.BookWithNeighborsDTO; import com.adityachandel.booklore.model.dto.response.GoogleBooksMetadata; import com.adityachandel.booklore.model.dto.BookViewerSettingDTO; import com.adityachandel.booklore.model.dto.request.SetMetadataRequest; @@ -47,6 +48,7 @@ public class BooksService { private final BookMetadataRepository metadataRepository; private final AuthorRepository authorRepository; private final CategoryRepository categoryRepository; + private final LibraryRepository libraryRepository; public BookDTO getBook(long bookId) { @@ -210,4 +212,17 @@ public class BooksService { return fileName.substring(0, dotIndex); } } + + public BookWithNeighborsDTO getBookWithNeighbours(long libraryId, long bookId) { + libraryRepository.findById(libraryId).orElseThrow(() -> ErrorCode.LIBRARY_NOT_FOUND.createException(libraryId)); + Book book = bookRepository.findById(bookId).orElseThrow(() -> ErrorCode.BOOK_NOT_FOUND.createException(bookId)); + Book previousBook = bookRepository.findFirstByLibraryIdAndIdLessThanOrderByIdDesc(libraryId, bookId).orElse(null); + Book nextBook = bookRepository.findFirstByLibraryIdAndIdGreaterThanOrderByIdAsc(libraryId, bookId).orElse(null); + return BookWithNeighborsDTO.builder() + .currentBook(BookTransformer.convertToBookDTO(book)) + .previousBookId(previousBook != null ? previousBook.getId() : null) + .nextBookId(nextBook != null ? nextBook.getId() : null) + .build(); + } + } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/PdfFileProcessor.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/PdfFileProcessor.java index 8f12b3372..4923d2f00 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/PdfFileProcessor.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/PdfFileProcessor.java @@ -73,7 +73,7 @@ public class PdfFileProcessor implements FileProcessor { } } generateCoverImage(bookFile, new File(appProperties.getPathConfig() + "/thumbs"), document); - } catch (IOException e) { + } catch (Exception e) { log.error("Error while processing file {}", libraryFile.getFilePath(), e); return FileProcessResult.builder() .libraryFile(libraryFile) diff --git a/booklore-ui/src/app/app-routing.module.ts b/booklore-ui/src/app/app-routing.module.ts index 40ad366bd..1aeec8325 100644 --- a/booklore-ui/src/app/app-routing.module.ts +++ b/booklore-ui/src/app/app-routing.module.ts @@ -1,10 +1,10 @@ import {NgModule} from '@angular/core'; import {RouterModule, Routes} from '@angular/router'; -import {AppLayoutComponent} from './layout/app.layout.component'; +import {AppLayoutComponent} from './book/component/layout/app.layout.component'; import {LibraryBrowserComponent} from './book/component/library-browser/library-browser.component'; import {PdfViewerComponent} from './book/component/pdf-viewer/pdf-viewer.component'; import {DashboardComponent} from './book/component/dashboard/dashboard.component'; -import {BookMetadataComponent} from './book-metadata/book-metadata.component'; +import {BookMetadataComponent} from './book/component/book-metadata/book-metadata.component'; const routes: Routes = [ { @@ -17,7 +17,7 @@ const routes: Routes = [ path: 'library/:libraryId/books', component: LibraryBrowserComponent, }, { - path: 'book/:bookId/info', component: BookMetadataComponent, + path: 'library/:libraryId/book/:bookId/info', component: BookMetadataComponent, } ] }, diff --git a/booklore-ui/src/app/app.module.ts b/booklore-ui/src/app/app.module.ts index afa00b5fb..8f1e164b9 100644 --- a/booklore-ui/src/app/app.module.ts +++ b/booklore-ui/src/app/app.module.ts @@ -3,7 +3,7 @@ import {BrowserModule} from '@angular/platform-browser'; import {AppRoutingModule} from './app-routing.module'; import {AppComponent} from './app.component'; -import {AppLayoutModule} from './layout/app.layout.module'; +import {AppLayoutModule} from './book/component/layout/app.layout.module'; import {FormsModule} from '@angular/forms'; import {DialogService} from 'primeng/dynamicdialog'; import {DirectoryPickerComponent} from './book/component/directory-picker/directory-picker.component'; @@ -20,10 +20,10 @@ import {ToastModule} from 'primeng/toast'; import {LibraryBrowserComponent} from './book/component/library-browser/library-browser.component'; import {InfiniteScrollDirective} from 'ngx-infinite-scroll'; import {SearchComponent} from './book/component/search/search.component'; -import { BookMetadataComponent } from './book-metadata/book-metadata.component'; -import { BooksMetadataDialogComponent } from './books-metadata-dialog/books-metadata-dialog.component'; +import { BookMetadataComponent } from './book/component/book-metadata/book-metadata.component'; +import { BooksMetadataDialogComponent } from './book/component/books-metadata-dialog/books-metadata-dialog.component'; import {MessageService} from 'primeng/api'; -import { NotificationComponent } from './notification/notification.component'; +import { NotificationComponent } from './book/component/notification/notification.component'; @NgModule({ declarations: [ diff --git a/booklore-ui/src/app/book-metadata/book-metadata.component.ts b/booklore-ui/src/app/book-metadata/book-metadata.component.ts deleted file mode 100644 index 05426508e..000000000 --- a/booklore-ui/src/app/book-metadata/book-metadata.component.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {Component, OnInit, OnDestroy} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {BookService} from '../book/service/book.service'; -import {Book} from '../book/model/book.model'; -import {Button} from 'primeng/button'; -import {NgForOf} from '@angular/common'; -import {BooksMetadataDialogComponent} from '../books-metadata-dialog/books-metadata-dialog.component'; -import {DialogService, DynamicDialogRef} from 'primeng/dynamicdialog'; -import {Subscription} from 'rxjs'; -import {TagModule} from 'primeng/tag'; - -@Component({ - selector: 'app-book-metadata', - templateUrl: './book-metadata.component.html', - styleUrls: ['./book-metadata.component.scss'], - imports: [ - Button, - NgForOf, - TagModule - ] -}) -export class BookMetadataComponent implements OnInit, OnDestroy { - book: Book | null = null; - private routeSubscription!: Subscription; - ref: DynamicDialogRef | undefined; - - constructor( - private bookService: BookService, - private activatedRoute: ActivatedRoute, - private dialogService: DialogService) { - } - - ngOnInit(): void { - this.routeSubscription = this.activatedRoute.paramMap.subscribe((paramMap) => { - const bookId = +paramMap.get('bookId')!; - if (bookId) { - this.loadBook(bookId); - } - }); - } - - private loadBook(bookId: number): void { - this.bookService.getBook(bookId).subscribe((book) => { - this.book = book; - }); - } - - getAuthorNames(book: Book | null): string { - if (book && book.metadata && book.metadata.authors) { - return book.metadata.authors.map((author) => author.name).join(', '); - } - return 'No authors available'; - } - - openEditDialog(id: number | undefined) { - this.ref = this.dialogService.open(BooksMetadataDialogComponent, { - header: 'Fetch Metadata (from Google Books)', - modal: false, - width: '65%', - height: '85%', - data: { - bookId: id, - bookTitle: this.book?.metadata.title, - }, - }); - - this.ref.onClose.subscribe(() => { - // @ts-ignore - this.loadBook(this.book?.id); - }); - } - - - coverImageSrc(bookId: any): string { - if (bookId === null) { - return 'assets/placeholder.png'; - } - return this.bookService.getBookCoverUrl(bookId); - } - - ngOnDestroy(): void { - if (this.routeSubscription) { - this.routeSubscription.unsubscribe(); - } - } - - readBook(id: number | undefined) { - const url = `/pdf-viewer/book/${id}`; - window.open(url, '_blank'); - } -} diff --git a/booklore-ui/src/app/book-metadata/book-metadata.component.html b/booklore-ui/src/app/book/component/book-metadata/book-metadata.component.html similarity index 53% rename from booklore-ui/src/app/book-metadata/book-metadata.component.html rename to booklore-ui/src/app/book/component/book-metadata/book-metadata.component.html index cd6b7ae99..587da227a 100644 --- a/booklore-ui/src/app/book-metadata/book-metadata.component.html +++ b/booklore-ui/src/app/book/component/book-metadata/book-metadata.component.html @@ -2,17 +2,38 @@ diff --git a/booklore-ui/src/app/book/component/dashboard-scroller/dashboard-scroller.component.ts b/booklore-ui/src/app/book/component/dashboard-scroller/dashboard-scroller.component.ts index 658eeeb6a..3b1f486c7 100644 --- a/booklore-ui/src/app/book/component/dashboard-scroller/dashboard-scroller.component.ts +++ b/booklore-ui/src/app/book/component/dashboard-scroller/dashboard-scroller.component.ts @@ -85,7 +85,7 @@ export class DashboardScrollerComponent implements OnInit { } } - openBookInfo(bookId: number) { - this.router.navigate(['/book', bookId, 'info']); + openBookInfo(bookId: number, libraryId: number) { + this.router.navigate(['/library', libraryId, 'book', bookId, 'info']); } } diff --git a/booklore-ui/src/app/layout/api/menuchangeevent.ts b/booklore-ui/src/app/book/component/layout/api/menuchangeevent.ts similarity index 100% rename from booklore-ui/src/app/layout/api/menuchangeevent.ts rename to booklore-ui/src/app/book/component/layout/api/menuchangeevent.ts diff --git a/booklore-ui/src/app/layout/app.footer.component.html b/booklore-ui/src/app/book/component/layout/app.footer.component.html similarity index 79% rename from booklore-ui/src/app/layout/app.footer.component.html rename to booklore-ui/src/app/book/component/layout/app.footer.component.html index 255f4800c..e6e627975 100644 --- a/booklore-ui/src/app/layout/app.footer.component.html +++ b/booklore-ui/src/app/book/component/layout/app.footer.component.html @@ -1,5 +1,5 @@ diff --git a/booklore-ui/src/app/layout/app.footer.component.ts b/booklore-ui/src/app/book/component/layout/app.footer.component.ts similarity index 100% rename from booklore-ui/src/app/layout/app.footer.component.ts rename to booklore-ui/src/app/book/component/layout/app.footer.component.ts diff --git a/booklore-ui/src/app/layout/app.layout.component.html b/booklore-ui/src/app/book/component/layout/app.layout.component.html similarity index 100% rename from booklore-ui/src/app/layout/app.layout.component.html rename to booklore-ui/src/app/book/component/layout/app.layout.component.html diff --git a/booklore-ui/src/app/layout/app.layout.component.scss b/booklore-ui/src/app/book/component/layout/app.layout.component.scss similarity index 100% rename from booklore-ui/src/app/layout/app.layout.component.scss rename to booklore-ui/src/app/book/component/layout/app.layout.component.scss diff --git a/booklore-ui/src/app/layout/app.layout.component.ts b/booklore-ui/src/app/book/component/layout/app.layout.component.ts similarity index 100% rename from booklore-ui/src/app/layout/app.layout.component.ts rename to booklore-ui/src/app/book/component/layout/app.layout.component.ts diff --git a/booklore-ui/src/app/layout/app.layout.module.ts b/booklore-ui/src/app/book/component/layout/app.layout.module.ts similarity index 100% rename from booklore-ui/src/app/layout/app.layout.module.ts rename to booklore-ui/src/app/book/component/layout/app.layout.module.ts diff --git a/booklore-ui/src/app/layout/app.menu.component.html b/booklore-ui/src/app/book/component/layout/app.menu.component.html similarity index 100% rename from booklore-ui/src/app/layout/app.menu.component.html rename to booklore-ui/src/app/book/component/layout/app.menu.component.html diff --git a/booklore-ui/src/app/layout/app.menu.component.ts b/booklore-ui/src/app/book/component/layout/app.menu.component.ts similarity index 90% rename from booklore-ui/src/app/layout/app.menu.component.ts rename to booklore-ui/src/app/book/component/layout/app.menu.component.ts index e119de5f7..4f4962c8b 100644 --- a/booklore-ui/src/app/layout/app.menu.component.ts +++ b/booklore-ui/src/app/book/component/layout/app.menu.component.ts @@ -2,8 +2,8 @@ import {Component, computed, OnInit} from '@angular/core'; import {AppMenuitemComponent} from './app.menuitem.component'; import {NgForOf, NgIf} from '@angular/common'; import {MenuModule} from 'primeng/menu'; -import {LibraryService} from '../book/service/library.service'; -import {Library} from '../book/model/library.model'; +import {LibraryService} from '../../service/library.service'; +import {Library} from '../../model/library.model'; @Component({ selector: 'app-menu', diff --git a/booklore-ui/src/app/layout/app.menu.service.ts b/booklore-ui/src/app/book/component/layout/app.menu.service.ts similarity index 100% rename from booklore-ui/src/app/layout/app.menu.service.ts rename to booklore-ui/src/app/book/component/layout/app.menu.service.ts diff --git a/booklore-ui/src/app/layout/app.menuitem.component.ts b/booklore-ui/src/app/book/component/layout/app.menuitem.component.ts similarity index 100% rename from booklore-ui/src/app/layout/app.menuitem.component.ts rename to booklore-ui/src/app/book/component/layout/app.menuitem.component.ts diff --git a/booklore-ui/src/app/layout/app.sidebar.component.html b/booklore-ui/src/app/book/component/layout/app.sidebar.component.html similarity index 100% rename from booklore-ui/src/app/layout/app.sidebar.component.html rename to booklore-ui/src/app/book/component/layout/app.sidebar.component.html diff --git a/booklore-ui/src/app/layout/app.sidebar.component.scss b/booklore-ui/src/app/book/component/layout/app.sidebar.component.scss similarity index 100% rename from booklore-ui/src/app/layout/app.sidebar.component.scss rename to booklore-ui/src/app/book/component/layout/app.sidebar.component.scss diff --git a/booklore-ui/src/app/layout/app.sidebar.component.ts b/booklore-ui/src/app/book/component/layout/app.sidebar.component.ts similarity index 100% rename from booklore-ui/src/app/layout/app.sidebar.component.ts rename to booklore-ui/src/app/book/component/layout/app.sidebar.component.ts diff --git a/booklore-ui/src/app/layout/app.topbar.component.html b/booklore-ui/src/app/book/component/layout/app.topbar.component.html similarity index 100% rename from booklore-ui/src/app/layout/app.topbar.component.html rename to booklore-ui/src/app/book/component/layout/app.topbar.component.html diff --git a/booklore-ui/src/app/layout/app.topbar.component.scss b/booklore-ui/src/app/book/component/layout/app.topbar.component.scss similarity index 100% rename from booklore-ui/src/app/layout/app.topbar.component.scss rename to booklore-ui/src/app/book/component/layout/app.topbar.component.scss diff --git a/booklore-ui/src/app/layout/app.topbar.component.ts b/booklore-ui/src/app/book/component/layout/app.topbar.component.ts similarity index 89% rename from booklore-ui/src/app/layout/app.topbar.component.ts rename to booklore-ui/src/app/book/component/layout/app.topbar.component.ts index f503d618f..4b97ef720 100644 --- a/booklore-ui/src/app/layout/app.topbar.component.ts +++ b/booklore-ui/src/app/book/component/layout/app.topbar.component.ts @@ -3,11 +3,11 @@ import { MenuItem } from 'primeng/api'; import { LayoutService } from './service/app.layout.service'; import { RouterLink } from '@angular/router'; import { DialogService as PrimeDialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; -import { LibraryCreatorComponent } from '../book/component/library-creator/library-creator.component'; +import { LibraryCreatorComponent } from '../library-creator/library-creator.component'; import { TooltipModule } from 'primeng/tooltip'; import { FormsModule } from '@angular/forms'; import { InputTextModule } from 'primeng/inputtext'; -import { SearchComponent } from '../book/component/search/search.component'; +import { SearchComponent } from '../search/search.component'; import { NotificationComponent } from '../notification/notification.component'; // Import the NotificationComponent @Component({ diff --git a/booklore-ui/src/app/layout/config/app.config.component.html b/booklore-ui/src/app/book/component/layout/config/app.config.component.html similarity index 64% rename from booklore-ui/src/app/layout/config/app.config.component.html rename to booklore-ui/src/app/book/component/layout/config/app.config.component.html index a1549f618..6633f736f 100644 --- a/booklore-ui/src/app/layout/config/app.config.component.html +++ b/booklore-ui/src/app/book/component/layout/config/app.config.component.html @@ -46,22 +46,22 @@
@@ -70,22 +70,22 @@
@@ -94,22 +94,22 @@
@@ -118,7 +118,7 @@
@@ -127,7 +127,7 @@
@@ -136,42 +136,42 @@
@@ -180,62 +180,62 @@
diff --git a/booklore-ui/src/app/layout/config/app.config.component.ts b/booklore-ui/src/app/book/component/layout/config/app.config.component.ts similarity index 100% rename from booklore-ui/src/app/layout/config/app.config.component.ts rename to booklore-ui/src/app/book/component/layout/config/app.config.component.ts diff --git a/booklore-ui/src/app/layout/config/config.module.ts b/booklore-ui/src/app/book/component/layout/config/config.module.ts similarity index 100% rename from booklore-ui/src/app/layout/config/config.module.ts rename to booklore-ui/src/app/book/component/layout/config/config.module.ts diff --git a/booklore-ui/src/app/layout/service/app.layout.service.ts b/booklore-ui/src/app/book/component/layout/service/app.layout.service.ts similarity index 100% rename from booklore-ui/src/app/layout/service/app.layout.service.ts rename to booklore-ui/src/app/book/component/layout/service/app.layout.service.ts diff --git a/booklore-ui/src/app/book/component/library-browser/library-browser.component.html b/booklore-ui/src/app/book/component/library-browser/library-browser.component.html index 2749db306..0a6e4a54b 100644 --- a/booklore-ui/src/app/book/component/library-browser/library-browser.component.html +++ b/booklore-ui/src/app/book/component/library-browser/library-browser.component.html @@ -9,7 +9,7 @@

{{ book.metadata.title }}

{{ getAuthorNames(book) }}

- + diff --git a/booklore-ui/src/app/book/component/library-browser/library-browser.component.ts b/booklore-ui/src/app/book/component/library-browser/library-browser.component.ts index 8b85976be..71870f206 100644 --- a/booklore-ui/src/app/book/component/library-browser/library-browser.component.ts +++ b/booklore-ui/src/app/book/component/library-browser/library-browser.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit, NgZone } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { BookProgressService } from '../../service/book-progress-service'; -import { BookUpdateEvent } from '../../model/book-update-event.model'; import { BookService } from '../../service/book.service'; -import { Book } from '../../model/book.model'; +import {Book, BookUpdateEvent} from '../../model/book.model'; import { combineLatest } from 'rxjs'; import {InfiniteScrollDirective} from 'ngx-infinite-scroll'; import {Button} from 'primeng/button'; @@ -105,7 +104,7 @@ export class LibraryBrowserComponent implements OnInit { window.open(url, '_blank'); } - openBookInfo(bookId: number) { - this.router.navigate(['/book', bookId, 'info']); + openBookInfo(bookId: number, libraryId: number) { + this.router.navigate(['/library', libraryId, 'book', bookId, 'info']); } } diff --git a/booklore-ui/src/app/notification/notification.component.html b/booklore-ui/src/app/book/component/notification/notification.component.html similarity index 100% rename from booklore-ui/src/app/notification/notification.component.html rename to booklore-ui/src/app/book/component/notification/notification.component.html diff --git a/booklore-ui/src/app/notification/notification.component.scss b/booklore-ui/src/app/book/component/notification/notification.component.scss similarity index 100% rename from booklore-ui/src/app/notification/notification.component.scss rename to booklore-ui/src/app/book/component/notification/notification.component.scss diff --git a/booklore-ui/src/app/notification/notification.component.ts b/booklore-ui/src/app/book/component/notification/notification.component.ts similarity index 88% rename from booklore-ui/src/app/notification/notification.component.ts rename to booklore-ui/src/app/book/component/notification/notification.component.ts index 229e4595c..a62d8a885 100644 --- a/booklore-ui/src/app/notification/notification.component.ts +++ b/booklore-ui/src/app/book/component/notification/notification.component.ts @@ -1,8 +1,8 @@ import {Component, OnInit, OnDestroy} from '@angular/core'; -import {BookProgressService} from '../book/service/book-progress-service'; -import {BookUpdateEvent} from '../book/model/book-update-event.model'; +import {BookProgressService} from '../../service/book-progress-service'; import {Subscription} from 'rxjs'; import {NgClass} from '@angular/common'; +import {BookUpdateEvent} from '../../model/book.model'; @Component({ selector: 'app-notification', diff --git a/booklore-ui/src/app/book/component/search/search.component.html b/booklore-ui/src/app/book/component/search/search.component.html index 17e14e27a..e7d42d628 100644 --- a/booklore-ui/src/app/book/component/search/search.component.html +++ b/booklore-ui/src/app/book/component/search/search.component.html @@ -12,7 +12,7 @@ -
+
Book Cover diff --git a/booklore-ui/src/app/book/model/author.model.ts b/booklore-ui/src/app/book/model/author.model.ts deleted file mode 100644 index 8ef51188b..000000000 --- a/booklore-ui/src/app/book/model/author.model.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Author { - id: number; - name: string; -} diff --git a/booklore-ui/src/app/book/model/book-settings.model.ts b/booklore-ui/src/app/book/model/book-settings.model.ts deleted file mode 100644 index 439249632..000000000 --- a/booklore-ui/src/app/book/model/book-settings.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface BookSetting { - pageNumber: number; - zoom: number | string; - sidebar_visible: boolean; - spread: 'off' | 'even' | 'odd'; -} diff --git a/booklore-ui/src/app/book/model/book-update-event.model.ts b/booklore-ui/src/app/book/model/book-update-event.model.ts deleted file mode 100644 index 83c535110..000000000 --- a/booklore-ui/src/app/book/model/book-update-event.model.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {BookMetadata} from './book.model'; - -export interface BookUpdateEvent { - libraryId: number; - filename: string; - book: { - id: number; - libraryId: number; - fileName: string; - addedOn: string; - metadata: BookMetadata; - }; - parsingStatus: string; -} diff --git a/booklore-ui/src/app/book/model/book.model.ts b/booklore-ui/src/app/book/model/book.model.ts index 1aad10abf..f3002e76c 100644 --- a/booklore-ui/src/app/book/model/book.model.ts +++ b/booklore-ui/src/app/book/model/book.model.ts @@ -17,6 +17,7 @@ export interface PaginatedBooksResponse { export interface BookMetadata { thumbnail: string; title: string; + subtitle?: string; authors: Author[]; categories: Category[]; publisher: string; @@ -38,4 +39,29 @@ export interface Category { name: string; } +export interface BookWithNeighborsDTO { + currentBook: Book; + previousBookId: number | null; + nextBookId: number | null; +} + +export interface BookUpdateEvent { + libraryId: number; + filename: string; + book: { + id: number; + libraryId: number; + fileName: string; + addedOn: string; + metadata: BookMetadata; + }; + parsingStatus: string; +} + +export interface BookSetting { + pageNumber: number; + zoom: number | string; + sidebar_visible: boolean; + spread: 'off' | 'even' | 'odd'; +} diff --git a/booklore-ui/src/app/book/service/book-progress-service.ts b/booklore-ui/src/app/book/service/book-progress-service.ts index 4034a0a4a..beac9494a 100644 --- a/booklore-ui/src/app/book/service/book-progress-service.ts +++ b/booklore-ui/src/app/book/service/book-progress-service.ts @@ -1,6 +1,6 @@ import {Injectable} from '@angular/core'; import {Observable} from 'rxjs'; -import {BookUpdateEvent} from '../model/book-update-event.model'; +import {BookUpdateEvent} from '../model/book.model'; @Injectable({ providedIn: 'root', diff --git a/booklore-ui/src/app/book/service/book.service.ts b/booklore-ui/src/app/book/service/book.service.ts index 1ef63ce36..cc3645517 100644 --- a/booklore-ui/src/app/book/service/book.service.ts +++ b/booklore-ui/src/app/book/service/book.service.ts @@ -1,8 +1,7 @@ import {Observable} from 'rxjs'; -import {Book, BookMetadata, PaginatedBooksResponse} from '../model/book.model'; +import {Book, BookMetadata, BookSetting, BookWithNeighborsDTO, PaginatedBooksResponse} from '../model/book.model'; import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; -import {BookSetting} from '../model/book-settings.model'; @Injectable({ providedIn: 'root', @@ -19,6 +18,10 @@ export class BookService { return this.http.get(`${this.bookUrl}/${bookId}`); } + getBookWithNeighbours(libraryId: number, bookId: number): Observable { + return this.http.get(`${this.libraryUrl}/${libraryId}/book/${bookId}/withNeighbors`); + } + loadBooks(libraryId: number, page: number): Observable { return this.http.get( `${this.libraryUrl}/${libraryId}/book?page=${page}&size=${this.pageSize}` diff --git a/booklore-ui/src/assets/placeholder.png b/booklore-ui/src/assets/book-cover-metadata.png similarity index 100% rename from booklore-ui/src/assets/placeholder.png rename to booklore-ui/src/assets/book-cover-metadata.png