Skip to content

Commit 6809ee1

Browse files
authored
[Feat] 사용자 피드백 등록 API 개발 (#78)
* feat: feedback 엔티티 추가 (#77) * feat: 피드백 등록 요청 dto 추가 (#77) * feat: feedback 리포지토리 추가 (#77) * feat: 피드백 등록 서비스 구현 (#77) * feat: 피드백 등록 컨트롤러 구현 (#77) * feat: 피드백 본문 유효성 검사 추가 (#77)
1 parent 09d0809 commit 6809ee1

File tree

8 files changed

+149
-0
lines changed

8 files changed

+149
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.moa.moa_server.domain.feedback.controller;
2+
3+
import com.moa.moa_server.domain.feedback.dto.request.FeedbackCreateRequest;
4+
import com.moa.moa_server.domain.feedback.service.FeedbackService;
5+
import com.moa.moa_server.domain.global.dto.ApiResponse;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping("/api/v1/user-feedback")
17+
public class FeedbackController {
18+
19+
private final FeedbackService feedbackService;
20+
21+
@PostMapping
22+
public ResponseEntity<ApiResponse> createFeedback(
23+
@AuthenticationPrincipal Long userId,
24+
@RequestBody FeedbackCreateRequest request
25+
) {
26+
feedbackService.createFeedback(userId, request);
27+
return ResponseEntity
28+
.status(201)
29+
.body(new ApiResponse("SUCCESS", null));
30+
}
31+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.moa.moa_server.domain.feedback.dto.request;
2+
3+
public record FeedbackCreateRequest (
4+
String content
5+
) {}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.moa.moa_server.domain.feedback.entity;
2+
3+
import com.moa.moa_server.domain.global.entity.BaseTimeEntity;
4+
import com.moa.moa_server.domain.user.entity.User;
5+
import jakarta.persistence.*;
6+
import lombok.*;
7+
import org.springframework.data.annotation.CreatedDate;
8+
9+
@Entity
10+
@Getter
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
12+
@AllArgsConstructor
13+
@Builder
14+
public class Feedback extends BaseTimeEntity {
15+
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
private Long id;
19+
20+
@ManyToOne(fetch = FetchType.LAZY)
21+
@JoinColumn(name = "user_id", nullable = false)
22+
private User user;
23+
24+
@Column(length = 500, nullable = false)
25+
private String content;
26+
27+
public static Feedback create(User user, String content) {
28+
return Feedback.builder()
29+
.user(user)
30+
.content(content)
31+
.build();
32+
}
33+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.moa.moa_server.domain.feedback.handler;
2+
3+
import com.moa.moa_server.domain.global.exception.BaseErrorCode;
4+
import org.springframework.http.HttpStatus;
5+
6+
public enum FeedbackErrorCode implements BaseErrorCode {
7+
INVALID_INPUT(HttpStatus.BAD_REQUEST);
8+
9+
private final HttpStatus status;
10+
11+
FeedbackErrorCode(HttpStatus status) { this.status = status; }
12+
13+
public HttpStatus getStatus() { return status; }
14+
15+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.moa.moa_server.domain.feedback.handler;
2+
3+
import com.moa.moa_server.domain.global.exception.BaseErrorCode;
4+
import com.moa.moa_server.domain.global.exception.BaseException;
5+
6+
public class FeedbackException extends BaseException {
7+
public FeedbackException(BaseErrorCode errorCode) { super(errorCode); }
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.moa.moa_server.domain.feedback.repository;
2+
3+
import com.moa.moa_server.domain.feedback.entity.Feedback;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface FeedbackRepository extends JpaRepository<Feedback, Long> {
7+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.moa.moa_server.domain.feedback.service;
2+
3+
import com.moa.moa_server.domain.feedback.dto.request.FeedbackCreateRequest;
4+
import com.moa.moa_server.domain.feedback.entity.Feedback;
5+
import com.moa.moa_server.domain.feedback.repository.FeedbackRepository;
6+
import com.moa.moa_server.domain.feedback.util.FeedbackValidator;
7+
import com.moa.moa_server.domain.user.entity.User;
8+
import com.moa.moa_server.domain.user.handler.UserErrorCode;
9+
import com.moa.moa_server.domain.user.handler.UserException;
10+
import com.moa.moa_server.domain.user.repository.UserRepository;
11+
import com.moa.moa_server.domain.user.util.AuthUserValidator;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
15+
16+
@Service
17+
@RequiredArgsConstructor
18+
public class FeedbackService {
19+
20+
private final FeedbackRepository feedbackRepository;
21+
private final UserRepository userRepository;
22+
23+
@Transactional
24+
public void createFeedback(Long userId, FeedbackCreateRequest request) {
25+
// 유저 조회 및 검증
26+
User user = userRepository.findById(userId)
27+
.orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND));
28+
AuthUserValidator.validateActive(user);
29+
30+
//
31+
FeedbackValidator.validateContent(request.content());
32+
33+
Feedback feedback = Feedback.create(user, request.content());
34+
35+
feedbackRepository.save(feedback);
36+
}
37+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.moa.moa_server.domain.feedback.util;
2+
3+
import com.moa.moa_server.domain.feedback.handler.FeedbackErrorCode;
4+
import com.moa.moa_server.domain.feedback.handler.FeedbackException;
5+
6+
public class FeedbackValidator {
7+
8+
public static void validateContent(String content){
9+
if (content == null || content.isBlank() || content.length() > 500 || content.length() < 2) {
10+
throw new FeedbackException(FeedbackErrorCode.INVALID_INPUT);
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)