Skip to content

Commit

Permalink
feat: TalkRoom Comment 등록 API 구현 (#24)
Browse files Browse the repository at this point in the history
  • Loading branch information
AHNYUNKI committed Mar 24, 2024
1 parent 6827d03 commit beb6774
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/main/java/com/jisungin/api/comment/CommentController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.jisungin.api.comment;

import com.jisungin.api.ApiResponse;
import com.jisungin.api.comment.request.CommentCreateRequest;
import com.jisungin.api.oauth.Auth;
import com.jisungin.api.oauth.AuthContext;
import com.jisungin.application.comment.CommentService;
import com.jisungin.application.comment.response.CommentResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RequestMapping("/v1")
@RestController
public class CommentController {

private final CommentService commentService;

@PostMapping("/talk-rooms/{talkRoomId}/comments")
public ApiResponse<CommentResponse> writeComment(@PathVariable Long talkRoomId,
@Valid @RequestBody CommentCreateRequest request,
@Auth AuthContext authContext) {
return ApiResponse.ok(commentService.writeComment(request.toService(), talkRoomId, authContext.getUserId()));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.jisungin.api.comment.request;

import com.jisungin.application.comment.request.CommentCreateServiceRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CommentCreateRequest {

@NotBlank(message = "내용은 필수 입니다.")
private String content;

@Builder
private CommentCreateRequest(String content) {
this.content = content;
}

public CommentCreateServiceRequest toService() {
return CommentCreateServiceRequest.builder()
.content(content)
.build();
}

}
38 changes: 38 additions & 0 deletions src/main/java/com/jisungin/application/comment/CommentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.jisungin.application.comment;

import com.jisungin.application.comment.request.CommentCreateServiceRequest;
import com.jisungin.application.comment.response.CommentResponse;
import com.jisungin.domain.comment.Comment;
import com.jisungin.domain.comment.repository.CommentRepository;
import com.jisungin.domain.talkroom.TalkRoom;
import com.jisungin.domain.talkroom.repository.TalkRoomRepository;
import com.jisungin.domain.user.User;
import com.jisungin.domain.user.repository.UserRepository;
import com.jisungin.exception.BusinessException;
import com.jisungin.exception.ErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
public class CommentService {

private final CommentRepository commentRepository;
private final TalkRoomRepository talkRoomRepository;
private final UserRepository userRepository;

public CommentResponse writeComment(CommentCreateServiceRequest request, Long talkRoomId, Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND));

TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId)
.orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND));

Comment comment = Comment.create(request, user, talkRoom);

commentRepository.save(comment);

return CommentResponse.of(comment.getContent(), user.getName());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.jisungin.application.comment.request;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CommentCreateServiceRequest {

private String content;

@Builder
private CommentCreateServiceRequest(String content) {
this.content = content;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.jisungin.application.comment.response;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CommentResponse {

private String content;

private String userName;

@Builder
private CommentResponse(String content, String userName) {
this.content = content;
this.userName = userName;
}

public static CommentResponse of(String content, String name) {
return CommentResponse.builder()
.content(content)
.userName(name)
.build();
}

}
9 changes: 9 additions & 0 deletions src/main/java/com/jisungin/domain/comment/Comment.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.jisungin.domain.comment;

import com.jisungin.application.comment.request.CommentCreateServiceRequest;
import com.jisungin.domain.BaseEntity;
import com.jisungin.domain.talkroom.TalkRoom;
import com.jisungin.domain.user.User;
Expand Down Expand Up @@ -38,4 +39,12 @@ private Comment(User user, TalkRoom talkRoom, String content) {
this.content = content;
}

public static Comment create(CommentCreateServiceRequest request, User user, TalkRoom talkRoom) {
return Comment.builder()
.content(request.getContent())
.user(user)
.talkRoom(talkRoom)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.jisungin.domain.comment.repository;

import com.jisungin.domain.comment.Comment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CommentRepository extends JpaRepository<Comment, Long> {

}

0 comments on commit beb6774

Please sign in to comment.