diff --git a/Dockerfile-dev b/Dockerfile-dev index 8b8dec83..4f882635 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -1,4 +1,4 @@ -FROM openjdk:17-jdk +FROM eclipse-temurin:17-jdk ARG JAR_FILE=./build/libs/juinjang-0.0.1-SNAPSHOT.jar ENV GOOGLE_APPLICATION_CREDENTIALS=/app/config/service-account-key.json diff --git a/Dockerfile-prod b/Dockerfile-prod index 7761c9e5..41320eb9 100644 --- a/Dockerfile-prod +++ b/Dockerfile-prod @@ -1,4 +1,4 @@ -FROM openjdk:17-jdk +FROM eclipse-temurin:17-jdk ARG JAR_FILE=./build/libs/juinjang-0.0.1-SNAPSHOT.jar COPY ${JAR_FILE} app.jar diff --git a/src/main/java/umc/th/juinjang/api/checklist/service/response/ReportGetResponse.java b/src/main/java/umc/th/juinjang/api/checklist/service/response/ReportGetResponse.java index 57e5caa0..2a648944 100644 --- a/src/main/java/umc/th/juinjang/api/checklist/service/response/ReportGetResponse.java +++ b/src/main/java/umc/th/juinjang/api/checklist/service/response/ReportGetResponse.java @@ -24,4 +24,17 @@ public static ReportGetResponse of(Report report) { report.getTotalRate() ); } + + public static ReportGetResponse mock() { + return new ReportGetResponse( + 1L, + "상당히 쾌적한 실내", + "훌륭한 공용 공간", + "좋은 편인 입지 조건", + 4.6f, + 4.3f, + 4.7f, + 4.5f + ); + } } \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangDetailGetResponse.java b/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangDetailGetResponse.java index 63b8251b..4786a5f8 100644 --- a/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangDetailGetResponse.java +++ b/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangDetailGetResponse.java @@ -1,41 +1,60 @@ package umc.th.juinjang.api.limjang.service.response; -import static umc.th.juinjang.api.limjang.service.LimjangPriceBridge.makePriceListVersion2; +import static umc.th.juinjang.api.limjang.service.LimjangPriceBridge.*; import java.time.LocalDateTime; import java.util.List; + import lombok.Builder; -import umc.th.juinjang.domain.image.model.Image; +import umc.th.juinjang.common.constant.MockConstant; import umc.th.juinjang.domain.checklist.model.LimjangCheckListVersion; +import umc.th.juinjang.domain.image.model.Image; import umc.th.juinjang.domain.limjang.model.Limjang; @Builder public record LimjangDetailGetResponse( - long limjangId, - LimjangCheckListVersion checkListVersion, - List images, - int purposeCode, - String nickname, - int priceType, - List priceList, - String address, - String addressDetail, - LocalDateTime createdAt, - LocalDateTime updatedAt + long limjangId, + LimjangCheckListVersion checkListVersion, + List images, + int purposeCode, + String nickname, + int priceType, + List priceList, + String address, + String addressDetail, + LocalDateTime createdAt, + LocalDateTime updatedAt ) { - public static LimjangDetailGetResponse of(Limjang limjang){ - return LimjangDetailGetResponse.builder() - .limjangId(limjang.getLimjangId()) - .checkListVersion(LimjangCheckListVersion.getByLimjangType(limjang)) - .images(limjang.getImageList().stream().map(Image::getImageUrl).toList()) - .purposeCode(limjang.getPurpose().getValue()) - .nickname(limjang.getNickname()) - .priceType(limjang.getPriceType().getValue()) - .priceList(makePriceListVersion2(limjang.getPriceType(), limjang.getPurpose(), limjang.getLimjangPrice())) - .address(limjang.getAddress()) - .addressDetail(limjang.getAddressDetail()) - .createdAt(limjang.getCreatedAt()) - .updatedAt(limjang.getUpdatedAt()) - .build(); - } + public static LimjangDetailGetResponse of(Limjang limjang) { + return LimjangDetailGetResponse.builder() + .limjangId(limjang.getLimjangId()) + .checkListVersion(LimjangCheckListVersion.getByLimjangType(limjang)) + .images(limjang.getImageList().stream().map(Image::getImageUrl).toList()) + .purposeCode(limjang.getPurpose().getValue()) + .nickname(limjang.getNickname()) + .priceType(limjang.getPriceType().getValue()) + .priceList(makePriceListVersion2(limjang.getPriceType(), limjang.getPurpose(), limjang.getLimjangPrice())) + .address(limjang.getAddress()) + .addressDetail(limjang.getAddressDetail()) + .createdAt(limjang.getCreatedAt()) + .updatedAt(limjang.getUpdatedAt()) + .build(); + } + + public static LimjangDetailGetResponse mock() { + return LimjangDetailGetResponse.builder() + .limjangId(1L) + .checkListVersion(LimjangCheckListVersion.LIMJANG) + .images(List.of(MockConstant.Image.IMAGE_1, MockConstant.Image.IMAGE_2, + MockConstant.Image.IMAGE_3, MockConstant.Image.IMAGE_4)) + .purposeCode(1) + .nickname("우성 아파트") + .priceType(0) + .priceList(List.of("500000000")) + .address("서울특별시 강남구 테헤란로 123") + .addressDetail("101동 1001호") + .createdAt(LocalDateTime.of(2024, 11, 15, 10, 30)) + .updatedAt(LocalDateTime.of(2024, 11, 20, 14, 20)) + .build(); + } } diff --git a/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangsMainGetVersion2Response.java b/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangsMainGetVersion2Response.java index afd83ee9..daa12c98 100644 --- a/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangsMainGetVersion2Response.java +++ b/src/main/java/umc/th/juinjang/api/limjang/service/response/LimjangsMainGetVersion2Response.java @@ -1,36 +1,52 @@ package umc.th.juinjang.api.limjang.service.response; -import static umc.th.juinjang.api.limjang.service.LimjangPriceBridge.getPriceToString; +import static umc.th.juinjang.api.limjang.service.LimjangPriceBridge.*; import java.util.List; + import lombok.Builder; +import umc.th.juinjang.common.constant.MockConstant; import umc.th.juinjang.domain.limjang.model.Limjang; public record LimjangsMainGetVersion2Response(List recentUpdatedList) { - @Builder - record LimjangMainVersion2Response( - long limjangId, - int priceType, - String image, - String nickname, - String price, - String totalAverage, - String address) { - - static LimjangMainVersion2Response of(Limjang limjang) { - return LimjangMainVersion2Response.builder() - .limjangId(limjang.getLimjangId()) - .priceType(limjang.getPriceType().getValue()) - .image(limjang.getDefaultImage()) - .nickname(limjang.getNickname()) - .price(getPriceToString(limjang)) - .totalAverage(limjang.getReport() == null ? null : limjang.getReport().getTotalRate().toString()) - .address(limjang.getAddress()) - .build(); - } - } - - public static LimjangsMainGetVersion2Response of(List limjangList) { - return new LimjangsMainGetVersion2Response(limjangList.stream().map(LimjangMainVersion2Response::of).toList()); - } + @Builder + record LimjangMainVersion2Response( + long limjangId, + int priceType, + String image, + String nickname, + String price, + String totalAverage, + String address) { + + static LimjangMainVersion2Response of(Limjang limjang) { + return LimjangMainVersion2Response.builder() + .limjangId(limjang.getLimjangId()) + .priceType(limjang.getPriceType().getValue()) + .image(limjang.getDefaultImage()) + .nickname(limjang.getNickname()) + .price(getPriceToString(limjang)) + .totalAverage(limjang.getReport() == null ? null : limjang.getReport().getTotalRate().toString()) + .address(limjang.getAddress()) + .build(); + } + } + + public static LimjangsMainGetVersion2Response of(List limjangList) { + return new LimjangsMainGetVersion2Response(limjangList.stream().map(LimjangMainVersion2Response::of).toList()); + } + + public static LimjangsMainGetVersion2Response mock() { + LimjangMainVersion2Response mockNote = LimjangMainVersion2Response.builder() + .limjangId(1L) + .priceType(0) + .image(MockConstant.Image.IMAGE_1) + .nickname("우성 아파트") + .price("3010000000") + .totalAverage("3.63") + .address("") + .build(); + + return new LimjangsMainGetVersion2Response(List.of(mockNote)); + } } diff --git a/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNoteGetResponse.java b/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNoteGetResponse.java index e14fd7ab..0aa4d4c3 100644 --- a/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNoteGetResponse.java +++ b/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNoteGetResponse.java @@ -3,6 +3,7 @@ import java.time.format.DateTimeFormatter; import java.util.List; +import umc.th.juinjang.common.constant.MockConstant; import umc.th.juinjang.domain.image.model.Image; import umc.th.juinjang.domain.limjang.model.Address; import umc.th.juinjang.domain.limjang.model.Limjang; @@ -52,4 +53,28 @@ public static UserNoteGetResponse of(boolean isShared, Limjang note, Address add address != null ? address.getBname2() : null ); } + + public static UserNoteGetResponse mock() { + return new UserNoteGetResponse( + true, + LimjangPurpose.RESIDENTIAL_PURPOSE, + LimjangPropertyType.APARTMENT, + LimjangPriceType.SALE, + "우성 아파트", + List.of(MockConstant.Image.IMAGE_1, MockConstant.Image.IMAGE_2, + MockConstant.Image.IMAGE_3, MockConstant.Image.IMAGE_4), + "서울 송파구 잠실동", + "101-1", + "3010000000", + null, + "23.12.01", + "10", + 28, + "1168010100", + "서울특별시", + "송파구", + "잠실동", + "" + ); + } } diff --git a/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNotesGetResponse.java b/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNotesGetResponse.java index 27288eeb..d8e4fb82 100644 --- a/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNotesGetResponse.java +++ b/src/main/java/umc/th/juinjang/api/limjang/service/response/UserNotesGetResponse.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import umc.th.juinjang.common.constant.MockConstant; import umc.th.juinjang.domain.image.model.Image; import umc.th.juinjang.domain.limjang.model.Limjang; import umc.th.juinjang.domain.limjang.model.LimjangPriceType; @@ -53,4 +54,26 @@ public static UserNotesGetResponse of(List limjangs, Map return new UserNotesGetResponse( limjangs.stream().map(it -> UserNoteResponse.of(it, isScraped.get(it.getLimjangId()))).toList()); } + + public static UserNotesGetResponse mock() { + UserNoteResponse mockNote1 = new UserNoteResponse( + 1L, + LimjangPurpose.RESIDENTIAL_PURPOSE, + LimjangPropertyType.APARTMENT, + LimjangPriceType.SALE, + "우성 아파트", + List.of(MockConstant.Image.IMAGE_1, MockConstant.Image.IMAGE_2, + MockConstant.Image.IMAGE_3, MockConstant.Image.IMAGE_4), + true, + "3.63", + "3010000000", + null, + 28, + "10", + "서울 송파구 잠실동 101-1", + "서울시" + ); + + return new UserNotesGetResponse(List.of(mockNote1)); + } } \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/api/mock/MockController.java b/src/main/java/umc/th/juinjang/api/mock/MockController.java new file mode 100644 index 00000000..c6aba157 --- /dev/null +++ b/src/main/java/umc/th/juinjang/api/mock/MockController.java @@ -0,0 +1,152 @@ +package umc.th.juinjang.api.mock; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import umc.th.juinjang.api.checklist.service.response.ChecklistAnswerResponseDTO; +import umc.th.juinjang.api.checklist.service.response.ReportGetResponse; +import umc.th.juinjang.api.checklist.service.response.ReportWithLimjangResponseDTO; +import umc.th.juinjang.api.dto.ApiResponse; +import umc.th.juinjang.api.limjang.service.response.LimjangDetailGetResponse; +import umc.th.juinjang.api.limjang.service.response.LimjangsMainGetVersion2Response; +import umc.th.juinjang.api.limjang.service.response.UserNoteGetResponse; +import umc.th.juinjang.api.limjang.service.response.UserNotesGetResponse; +import umc.th.juinjang.api.record.service.response.RecordResponseDTO; +import umc.th.juinjang.domain.checklist.model.ChecklistQuestionCategory; +import umc.th.juinjang.domain.checklist.model.ChecklistQuestionType; + +@RestController +@RequestMapping("/api/mock") +@RequiredArgsConstructor +public class MockController { + + @Operation(summary = "임장 메인화면에서 최근 임장 조회 Mock API") + @GetMapping("/notes/recent") + public ApiResponse getRecentMockNotes() { + return ApiResponse.onSuccess(LimjangsMainGetVersion2Response.mock()); + } + + @Operation(summary = "임장 상세 조회 Mock API") + @GetMapping("/notes/detail") + public ApiResponse getMockNoteDetail() { + return ApiResponse.onSuccess(UserNoteGetResponse.mock()); + } + + @Operation(summary = "마이노트 조회 Mock API") + @GetMapping("/notes/mynotes") + public ApiResponse getMockUserNotes() { + return ApiResponse.onSuccess(UserNotesGetResponse.mock()); + } + + @Operation(summary = "리포트 조회 Mock API") + @GetMapping("/notes/report") + public ApiResponse getMockReport() { + ReportGetResponse reportMock = ReportGetResponse.mock(); + LimjangDetailGetResponse limjangMock = LimjangDetailGetResponse.mock(); + ReportWithLimjangResponseDTO response = new ReportWithLimjangResponseDTO(reportMock, limjangMock); + return ApiResponse.onSuccess(response); + } + + @Operation(summary = "녹음 및 메모 조회 Mock API") + @GetMapping("/notes/records") + public ApiResponse getMockRecordMemo() { + + // Mock 메모 데이터 생성 + RecordResponseDTO.RecordMemoDto response = RecordResponseDTO.RecordMemoDto.builder() + .limjangId(1L) + .memo("- 베란다 확장 공사 완료. 냉기 차단 잘 됨 \n- 단지내 어린이집") + .createdAt(LocalDateTime.of(2024, 11, 15, 10, 30)) + .updatedAt(LocalDateTime.of(2024, 11, 20, 17, 0)) + .recordDto(List.of()) + .build(); + + return ApiResponse.onSuccess(response); + } + + @Operation(summary = "체크리스트 조회 Mock API") + @GetMapping("/notes/checklists") + public ApiResponse> getMockChecklistAnswer() { + Long limjangId = 1L; + + // 카테고리, 답변, 답변타입 순서로 정의 + Object[][] mockData = { + // 입지여건 + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "2호선 신당역", ChecklistQuestionType.DROPDOWN}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "1", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "아파트 단지", ChecklistQuestionType.DROPDOWN}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "남향", ChecklistQuestionType.DROPDOWN}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "1", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "2000년도", ChecklistQuestionType.TEXT_FIELD}, + {ChecklistQuestionCategory.LOCATION_CONDITION, "3", ChecklistQuestionType.SCORE}, + // 공용공간 + {ChecklistQuestionCategory.PUBLIC_SPACE, "2대", ChecklistQuestionType.TEXT_FIELD}, + {ChecklistQuestionCategory.PUBLIC_SPACE, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.PUBLIC_SPACE, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.PUBLIC_SPACE, "1", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.PUBLIC_SPACE, "3", ChecklistQuestionType.SCORE}, + // 실내 + {ChecklistQuestionCategory.INDOOR, "설치형에어컨", ChecklistQuestionType.DROPDOWN}, + {ChecklistQuestionCategory.INDOOR, "2", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "거실중앙형 구조", ChecklistQuestionType.DROPDOWN}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "1", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "2", ChecklistQuestionType.TEXT_FIELD}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "4", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "3", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE}, + {ChecklistQuestionCategory.INDOOR, "5", ChecklistQuestionType.SCORE} + }; + + List answers = new ArrayList<>(); + for (int i = 0; i < mockData.length; i++) { + answers.add(ChecklistAnswerResponseDTO.AnswerDto.builder() + .answerId((long)(i + 1)) + .questionId((long)(i + 1)) + .category((ChecklistQuestionCategory)mockData[i][0]) + .limjangId(limjangId) + .answer((String)mockData[i][1]) + .answerType((ChecklistQuestionType)mockData[i][2]) + .build()); + } + + return ApiResponse.onSuccess(answers); + } + +} diff --git a/src/main/java/umc/th/juinjang/auth/config/SecurityConfig.java b/src/main/java/umc/th/juinjang/auth/config/SecurityConfig.java index 03424875..c156e129 100644 --- a/src/main/java/umc/th/juinjang/auth/config/SecurityConfig.java +++ b/src/main/java/umc/th/juinjang/auth/config/SecurityConfig.java @@ -37,7 +37,8 @@ public class SecurityConfig { "/api/auth/v2/kakao/**", "/api/members/nickname/exists", "/api/app/version/ios", - "/api/apple/notifications/v2" + "/api/apple/notifications/v2", + "/api/mock/**" }; // 개발 환경에서만 추가로 허용되는 URL 패턴 private static final String[] DEV_WHITELIST_URLS = { diff --git a/src/main/java/umc/th/juinjang/common/constant/MockConstant.java b/src/main/java/umc/th/juinjang/common/constant/MockConstant.java new file mode 100644 index 00000000..bbd644fa --- /dev/null +++ b/src/main/java/umc/th/juinjang/common/constant/MockConstant.java @@ -0,0 +1,14 @@ +package umc.th.juinjang.common.constant; + +public final class MockConstant { + + private MockConstant() { + } + + public static final class Image { + public static final String IMAGE_1 = "https://juinjang-bucket.s3.ap-northeast-2.amazonaws.com/mock/mock-png_1.jpeg"; + public static final String IMAGE_2 = "https://juinjang-bucket.s3.ap-northeast-2.amazonaws.com/mock/mock_png_2.jpeg"; + public static final String IMAGE_3 = "https://juinjang-bucket.s3.ap-northeast-2.amazonaws.com/mock/mock_png_3.jpeg"; + public static final String IMAGE_4 = "https://juinjang-bucket.s3.ap-northeast-2.amazonaws.com/mock/mock_png_4.jpeg"; + } +} \ No newline at end of file