22
33import com .example .research .profile .entity .cache .Profile ;
44import com .example .research .profile .entity .cache .ProfileRepository ;
5+ import com .example .research .profile .entity .event .ProfileChangedEvent ;
56import com .example .research .profile .entity .event .ProfileSavedEvent ;
67import com .example .research .profile .entity .storage .ProfileStorageRepository ;
78
1011import org .springframework .http .MediaType ;
1112import org .springframework .lang .NonNull ;
1213import org .springframework .stereotype .Component ;
14+ import org .springframework .util .StringUtils ;
1315import org .springframework .web .reactive .function .server .ServerRequest ;
1416import org .springframework .web .reactive .function .server .ServerResponse ;
1517
18+ import java .time .LocalDateTime ;
1619import java .util .function .Function ;
1720
1821import lombok .extern .slf4j .Slf4j ;
@@ -33,25 +36,19 @@ public class ProfileHandler {
3336 @ NonNull
3437 public Mono <ServerResponse > fetchProfiles (ServerRequest request ) {
3538 Flux <Profile > profiles = Flux .fromIterable (profileStorageRepository .findAll ())
36- .flatMap (profile -> {
37- log .info ("call switchIfEmpty" );
38- return profileRepository .save (Profile .from (profile ));
39- });
39+ .flatMap (profile -> profileRepository .save (Profile .from (profile )));
4040 return ok ().contentType (MediaType .APPLICATION_JSON ).body (profiles , Profile .class );
4141 }
4242
4343 @ NonNull
4444 public Mono <ServerResponse > fetch (ServerRequest request ) {
4545 String id = request .pathVariable ("id" );
4646 Mono <Profile > profile = profileRepository .findById (id )
47- .onErrorResume (throwable -> {
48- log .error ("throwable : " , throwable );
49- return Mono .just (
50- profileStorageRepository .findById (id )
51- .orElseThrow (() -> new IllegalStateException ("profile not found" ))
52- )
53- .flatMap (storedProfile -> profileRepository .save (Profile .from (storedProfile )));
54- });
47+ .onErrorResume (throwable ->
48+ Mono .just (profileStorageRepository .findById (id )
49+ .orElseThrow (() -> new IllegalStateException ("profile not found" )))
50+ .flatMap (storedProfile -> profileRepository .save (Profile .from (storedProfile )))
51+ );
5552 return ok ().contentType (MediaType .APPLICATION_JSON ).body (profile , Profile .class );
5653 }
5754
@@ -62,6 +59,7 @@ public Mono<ServerResponse> save(Mono<ProfileSaveRequest> request) {
6259
6360 Function <com .example .research .profile .entity .storage .Profile , Mono <com .example .research .profile .entity .storage .Profile >>
6461 saveProfile = profile -> {
62+ log .info ("profile is {}" , profile );
6563 com .example .research .profile .entity .storage .Profile storeProfile = profileStorageRepository .save (profile );
6664 applicationEventPublisher .publishEvent (ProfileSavedEvent .from (storeProfile ));
6765 return Mono .just (storeProfile );
@@ -73,7 +71,29 @@ public Mono<ServerResponse> save(Mono<ProfileSaveRequest> request) {
7371 Mono <ProfileSaveResponse > save = request .flatMap (saveProfile .compose (mapToProfile ))
7472 .map (mapToResponse ); // FIXME throw 처리
7573
76- return ServerResponse .ok ()
77- .body (save , ProfileSaveResponse .class );
74+ return ok ().body (save , ProfileSaveResponse .class );
75+ }
76+
77+ @ NonNull
78+ public Mono <ServerResponse > update (ServerRequest request ) {
79+ Mono <ProfileSaveRequest > profileSaveRequestMono = request .bodyToMono (ProfileSaveRequest .class );
80+ com .example .research .profile .entity .storage .Profile existProfile = profileStorageRepository
81+ .findById (request .pathVariable ("id" )).orElseThrow (IllegalStateException ::new );
82+
83+ return profileSaveRequestMono .flatMap (requestProfile -> {
84+ existProfile .setName (
85+ StringUtils .isEmpty (requestProfile .getName ()) ?
86+ existProfile .getName () : requestProfile .getName ()
87+ );
88+ existProfile .setAge (requestProfile .getAge () == null ? existProfile .getAge () : requestProfile .getAge ());
89+ existProfile .setSex (requestProfile .getSex () == null ? existProfile .getSex () : requestProfile .getSex ());
90+ existProfile .setUpdatedAt (LocalDateTime .now ());
91+ profileStorageRepository .save (existProfile );
92+
93+ applicationEventPublisher .publishEvent (ProfileChangedEvent .from (existProfile ));
94+
95+ return ok ().contentType (MediaType .APPLICATION_JSON ).body (fromObject (existProfile ))
96+ .switchIfEmpty (ServerResponse .badRequest ().build ());
97+ });
7898 }
7999}
0 commit comments