Skip to content

Commit bcc3697

Browse files
authored
Merge pull request #238 from devping-kr/dev
deploy : 배포
2 parents ce63521 + 932e9d7 commit bcc3697

File tree

16 files changed

+543
-410
lines changed

16 files changed

+543
-410
lines changed

src/main/java/devping/nnplanner/domain/auth/service/AuthService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public String loginUrlGoogle() {
101101
+ "&response_type=code&scope=email%20profile%20openid&access_type=offline";
102102
}
103103

104+
@Transactional
104105
public AuthResponseDTO loginGoogle(GoogleLoginRequestDTO googleLoginRequestDTO) {
105106

106107
RestTemplate restTemplate = new RestTemplate();

src/main/java/devping/nnplanner/domain/menucategory/service/MenuCategoryService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ private void saveMenuCategories(String majorCategory, List<String> minorCategori
6868
}
6969
}
7070

71+
@Transactional(readOnly = true)
7172
public List<String> getSchoolNameSuggestions(String keyword) {
7273

7374
if (keyword.length() < 2) { // 최소 2글자 이상 입력해야 검색

src/main/java/devping/nnplanner/domain/monthmenu/service/MonthMenuService.java

Lines changed: 161 additions & 205 deletions
Large diffs are not rendered by default.

src/main/java/devping/nnplanner/domain/survey/dto/response/SurveyDetailResponseDTO.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package devping.nnplanner.domain.survey.dto.response;
22

3-
import lombok.Getter;
4-
import lombok.Setter;
3+
import lombok.*;
54

65
import java.time.LocalDateTime;
76
import java.util.List;
87
import java.util.Map;
98
import java.util.UUID;
109

1110
@Getter
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1212
@Setter
1313
public class SurveyDetailResponseDTO {
1414

@@ -21,24 +21,45 @@ public class SurveyDetailResponseDTO {
2121

2222
private AverageScores averageScores;
2323

24+
@Builder
25+
private SurveyDetailResponseDTO(String surveyName, LocalDateTime deadline, UUID mmId, List<QuestionSatisfactionDistribution> mandatoryQuestions, List<QuestionSatisfactionDistribution> additionalQuestions, AverageScores averageScores) {
26+
this.surveyName = surveyName;
27+
this.deadline = deadline;
28+
this.mmId = mmId;
29+
this.mandatoryQuestions = mandatoryQuestions;
30+
this.additionalQuestions = additionalQuestions;
31+
this.averageScores = averageScores;
32+
}
33+
2434
@Getter
2535
@Setter
36+
@NoArgsConstructor
2637
public static class AverageScores {
2738
private double totalSatisfaction;
2839
private double portionSatisfaction;
2940
private double hygieneSatisfaction;
3041
private double tasteSatisfaction;
42+
43+
@Builder
44+
public AverageScores(double totalSatisfaction, double portionSatisfaction, double hygieneSatisfaction, double tasteSatisfaction) {
45+
this.totalSatisfaction = totalSatisfaction;
46+
this.portionSatisfaction = portionSatisfaction;
47+
this.hygieneSatisfaction = hygieneSatisfaction;
48+
this.tasteSatisfaction = tasteSatisfaction;
49+
}
3150
}
3251

3352
@Getter
34-
@Setter
53+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
54+
3555
public static class QuestionSatisfactionDistribution {
3656
private Long questionId;
3757
private String questionText;
3858
private Map<Integer, Integer> radioResponses; // "radio" 타입 질문에 대해서만 설정됨
3959
private List<String> textResponses; // "text" 타입 질문에 대해서만 설정됨
4060
private String answerType;
4161

62+
@Builder
4263
public QuestionSatisfactionDistribution(Long questionId, String questionText,
4364
Map<Integer, Integer> radioResponses,
4465
List<String> textResponses,
@@ -50,7 +71,8 @@ public QuestionSatisfactionDistribution(Long questionId, String questionText,
5071
this.answerType = answerType;
5172
}
5273

53-
public QuestionSatisfactionDistribution(Long questionId, String questionText, String answerType) {
74+
@Builder
75+
private QuestionSatisfactionDistribution(Long questionId, String questionText, String answerType) {
5476
this.questionId = questionId;
5577
this.questionText = questionText;
5678
this.radioResponses = Map.of();
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package devping.nnplanner.domain.survey.entity;
2+
3+
public enum AnswerItemType {
4+
DATE("날짜"), RADIO("점수"), TEXT("의견"), ETC("기타");
5+
6+
private final String name;
7+
8+
AnswerItemType(String name) {
9+
this.name = name;
10+
}
11+
}

src/main/java/devping/nnplanner/domain/survey/entity/Question.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package devping.nnplanner.domain.survey.entity;
22

3+
import com.fasterxml.jackson.databind.introspect.Annotated;
34
import jakarta.persistence.*;
45
import lombok.Getter;
56
import lombok.NoArgsConstructor;
@@ -34,4 +35,9 @@ public Question(String question, String answerType, boolean isMandatory, Survey
3435
this.isMandatory = isMandatory;
3536
this.survey = survey;
3637
}
38+
39+
public void reviseQuestion(final String newContent, final String answerType) {
40+
this.question = newContent;
41+
this.answerType = answerType;
42+
}
3743
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package devping.nnplanner.domain.survey.entity;
2+
3+
import devping.nnplanner.global.entity.BaseTimeEntity;
4+
import jakarta.persistence.*;
5+
import lombok.AccessLevel;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Entity
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
12+
@Getter
13+
public class SurveyAnswerItem extends BaseTimeEntity {
14+
@Id
15+
@GeneratedValue(strategy = GenerationType.IDENTITY )
16+
private Long id;
17+
18+
@ManyToOne(fetch = FetchType.LAZY)
19+
@JoinColumn(name = "survey_response_detail_id", nullable = false)
20+
private SurveyResponseDetail surveyResponseDetail;
21+
22+
@Column(name = "answer_item", length = 1000)
23+
private String answerItem;
24+
25+
@Column(name = "answer_score")
26+
private Integer answerScore; // radio 타입 점수 저장
27+
28+
@Enumerated(EnumType.STRING)
29+
private AnswerItemType answerItemType;
30+
31+
@Builder
32+
private SurveyAnswerItem(Long id, SurveyResponseDetail surveyResponseDetail, String answerItem, Integer answerScore, AnswerItemType answerItemType) {
33+
this.id = id;
34+
this.surveyResponseDetail = surveyResponseDetail;
35+
this.answerItem = answerItem;
36+
this.answerScore = answerScore;
37+
this.answerItemType = answerItemType;
38+
}
39+
}
Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package devping.nnplanner.domain.survey.entity;
22

33
import jakarta.persistence.*;
4-
import lombok.Getter;
5-
import lombok.NoArgsConstructor;
6-
import lombok.Setter;
4+
import lombok.*;
75

86
import java.util.List;
97

108
@Entity
119
@Getter
1210
@Setter
13-
@NoArgsConstructor
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1412
public class SurveyResponseDetail {
1513

1614
@Id
@@ -25,22 +23,14 @@ public class SurveyResponseDetail {
2523
@JoinColumn(name = "question_id", nullable = false)
2624
private Question question; // 질문과 연관
2725

28-
@Column(name = "answer_score")
29-
private Integer answerScore; // radio 타입 점수 저장
3026

31-
@Column(name = "answer_text", length = 1000)
32-
private String answerText; // text 타입의 단일 텍스트 응답 저장
27+
@OneToMany(mappedBy = "surveyResponseDetail", fetch = FetchType.LAZY)
28+
private List<SurveyAnswerItem> surveyAnswerItems; // 응답에 포함된 답변 항목 리스트
3329

34-
@ElementCollection
35-
@CollectionTable(name = "survey_response_answer_list", joinColumns = @JoinColumn(name = "survey_response_detail_id"))
36-
@Column(name = "answer_item")
37-
private List<String> answerList; // text 타입의 리스트 응답 저장 (ex: "가장 좋아하는 상위 3개 식단")
30+
@Builder
3831

39-
public SurveyResponseDetail(SurveyResponse surveyResponse, Question question, Integer answerScore, String answerText, List<String> answerList) {
32+
private SurveyResponseDetail(SurveyResponse surveyResponse, Question question) {
4033
this.surveyResponse = surveyResponse;
4134
this.question = question;
42-
this.answerScore = answerScore;
43-
this.answerText = answerText;
44-
this.answerList = answerList;
4535
}
4636
}

src/main/java/devping/nnplanner/domain/survey/repository/QuestionRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import devping.nnplanner.domain.survey.entity.Question;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

6+
import java.util.List;
67
import java.util.Optional;
78

89
public interface QuestionRepository extends JpaRepository<Question, Long> {
910
Optional<Question> findByIdAndSurveyId(Long questionId, Long surveyId);
11+
12+
Optional<List<Question>> findAllBySurveyId(Long surveyId);
1013
}

src/main/java/devping/nnplanner/domain/survey/repository/ResponseDetailRepository.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,23 @@
77
import org.springframework.data.repository.query.Param;
88

99
import java.util.List;
10+
import java.util.Optional;
1011

1112
public interface ResponseDetailRepository extends JpaRepository<SurveyResponseDetail, Long> {
1213

13-
// 특정 SurveyResponse에 연결된 ResponseDetail 조회
14-
List<SurveyResponseDetail> findBySurveyResponse(SurveyResponse surveyResponse);
15-
16-
// 특정 질문 ID에 따라 분류된 응답 조회 예시
17-
@Query("SELECT rd FROM SurveyResponseDetail rd WHERE rd.question.id = :questionId AND rd.surveyResponse.survey.id = :surveyId")
18-
List<SurveyResponseDetail> findByQuestionAndSurvey(@Param("questionId") Long questionId, @Param("surveyId") Long surveyId);
19-
20-
// 영양사에게 남긴 메시지 조회 (answerText가 NULL이 아닌 경우)
21-
@Query("SELECT rd.answerText FROM SurveyResponseDetail rd WHERE rd.surveyResponse.survey.id = :surveyId AND rd.answerText IS NOT NULL")
22-
List<String> findMessagesToDietitian(@Param("surveyId") Long surveyId);
23-
24-
// 만족도나 기타 항목의 평균값 계산 예시
25-
@Query("SELECT AVG(rd.answerScore) FROM SurveyResponseDetail rd WHERE rd.surveyResponse.survey.id = :surveyId")
26-
Double findAverageSatisfactionScoreBySurvey(@Param("surveyId") Long surveyId);
14+
// 특정 SurveyResponse에 연결된 ResponseDetail 조회")
15+
@Query("SELECT rd FROM SurveyResponseDetail rd join fetch rd.surveyAnswerItems WHERE rd.surveyResponse.id = :surveyResponseId")
16+
Optional<List<SurveyResponseDetail>> findSurveyResponseDetailBySurveyResponse(final Long surveyResponseId);
17+
//
18+
// // 특정 질문 ID에 따라 분류된 응답 조회 예시
19+
// @Query("SELECT rd FROM SurveyResponseDetail rd WHERE rd.question.id = :questionId AND rd.surveyResponse.survey.id = :surveyId")
20+
// List<SurveyResponseDetail> findByQuestionAndSurvey(@Param("questionId") Long questionId, @Param("surveyId") Long surveyId);
21+
//
22+
// // 영양사에게 남긴 메시지 조회 (answerText가 NULL이 아닌 경우)
23+
// @Query("SELECT rd.answerText FROM SurveyResponseDetail rd WHERE rd.surveyResponse.survey.id = :surveyId AND rd.answerText IS NOT NULL")
24+
// List<String> findMessagesToDietitian(@Param("surveyId") Long surveyId);
25+
//
26+
// // 만족도나 기타 항목의 평균값 계산 예시
27+
// @Query("SELECT AVG(rd.answerScore) FROM SurveyResponseDetail rd WHERE rd.surveyResponse.survey.id = :surveyId")
28+
// Double findAverageSatisfactionScoreBySurvey(@Param("surveyId") Long surveyId);
2729
}

0 commit comments

Comments
 (0)