diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/build.gradle" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/build.gradle" index 6d6c1ba..e345fd7 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/build.gradle" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/build.gradle" @@ -25,16 +25,17 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' + //Swagger + implementation 'org.springdoc:springdoc-openapi-ui:1.6.15' + implementation 'io.springfox:springfox-swagger2:2.9.2' + implementation 'io.springfox:springfox-swagger-ui:2.9.2' + compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } -tasks.named('bootBuildImage') { - builder = 'paketobuildpacks/builder-jammy-base:latest' -} - tasks.named('test') { useJUnitPlatform() } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/Application.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/Application.java" index ff807df..1712ec5 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/Application.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/Application.java" @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class Application { public static void main(String[] args) { diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/ApiResponse.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/ApiResponse.java" index 7f0d0e0..82e8d84 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/ApiResponse.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/ApiResponse.java" @@ -29,6 +29,6 @@ public static ApiResponse of(BaseCode code, T result) { } public static ApiResponse onFailure(String code, String message, T data) { - return new ApiResponse<>(true, code, message, data); + return new ApiResponse<>(false, code, message, data); } } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/code/status/ErrorStatus.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/code/status/ErrorStatus.java" index 81b87b4..df50679 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/code/status/ErrorStatus.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/code/status/ErrorStatus.java" @@ -21,7 +21,17 @@ public enum ErrorStatus implements BaseErrorCode { TEMP_EXCEPTION(HttpStatus.BAD_REQUEST, "TEMP4001", "이거는 테스트"), - FOOD_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "FOOD_CATEGORY4001", "음식 카테고리가 없습니다."); + + FOOD_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "FOOD_CATEGORY4001", "음식 카테고리가 없습니다."), + + TOWN_NOT_FOUND(HttpStatus.NOT_FOUND, "TOWN4001", "해당 지역이 존재하지 않습니다."), + + MISSION_NOT_FOUND(HttpStatus.NOT_FOUND, "MISSION4001", "해당 미션이 존재하지 않습니다."), + + RESTAURANT_NOT_FOUND(HttpStatus.NOT_FOUND, "RESTAURANT4001", "해당 식당이 존재하지 않습니다."), + + PAGE_NOT_NEGATIVE(HttpStatus.BAD_REQUEST, "PAGE4001", "페이지 번호는 음수일 수 없습니다."); + private final HttpStatus httpStatus; private final String code; diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/FoodCategoryHandler.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/FoodCategoryHandler.java" new file mode 100644 index 0000000..40bb6cd --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/FoodCategoryHandler.java" @@ -0,0 +1,11 @@ +package umc.spring.apiPayload.exception.handler; + +import umc.spring.apiPayload.code.BaseErrorCode; +import umc.spring.apiPayload.exception.GeneralException; + +public class FoodCategoryHandler extends GeneralException { + + public FoodCategoryHandler(BaseErrorCode code) { + super(code); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/RestaurantHandler.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/RestaurantHandler.java" new file mode 100644 index 0000000..73d90e2 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/apiPayload/exception/handler/RestaurantHandler.java" @@ -0,0 +1,10 @@ +package umc.spring.apiPayload.exception.handler; + +import umc.spring.apiPayload.code.BaseErrorCode; +import umc.spring.apiPayload.exception.GeneralException; + +public class RestaurantHandler extends GeneralException { + public RestaurantHandler(BaseErrorCode code) { + super(code); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/config/SwaggerConfig.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/config/SwaggerConfig.java" new file mode 100644 index 0000000..6bfa428 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/config/SwaggerConfig.java" @@ -0,0 +1,39 @@ +package umc.spring.config; + + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI UMCstudyAPI() { + Info info = new Info() + .title("UMC Server WorkBook API") + .description("UMC Server WorkBook API 명세서") + .version("1.0.0"); + + String jwtSchemeName = "JWT TOKEN"; + // API 요청헤더에 인증정보 포함 + SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName); + // SecuritySchemes 등록 + Components components = new Components() + .addSecuritySchemes(jwtSchemeName, new SecurityScheme() + .name(jwtSchemeName) + .type(SecurityScheme.Type.HTTP) // HTTP 방식 + .scheme("bearer") + .bearerFormat("JWT")); + + return new OpenAPI() + .addServersItem(new Server().url("/")) + .info(info) + .addSecurityItem(securityRequirement) + .components(components); + } +} \ No newline at end of file diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberCategoryConverter.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberCategoryConverter.java" new file mode 100644 index 0000000..baffc38 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberCategoryConverter.java" @@ -0,0 +1,18 @@ +package umc.spring.converter; + +import umc.spring.domain.Category; +import umc.spring.domain.mapping.MemberCategory; + +import java.util.List; +import java.util.stream.Collectors; + +public class MemberCategoryConverter { + public static List toMemberCategoryList(List categoryList) { + return categoryList.stream() + .map(category -> + MemberCategory.builder() + .category(category) + .build() + ).collect(Collectors.toList()); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberConverter.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberConverter.java" new file mode 100644 index 0000000..b6d7437 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MemberConverter.java" @@ -0,0 +1,41 @@ +package umc.spring.converter; + +import umc.spring.domain.Member; +import umc.spring.domain.enums.Gender; +import umc.spring.web.dto.MemberRequestDTO; +import umc.spring.web.dto.MemberResponseDTO; + +import java.time.LocalDateTime; +import java.util.ArrayList; + +public class MemberConverter { + public static MemberResponseDTO.JoinResultDTO toJoinResultDTO(Member member) { + return MemberResponseDTO.JoinResultDTO.builder() + .memberID(member.getId()) + .createdAt(LocalDateTime.now()) + .build(); + } + + public static Member toMember(MemberRequestDTO.JoinDTO joinDTO) { + Gender gender = null; + switch (joinDTO.getGender()) { + case 1: + gender = Gender.MALE; + break; + case 2: + gender = Gender.FEMALE; + break; + case 3: + gender = Gender.NONE; + break; + } + return Member.builder() + .address(joinDTO.getAddress()) + .email(joinDTO.getEmail()) + .gender(gender) + .name(joinDTO.getName()) + .birth(String.format("%04d-%02d-%02d", joinDTO.getBirthYear(), joinDTO.getBirthMonth(), joinDTO.getBirthDay())) + .memberCategoryList(new ArrayList<>()) + .build(); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MissionConverter.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MissionConverter.java" new file mode 100644 index 0000000..2c6c2c1 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/MissionConverter.java" @@ -0,0 +1,103 @@ +package umc.spring.converter; + +import org.springframework.data.domain.Page; +import umc.spring.domain.Mission; +import umc.spring.domain.Restaurant; +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.web.dto.MissionParticipationRequestDTO; +import umc.spring.web.dto.MissionParticipationResponseDTO; +import umc.spring.web.dto.MissionRequestDTO; +import umc.spring.web.dto.MissionResponseDTO; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class MissionConverter { + public static Mission toMission(MissionRequestDTO.RegisterMission registerMissionDTO) { + return Mission.builder() + .deadline(registerMissionDTO.getDeadline()) + .description(registerMissionDTO.getDescription()) + .reward(registerMissionDTO.getReward()) + .missionParticipationList(new ArrayList<>()) + .build(); + } + + public static MissionResponseDTO.RegisterMissionResult toRegisterMissionResult(Mission mission) { + return MissionResponseDTO.RegisterMissionResult + .builder() + .missionId(mission.getId()) + .createdAt(LocalDateTime.now()) + .build(); + } + public static MissionParticipation toMissionParticipation(MissionParticipationRequestDTO.ChallengeMission challengeMissionDTO) { + return MissionParticipation.builder() + .status(challengeMissionDTO.getMissionStatus()) + .build(); + } + + public static MissionParticipationResponseDTO.ChallengeMissionResultDTO toChallengeMissionResultDTO(MissionParticipation missionParticipation) { + return MissionParticipationResponseDTO.ChallengeMissionResultDTO + .builder() + .missionParticipationId(missionParticipation.getId()) + .build(); + } + + + public static MissionParticipationResponseDTO.MyMissionDTO toGetMyMissionDTO(MissionParticipation missionParticipation) { + //todo fetch join으로 한번에 가져오게 수정 + Mission mission = missionParticipation.getMission(); + Restaurant restaurant = mission.getRestaurant(); + + return MissionParticipationResponseDTO.MyMissionDTO + .builder() + .restaurantName(restaurant.getName()) + .restaurantCategoryName(restaurant.getCategory().getName()) + .description(mission.getDescription()) + .reward(mission.getReward()) + .deadline(mission.getDeadline().toLocalDate()) + .build(); + } + + public static MissionParticipationResponseDTO.MyMissionListDTO toGetMyMissionListDTO(Page missionParticipationList) { + List missionList = missionParticipationList.stream() + .map(MissionConverter::toGetMyMissionDTO).collect(Collectors.toList()); + + return MissionParticipationResponseDTO.MyMissionListDTO + .builder() + .missionList(missionList) + .isFirst(missionParticipationList.isFirst()) + .isLast(missionParticipationList.isLast()) + .totalPage(missionParticipationList.getTotalPages()) + .totalElements(missionParticipationList.getTotalElements()) + .listSize(missionList.size()) + .build(); + } + + public static MissionResponseDTO.MissionPreviewDTO missionPreviewDTO(Mission mission) { + return MissionResponseDTO.MissionPreviewDTO.builder() + .restaurantName(mission.getRestaurant().getName()) + .restaurantCategoryName(mission.getRestaurant().getCategory().getName()) + .description(mission.getDescription()) + .reward(mission.getReward()) + .createdAt(mission.getCreatedAt().toLocalDate()) + .build(); + } + + public static MissionResponseDTO.MissionPreviewListDTO missionPreviewListDTO(Page missionList) { + List missionPreviewListDTO = missionList.stream() + .map(MissionConverter::missionPreviewDTO) + .collect(Collectors.toList()); + + return MissionResponseDTO.MissionPreviewListDTO + .builder() + .isFirst(missionList.isFirst()) + .isLast(missionList.isLast()) + .totalPage(missionList.getTotalPages()) + .totalElements(missionList.getTotalElements()) + .listSize(missionPreviewListDTO.size()) + .missionList(missionPreviewListDTO) + .build(); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/RestaurantConverter.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/RestaurantConverter.java" new file mode 100644 index 0000000..40935b9 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/RestaurantConverter.java" @@ -0,0 +1,30 @@ +package umc.spring.converter; + +import umc.spring.domain.Category; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Town; +import umc.spring.web.dto.RestaurantRequestDTO; +import umc.spring.web.dto.RestaurantResponseDTO; + +import java.time.LocalDateTime; +import java.util.ArrayList; + +public class RestaurantConverter { + public static RestaurantResponseDTO.RegisterResultDTO toRegisterResultDTO(Restaurant restaurant) { + return RestaurantResponseDTO.RegisterResultDTO.builder() + .restaurantId(restaurant.getId()) + .name(restaurant.getName()) + .createdAt(LocalDateTime.now()) + .build(); + } + + public static Restaurant toRestaurant(RestaurantRequestDTO.RegisterDTO registerDTO, Category category, Town town) { + return Restaurant.builder() + .name(registerDTO.getName()) + .category(category) + .town(town) + .address(registerDTO.getAddress()) + .missionList(new ArrayList<>()) + .build(); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/ReviewConverter.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/ReviewConverter.java" new file mode 100644 index 0000000..33132fa --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/converter/ReviewConverter.java" @@ -0,0 +1,53 @@ +package umc.spring.converter; + +import org.springframework.data.domain.Page; +import umc.spring.domain.Review; +import umc.spring.web.dto.ReviewRequestDTO; +import umc.spring.web.dto.ReviewResponseDTO; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +public class ReviewConverter { + public static ReviewResponseDTO.RegisterReviewResult toRegisterReviewResult (Review review) { + return ReviewResponseDTO.RegisterReviewResult + .builder() + .reviewId(review.getId()) + .createdAt(LocalDateTime.now()) + .build(); + } + + public static Review toReview(ReviewRequestDTO.WriteReviewDTO reviewDTO) { + return Review + .builder() + .description(reviewDTO.getDescription()) + .grade(reviewDTO.getGrade()) + .build(); + } + + public static ReviewResponseDTO.ReviewPreviewDTO reviewPreviewDTO(Review review) { + return ReviewResponseDTO.ReviewPreviewDTO.builder() + .ownerNickname(review.getMember().getName()) + .grade(review.getGrade()) + .createdAt(review.getCreatedAt().toLocalDate()) + .description(review.getDescription()) + .build(); + } + + public static ReviewResponseDTO.ReviewPreviewListDTO reviewPreviewListDTO(Page reviewList) { + List reviewPreviewListDTO = reviewList.stream() + .map(ReviewConverter::reviewPreviewDTO) + .collect(Collectors.toList()); + + return ReviewResponseDTO.ReviewPreviewListDTO + .builder() + .isFirst(reviewList.isFirst()) + .isLast(reviewList.isLast()) + .totalPage(reviewList.getTotalPages()) + .totalElements(reviewList.getTotalElements()) + .listSize(reviewPreviewListDTO.size()) + .reviewList(reviewPreviewListDTO) + .build(); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Member.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Member.java" index 4c43b37..be880e9 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Member.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Member.java" @@ -1,6 +1,9 @@ package umc.spring.domain; import lombok.*; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import umc.spring.domain.common.BaseEntity; import umc.spring.domain.enums.Gender; import umc.spring.domain.enums.MemberStatus; @@ -16,6 +19,8 @@ @Entity @Getter @Builder +@DynamicInsert +@DynamicUpdate @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Member extends BaseEntity { @@ -29,10 +34,10 @@ public class Member extends BaseEntity { @Column(nullable = false, length = 50) private String address; - @Column(nullable = false, length = 30) + //@Column(nullable = false, length = 30) private String email; - @Column(nullable = false, length = 10) + @Column(nullable = false, length = 20) private String birth; @Enumerated(EnumType.STRING) @@ -46,6 +51,7 @@ public class Member extends BaseEntity { @Enumerated(EnumType.STRING) private SocialType socialType; + @ColumnDefault("0") private Integer point; private LocalDateTime inactive_date; diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Mission.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Mission.java" index 23f0343..469ebaa 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Mission.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Mission.java" @@ -34,4 +34,9 @@ public class Mission extends BaseEntity { @OneToMany(mappedBy = "mission", cascade = CascadeType.ALL) private List missionParticipationList = new ArrayList<>(); + // ==== 연관관계 메서드 ==== // + public void setRestaurant(Restaurant restaurant) { + this.restaurant = restaurant; + restaurant.getMissionList().add(this); + } } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Notification.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Notification.java" index 7577efc..e8e244a 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Notification.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Notification.java" @@ -1,6 +1,7 @@ package umc.spring.domain; import lombok.*; +import org.hibernate.annotations.ColumnDefault; import umc.spring.domain.common.BaseEntity; import javax.persistence.*; @@ -19,8 +20,9 @@ public class Notification extends BaseEntity { @JoinColumn(name = "member_id") private Member member; - @Column(columnDefinition = "TINYINT(1) DEFAULT 0") - private boolean isConfirmed; + @ColumnDefault("false") + @Column(columnDefinition = "TINYINT(1)") + private Boolean isConfirmed; @Column(nullable = false, length = 50) private String title; diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Restaurant.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Restaurant.java" index 628d58b..880c368 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Restaurant.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Restaurant.java" @@ -1,6 +1,8 @@ package umc.spring.domain; import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import umc.spring.domain.common.BaseEntity; import javax.persistence.*; @@ -12,6 +14,8 @@ @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor +@DynamicInsert +@DynamicUpdate public class Restaurant extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -19,8 +23,8 @@ public class Restaurant extends BaseEntity { @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "location_id") - private Location location; + @JoinColumn(name = "town_id") + private Town town; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_id") @@ -35,4 +39,7 @@ public class Restaurant extends BaseEntity { @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) private List missionList = new ArrayList<>(); + @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL) + private List reviewList = new ArrayList<>(); + } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Review.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Review.java" index 6698f0a..04d97da 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Review.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Review.java" @@ -1,6 +1,8 @@ package umc.spring.domain; import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; import umc.spring.domain.common.BaseEntity; import javax.persistence.*; @@ -12,6 +14,8 @@ @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor +@DynamicInsert +@DynamicUpdate public class Review extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -33,4 +37,15 @@ public class Review extends BaseEntity { @OneToMany(mappedBy = "review", cascade = CascadeType.ALL) private List reviewImageList = new ArrayList<>(); + + // ==== 연관관계 메서드 ==== // + public void setMember(Member member) { + this.member = member; + member.getReviewList().add(this); + } + + public void setRestaurant(Restaurant restaurant) { + this.restaurant = restaurant; + restaurant.getReviewList().add(this); + } } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Town.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Town.java" new file mode 100644 index 0000000..8fe7728 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/Town.java" @@ -0,0 +1,24 @@ +package umc.spring.domain; + +import lombok.*; +import umc.spring.domain.common.BaseEntity; + +import javax.persistence.*; + +@Entity +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +public class Town extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, length = 20) + private String name; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "location_id") + private Location location; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/enums/Gender.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/enums/Gender.java" index 5193cf9..2c85fef 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/enums/Gender.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/enums/Gender.java" @@ -1,5 +1,5 @@ package umc.spring.domain.enums; public enum Gender { - MALE, FEMALE; + MALE, FEMALE, NONE; } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MemberCategory.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MemberCategory.java" index a965a78..ab8c383 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MemberCategory.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MemberCategory.java" @@ -24,4 +24,16 @@ public class MemberCategory extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_id") private Category category; + + // ==== 연관관계 메서드 ==== // + public void setMember(Member member) { + if(this.member != null) + member.getMemberCategoryList().remove(this); + this.member = member; + member.getMemberCategoryList().add(this); + } + + public void setFoodCategory(Category category) { + this.category = category; + } } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MissionParticipation.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MissionParticipation.java" index 67258ab..4bf5e2d 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MissionParticipation.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/domain/mapping/MissionParticipation.java" @@ -28,4 +28,15 @@ public class MissionParticipation extends BaseEntity { @Enumerated(EnumType.STRING) private MissionStatus status; + + // ==== 연관관계 메서드 ==== // + public void setMember(Member member) { + this.member = member; + member.getMissionParticipationList().add(this); + } + + public void setMission(Mission mission) { + this.mission = mission; + mission.getMissionParticipationList().add(this); + } } diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/CategoryRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/CategoryRepository.java" new file mode 100644 index 0000000..f718cb6 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/CategoryRepository.java" @@ -0,0 +1,7 @@ +package umc.spring.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Category; + +public interface CategoryRepository extends JpaRepository { +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberCategoryRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberCategoryRepository.java" new file mode 100644 index 0000000..25fabac --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberCategoryRepository.java" @@ -0,0 +1,7 @@ +package umc.spring.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.mapping.MemberCategory; + +public interface MemberCategoryRepository extends JpaRepository { +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberRepository.java" new file mode 100644 index 0000000..7ab9086 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MemberRepository.java" @@ -0,0 +1,7 @@ +package umc.spring.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Member; + +public interface MemberRepository extends JpaRepository { +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionParticipationRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionParticipationRepository.java" new file mode 100644 index 0000000..b06aabe --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionParticipationRepository.java" @@ -0,0 +1,12 @@ +package umc.spring.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Member; +import umc.spring.domain.enums.MissionStatus; +import umc.spring.domain.mapping.MissionParticipation; + +public interface MissionParticipationRepository extends JpaRepository { + Page findAllByMemberAndStatus(Member member, MissionStatus status, PageRequest pageRequest); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionRepository.java" new file mode 100644 index 0000000..694aab7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/MissionRepository.java" @@ -0,0 +1,11 @@ +package umc.spring.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Mission; +import umc.spring.domain.Restaurant; + +public interface MissionRepository extends JpaRepository { + Page findAllByRestaurant(Restaurant restaurant, PageRequest pageRequest); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/RestaurantRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/RestaurantRepository.java" new file mode 100644 index 0000000..2b687e7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/RestaurantRepository.java" @@ -0,0 +1,7 @@ +package umc.spring.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Restaurant; + +public interface RestaurantRepository extends JpaRepository { +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/ReviewRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/ReviewRepository.java" new file mode 100644 index 0000000..cc5cd49 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/ReviewRepository.java" @@ -0,0 +1,15 @@ +package umc.spring.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Member; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Review; + +public interface ReviewRepository extends JpaRepository { + Page findAllByRestaurant(Restaurant restaurant, PageRequest pageRequest); + Page findAllByMember(Member member, PageRequest pageRequest); +} + + diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/TownRepository.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/TownRepository.java" new file mode 100644 index 0000000..9841a7b --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/repository/TownRepository.java" @@ -0,0 +1,7 @@ +package umc.spring.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import umc.spring.domain.Town; + +public interface TownRepository extends JpaRepository { +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandService.java" new file mode 100644 index 0000000..0e047c6 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandService.java" @@ -0,0 +1,17 @@ +package umc.spring.service.RestaurantService; + +import umc.spring.domain.Mission; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Review; +import umc.spring.web.dto.MissionRequestDTO; +import umc.spring.web.dto.RestaurantRequestDTO; +import umc.spring.web.dto.ReviewRequestDTO; + +public interface RestaurantCommandService { + Restaurant registerRestaurant(RestaurantRequestDTO.RegisterDTO registerDTO); + + Mission registerMission(MissionRequestDTO.RegisterMission registerMissionDTO, Long restaurantId); + + Review registerReview(ReviewRequestDTO.WriteReviewDTO reviewDTO, Long restaurantId); + +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandServiceImpl.java" new file mode 100644 index 0000000..96c87a7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantCommandServiceImpl.java" @@ -0,0 +1,56 @@ +package umc.spring.service.RestaurantService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.apiPayload.exception.handler.RestaurantHandler; +import umc.spring.converter.MissionConverter; +import umc.spring.converter.RestaurantConverter; +import umc.spring.converter.ReviewConverter; +import umc.spring.domain.*; +import umc.spring.repository.*; +import umc.spring.web.dto.MissionRequestDTO; +import umc.spring.web.dto.RestaurantRequestDTO; +import umc.spring.web.dto.ReviewRequestDTO; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class RestaurantCommandServiceImpl implements RestaurantCommandService { + private final RestaurantRepository restaurantRepository; + private final TownRepository townRepository; + private final CategoryRepository categoryRepository; + private final MissionRepository missionRepository; + private final ReviewRepository reviewRepository; + private final MemberRepository memberRepository; + + @Transactional + @Override + public Restaurant registerRestaurant(RestaurantRequestDTO.RegisterDTO registerDTO) { + Category category = categoryRepository.findById(registerDTO.getCategoryId()).orElseThrow(() -> new RestaurantHandler(ErrorStatus.FOOD_CATEGORY_NOT_FOUND)); + Town town = townRepository.findById(registerDTO.getTownId()).orElseThrow(() -> new RestaurantHandler(ErrorStatus.TOWN_NOT_FOUND)); + Restaurant restaurant = RestaurantConverter.toRestaurant(registerDTO, category, town); + return restaurantRepository.save(restaurant); + } + + @Transactional + @Override + public Mission registerMission(MissionRequestDTO.RegisterMission registerMissionDTO, Long restaurantId) { + Mission mission = MissionConverter.toMission(registerMissionDTO); + Restaurant restaurant = restaurantRepository.findById(restaurantId).get(); + mission.setRestaurant(restaurant); + return missionRepository.save(mission); + } + + @Transactional + @Override + public Review registerReview(ReviewRequestDTO.WriteReviewDTO reviewDTO, Long restaurantId) { + Review review = ReviewConverter.toReview(reviewDTO); + Restaurant restaurant = restaurantRepository.findById(restaurantId).get(); + review.setRestaurant(restaurant); + Member member = memberRepository.findById(reviewDTO.getMemberId()).get(); + review.setMember(member); + return reviewRepository.save(review); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryService.java" new file mode 100644 index 0000000..eeb75c5 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryService.java" @@ -0,0 +1,13 @@ +package umc.spring.service.RestaurantService; + +import org.springframework.data.domain.Page; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Review; + +import java.util.Optional; + +public interface RestaurantQueryService { + Optional findRestaurant(Long id); + + Page getReviewList(Long restaurantId, Integer page); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryServiceImpl.java" new file mode 100644 index 0000000..c58dd2c --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/RestaurantService/RestaurantQueryServiceImpl.java" @@ -0,0 +1,32 @@ +package umc.spring.service.RestaurantService; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Review; +import umc.spring.repository.RestaurantRepository; +import umc.spring.repository.ReviewRepository; + +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class RestaurantQueryServiceImpl implements RestaurantQueryService { + + private final RestaurantRepository restaurantRepository; + private final ReviewRepository reviewRepository; + @Override + public Optional findRestaurant(Long id) { + return restaurantRepository.findById(id); + } + + @Override + public Page getReviewList(Long restaurantId, Integer page) { + Restaurant restaurant = restaurantRepository.findById(restaurantId).get(); + return reviewRepository.findAllByRestaurant(restaurant, PageRequest.of(page, 10)); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/TempCommandService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/TempCommandService.java" index 3c2c5aa..65155da 100644 --- "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/TempCommandService.java" +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/TempCommandService.java" @@ -1,5 +1,28 @@ package umc.spring.service; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Town; +import umc.spring.repository.TownRepository; + +import java.util.Optional; + public interface TempCommandService { + @Service + @Transactional(readOnly = true) + @RequiredArgsConstructor + class TownQueryServiceImpl implements TownQueryService { + private final TownRepository townRepository; + @Override + public Optional findTown(Long id) { + return townRepository.findById(id); + } + } + + interface TownQueryService { + Optional findTown(Long id); + } } + diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryService.java" new file mode 100644 index 0000000..3306d09 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryService.java" @@ -0,0 +1,10 @@ +package umc.spring.service.categoryService; + +import umc.spring.domain.Category; + +import java.util.Optional; + +public interface CategoryQueryService { + Optional findCategory(Long id); + boolean existById(Long id); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryServiceImpl.java" new file mode 100644 index 0000000..e51f3ce --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/categoryService/CategoryQueryServiceImpl.java" @@ -0,0 +1,25 @@ +package umc.spring.service.categoryService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Category; +import umc.spring.repository.CategoryRepository; + +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CategoryQueryServiceImpl implements CategoryQueryService { + private final CategoryRepository categoryRepository; + @Override + public Optional findCategory(Long id) { + return categoryRepository.findById(id); + } + + @Override + public boolean existById(Long id) { + return categoryRepository.existsById(id); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandService.java" new file mode 100644 index 0000000..c475d6c --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandService.java" @@ -0,0 +1,8 @@ +package umc.spring.service.memberService; + +import umc.spring.domain.Member; +import umc.spring.web.dto.MemberRequestDTO; + +public interface MemberCommandService { + Member joinMember(MemberRequestDTO.JoinDTO joinDTO); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandServiceImpl.java" new file mode 100644 index 0000000..3b880a1 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberCommandServiceImpl.java" @@ -0,0 +1,40 @@ +package umc.spring.service.memberService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.apiPayload.exception.handler.FoodCategoryHandler; +import umc.spring.converter.MemberCategoryConverter; +import umc.spring.converter.MemberConverter; +import umc.spring.domain.Category; +import umc.spring.domain.Member; +import umc.spring.domain.mapping.MemberCategory; +import umc.spring.repository.CategoryRepository; +import umc.spring.repository.MemberRepository; +import umc.spring.web.dto.MemberRequestDTO; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberCommandServiceImpl implements MemberCommandService { + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + @Override + @Transactional + public Member joinMember(MemberRequestDTO.JoinDTO joinDTO) { + Member member = MemberConverter.toMember(joinDTO); + List categoryList = joinDTO.getMemberCategoryList().stream() + .map(categoryId -> { + return categoryRepository.findById(categoryId).orElseThrow(() -> new FoodCategoryHandler(ErrorStatus.FOOD_CATEGORY_NOT_FOUND)); + }).collect(Collectors.toList()); + List memberCategoryList = MemberCategoryConverter.toMemberCategoryList(categoryList); + memberCategoryList.forEach(memberCategory -> { + memberCategory.setMember(member); + }); + return memberRepository.save(member); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryService.java" new file mode 100644 index 0000000..d2bb071 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryService.java" @@ -0,0 +1,19 @@ +package umc.spring.service.memberService; + +import org.springframework.data.domain.Page; +import umc.spring.domain.Member; +import umc.spring.domain.Review; +import umc.spring.domain.enums.MissionStatus; +import umc.spring.domain.mapping.MissionParticipation; + +import java.util.Optional; + +public interface MemberQueryService { + Optional findMember(Long id); + boolean existById(Long id); + + Page getMyMissionList(Long memberId, MissionStatus status, Integer page); + + Page getMyReviewList(Long memberId, Integer page); + +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryServiceImpl.java" new file mode 100644 index 0000000..30e79f7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/memberService/MemberQueryServiceImpl.java" @@ -0,0 +1,52 @@ +package umc.spring.service.memberService; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import umc.spring.domain.Member; + +import umc.spring.domain.enums.MissionStatus; +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.repository.MemberRepository; +import umc.spring.repository.MissionParticipationRepository; + +import umc.spring.domain.Review; +import umc.spring.repository.ReviewRepository; + +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class MemberQueryServiceImpl implements MemberQueryService { + + private final MemberRepository memberRepository; + + private final MissionParticipationRepository missionParticipationRepository; + + private final ReviewRepository reviewRepository; + + @Override + public Optional findMember(Long id) { + return memberRepository.findById(id); + } + + @Override + public boolean existById(Long id) { + return memberRepository.existsById(id); + } + + @Override + public Page getMyMissionList(Long memberId, MissionStatus status, Integer page) { + Member member = memberRepository.findById(memberId).get(); + return missionParticipationRepository.findAllByMemberAndStatus(member, status, PageRequest.of(page, 10)); + } + @Override + public Page getMyReviewList(Long memberId, Integer page) { + Member member = memberRepository.findById(memberId).get(); + return reviewRepository.findAllByMember(member, PageRequest.of(page, 10)); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandService.java" new file mode 100644 index 0000000..fd3caa2 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandService.java" @@ -0,0 +1,8 @@ +package umc.spring.service.missionService; + +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.web.dto.MissionParticipationRequestDTO; + +public interface MissionCommandService { + MissionParticipation challengeMission(MissionParticipationRequestDTO.ChallengeMission missionDTO, Long missionId); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandServiceImpl.java" new file mode 100644 index 0000000..0591300 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionCommandServiceImpl.java" @@ -0,0 +1,35 @@ +package umc.spring.service.missionService; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.converter.MissionConverter; +import umc.spring.domain.Member; +import umc.spring.domain.Mission; +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.repository.MemberRepository; +import umc.spring.repository.MissionParticipationRepository; +import umc.spring.repository.MissionRepository; +import umc.spring.web.dto.MissionParticipationRequestDTO; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MissionCommandServiceImpl implements MissionCommandService { + private final MissionRepository missionRepository; + private final MemberRepository memberRepository; + private final MissionParticipationRepository missionParticipationRepository; + @Transactional + @Override + public MissionParticipation challengeMission(MissionParticipationRequestDTO.ChallengeMission missionPartDTO, Long missionId) { + MissionParticipation missionParticipation = MissionConverter.toMissionParticipation(missionPartDTO); + + Mission mission = missionRepository.findById(missionId).get(); + missionParticipation.setMission(mission); + + Member member = memberRepository.findById(missionPartDTO.getMemberId()).get(); + missionParticipation.setMember(member); + + return missionParticipationRepository.save(missionParticipation); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryService.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryService.java" new file mode 100644 index 0000000..bb8ea16 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryService.java" @@ -0,0 +1,11 @@ +package umc.spring.service.missionService; + +import org.springframework.data.domain.Page; +import umc.spring.domain.Mission; + +import java.util.Optional; + +public interface MissionQueryService { + Optional findMission(Long missionId); + Page getMissionList(Long restaurantId, Integer page); +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryServiceImpl.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryServiceImpl.java" new file mode 100644 index 0000000..0cfb200 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/service/missionService/MissionQueryServiceImpl.java" @@ -0,0 +1,31 @@ +package umc.spring.service.missionService; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import umc.spring.domain.Mission; +import umc.spring.domain.Restaurant; +import umc.spring.repository.MissionRepository; +import umc.spring.repository.RestaurantRepository; + +import java.util.Optional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class MissionQueryServiceImpl implements MissionQueryService { + private final MissionRepository missionRepository; + private final RestaurantRepository restaurantRepository; + @Override + public Optional findMission(Long missionId) { + return missionRepository.findById(missionId); + } + + @Override + public Page getMissionList(Long restaurantId, Integer page) { + Restaurant restaurant = restaurantRepository.findById(restaurantId).get(); + return missionRepository.findAllByRestaurant(restaurant, PageRequest.of(page, 10)); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/CheckPage.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/CheckPage.java" new file mode 100644 index 0000000..8bfd53a --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/CheckPage.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.PageCheckValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = PageCheckValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface CheckPage { + String message() default "페이지 번호는 음수일 수 없습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategories.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategories.java" new file mode 100644 index 0000000..418170e --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategories.java" @@ -0,0 +1,18 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.CategoriesExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = CategoriesExistValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExistCategories { + + String message() default "해당하는 카테고리가 존재하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategory.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategory.java" new file mode 100644 index 0000000..f9f000d --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistCategory.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.CategoryExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER } ) +@Retention(value = RetentionPolicy.RUNTIME) +@Constraint(validatedBy = CategoryExistValidator.class) +public @interface ExistCategory { + String message() default "해당하는 카테고리가 존재하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMember.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMember.java" new file mode 100644 index 0000000..fb9b1b1 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMember.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.MemberExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER } ) +@Retention(value = RetentionPolicy.RUNTIME) +@Constraint(validatedBy = MemberExistValidator.class) +public @interface ExistMember { + String message() default "존재하지 않는 회원입니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMission.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMission.java" new file mode 100644 index 0000000..075a79e --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistMission.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.MissionExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = MissionExistValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExistMission { + String message() default "존재하지 않는 미션입니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistRestaurant.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistRestaurant.java" new file mode 100644 index 0000000..efb797d --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistRestaurant.java" @@ -0,0 +1,18 @@ +package umc.spring.validation.annotation; + + +import umc.spring.validation.validator.RestaurantExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER } ) +@Retention(value = RetentionPolicy.RUNTIME) +@Constraint(validatedBy = RestaurantExistValidator.class) +public @interface ExistRestaurant { + String message() default "해당 식당이 존재하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistTown.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistTown.java" new file mode 100644 index 0000000..b9fce90 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/ExistTown.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.TownExistValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = TownExistValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExistTown { + String message() default "해당 지역이 존재하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} \ No newline at end of file diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/FutureDateTime.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/FutureDateTime.java" new file mode 100644 index 0000000..51e828f --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/annotation/FutureDateTime.java" @@ -0,0 +1,17 @@ +package umc.spring.validation.annotation; + +import umc.spring.validation.validator.FutureDateTimeValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER } ) +@Retention(value = RetentionPolicy.RUNTIME) +@Constraint(validatedBy = FutureDateTimeValidator.class) +public @interface FutureDateTime { + String message() default "미션 마감 시간은 현재 시각 이후이어야 합니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoriesExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoriesExistValidator.java" new file mode 100644 index 0000000..724d8a7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoriesExistValidator.java" @@ -0,0 +1,35 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.service.categoryService.CategoryQueryService; +import umc.spring.service.memberService.MemberQueryService; +import umc.spring.validation.annotation.ExistCategories; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class CategoriesExistValidator implements ConstraintValidator> { + + private final CategoryQueryService categoryQueryService; + @Override + public void initialize(ExistCategories constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(List values, ConstraintValidatorContext context) { + //stream().allMatch() 주어진 모든 요소를 만족하면 true, 그렇지 않으면 false + boolean isValid = values.stream().allMatch(categoryQueryService::existById); + System.out.println("isValid = " + isValid); + if (!isValid) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.FOOD_CATEGORY_NOT_FOUND.toString()).addConstraintViolation(); + } + return isValid; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoryExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoryExistValidator.java" new file mode 100644 index 0000000..2704b19 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/CategoryExistValidator.java" @@ -0,0 +1,33 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.domain.Category; +import umc.spring.service.categoryService.CategoryQueryService; +import umc.spring.validation.annotation.ExistCategory; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class CategoryExistValidator implements ConstraintValidator { + private final CategoryQueryService categoryQueryService; + @Override + public void initialize(ExistCategory constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Long value, ConstraintValidatorContext context) { + Optional category = categoryQueryService.findCategory(value); + if (category.isEmpty()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.FOOD_CATEGORY_NOT_FOUND.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/FutureDateTimeValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/FutureDateTimeValidator.java" new file mode 100644 index 0000000..7907525 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/FutureDateTimeValidator.java" @@ -0,0 +1,23 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.validation.annotation.FutureDateTime; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.time.LocalDateTime; + +@Component +@RequiredArgsConstructor +public class FutureDateTimeValidator implements ConstraintValidator { + @Override + public void initialize(FutureDateTime constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(LocalDateTime value, ConstraintValidatorContext context) { + return value.isAfter(LocalDateTime.now()); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MemberExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MemberExistValidator.java" new file mode 100644 index 0000000..49b3752 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MemberExistValidator.java" @@ -0,0 +1,33 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.domain.Member; +import umc.spring.service.memberService.MemberQueryService; +import umc.spring.validation.annotation.ExistMember; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class MemberExistValidator implements ConstraintValidator { + private final MemberQueryService memberQueryService; + @Override + public void initialize(ExistMember constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Long value, ConstraintValidatorContext context) { + Optional member = memberQueryService.findMember(value); + if (member.isEmpty()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.MEMBER_NOT_FOUND.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MissionExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MissionExistValidator.java" new file mode 100644 index 0000000..e5c054c --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/MissionExistValidator.java" @@ -0,0 +1,34 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.domain.Mission; +import umc.spring.service.missionService.MissionQueryService; +import umc.spring.validation.annotation.ExistMission; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class MissionExistValidator implements ConstraintValidator { + + private final MissionQueryService missionQueryService; + @Override + public void initialize(ExistMission constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Long value, ConstraintValidatorContext context) { + Optional mission = missionQueryService.findMission(value); + if (mission.isEmpty()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.MISSION_NOT_FOUND.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/PageCheckValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/PageCheckValidator.java" new file mode 100644 index 0000000..01af3c6 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/PageCheckValidator.java" @@ -0,0 +1,24 @@ +package umc.spring.validation.validator; + +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.validation.annotation.CheckPage; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class PageCheckValidator implements ConstraintValidator { + @Override + public void initialize(CheckPage constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value < 0) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.PAGE_NOT_NEGATIVE.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/RestaurantExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/RestaurantExistValidator.java" new file mode 100644 index 0000000..97dbefc --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/RestaurantExistValidator.java" @@ -0,0 +1,33 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.domain.Restaurant; +import umc.spring.service.RestaurantService.RestaurantQueryService; +import umc.spring.validation.annotation.ExistRestaurant; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class RestaurantExistValidator implements ConstraintValidator { + private final RestaurantQueryService restaurantQueryService; + @Override + public void initialize(ExistRestaurant constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Long value, ConstraintValidatorContext context) { + Optional restaurant = restaurantQueryService.findRestaurant(value); + if (restaurant.isEmpty()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.RESTAURANT_NOT_FOUND.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/TownExistValidator.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/TownExistValidator.java" new file mode 100644 index 0000000..1532c81 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/validation/validator/TownExistValidator.java" @@ -0,0 +1,34 @@ +package umc.spring.validation.validator; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import umc.spring.apiPayload.code.status.ErrorStatus; +import umc.spring.domain.Town; +import umc.spring.service.TempCommandService; +import umc.spring.validation.annotation.ExistTown; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class TownExistValidator implements ConstraintValidator { + + private final TempCommandService.TownQueryService townQueryService; + @Override + public void initialize(ExistTown constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Long value, ConstraintValidatorContext context) { + Optional town = townQueryService.findTown(value); + if (town.isEmpty()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.TOWN_NOT_FOUND.toString()).addConstraintViolation(); + return false; + } + return true; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MemberRestController.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MemberRestController.java" new file mode 100644 index 0000000..916ac6c --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MemberRestController.java" @@ -0,0 +1,83 @@ +package umc.spring.web.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import umc.spring.apiPayload.ApiResponse; +import umc.spring.converter.MemberConverter; +import umc.spring.converter.MissionConverter; +import umc.spring.converter.ReviewConverter; +import umc.spring.domain.Member; +import umc.spring.domain.Review; +import umc.spring.domain.enums.MissionStatus; +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.service.memberService.MemberCommandService; +import umc.spring.service.memberService.MemberQueryService; +import umc.spring.validation.annotation.CheckPage; +import umc.spring.validation.annotation.ExistMember; +import umc.spring.web.dto.MemberRequestDTO; +import umc.spring.web.dto.MemberResponseDTO; +import umc.spring.web.dto.MissionParticipationResponseDTO; +import umc.spring.web.dto.ReviewResponseDTO; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@Validated +@RequestMapping("/users") +public class MemberRestController { + private final MemberCommandService memberCommandService; + private final MemberQueryService memberQueryService; + + @PostMapping + public ApiResponse join(@RequestBody @Valid MemberRequestDTO.JoinDTO joinDTO) { + Member member = memberCommandService.joinMember(joinDTO); + return ApiResponse.onSuccess(MemberConverter.toJoinResultDTO(member)); + } + + @Operation(summary = "특정 회원이 진행 중인 미션 목록 조회 API",description = "특정 회원이 진행 중인 미션 목록을 조회하는 API로 페이징을 포함한다. query String 으로 page 번호를 주세요") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH003", description = "access 토큰을 주세요!",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH004", description = "acess 토큰 만료",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH006", description = "acess 토큰 모양이 이상함",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "memberId", description = "회원의 아이디, path variable 입니다!"), + @Parameter(name = "page", description = "페이지 번호, 1번이 1 페이지 입니다."), + @Parameter(name = "status", description = "미션 상태, SUCCESS, CHALLENGING, FAILURE, PAYMENTS 중 하나"), + }) + @GetMapping("/{memberId}/missions") + public ApiResponse getMyReviewList(@PathVariable @ExistMember Long memberId, + @RequestParam @CheckPage Integer page,@RequestParam MissionStatus status) { + Page missionParticipationList = memberQueryService.getMyMissionList(memberId, status, page - 1); + return ApiResponse.onSuccess(MissionConverter.toGetMyMissionListDTO(missionParticipationList)); + } + + + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH003", description = "access 토큰을 주세요!",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH004", description = "acess 토큰 만료",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH006", description = "acess 토큰 모양이 이상함",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "memberId", description = "회원의 아이디, path variable 입니다!"), + @Parameter(name = "page", description = "페이지 번호, 1번이 1 페이지 입니다."), + }) + @Operation(summary = "특정 회원이 작성한 리뷰 목록 조회 API",description = "특정 회원의 리뷰 목록을 조회하는 API로 페이징을 포함한다. query String 으로 page 번호를 주세요") + @GetMapping("/{memberId}/reviews") + public ApiResponse getMyReviewList(@PathVariable @ExistMember Long memberId, @RequestParam @CheckPage Integer page) { + Page reviewList = memberQueryService.getMyReviewList(memberId, page - 1); + return ApiResponse.onSuccess(ReviewConverter.reviewPreviewListDTO(reviewList)); + } + +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MissionRestController.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MissionRestController.java" new file mode 100644 index 0000000..384846c --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/MissionRestController.java" @@ -0,0 +1,30 @@ +package umc.spring.web.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import umc.spring.apiPayload.ApiResponse; +import umc.spring.converter.MissionConverter; +import umc.spring.domain.mapping.MissionParticipation; +import umc.spring.service.missionService.MissionCommandService; +import umc.spring.validation.annotation.ExistMission; +import umc.spring.web.dto.MissionParticipationRequestDTO; +import umc.spring.web.dto.MissionParticipationResponseDTO; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@Validated +@RequestMapping("/missions") +public class MissionRestController { + + private final MissionCommandService missionCommandService; + @PostMapping("/{missionId}/participation") + public ApiResponse challenge( + @RequestBody @Valid MissionParticipationRequestDTO.ChallengeMission challengeMissionDTO, + @PathVariable @ExistMission Long missionId) { + MissionParticipation missionParticipation = missionCommandService.challengeMission(challengeMissionDTO, missionId); + return ApiResponse.onSuccess(MissionConverter.toChallengeMissionResultDTO(missionParticipation)); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/RestaurantController.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/RestaurantController.java" new file mode 100644 index 0000000..3e7da60 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/controller/RestaurantController.java" @@ -0,0 +1,94 @@ +package umc.spring.web.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import umc.spring.apiPayload.ApiResponse; +import umc.spring.converter.MissionConverter; +import umc.spring.converter.RestaurantConverter; +import umc.spring.converter.ReviewConverter; +import umc.spring.domain.Mission; +import umc.spring.domain.Restaurant; +import umc.spring.domain.Review; +import umc.spring.service.RestaurantService.RestaurantCommandService; +import umc.spring.service.RestaurantService.RestaurantQueryService; +import umc.spring.service.missionService.MissionQueryService; +import umc.spring.validation.annotation.CheckPage; +import umc.spring.validation.annotation.ExistRestaurant; +import umc.spring.web.dto.*; + +import javax.validation.Valid; + +@RestController +@Validated +@RequiredArgsConstructor +@RequestMapping("/restaurants") +public class RestaurantController { + private final RestaurantCommandService restaurantCommandService; + + private final MissionQueryService missionQueryService; + + private final RestaurantQueryService restaurantQueryService; + + + @PostMapping + public ApiResponse register(@RequestBody @Valid RestaurantRequestDTO.RegisterDTO registerDTO) { + Restaurant restaurant = restaurantCommandService.registerRestaurant(registerDTO); + return ApiResponse.onSuccess(RestaurantConverter.toRegisterResultDTO(restaurant)); + } + + + @PostMapping("/{restaurantId}/missions") + public ApiResponse registerMission(@RequestBody @Valid MissionRequestDTO.RegisterMission registerMissionDTO, @PathVariable @ExistRestaurant Long restaurantId) { + Mission mission = restaurantCommandService.registerMission(registerMissionDTO, restaurantId); + return ApiResponse.onSuccess(MissionConverter.toRegisterMissionResult(mission)); + } + @PostMapping("/{restaurantId}/reviews") + public ApiResponse writeReview(@RequestBody @Valid ReviewRequestDTO.WriteReviewDTO reviewDTO, @PathVariable @ExistRestaurant Long restaurantId) { + Review review = restaurantCommandService.registerReview(reviewDTO, restaurantId); + return ApiResponse.onSuccess(ReviewConverter.toRegisterReviewResult(review)); + + } + + + @Operation(summary = "특정 가게의 미션 목록 조회 API",description = "특정 가게의 미션들의 목록을 조회하는 API로 페이징을 포함한다. query String 으로 page 번호를 주세요") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH003", description = "access 토큰을 주세요!",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH004", description = "acess 토큰 만료",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH006", description = "acess 토큰 모양이 이상함",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "restaurantId", description = "가게의 아이디, path variable 입니다!"), + @Parameter(name = "page", description = "페이지 번호, 1번이 첫 페이지 입니다."), + }) + @GetMapping("/{restaurantId}/missions") + public ApiResponse getMissionList(@ExistRestaurant @PathVariable Long restaurantId, @CheckPage @RequestParam(name = "page") Integer page) { + Page missionList = missionQueryService.getMissionList(restaurantId, page - 1); + return ApiResponse.onSuccess(MissionConverter.missionPreviewListDTO(missionList)); + } + + @GetMapping("/{restaurantId}/reviews") + @Operation(summary = "특정 가게의 리뷰 목록 조회 API",description = "특정 가게의 리뷰들의 목록을 조회하는 API이며, 페이징을 포함합니다. query String 으로 page 번호를 주세요") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200",description = "OK, 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH003", description = "access 토큰을 주세요!",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH004", description = "access 토큰 만료",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH006", description = "access 토큰 모양이 이상함",content = @Content(schema = @Schema(implementation = ApiResponse.class))), + }) + @Parameters({ + @Parameter(name = "restaurantId", description = "가게의 아이디, path variable 입니다!"), + @Parameter(name = "page", description = "페이지 번호, 1번이 첫 페이지 입니다."), + }) + public ApiResponse getReviewList(@ExistRestaurant @PathVariable Long restaurantId, @CheckPage @RequestParam(name = "page") Integer page) { + Page reviewList = restaurantQueryService.getReviewList(restaurantId, page - 1); + return ApiResponse.onSuccess(ReviewConverter.reviewPreviewListDTO(reviewList)); + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberRequestDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberRequestDTO.java" new file mode 100644 index 0000000..e6ecb29 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberRequestDTO.java" @@ -0,0 +1,32 @@ +package umc.spring.web.dto; + +import lombok.Getter; +import umc.spring.validation.annotation.ExistCategories; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +public class MemberRequestDTO { + + @Getter + public static class JoinDTO { + @NotBlank + private String name; + @NotNull + private Integer gender; + @NotNull + private Integer birthYear; + @NotNull + private Integer birthMonth; + @NotNull + private Integer birthDay; + @Size(min = 5, max = 12) + private String address; + private String email; + @ExistCategories + private List memberCategoryList; + } + +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberResponseDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberResponseDTO.java" new file mode 100644 index 0000000..477b20d --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MemberResponseDTO.java" @@ -0,0 +1,20 @@ +package umc.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +public class MemberResponseDTO { + + @Getter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class JoinResultDTO { + private Long memberID; + private LocalDateTime createdAt; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationRequestDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationRequestDTO.java" new file mode 100644 index 0000000..89ac1e7 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationRequestDTO.java" @@ -0,0 +1,17 @@ +package umc.spring.web.dto; + +import lombok.Getter; +import umc.spring.domain.enums.MissionStatus; +import umc.spring.validation.annotation.ExistMember; + +import javax.validation.constraints.NotNull; + +public class MissionParticipationRequestDTO { + @Getter + public static class ChallengeMission { + @ExistMember + private Long memberId; + @NotNull + private MissionStatus missionStatus; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationResponseDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationResponseDTO.java" new file mode 100644 index 0000000..7fc09ca --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionParticipationResponseDTO.java" @@ -0,0 +1,46 @@ +package umc.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +public class MissionParticipationResponseDTO { + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class ChallengeMissionResultDTO { + private Long missionParticipationId; + private LocalDateTime createdAt; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class MyMissionDTO { + private String restaurantName; + private String restaurantCategoryName; + private String description; + private Integer reward; + private LocalDate deadline; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class MyMissionListDTO { + List missionList; + Integer listSize; + Integer totalPage; + Long totalElements; + Boolean isFirst; + Boolean isLast; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionRequestDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionRequestDTO.java" new file mode 100644 index 0000000..df44009 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionRequestDTO.java" @@ -0,0 +1,20 @@ +package umc.spring.web.dto; + +import lombok.Getter; +import org.hibernate.validator.constraints.Range; +import umc.spring.validation.annotation.FutureDateTime; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +public class MissionRequestDTO { + @Getter + public static class RegisterMission { + @NotNull + private String description; + @FutureDateTime + private LocalDateTime deadline; + @Range(max = 10000, min = 0) + private Integer reward; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionResponseDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionResponseDTO.java" new file mode 100644 index 0000000..92df310 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/MissionResponseDTO.java" @@ -0,0 +1,46 @@ +package umc.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +public class MissionResponseDTO { + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class RegisterMissionResult { + private Long missionId; + private LocalDateTime createdAt; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class MissionPreviewListDTO { + List missionList; + Integer listSize; + Integer totalPage; + Long totalElements; + Boolean isFirst; + Boolean isLast; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class MissionPreviewDTO { + String restaurantName; + String restaurantCategoryName; + Integer reward; + String description; + LocalDate createdAt; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantRequestDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantRequestDTO.java" new file mode 100644 index 0000000..1b12b14 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantRequestDTO.java" @@ -0,0 +1,21 @@ +package umc.spring.web.dto; + +import lombok.Getter; +import umc.spring.validation.annotation.ExistCategory; +import umc.spring.validation.annotation.ExistTown; + +import javax.validation.constraints.NotNull; + +public class RestaurantRequestDTO { + @Getter + public static class RegisterDTO { + @NotNull + private String name; + @ExistCategory + private Long categoryId; + @ExistTown + private Long townId; + @NotNull + private String address; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantResponseDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantResponseDTO.java" new file mode 100644 index 0000000..f69bafd --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/RestaurantResponseDTO.java" @@ -0,0 +1,20 @@ +package umc.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +public class RestaurantResponseDTO { + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RegisterResultDTO { + private Long restaurantId; + private String name; + private LocalDateTime createdAt; + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewRequestDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewRequestDTO.java" new file mode 100644 index 0000000..061ab87 --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewRequestDTO.java" @@ -0,0 +1,20 @@ +package umc.spring.web.dto; + +import lombok.Getter; +import umc.spring.validation.annotation.ExistMember; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +public class ReviewRequestDTO { + @Getter + public static class WriteReviewDTO { + @ExistMember + private Long memberId; + @Size(max = 100) + private String description; + @NotNull + private double grade; + + } +} diff --git "a/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewResponseDTO.java" "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewResponseDTO.java" new file mode 100644 index 0000000..5e707ca --- /dev/null +++ "b/\353\250\270\355\224\274_\354\230\244\355\230\204\353\260\260/spring/src/main/java/umc/spring/web/dto/ReviewResponseDTO.java" @@ -0,0 +1,45 @@ +package umc.spring.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +public class ReviewResponseDTO { + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class RegisterReviewResult { + private Long reviewId; + private LocalDateTime createdAt; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class ReviewPreviewListDTO { + List reviewList; + Integer listSize; + Integer totalPage; + Long totalElements; + Boolean isFirst; + Boolean isLast; + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class ReviewPreviewDTO { + String ownerNickname; + Double grade; + String description; + LocalDate createdAt; + } +}