Skip to content

Commit 936b7f5

Browse files
brandonrobertsMikeRyanDev
authored andcommitted
06-effects crud complete
1 parent f137acf commit 936b7f5

File tree

3 files changed

+75
-9
lines changed

3 files changed

+75
-9
lines changed

src/app/books/actions/books-api.actions.ts

+27-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { Book } from "src/app/shared/models/book.model";
22
import { Action } from "@ngrx/store";
33

44
export enum BooksApiActionTypes {
5-
BooksLoaded = '[Books API] Books Loaded Success',
5+
BooksLoaded = "[Books API] Books Loaded Success",
6+
BookCreated = "[Books API] Book Created",
7+
BookUpdated = "[Books API] Book Updated",
8+
BookDeleted = "[Books API] Book Deleted"
69
}
710

811
export class BooksLoaded implements Action {
@@ -11,5 +14,26 @@ export class BooksLoaded implements Action {
1114
constructor(public books: Book[]) {}
1215
}
1316

14-
export type BooksApiActions =
15-
| BooksLoaded;
17+
export class BookCreated implements Action {
18+
readonly type = BooksApiActionTypes.BookCreated;
19+
20+
constructor(public book: Book) {}
21+
}
22+
23+
export class BookUpdated implements Action {
24+
readonly type = BooksApiActionTypes.BookUpdated;
25+
26+
constructor(public book: Book) {}
27+
}
28+
29+
export class BookDeleted implements Action {
30+
readonly type = BooksApiActionTypes.BookDeleted;
31+
32+
constructor(public book: Book) {}
33+
}
34+
35+
export type BooksApiActions =
36+
| BooksLoaded
37+
| BookCreated
38+
| BookUpdated
39+
| BookDeleted;

src/app/books/books-api.effects.ts

+41-2
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,61 @@ import { Injectable } from "@angular/core";
22
import { Effect, Actions, ofType } from "@ngrx/effects";
33
import { BooksPageActions, BooksApiActions } from "./actions";
44
import { BooksService } from "../shared/services/book.service";
5-
import { mergeMap, map, catchError } from "rxjs/operators";
5+
import {
6+
mergeMap,
7+
map,
8+
catchError,
9+
exhaustMap,
10+
concatMap
11+
} from "rxjs/operators";
612
import { EMPTY } from "rxjs";
713

814
@Injectable()
915
export class BooksApiEffects {
1016
@Effect()
1117
loadBooks$ = this.actions$.pipe(
1218
ofType(BooksPageActions.BooksActionTypes.Enter),
13-
mergeMap(() =>
19+
exhaustMap(() =>
1420
this.booksService.all().pipe(
1521
map(books => new BooksApiActions.BooksLoaded(books)),
1622
catchError(() => EMPTY)
1723
)
1824
)
1925
);
2026

27+
@Effect()
28+
createBook$ = this.actions$.pipe(
29+
ofType(BooksPageActions.BooksActionTypes.CreateBook),
30+
mergeMap(action =>
31+
this.booksService.create(action.book).pipe(
32+
map(book => new BooksApiActions.BookCreated(book)),
33+
catchError(() => EMPTY)
34+
)
35+
)
36+
);
37+
38+
@Effect()
39+
updateBook$ = this.actions$.pipe(
40+
ofType(BooksPageActions.BooksActionTypes.UpdateBook),
41+
concatMap(action =>
42+
this.booksService.update(action.book.id, action.book).pipe(
43+
map(book => new BooksApiActions.BookUpdated(book)),
44+
catchError(() => EMPTY)
45+
)
46+
)
47+
);
48+
49+
@Effect()
50+
deleteBook$ = this.actions$.pipe(
51+
ofType(BooksPageActions.BooksActionTypes.DeleteBook),
52+
mergeMap(action =>
53+
this.booksService.delete(action.book.id).pipe(
54+
map(() => new BooksApiActions.BookDeleted(action.book)),
55+
catchError(() => EMPTY)
56+
)
57+
)
58+
);
59+
2160
constructor(
2261
private booksService: BooksService,
2362
private actions$: Actions<

src/app/shared/state/books.reducer.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,19 @@ export function reducer(
5454
activeBookId: null
5555
};
5656

57-
case BooksPageActions.BooksActionTypes.CreateBook:
58-
return adapter.addOne(action.book, state);
57+
case BooksApiActions.BooksApiActionTypes.BookCreated:
58+
return adapter.addOne(action.book, {
59+
...state,
60+
activeBookId: action.book.id
61+
});
5962

60-
case BooksPageActions.BooksActionTypes.UpdateBook:
63+
case BooksApiActions.BooksApiActionTypes.BookUpdated:
6164
return adapter.updateOne(
6265
{ id: action.book.id, changes: action.book },
6366
{ ...state, activeBookId: action.book.id }
6467
);
6568

66-
case BooksPageActions.BooksActionTypes.DeleteBook:
69+
case BooksApiActions.BooksApiActionTypes.BookDeleted:
6770
return adapter.removeOne(action.book.id, {
6871
...state,
6972
activeBookId: null

0 commit comments

Comments
 (0)