일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- auto.create.topics.enable
- 브릿지 메소드
- junit 5
- 프리미티브 타입
- 바운디드 타입
- yield
- 람다식
- System.in
- 접근지시자
- 합병 정렬
- 상속
- 정렬
- github api
- annotation processor
- 자바스터디
- 함수형 인터페이스
- Switch Expressions
- 스파르타코딩클럽
- 제네릭 타입
- 항해99
- 자바할래
- raw 타입
- 익명 클래스
- docker
- System.out
- 로컬 클래스
- 제네릭 와일드 카드
- System.err
- throwable
- Study Halle
Archives
- Today
- Total
코딩하는 털보
11 to 9, Day 11 본문
Today, ToDoList
- Toy Project - NGMA
- 신청 받은 내역 확인/거절 프로세스 만들기
- 내가 신청한 이력을 취소할 수 있는 기능 만들기
신청 받은 내역 확인/거절 프로세스 만들기
대기자 테이블의 확인/취소 버튼에 ajax로 대기자 속성 변경하기
컨트롤러 테스트
@Test
@WithUserDetails(value = "jilee@example.com", setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void confirmWaiter() throws Exception {
Account lover = accountService.getUserByEmail("sjlee@example.com");
Account account = accountService.getUserByEmail("jilee@example.com");
accountService.pickLover(lover, account);
assertThat(lover.getLoverState()).isEqualTo(LoverState.WAITING);
assertThat(account.getLoverState().getHasWaiters()).isEqualTo(true);
assertThat(account.getWaiter()).isNotEmpty();
mvc.perform(post("/account/waiter/"+lover.getId())
.param("param", "confirm"))
.andDo(print())
.andExpect(status().isOk());
assertThat(lover.getLoverState()).isEqualTo(LoverState.COUPLED);
assertThat(account.getLoverState().getHasWaiters()).isEqualTo(false);
assertThat(account.getWaiter()).isEmpty();
}
@Test
@WithUserDetails(value = "jilee@example.com", setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void rejectWaiter() throws Exception {
Account lover = accountService.getUserByEmail("sjlee@example.com");
Account account = accountService.getUserByEmail("jilee@example.com");
accountService.pickLover(lover, account);
assertThat(lover.getLoverState()).isEqualTo(LoverState.WAITING);
assertThat(account.getLoverState().getHasWaiters()).isEqualTo(true);
assertThat(account.getWaiter().contains(lover)).isTrue();
assertThat(account.getWaiter()).isNotEmpty();
mvc.perform(post("/account/waiter/"+lover.getId())
.param("param", "reject"))
.andDo(print())
.andExpect(status().isOk());
assertThat(lover.getLoverState()).isEqualTo(LoverState.NOTHING);
assertThat(account.getWaiter().contains(lover)).isFalse();
}
핸들러
@PostMapping("/waiter/{id}")
@ResponseBody
public ResponseEntity<?> modifyWaiter(@AuthenticationPrincipal UserAccount userAccount,
@PathVariable("id") Long id,@RequestParam String param) {
if (param.equals("confirm")) {
accountService.confirmWaiter(userAccount, id);
} else if (param.equals("reject")) {
accountService.rejectWaiter(userAccount, id);
} else {
throw new InvalidParameterException(param);
}
return ResponseEntity.ok().body("{}");
}
서비스
public void rejectWaiter(UserAccount userAccount, Long waiterId) {
Account account = getUserById(userAccount.getAccountId());
Account waiter = getUserById(waiterId);
account.getWaiters().remove(waiter);
waiter.setLover(null);
waiter.setLoverState(LoverState.NOTHING);
}
public void confirmWaiter(UserAccount userAccount, Long waiterId) {
Account account = getUserById(userAccount.getAccountId());
Account waiter = getUserById(waiterId);
account.setLover(waiter);
account.setLoverState(LoverState.COUPLED);
waiter.setLoverState(LoverState.COUPLED);
account.getWaiters().remove(waiter);
clearWaiter(account);
clearWaiter(waiter);
}
public void clearWaiter(Account account) {
List<Account> waiterList = account.getWaiters();
for (Account waiter : waiterList) {
waiter.setLover(null);
waiter.setLoverState(LoverState.NOTHING);
}
waiterList.clear();
account.setLoverStateHasWaiters(false);
}
ajax
function confirmWaiter(accountId) {
$.ajax({
url: "http://localhost:8080/account/waiter/"+accountId,
type: "POST",
data: {param: "confirm"},
dataType: "json",
success: function(data) {
alert("확인되었습니다.");
loadCoupleState();
},
error: function(request) {
alert(request.responseText);
}
});
}
function rejectWaiter() {
$.ajax({
url: "http://localhost:8080/account/waiter/"+accountId,
type: "POST",
data: {param: "reject"},
dataType: "json",
success: function(data) {
alert("거절되었습니다.");
loadCoupleState();
},
error: function(request) {
alert(request.responseText);
}
});
}
트러블 슈팅
두 Account 객체의 lover 속성이 서로 일 경우 무한 루프 발생.
@OneToOne
@JsonIgnore
@JoinColumn(name = "lover_id")
private Account lover;
@JsonIgnore 애노테이션으로 Json response에서 제외
내가 신청한 이력을 취소할 수 있는 기능 만들기
컨트롤러 테스트
@Test
@WithUserDetails(value = "jilee@example.com", setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void cancelpick() throws Exception {
Account account = accountService.getUserByEmail("jilee@example.com");
Account lover = accountService.getUserByEmail("sjlee@example.com");
lover.setLover(account);
lover.setLoverState(LoverState.WAITING);
account.getWaiters().add(lover);
account.setLoverStateHasWaiters(true);
mvc.perform(post("/account/pick/cancel"))
.andDo(print())
.andExpect(status().isOk());
assertThat(account.getLover()).isNull();
assertThat(account.getLoverState()).isEqualTo(LoverState.NOTHING);
}
핸들러
@PostMapping("/pick/cancel")
@ResponseBody
public ResponseEntity<?> cancelPick(@AuthenticationPrincipal UserAccount userAccount) {
accountService.cancelPick(userAccount);
return ResponseEntity.ok().body("{}");
}
서비스
public void cancelPick(UserAccount userAccount) {
Account account = getUserById(userAccount.getAccountId());
account.setLover(null);
account.setLoverState(LoverState.NOTHING);
}
취소 버튼 및 ajax 함수 추가
function waitingComment(data) {
$("div#loverStateResult")
.append("<p class=\"text-sm-start\">아직 "+data.name.toString()+"("+data.email.toString()+")" +
"님으로부터 승인을 대기중입니다. 상대방의 확인이 끝날 때 까지 기다려주세요.</p>" +
"\<a class=\"btn btn-outline-primary btn-sm\" type=\"button\" id=\"cancelPick\" onclick=\"cancelPick();\">취소하기</a>");
}
function cancelPick() {
$.ajax({
url: "http://localhost:8080/account/pick/cancel",
type: "POST",
dataType: "json",
success: function(data) {
alert("취소되었습니다.");
loadCoupleState();
},
error: function(request) {
alert(request.responseText);
}
});
}
Comments