diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 519d15f..86a3a55 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -11,6 +11,7 @@ export class AppComponent { static readonly api = { user: { retrieve: `api/user/retrieve`, + create: `api/user/create`, }, }; } diff --git a/src/app/core/service/user/user.service.ts b/src/app/core/service/user/user.service.ts index 7bf3037..aeebe5f 100644 --- a/src/app/core/service/user/user.service.ts +++ b/src/app/core/service/user/user.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import {HttpClient} from "@angular/common/http"; -import {User, UserState} from "../../store/user/user.state"; +import { User, UserSaveDto } from '../../store/user/user.state'; import {Observable} from "rxjs"; import {AppComponent} from "../../../app.component"; @@ -14,4 +14,9 @@ export class UserService { retrieve(): Observable { return this.httpClient.post(AppComponent.api.user.retrieve, {}); } + + create(user: UserSaveDto): Observable { + return this.httpClient.post(AppComponent.api.user.create, user); + } + } diff --git a/src/app/core/store/user/user.actions.ts b/src/app/core/store/user/user.actions.ts index 20fbc5b..f72956a 100644 --- a/src/app/core/store/user/user.actions.ts +++ b/src/app/core/store/user/user.actions.ts @@ -1,9 +1,11 @@ import {Action} from "@ngrx/store"; -import {User} from "./user.state"; +import { User, UserSaveDto } from './user.state'; export enum UserActionType { Retrieve = '[User] Retrieve', - RetrieveSuccess = '[User] Retrieve Success' + RetrieveSuccess = '[User] Retrieve Success', + Create = '[User] Create', + CreateSuccess = '[User] Create Success' } export class UserRetrieveAction implements Action { @@ -14,3 +16,13 @@ export class UserRetrieveSuccessAction implements Action { readonly type = UserActionType.RetrieveSuccess; constructor(public data: User[]){} } + +export class UserCreateAction implements Action { + readonly type = UserActionType.Create; + constructor(public user: UserSaveDto) {} +} + +export class UserCreateSuccessAction implements Action { + readonly type = UserActionType.CreateSuccess; + constructor(public user: User){} +} diff --git a/src/app/core/store/user/user.effects.ts b/src/app/core/store/user/user.effects.ts index ef8f6c6..fac10e9 100644 --- a/src/app/core/store/user/user.effects.ts +++ b/src/app/core/store/user/user.effects.ts @@ -3,7 +3,7 @@ import {UserService} from "../../service/user/user.service"; import {Actions, createEffect, ofType} from "@ngrx/effects"; import {Observable, of} from "rxjs"; import {Action} from "@ngrx/store"; -import {UserActionType, UserRetrieveSuccessAction} from "./user.actions"; +import { UserActionType, UserCreateAction, UserCreateSuccessAction, UserRetrieveSuccessAction } from './user.actions'; import {catchError, map, switchMap} from "rxjs/operators"; import {ErrorAction} from "../error/error.actions"; @@ -22,4 +22,16 @@ export class UserEffects { }) ); }); + + create$: Observable = createEffect(() => { + return this.actions$.pipe( + ofType(UserActionType.Create), + switchMap((action: UserCreateAction) => { + return this.service.create(action.user).pipe( + map(response => new UserCreateSuccessAction(response)), + catchError(error => of(new ErrorAction(error))) + ); + }) + ); + }); } diff --git a/src/app/core/store/user/user.facade.ts b/src/app/core/store/user/user.facade.ts index 1e39a93..e59d10a 100644 --- a/src/app/core/store/user/user.facade.ts +++ b/src/app/core/store/user/user.facade.ts @@ -3,8 +3,8 @@ import {Store} from "@ngrx/store"; import {AppState} from "../app.state"; import {Observable} from "rxjs"; import {userStateSelector} from "./user.selector"; -import {UserRetrieveAction} from "./user.actions"; -import {UserState} from "./user.state"; +import { UserCreateAction, UserRetrieveAction } from './user.actions'; +import { UserSaveDto, UserState } from './user.state'; @Injectable({ providedIn: 'root' }) export class UserFacade { @@ -14,6 +14,10 @@ export class UserFacade { this.store.dispatch(new UserRetrieveAction()); } + dispatchCreate(user: UserSaveDto): void { + this.store.dispatch(new UserCreateAction(user)); + } + retrieve(): Observable { return this.store.select(userStateSelector); } diff --git a/src/app/core/store/user/user.reducer.ts b/src/app/core/store/user/user.reducer.ts index 1a46cfc..069f7f1 100644 --- a/src/app/core/store/user/user.reducer.ts +++ b/src/app/core/store/user/user.reducer.ts @@ -1,16 +1,20 @@ -import {initialUserState, UserState} from "./user.state"; -import {UserActionType, UserRetrieveSuccessAction} from "./user.actions"; -import {Action} from "@ngrx/store"; +import {initialUserState, UserState} from './user.state'; +import { UserActionType, UserCreateSuccessAction, UserRetrieveSuccessAction } from './user.actions'; +import {Action} from '@ngrx/store'; export function userReducer( state: UserState = initialUserState, action: Action ): UserState { - switch(action.type){ + switch (action.type){ case UserActionType.Retrieve: return initialUserState; case UserActionType.RetrieveSuccess: - return handleUserRetrieveSuccessAction(state, action); + return handleUserRetrieveSuccessAction(state, action as UserRetrieveSuccessAction); + case UserActionType.Create: + return state; + case UserActionType.CreateSuccess: + return handleUserCreateSuccessAction(state, action as UserCreateSuccessAction); default: return state; } @@ -23,5 +27,15 @@ function handleUserRetrieveSuccessAction( return { ...state, data: action.data - } + }; +} + +function handleUserCreateSuccessAction( + state: UserState, + action: UserCreateSuccessAction, +): UserState { + return { + ...state, + data: [...state.data, action.user] + }; } diff --git a/src/app/core/store/user/user.state.ts b/src/app/core/store/user/user.state.ts index 39fcd95..fb9d411 100644 --- a/src/app/core/store/user/user.state.ts +++ b/src/app/core/store/user/user.state.ts @@ -9,6 +9,13 @@ export interface User { updated: string; } +export interface UserSaveDto { + firstName: string; + middleName: string; + lastName: string; + phoneNumber: string; +} + export const initialUserState: UserState = { data: [] };