Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,14 @@ public MemberSignupResponseDto registerWithSurvey(String email,
// surveyRepository.save(survey);
// });

SurveyRequestDto s = req.getSurvey(); // 단일 설문
SurveyRequestDto s = req.getSurvey();
Survey survey = surveyRepository.findByMemberIdAndIsDeletedFalse(member.getId())
.map(existing -> {
existing.update(
s.getEnergyLevel()
// 이후 섹션 늘리면 여기에 추가
);
existing.update(s);
return existing;
})
.orElseGet(() -> Survey.create(
member,
s.getEnergyLevel()
// 이후 섹션 늘리면 여기에 추가
));
.orElseGet(() -> Survey.create(member, s));

surveyRepository.save(survey);

member.markAdditionalDataChecked();
Expand Down
101 changes: 88 additions & 13 deletions src/main/java/com/arom/with_travel/domain/survey/Survey.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package com.arom.with_travel.domain.survey;

import com.arom.with_travel.domain.member.Member;
import com.arom.with_travel.domain.survey.enums.EnergyLevel;
import com.arom.with_travel.domain.survey.dto.request.SurveyRequestDto;
import com.arom.with_travel.domain.survey.enums.*;
import com.arom.with_travel.global.entity.BaseEntity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

import java.util.HashSet;
import java.util.Set;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -26,18 +29,94 @@ public class Survey extends BaseEntity {
@JoinColumn(name = "member_id", nullable = false)
private Member member;

@NotNull
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_energy_levels", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "energy_level", length = 50)
@Enumerated(EnumType.STRING)
private Set<EnergyLevel> energyLevels = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_travel_goals", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "travel_goal", length = 50)
@Enumerated(EnumType.STRING)
private Set<TravelGoal> travelGoals = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_travel_paces", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "travel_pace", length = 50)
@Enumerated(EnumType.STRING)
private Set<TravelPace> travelPaces = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_comm_styles", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "comm_style", length = 50)
@Enumerated(EnumType.STRING)
private Set<CommStyle> commStyles = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_personalities", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "personality", length = 50)
@Enumerated(EnumType.STRING)
private Set<RecordTendency> recordTendencies = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_companion_styles", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "companion_style", length = 50)
@Enumerated(EnumType.STRING)
private Set<CompanionStyle> companionStyles = new HashSet<>();

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "survey_spend_patterns", joinColumns = @JoinColumn(name = "survey_id"))
@Column(name = "spend_pattern", length = 50)
@Enumerated(EnumType.STRING)
@Column(name = "energy_level", nullable = false, length = 50)
private EnergyLevel energyLevel;
private Set<SpendPattern> spendPatterns = new HashSet<>();

private Survey(Member member, EnergyLevel energyLevel) {
this.energyLevel = energyLevel;
// @Column(name = "introduction", length = 1000)
// private String introduction;

// ---- 생성/수정 로직 ----
private Survey(Member member,
Set<EnergyLevel> energyLevels,
Set<TravelGoal> travelGoals,
Set<TravelPace> travelPaces,
Set<CommStyle> commStyles,
Set<RecordTendency> recordTendencies,
Set<CompanionStyle> companionStyles,
Set<SpendPattern> spendPatterns) {
this.energyLevels = safe(energyLevels);
this.travelGoals = safe(travelGoals);
this.travelPaces = safe(travelPaces);
this.commStyles = safe(commStyles);
this.recordTendencies = safe(recordTendencies);
this.companionStyles= safe(companionStyles);
this.spendPatterns = safe(spendPatterns);
// this.introduction = introduction;
linkMember(member);
}

public static Survey create(Member member, EnergyLevel energyLevel) {
return new Survey(member, energyLevel);
public static Survey create(Member member, SurveyRequestDto dto){
return new Survey(
member,
dto.getEnergyLevels(), dto.getTravelGoals(), dto.getTravelPaces(),
dto.getCommStyles(), dto.getRecordTendencies(), dto.getCompanionStyles(),
dto.getSpendPatterns()
// dto.getIntroduction()
);
}

public void update(SurveyRequestDto dto){
this.energyLevels = safe(dto.getEnergyLevels());
this.travelGoals = safe(dto.getTravelGoals());
this.travelPaces = safe(dto.getTravelPaces());
this.commStyles = safe(dto.getCommStyles());
this.recordTendencies = safe(dto.getRecordTendencies());
this.companionStyles = safe(dto.getCompanionStyles());
this.spendPatterns = safe(dto.getSpendPatterns());
// this.introduction = dto.getIntroduction();
}

private <T> Set<T> safe(Set<T> in){
return (in == null) ? new HashSet<>() : new HashSet<>(in);
}

private void linkMember(Member newMember) {
Expand All @@ -49,8 +128,4 @@ private void linkMember(Member newMember) {
newMember.setSurvey(this);
}
}

public void update(EnergyLevel energyLevel) {
this.energyLevel = energyLevel;
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
package com.arom.with_travel.domain.survey.dto.request;

import com.arom.with_travel.domain.survey.enums.EnergyLevel;
import com.arom.with_travel.domain.survey.enums.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Set;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SurveyRequestDto {

@NotNull(message = "energyLevel은 필수입니다.")
private EnergyLevel energyLevel;
// @NotNull TravelGoal travelGoal,
// @NotNull TravelPace travelPace,
// @NotNull CommStyle commStyle,
// @NotNull Personality personality,
// @NotNull CompanionStyle companionStyle,
// @NotNull SpendPattern spendPattern
private Set<EnergyLevel> energyLevels;
private Set<TravelGoal> travelGoals;
private Set<TravelPace> travelPaces;
private Set<CommStyle> commStyles;
private Set<RecordTendency> recordTendencies;
private Set<CompanionStyle> companionStyles;
private Set<SpendPattern> spendPatterns;

// @Size(max = 1000, message = "자기소개는 최대 1000자입니다.")
// private String introduction;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.arom.with_travel.domain.survey.dto.response;

import com.arom.with_travel.domain.survey.Survey;
import com.arom.with_travel.domain.survey.enums.EnergyLevel;
import com.arom.with_travel.domain.survey.enums.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

@Getter
@NoArgsConstructor
Expand All @@ -17,22 +18,28 @@ public class SurveyResponseDto {
private Long surveyId;
private Long memberId;

private EnergyLevel energyLevel;
// 나중에 추가되면 주석 해제
// private TravelGoal travelGoal;
// private TravelPace travelPace;
// private CommStyle commStyle;
// private Personality personality;
// private CompanionStyle companionStyle;
// private SpendPattern spendPattern;
private Set<EnergyLevel> energyLevels;
private Set<TravelGoal> travelGoals;
private Set<TravelPace> travelPaces;
private Set<CommStyle> commStyles;
private Set<RecordTendency> recordTendencies;
private Set<CompanionStyle> companionStyles;
private Set<SpendPattern> spendPatterns;

// private String introduction;

public static SurveyResponseDto from(Survey s) {
return SurveyResponseDto.builder()
.surveyId(s.getId())
.memberId(s.getMember().getId())
.energyLevel(s.getEnergyLevel())
// .travelGoal(s.getTravelGoal())
// ...
.energyLevels(s.getEnergyLevels())
.travelGoals(s.getTravelGoals())
.travelPaces(s.getTravelPaces())
.commStyles(s.getCommStyles())
.recordTendencies(s.getRecordTendencies())
.companionStyles(s.getCompanionStyles())
.spendPatterns(s.getSpendPatterns())
// .introduction(s.getIntroduction())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.arom.with_travel.domain.survey.enums;

import com.arom.with_travel.global.exception.BaseException;
import com.arom.with_travel.global.exception.error.ErrorCode;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;

import java.util.Arrays;

@AllArgsConstructor
public enum CommStyle implements SurveyEnum {

TALKATIVE("TALKATIVE", "#수다쟁이"),
QUIET("QUIET", "#조용한편"),
REACTION_KING("REACTION_KING", "#리액션킹"),
RESPECT_ME_TIME("RESPECT_ME_TIME", "#개인시간존중");

private final String code;
private final String label;

@Override public String getCode(){return code;}
@Override public String getLabel(){return label;}

@JsonValue
public String json(){return code;}

@JsonCreator
public static CommStyle from(String value){
return Arrays.stream(values())
.filter(v -> v.name().equalsIgnoreCase(value) || v.getCode().equalsIgnoreCase(value))
.findFirst()
.orElseThrow(() -> BaseException.from(ErrorCode.INVALID_SURVEY_TRAVELGOAL));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.arom.with_travel.domain.survey.enums;

import com.arom.with_travel.global.exception.BaseException;
import com.arom.with_travel.global.exception.error.ErrorCode;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;

import java.util.Arrays;

@AllArgsConstructor
public enum CompanionStyle implements SurveyEnum {

LEADER("LEADER", "#리더발휘"),
FOLLOWER("FOLLOWER", "#따라가는편"),
OPINION_GIVER("OPINION_GIVER", "#의견제시"),
MOOD_MAKER("MOOD_MAKER", "#분위기메이커");

private final String code;
private final String label;

@Override public String getCode(){return code;}
@Override public String getLabel(){return label;}

@JsonValue
public String json(){return code;}

@JsonCreator
public static CompanionStyle from(String value){
return Arrays.stream(values())
.filter(v -> v.name().equalsIgnoreCase(value) || v.getCode().equalsIgnoreCase(value))
.findFirst()
.orElseThrow(() -> BaseException.from(ErrorCode.INVALID_SURVEY_TRAVELGOAL));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.arom.with_travel.domain.survey.enums;

import com.arom.with_travel.global.exception.BaseException;
import com.arom.with_travel.global.exception.error.ErrorCode;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;

import java.util.Arrays;

@AllArgsConstructor
public enum RecordTendency implements SurveyEnum {

LIFE_SHOT_HUNTER("LIFE_SHOT_HUNTER", "#인생샷헌터"),
CANT_SKIP_SELFIE("CANT_SKIP_SELFIE", "#셀카는못참지"),
LOVE_RECORDING("LOVE_RECORDING", "#기록좋아"),
EYES_ONLY("EYES_ONLY", "#눈으로만감상");

private final String code;
private final String label;

@Override public String getCode(){return code;}
@Override public String getLabel(){return label;}

@JsonValue
public String json(){return code;}

@JsonCreator
public static RecordTendency from(String value){
return Arrays.stream(values())
.filter(v -> v.name().equalsIgnoreCase(value) || v.getCode().equalsIgnoreCase(value))
.findFirst()
.orElseThrow(() -> BaseException.from(ErrorCode.INVALID_SURVEY_TRAVELGOAL));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.arom.with_travel.domain.survey.enums;

import com.arom.with_travel.global.exception.BaseException;
import com.arom.with_travel.global.exception.error.ErrorCode;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;

import java.util.Arrays;

@AllArgsConstructor
public enum SpendPattern implements SurveyEnum {

VALUE_FOR_MONEY("VALUE_FOR_MONEY", "#가성비추구"),
VALUE_INVESTING("VALUE_INVESTING", "#가치투자"),
FLEX("FLEX", "#플렉스");

private final String code;
private final String label;

@Override public String getCode(){return code;}
@Override public String getLabel(){return label;}

@JsonValue
public String json(){return code;}

@JsonCreator
public static SpendPattern from(String value){
return Arrays.stream(values())
.filter(v -> v.name().equalsIgnoreCase(value) || v.getCode().equalsIgnoreCase(value))
.findFirst()
.orElseThrow(() -> BaseException.from(ErrorCode.INVALID_SURVEY_TRAVELGOAL));
}
}
Loading