Skip to content

Commit 420c9b6

Browse files
committed
[J2KB-3rd-Season#22]feat: 답변 Like 추가
1 parent 538d458 commit 420c9b6

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

src/main/java/com/devin/dev/controller/reply/ReplyController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public DefaultResponse<?> reply(@PathVariable("id") Long replyId, HttpServletReq
3737
return replyService.deleteReply(replyId, request);
3838
}
3939

40+
@PatchMapping("/reply/{id}/like")
41+
public DefaultResponse<?> changePostLike(@PathVariable("id") Long replyId, HttpServletRequest request) {
42+
return replyService.changeReplyLike(replyId, request);
43+
}
44+
4045
@Data
4146
private static class CreateReplyResponse {
4247
private Long id;

src/main/java/com/devin/dev/dto/reply/ReplyDto.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.devin.dev.dto.reply;
22

3+
import com.devin.dev.entity.reply.Reply;
34
import com.devin.dev.entity.reply.ReplyImage;
45
import com.devin.dev.entity.reply.ReplyStatus;
56
import com.devin.dev.entity.user.UserStatus;
@@ -33,4 +34,11 @@ public ReplyDto(Long id, String name, String content, ReplyStatus status, Intege
3334
this.like = like;
3435
}
3536

37+
public ReplyDto(Reply reply) {
38+
this.id = reply.getId();
39+
this.name = reply.getUser().getName();
40+
this.content = reply.getContent();
41+
this.status = reply.getStatus();
42+
this.like = reply.getLikes().size();
43+
}
3644
}

src/main/java/com/devin/dev/service/ReplyService.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,4 +342,55 @@ public DefaultResponse<?> deleteReply(Long replyId, HttpServletRequest request)
342342

343343
return new DefaultResponse<>(StatusCode.SUCCESS, ResponseMessage.REPLY_DELETE_SUCCESS);
344344
}
345+
346+
@Transactional
347+
public DefaultResponse<ReplyDto> changeReplyLike(Long replyId, HttpServletRequest request) {
348+
String token = tokenProvider.parseToken(request);
349+
Long userId;
350+
if (tokenProvider.validateToken(token)) {
351+
userId = tokenProvider.getUserId(token);
352+
} else {
353+
return new DefaultResponse<>(StatusCode.FAIL_AUTH, ResponseMessage.NOT_FOUND_USER);
354+
}
355+
Optional<User> userOptional = userRepository.findById(userId);
356+
if (userOptional.isEmpty()) {
357+
return new DefaultResponse<>(StatusCode.NOT_EXIST, ResponseMessage.NOT_FOUND_USER);
358+
}
359+
User user = userOptional.get();
360+
361+
Optional<Reply> replyOptional = replyRepository.findById(replyId);
362+
if (replyOptional.isEmpty()) {
363+
return new DefaultResponse<>(StatusCode.NOT_EXIST, ResponseMessage.NOT_FOUND_REPLY);
364+
}
365+
Reply reply = replyOptional.get();
366+
367+
// 추천 조회
368+
Optional<ReplyLike> likeOptional = replyRepository.findLikeByUser(reply, user);
369+
370+
ReplyLike replyLike;
371+
// 추천 유무에 따라 실행
372+
if (likeOptional.isPresent()) {
373+
replyLike = likeOptional.get();
374+
replyLikeRepository.delete(replyLike);
375+
if (isNotSameUser(user, reply.getUser())) {
376+
// 좋아요 누른 사람 경험치 감소
377+
user.changeExp(User.ExpChangeType.REPLY_CANCEL_LIKE);
378+
// 답변 작성자 경험치 감소
379+
reply.getUser().changeExp(User.ExpChangeType.REPLY_NOT_BE_LIKED);
380+
}
381+
} else {
382+
replyLike = reply.like(user, new ReplyLike());
383+
if (isNotSameUser(user, reply.getUser())) {
384+
// 좋아요 누른 사람 경험치 증가
385+
user.changeExp(User.ExpChangeType.REPLY_LIKE);
386+
// 답변 작성자 경험치 증가
387+
reply.getUser().changeExp(User.ExpChangeType.REPLY_BE_LIKED);
388+
}
389+
replyLikeRepository.save(replyLike);
390+
}
391+
392+
ReplyDto replyDto = new ReplyDto(reply);
393+
394+
return new DefaultResponse<>(StatusCode.SUCCESS, ResponseMessage.REPLY_LIKE_CHANGE_SUCCESS, replyDto);
395+
}
345396
}

0 commit comments

Comments
 (0)