|
@@ -1,4 +1,5 @@
|
|
| 1 |
import { NgModule } from '@angular/core';
|
|
|
|
| 2 |
import { BrowserModule } from '@angular/platform-browser';
|
| 3 |
|
| 4 |
import { AppRoutingModule } from './app-routing.module';
|
|
@@ -16,7 +17,9 @@ import { HomeComponent } from './home/home.component';
|
|
| 16 |
AppRoutingModule,
|
| 17 |
BooksModule
|
| 18 |
],
|
| 19 |
-
providers: [
|
|
|
|
|
|
|
| 20 |
bootstrap: [AppComponent]
|
| 21 |
})
|
| 22 |
export class AppModule { }
|
| 1 |
import { NgModule } from '@angular/core';
|
| 2 |
+
import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
| 3 |
import { BrowserModule } from '@angular/platform-browser';
|
| 4 |
|
| 5 |
import { AppRoutingModule } from './app-routing.module';
|
| 17 |
AppRoutingModule,
|
| 18 |
BooksModule
|
| 19 |
],
|
| 20 |
+
providers: [
|
| 21 |
+
provideHttpClient(withInterceptorsFromDi())
|
| 22 |
+
],
|
| 23 |
bootstrap: [AppComponent]
|
| 24 |
})
|
| 25 |
export class AppModule { }
|
|
@@ -23,4 +23,7 @@
|
|
| 23 |
[src]="book.thumbnailUrl"
|
| 24 |
alt="Cover">
|
| 25 |
<a class="button arrow-left" routerLink="..">Back to list</a>
|
|
|
|
|
|
|
|
|
|
| 26 |
</div>
|
| 23 |
[src]="book.thumbnailUrl"
|
| 24 |
alt="Cover">
|
| 25 |
<a class="button arrow-left" routerLink="..">Back to list</a>
|
| 26 |
+
<button class="red" (click)="removeBook(book.isbn)">
|
| 27 |
+
Remove book
|
| 28 |
+
</button>
|
| 29 |
</div>
|
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import { Component } from '@angular/core';
|
| 2 |
-
import { ActivatedRoute } from '@angular/router';
|
| 3 |
|
| 4 |
import { BookStoreService } from '../../shared/book-store.service';
|
| 5 |
import { Book } from '../../shared/book';
|
|
@@ -15,8 +15,19 @@ export class BookDetailsComponent {
|
|
| 15 |
constructor(
|
| 16 |
private service: BookStoreService,
|
| 17 |
private route: ActivatedRoute,
|
|
|
|
| 18 |
) {
|
| 19 |
const isbn = this.route.snapshot.paramMap.get('isbn')!;
|
| 20 |
-
this.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
}
|
| 22 |
}
|
| 1 |
import { Component } from '@angular/core';
|
| 2 |
+
import { ActivatedRoute, Router } from '@angular/router';
|
| 3 |
|
| 4 |
import { BookStoreService } from '../../shared/book-store.service';
|
| 5 |
import { Book } from '../../shared/book';
|
| 15 |
constructor(
|
| 16 |
private service: BookStoreService,
|
| 17 |
private route: ActivatedRoute,
|
| 18 |
+
private router: Router
|
| 19 |
) {
|
| 20 |
const isbn = this.route.snapshot.paramMap.get('isbn')!;
|
| 21 |
+
this.service.getSingle(isbn).subscribe(book => {
|
| 22 |
+
this.book = book;
|
| 23 |
+
});
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
removeBook(isbn: string) {
|
| 27 |
+
if (window.confirm('Remove book?')) {
|
| 28 |
+
this.service.remove(isbn).subscribe(() => {
|
| 29 |
+
this.router.navigateByUrl('/books');
|
| 30 |
+
});
|
| 31 |
+
}
|
| 32 |
}
|
| 33 |
}
|
|
@@ -13,6 +13,8 @@ export class BookListComponent {
|
|
| 13 |
books: Book[] = [];
|
| 14 |
|
| 15 |
constructor(private service: BookStoreService) {
|
| 16 |
-
this.
|
|
|
|
|
|
|
| 17 |
}
|
| 18 |
}
|
| 13 |
books: Book[] = [];
|
| 14 |
|
| 15 |
constructor(private service: BookStoreService) {
|
| 16 |
+
this.service.getAll().subscribe(books => {
|
| 17 |
+
this.books = books;
|
| 18 |
+
});
|
| 19 |
}
|
| 20 |
}
|
|
@@ -1,4 +1,6 @@
|
|
|
|
|
| 1 |
import { Injectable } from '@angular/core';
|
|
|
|
| 2 |
|
| 3 |
import { Book } from './book';
|
| 4 |
|
|
@@ -6,36 +8,19 @@ import { Book } from './book';
|
|
| 6 |
providedIn: 'root'
|
| 7 |
})
|
| 8 |
export class BookStoreService {
|
| 9 |
-
private
|
| 10 |
|
| 11 |
-
constructor() {
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
title: 'Tierisch gut kochen',
|
| 16 |
-
authors: ['Mrs Chimp', 'Mr Gorilla'],
|
| 17 |
-
published: '2022-06-20',
|
| 18 |
-
subtitle: 'Rezepte von Affe bis Zebra',
|
| 19 |
-
thumbnailUrl: 'https://cdn.ng-buch.de/kochen.png',
|
| 20 |
-
description: 'Immer lecker und gut'
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
isbn: '67890',
|
| 24 |
-
title: 'Backen mit Affen',
|
| 25 |
-
authors: ['Orang Utan'],
|
| 26 |
-
published: '2022-07-15',
|
| 27 |
-
subtitle: 'Bananenbrot und mehr',
|
| 28 |
-
thumbnailUrl: 'https://cdn.ng-buch.de/backen.png',
|
| 29 |
-
description: 'Tolle Backtipps für Mensch und Tier'
|
| 30 |
-
}
|
| 31 |
-
];
|
| 32 |
}
|
| 33 |
|
| 34 |
-
|
| 35 |
-
return this.books;
|
| 36 |
}
|
| 37 |
|
| 38 |
-
|
| 39 |
-
return this.
|
| 40 |
}
|
| 41 |
}
|
| 1 |
+
import { HttpClient } from '@angular/common/http';
|
| 2 |
import { Injectable } from '@angular/core';
|
| 3 |
+
import { Observable } from 'rxjs';
|
| 4 |
|
| 5 |
import { Book } from './book';
|
| 6 |
|
| 8 |
providedIn: 'root'
|
| 9 |
})
|
| 10 |
export class BookStoreService {
|
| 11 |
+
private apiUrl = 'https://api5.angular-buch.com';
|
| 12 |
|
| 13 |
+
constructor(private http: HttpClient) {}
|
| 14 |
+
|
| 15 |
+
getAll(): Observable<Book[]> {
|
| 16 |
+
return this.http.get<Book[]>(`${this.apiUrl}/books`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
}
|
| 18 |
|
| 19 |
+
getSingle(isbn: string): Observable<Book> {
|
| 20 |
+
return this.http.get<Book>(`${this.apiUrl}/books/${isbn}`);
|
| 21 |
}
|
| 22 |
|
| 23 |
+
remove(isbn: string): Observable<unknown> {
|
| 24 |
+
return this.http.delete(`${this.apiUrl}/books/${isbn}`);
|
| 25 |
}
|
| 26 |
}
|