From 8264d9a5366ae4b8f52ece9f2acb9657c5e4ecb6 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Tue, 25 Jun 2024 23:11:07 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=EB=B3=B5=EB=8D=95=EB=B0=A9=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/land/controller/AdminLandApi.java | 18 ++++++++++++++++++ .../land/controller/AdminLandController.java | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java index 7f93a12a2..cb8e9f6de 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java @@ -10,9 +10,11 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +import in.koreatech.koin.admin.land.dto.AdminLandResponse; import in.koreatech.koin.admin.land.dto.AdminLandsRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; +import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.global.auth.Auth; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -75,4 +77,20 @@ ResponseEntity deleteLand( @Auth(permit = {ADMIN}) Integer adminId ); + @ApiResponses( + value = { + @ApiResponse(responseCode = "200"), + @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), + } + ) + @Operation(summary = "복덕방 조회") + @SecurityRequirement(name = "Jwt Authentication") + @GetMapping("/admin/lands/{id}") + ResponseEntity getLand( + @PathVariable("id") Integer id + //@Auth(permit = {ADMIN}) Integer adminId + ); + } diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java index 2fda9c5dc..19fb1f4ab 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java @@ -12,9 +12,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import in.koreatech.koin.admin.land.dto.AdminLandResponse; import in.koreatech.koin.admin.land.dto.AdminLandsRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; import in.koreatech.koin.admin.land.service.AdminLandService; +import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.global.auth.Auth; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -53,4 +55,12 @@ public ResponseEntity deleteLand( return null; } + @GetMapping("/admin/lands/{id}") + public ResponseEntity getLand( + @PathVariable("id") Integer id + //@Auth(permit = {ADMIN}) Integer adminId + ) { + return ResponseEntity.ok().body(adminLandService.getLand(id)); + } + } From d199ccba87cb7c5f951ac59b895308e6c5da4e2f Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Tue, 25 Jun 2024 23:11:18 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20=EB=B3=B5=EB=8D=95=EB=B0=A9=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/land/service/AdminLandService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java b/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java index d719f13d5..588c2f990 100644 --- a/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java +++ b/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java @@ -6,11 +6,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import in.koreatech.koin.admin.land.dto.AdminLandResponse; import in.koreatech.koin.admin.land.dto.AdminLandsRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; import in.koreatech.koin.admin.land.execption.LandNameDuplicationException; import in.koreatech.koin.admin.land.repository.AdminLandRepository; +import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.domain.land.model.Land; +import in.koreatech.koin.domain.member.model.Member; import in.koreatech.koin.global.model.Criteria; import lombok.RequiredArgsConstructor; @@ -49,4 +52,9 @@ public void deleteLand(Integer id) { Land land = adminLandRepository.getById(id); land.delete(); } + + public AdminLandResponse getLand(Integer id) { + Land land = adminLandRepository.getById(id); + return AdminLandResponse.from(land); + } } From aad48e5f6720d5e24820982f9634f851a6d573d7 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Tue, 25 Jun 2024 23:11:29 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat:=20=EB=B3=B5=EB=8D=95=EB=B0=A9=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/acceptance/AdminLandApiTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java index 12a5df1ce..a44721dd1 100644 --- a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java +++ b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java @@ -21,6 +21,7 @@ import in.koreatech.koin.domain.land.model.Land; import in.koreatech.koin.domain.user.model.User; import in.koreatech.koin.fixture.UserFixture; +import in.koreatech.koin.support.JsonAssertions; import io.restassured.RestAssured; @SuppressWarnings("NonAsciiCharacters") @@ -167,4 +168,68 @@ void deleteLand() { softly.assertThat(deletedLand.isDeleted()).isEqualTo(true); }); } + + @Test + @DisplayName("특정 복덕방 정보를 조회한다.") + void getLand() { + // 복덕방 생성 + Land request = Land.builder() + .internalName("금실타운") + .name("금실타운") + .roomType("원룸") + .latitude("37.555") + .longitude("126.555") + .monthlyFee("100") + .charterFee("1000") + .address("가전리 123") + .description("테스트용 복덕방") + .build(); + + Land savedLand = adminLandRepository.save(request); + Integer landId = savedLand.getId(); + + User adminUser = userFixture.코인_운영자(); + String token = userFixture.getToken(adminUser); + + var response = RestAssured + .given() + .header("Authorization", "Bearer " + token) + .when() + .get("/admin/lands/{id}", landId) + .then() + .statusCode(HttpStatus.OK.value()) + .extract(); + + JsonAssertions.assertThat(response.asPrettyString()) + .isEqualTo(String.format(""" + { + "id": %d, + "name": "금실타운", + "internal_name": "금실타운", + "size": null, + "room_type": "원룸", + "latitude": "37.555", + "longitude": "126.555", + "phone": null, + "image_urls": [], + "address": "가전리 123", + "description": "테스트용 복덕방", + "floor": null, + "deposit": null, + "monthly_fee": "100", + "charter_fee": "1000", + "management_fee": null, + "opt_closet": false, + "opt_tv": false, + "opt_microwave": false, + "opt_gas_range": false, + "opt_induction": false, + "opt_water_purifier": false, + "opt_air_conditioner": false, + "opt_washer": false, + "is_deleted": false + } + """, landId)); + } + } From dd679c5553f277b03fd8f2c21a979ceda18b9650 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 02:58:04 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=EB=B3=B5=EB=8D=95=EB=B0=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=EC=82=AD=EC=A0=9C=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/land/controller/AdminLandApi.java | 38 +++++++++++++++++-- .../land/controller/AdminLandController.java | 27 +++++++++++-- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java index cb8e9f6de..bf84e2596 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java @@ -7,14 +7,14 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import in.koreatech.koin.admin.land.dto.AdminLandResponse; -import in.koreatech.koin.admin.land.dto.AdminLandsRequest; +import in.koreatech.koin.admin.land.dto.AdminLandRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.global.auth.Auth; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -57,7 +57,7 @@ ResponseEntity getLands( @SecurityRequirement(name = "Jwt Authentication") @PostMapping("/admin/lands") ResponseEntity postLands( - @RequestBody @Valid AdminLandsRequest adminLandsRequest, + @RequestBody @Valid AdminLandRequest adminLandRequest, @Auth(permit = {ADMIN}) Integer adminId ); @@ -93,4 +93,36 @@ ResponseEntity getLand( //@Auth(permit = {ADMIN}) Integer adminId ); + @ApiResponses( + value = { + @ApiResponse(responseCode = "200"), + @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), + } + ) + @Operation(summary = "복덕방 수정") + @SecurityRequirement(name = "Jwt Authentication") + @PutMapping("/admin/lands/{id}") + ResponseEntity updateLand( + @PathVariable("id") Integer id, + @RequestBody @Valid AdminLandRequest request + //@Auth(permit = {ADMIN}) Integer adminId + ); + + @ApiResponses( + value = { + @ApiResponse(responseCode = "200"), + @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), + } + ) + @Operation(summary = "복덕방 삭제 취소") + @SecurityRequirement(name = "Jwt Authentication") + @PostMapping("/admin/lands/{id}/undelete") + ResponseEntity undeleteLand( + @PathVariable("id") Integer id + //@Auth(permit = {ADMIN}) Integer adminId + ); } diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java index 19fb1f4ab..6fb3cb6be 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java @@ -8,15 +8,15 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import in.koreatech.koin.admin.land.dto.AdminLandResponse; -import in.koreatech.koin.admin.land.dto.AdminLandsRequest; +import in.koreatech.koin.admin.land.dto.AdminLandRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; import in.koreatech.koin.admin.land.service.AdminLandService; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.global.auth.Auth; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -39,10 +39,10 @@ public ResponseEntity getLands( @PostMapping("/admin/lands") public ResponseEntity postLands( - @RequestBody @Valid AdminLandsRequest adminLandsRequest, + @RequestBody @Valid AdminLandRequest adminLandRequest, @Auth(permit = {ADMIN}) Integer adminId ) { - adminLandService.createLands(adminLandsRequest); + adminLandService.createLands(adminLandRequest); return ResponseEntity.status(HttpStatus.CREATED).build(); } @@ -63,4 +63,23 @@ public ResponseEntity getLand( return ResponseEntity.ok().body(adminLandService.getLand(id)); } + @PutMapping("/admin/lands/{id}") + public ResponseEntity updateLand( + @PathVariable("id") Integer id, + @RequestBody @Valid AdminLandRequest request + //@Auth(permit = {ADMIN}) Integer adminId + ) { + adminLandService.updateLand(id, request); + return ResponseEntity.ok().build(); + } + + @PostMapping("/admin/lands/{id}/undelete") + public ResponseEntity undeleteLand( + @PathVariable("id") Integer id + //@Auth(permit = {ADMIN}) Integer adminId + ) { + adminLandService.undeleteLand(id); + return ResponseEntity.ok().build(); + } + } From f99c12dcaa68a7259d3595d9d7117ec352988fb1 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 02:58:31 +0900 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=EB=B3=B5=EB=8D=95=EB=B0=A9=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=EC=82=AD=EC=A0=9C=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/land/service/AdminLandService.java | 57 ++++++++++++++++--- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java b/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java index 588c2f990..0f82166ad 100644 --- a/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java +++ b/src/main/java/in/koreatech/koin/admin/land/service/AdminLandService.java @@ -7,13 +7,11 @@ import org.springframework.transaction.annotation.Transactional; import in.koreatech.koin.admin.land.dto.AdminLandResponse; -import in.koreatech.koin.admin.land.dto.AdminLandsRequest; +import in.koreatech.koin.admin.land.dto.AdminLandRequest; import in.koreatech.koin.admin.land.dto.AdminLandsResponse; import in.koreatech.koin.admin.land.execption.LandNameDuplicationException; import in.koreatech.koin.admin.land.repository.AdminLandRepository; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; import in.koreatech.koin.domain.land.model.Land; -import in.koreatech.koin.domain.member.model.Member; import in.koreatech.koin.global.model.Criteria; import lombok.RequiredArgsConstructor; @@ -39,11 +37,11 @@ public AdminLandsResponse getLands(Integer page, Integer limit, Boolean isDelete } @Transactional - public void createLands(AdminLandsRequest adminLandsRequest) { - if (adminLandRepository.findByName(adminLandsRequest.name()).isPresent()) { - throw LandNameDuplicationException.withDetail("name: " + adminLandsRequest.name()); + public void createLands(AdminLandRequest adminLandRequest) { + if (adminLandRepository.findByName(adminLandRequest.name()).isPresent()) { + throw LandNameDuplicationException.withDetail("name: " + adminLandRequest.name()); } - Land land = adminLandsRequest.toLand(); + Land land = adminLandRequest.toLand(); adminLandRepository.save(land); } @@ -57,4 +55,49 @@ public AdminLandResponse getLand(Integer id) { Land land = adminLandRepository.getById(id); return AdminLandResponse.from(land); } + + @Transactional + public void updateLand(Integer id, AdminLandRequest request) { + Land land = adminLandRepository.getById(id); + land.update( + request.internalName(), + request.name(), + request.size(), + request.roomType(), + request.latitude(), + request.longitude(), + request.phone(), + request.imageUrls(), + request.address(), + request.description(), + request.floor(), + request.deposit(), + request.monthlyFee(), + request.charterFee(), + request.managementFee(), + request.optRefrigerator(), + request.optCloset(), + request.optTv(), + request.optMicrowave(), + request.optGasRange(), + request.optInduction(), + request.optWaterPurifier(), + request.optAirConditioner(), + request.optWasher(), + request.optBed(), + request.optDesk(), + request.optShoeCloset(), + request.optElectronicDoorLocks(), + request.optBidet(), + request.optVeranda(), + request.optElevator() + ); + + } + + @Transactional + public void undeleteLand(Integer id) { + Land land = adminLandRepository.getById(id); + land.undelete(); + } } From 52ae2a86048271335cc6955c8ca9950c78cd8b3d Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 02:59:04 +0900 Subject: [PATCH 06/13] =?UTF-8?q?refactor:=20land=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/domain/land/model/Land.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/main/java/in/koreatech/koin/domain/land/model/Land.java b/src/main/java/in/koreatech/koin/domain/land/model/Land.java index ae187c3aa..f8350b3dc 100644 --- a/src/main/java/in/koreatech/koin/domain/land/model/Land.java +++ b/src/main/java/in/koreatech/koin/domain/land/model/Land.java @@ -247,4 +247,49 @@ private String convertToSting(List imageUrls) { public void delete() { this.isDeleted = true; } + + public void undelete() { + this.isDeleted = false; + } + + public void update(String internalName, String name, String size, String roomType, String latitude, + String longitude, + String phone, List imageUrls, String address, String description, Integer floor, + String deposit, String monthlyFee, String charterFee, String managementFee, boolean optRefrigerator, + boolean optCloset, boolean optTv, boolean optMicrowave, boolean optGasRange, boolean optInduction, + boolean optWaterPurifier, boolean optAirConditioner, boolean optWasher, boolean optBed, boolean optDesk, + boolean optShoeCloset, boolean optElectronicDoorLocks, boolean optBidet, boolean optVeranda, + boolean optElevator) { + this.internalName = internalName; + this.name = name; + this.size = size; + this.roomType = roomType; + this.latitude = latitude; + this.longitude = longitude; + this.phone = phone; + this.imageUrls = convertToSting(imageUrls); + this.address = address; + this.description = description; + this.floor = floor; + this.deposit = deposit; + this.monthlyFee = monthlyFee; + this.charterFee = charterFee; + this.managementFee = managementFee; + this.optRefrigerator = optRefrigerator; + this.optCloset = optCloset; + this.optTv = optTv; + this.optMicrowave = optMicrowave; + this.optGasRange = optGasRange; + this.optInduction = optInduction; + this.optWaterPurifier = optWaterPurifier; + this.optAirConditioner = optAirConditioner; + this.optWasher = optWasher; + this.optBed = optBed; + this.optDesk = optDesk; + this.optShoeCloset = optShoeCloset; + this.optElectronicDoorLocks = optElectronicDoorLocks; + this.optBidet = optBidet; + this.optVeranda = optVeranda; + this.optElevator = optElevator; + } } From 6f7143e7073eb430248b667391ad58352ba1dace Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 02:59:24 +0900 Subject: [PATCH 07/13] =?UTF-8?q?refactor:=20land=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koreatech/koin/fixture/LandFixture.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/in/koreatech/koin/fixture/LandFixture.java b/src/test/java/in/koreatech/koin/fixture/LandFixture.java index a6cea411a..3e7aa6c8a 100644 --- a/src/test/java/in/koreatech/koin/fixture/LandFixture.java +++ b/src/test/java/in/koreatech/koin/fixture/LandFixture.java @@ -66,4 +66,24 @@ public LandFixture(LandRepository landRepository) { .build() ); } + + public Land 삭제된_복덕방() { + List imageUrls = List.of( + "https://example1.test.com/image.jpeg", + "https://example2.test.com/image.jpeg" + ); + return landRepository.save( + Land.builder() + .internalName("삭제된 복덕방") + .name("삭제된 복덕방") + .roomType("원룸") + .latitude("37.555") + .longitude("126.555") + .monthlyFee("100") + .charterFee("1000") + .isDeleted(true) + .imageUrls(imageUrls) + .build() + ); + } } From eb4758c259b19bd793edd6cb987c68b0251288ce Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 02:59:43 +0900 Subject: [PATCH 08/13] =?UTF-8?q?refactor:=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=20dto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...andsRequest.java => AdminLandRequest.java} | 32 ++++- .../admin/land/dto/AdminLandResponse.java | 124 +++++++++++++++++- .../admin/land/dto/AdminLandsResponse.java | 39 +++++- 3 files changed, 186 insertions(+), 9 deletions(-) rename src/main/java/in/koreatech/koin/admin/land/dto/{AdminLandsRequest.java => AdminLandRequest.java} (84%) diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsRequest.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java similarity index 84% rename from src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsRequest.java rename to src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java index 376952656..3953c16df 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsRequest.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java @@ -17,7 +17,7 @@ import jakarta.validation.constraints.Size; @JsonNaming(SnakeCaseStrategy.class) -public record AdminLandsRequest( +public record AdminLandRequest( @Schema(description = "이름 - not null - 최대 255자", example = "금실타운", requiredMode = REQUIRED) @NotNull(message = "방이름은 필수입니다.") @Size(max = 255, message = "방이름의 최대 길이는 255자입니다.") @@ -101,7 +101,28 @@ public record AdminLandsRequest( boolean optAirConditioner, @Schema(description = "샤워기 보유 여부 - null일경우 false로 요청됨", example = "true") - boolean optWasher + boolean optWasher, + + @Schema(description = "침대 보유 여부", example = "false") + boolean optBed, + + @Schema(description = "책상 보유 여부", example = "true") + boolean optDesk, + + @Schema(description = "신발장 보유 여부", example = "true") + boolean optShoeCloset, + + @Schema(description = "전자 도어락 보유 여부", example = "true") + boolean optElectronicDoorLocks, + + @Schema(description = "비데 보유 여부", example = "false") + boolean optBidet, + + @Schema(description = "베란다 보유 여부", example = "false") + boolean optVeranda, + + @Schema(description = "엘리베이터 보유 여부", example = "true") + boolean optElevator ) { public Land toLand() { return Land.builder() @@ -129,6 +150,13 @@ public Land toLand() { .optWaterPurifier(optWaterPurifier) .optAirConditioner(optAirConditioner) .optWasher(optWasher) + .optBed(optBed) + .optDesk(optDesk) + .optShoeCloset(optShoeCloset) + .optElectronicDoorLocks(optElectronicDoorLocks) + .optBidet(optBidet) + .optVeranda(optVeranda) + .optElevator(optElevator) .build(); } } diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java index 0c5e1d1cc..c2e6d27be 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java @@ -1,7 +1,8 @@ package in.koreatech.koin.admin.land.dto; import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import java.util.List; import com.fasterxml.jackson.databind.annotation.JsonNaming; @@ -10,32 +11,147 @@ @JsonNaming(value = SnakeCaseStrategy.class) public record AdminLandResponse( - @Schema(description = "고유 id", example = "1", requiredMode = REQUIRED) + @Schema(description = "고유 id", example = "1", requiredMode = Schema.RequiredMode.REQUIRED) Integer id, - @Schema(description = "이름", example = "금실타운", requiredMode = REQUIRED) + @Schema(description = "이름", example = "금실타운", requiredMode = Schema.RequiredMode.REQUIRED) String name, + @Schema(description = "내부 이름", example = "금실타운", requiredMode = Schema.RequiredMode.REQUIRED) + String internalName, + + @Schema(description = "크기", example = "9.0") + String size, + @Schema(description = "종류", example = "원룸") String roomType, + @Schema(description = "위도", example = "36.766205") + String latitude, + + @Schema(description = "경도", example = "127.284638") + String longitude, + + @Schema(description = "전화번호", example = "041-111-1111") + String phone, + + @Schema(description = "이미지 URL 리스트") + List imageUrls, + + @Schema(description = "주소", example = "충청남도 천안시 동남구 병천면") + String address, + + @Schema(description = "설명", example = "1년 계약시 20만원 할인") + String description, + + @Schema(description = "층수", example = "4") + Integer floor, + + @Schema(description = "보증금", example = "30") + String deposit, + @Schema(description = "월세", example = "200만원 (6개월)") String monthlyFee, @Schema(description = "전세", example = "3500") String charterFee, - @Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = REQUIRED) + @Schema(description = "관리비", example = "21(1인 기준)") + String managementFee, + + @Schema(description = "냉장고 보유 여부", example = "true") + boolean optRefrigerator, + + @Schema(description = "옷장 보유 여부", example = "true") + boolean optCloset, + + @Schema(description = "TV 보유 여부", example = "true") + boolean optTv, + + @Schema(description = "전자레인지 보유 여부", example = "true") + boolean optMicrowave, + + @Schema(description = "가스레인지 보유 여부", example = "false") + boolean optGasRange, + + @Schema(description = "인덕션 보유 여부", example = "true") + boolean optInduction, + + @Schema(description = "정수기 보유 여부", example = "true") + boolean optWaterPurifier, + + @Schema(description = "에어컨 보유 여부", example = "true") + boolean optAirConditioner, + + @Schema(description = "세탁기 보유 여부", example = "true") + boolean optWasher, + + @Schema(description = "침대 보유 여부", example = "false") + boolean optBed, + + @Schema(description = "책상 보유 여부", example = "true") + boolean optDesk, + + @Schema(description = "신발장 보유 여부", example = "true") + boolean optShoeCloset, + + @Schema(description = "전자 도어락 보유 여부", example = "true") + boolean optElectronicDoorLocks, + + @Schema(description = "비데 보유 여부", example = "false") + boolean optBidet, + + @Schema(description = "베란다 보유 여부", example = "false") + boolean optVeranda, + + @Schema(description = "엘리베이터 보유 여부", example = "true") + boolean optElevator, + + @Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = Schema.RequiredMode.REQUIRED) Boolean isDeleted ) { public static AdminLandResponse from(Land land) { return new AdminLandResponse( land.getId(), land.getName(), + land.getInternalName(), + land.getSize(), land.getRoomType(), + land.getLatitude() != null ? land.getLatitude().toString() : null, + land.getLongitude() != null ? land.getLongitude().toString() : null, + land.getPhone(), + convertToList(land.getImageUrls()), + land.getAddress(), + land.getDescription(), + land.getFloor(), + land.getDeposit(), land.getMonthlyFee(), land.getCharterFee(), + land.getManagementFee(), + land.isOptRefrigerator(), + land.isOptCloset(), + land.isOptTv(), + land.isOptMicrowave(), + land.isOptGasRange(), + land.isOptInduction(), + land.isOptWaterPurifier(), + land.isOptAirConditioner(), + land.isOptWasher(), + land.isOptBed(), + land.isOptDesk(), + land.isOptShoeCloset(), + land.isOptElectronicDoorLocks(), + land.isOptBidet(), + land.isOptVeranda(), + land.isOptElevator(), land.isDeleted() ); } + + private static List convertToList(String imageUrls) { + if (imageUrls == null || imageUrls.isEmpty()) { + return List.of(); + } + return List.of(imageUrls.replace("[", "").replace("]", "").replace("\"", "").split(",")); + } } diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsResponse.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsResponse.java index 5d2676a99..63d6e6836 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsResponse.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandsResponse.java @@ -29,7 +29,7 @@ public record AdminLandsResponse( Integer currentPage, @Schema(description = "집 정보 리스트", requiredMode = REQUIRED) - List lands + List lands ) { public static AdminLandsResponse of(Page pagedResult, Criteria criteria) { return new AdminLandsResponse( @@ -39,8 +39,41 @@ public static AdminLandsResponse of(Page pagedResult, Criteria criteria) { criteria.getPage() + 1, pagedResult.getContent() .stream() - .map(AdminLandResponse::from) + .map(SimpleLandInformation::from) .toList() ); } -} + + @JsonNaming(value = SnakeCaseStrategy.class) + private record SimpleLandInformation( + @Schema(description = "고유 id", example = "1", requiredMode = REQUIRED) + Integer id, + + @Schema(description = "이름", example = "금실타운", requiredMode = REQUIRED) + String name, + + @Schema(description = "종류", example = "원룸") + String roomType, + + @Schema(description = "월세", example = "200만원 (6개월)") + String monthlyFee, + + @Schema(description = "전세", example = "3500") + String charterFee, + + @Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = REQUIRED) + Boolean isDeleted + ) { + public static SimpleLandInformation from(Land land) { + return new SimpleLandInformation( + land.getId(), + land.getName(), + land.getRoomType(), + land.getMonthlyFee(), + land.getCharterFee(), + land.isDeleted() + ); + } + } + +} \ No newline at end of file From b92add0ef792e7da82b91ab19ba935f8be71cf5d Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 03:00:05 +0900 Subject: [PATCH 09/13] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/acceptance/AdminLandApiTest.java | 115 +++++++++++++++++- 1 file changed, 110 insertions(+), 5 deletions(-) diff --git a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java index a44721dd1..dd51ae3bf 100644 --- a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java +++ b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java @@ -1,14 +1,10 @@ package in.koreatech.koin.admin.acceptance; -import static in.koreatech.koin.support.JsonAssertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; import static org.hibernate.validator.internal.util.Contracts.assertNotNull; import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.assertAll; -import java.util.List; -import java.util.Optional; - import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,10 +12,10 @@ import org.springframework.http.HttpStatus; import in.koreatech.koin.AcceptanceTest; -import in.koreatech.koin.admin.land.dto.AdminLandsRequest; import in.koreatech.koin.admin.land.repository.AdminLandRepository; import in.koreatech.koin.domain.land.model.Land; import in.koreatech.koin.domain.user.model.User; +import in.koreatech.koin.fixture.LandFixture; import in.koreatech.koin.fixture.UserFixture; import in.koreatech.koin.support.JsonAssertions; import io.restassured.RestAssured; @@ -30,6 +26,9 @@ class AdminLandApiTest extends AcceptanceTest { @Autowired private AdminLandRepository adminLandRepository; + @Autowired + private LandFixture landFixture; + @Autowired private UserFixture userFixture; @@ -232,4 +231,110 @@ void getLand() { """, landId)); } + @Test + @DisplayName("관리자 권한으로 복덕방 정보를 수정한다.") + void updateLand() { + Land land = landFixture.신안빌(); + Integer landId = land.getId(); + + User adminUser = userFixture.코인_운영자(); + String token = userFixture.getToken(adminUser); + + String jsonBody = """ + { + "name": "신안빌 수정", + "internal_name": "신안빌", + "size": "110.0", + "room_type": "투룸", + "latitude": "37.556", + "longitude": "126.556", + "phone": "010-1234-5679", + "image_urls": ["http://newimage1.com", "http://newimage2.com"], + "address": "서울시 강남구 신사동", + "description": "신안빌 수정 설명", + "floor": 5, + "deposit": "50", + "monthly_fee": "150만원", + "charter_fee": "5000", + "management_fee": "150", + "opt_closet": true, + "opt_tv": false, + "opt_microwave": true, + "opt_gas_range": false, + "opt_induction": true, + "opt_water_purifier": false, + "opt_air_conditioner": true, + "opt_washer": true + } + """; + + RestAssured + .given() + .header("Authorization", "Bearer " + token) + .contentType("application/json") + .body(jsonBody) + .when() + .put("/admin/lands/{id}", landId) + .then() + .statusCode(HttpStatus.OK.value()) + .extract(); + + Land updatedLand = adminLandRepository.getById(landId); + + assertSoftly(softly -> { + softly.assertThat(updatedLand.getName()).isEqualTo("신안빌 수정"); + softly.assertThat(updatedLand.getInternalName()).isEqualTo("신안빌"); + softly.assertThat(updatedLand.getSize()).isEqualTo("110.0"); + softly.assertThat(updatedLand.getRoomType()).isEqualTo("투룸"); + softly.assertThat(updatedLand.getLatitude()).isEqualTo(37.556); + softly.assertThat(updatedLand.getLongitude()).isEqualTo(126.556); + softly.assertThat(updatedLand.getPhone()).isEqualTo("010-1234-5679"); + softly.assertThat(updatedLand.getImageUrls()).containsAnyOf("http://newimage1.com", "http://newimage2.com"); + softly.assertThat(updatedLand.getAddress()).isEqualTo("서울시 강남구 신사동"); + softly.assertThat(updatedLand.getDescription()).isEqualTo("신안빌 수정 설명"); + softly.assertThat(updatedLand.getFloor()).isEqualTo(5); + softly.assertThat(updatedLand.getDeposit()).isEqualTo("50"); + softly.assertThat(updatedLand.getMonthlyFee()).isEqualTo("150만원"); + softly.assertThat(updatedLand.getCharterFee()).isEqualTo("5000"); + softly.assertThat(updatedLand.getManagementFee()).isEqualTo("150"); + softly.assertThat(updatedLand.isOptCloset()).isTrue(); + softly.assertThat(updatedLand.isOptTv()).isFalse(); + softly.assertThat(updatedLand.isOptMicrowave()).isTrue(); + softly.assertThat(updatedLand.isOptGasRange()).isFalse(); + softly.assertThat(updatedLand.isOptInduction()).isTrue(); + softly.assertThat(updatedLand.isOptWaterPurifier()).isFalse(); + softly.assertThat(updatedLand.isOptAirConditioner()).isTrue(); + softly.assertThat(updatedLand.isOptWasher()).isTrue(); + softly.assertThat(updatedLand.isDeleted()).isEqualTo(false); + }); + } + + @Test + @DisplayName("관리자 권한으로 복덕방 삭제를 취소한다.") + void undeleteLand() { + Land deletedLand = landFixture.삭제된_복덕방(); + Integer landId = deletedLand.getId(); + + User adminUser = userFixture.코인_운영자(); + String token = userFixture.getToken(adminUser); + + RestAssured + .given() + .header("Authorization", "Bearer " + token) + .when() + .post("/admin/lands/{id}/undelete", landId) + .then() + .statusCode(HttpStatus.OK.value()) + .extract(); + + Land undeletedLand = adminLandRepository.getById(landId); + + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(undeletedLand).isNotNull(); + softly.assertThat(undeletedLand.getName()).isEqualTo("삭제된 복덕방"); + softly.assertThat(undeletedLand.isDeleted()).isFalse(); + }); + } + + } From 55a7650a7441360a3cad59a1c56c59bc045b3446 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 03:02:00 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor:=20=EB=9D=BC=EC=9D=B8=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/land/controller/AdminLandApi.java | 12 +- .../land/controller/AdminLandController.java | 12 +- .../koin/admin/land/dto/AdminLandRequest.java | 1 - .../admin/acceptance/AdminLandApiTest.java | 109 +++++++++--------- 4 files changed, 66 insertions(+), 68 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java index bf84e2596..5e0664ade 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandApi.java @@ -89,8 +89,8 @@ ResponseEntity deleteLand( @SecurityRequirement(name = "Jwt Authentication") @GetMapping("/admin/lands/{id}") ResponseEntity getLand( - @PathVariable("id") Integer id - //@Auth(permit = {ADMIN}) Integer adminId + @PathVariable("id") Integer id, + @Auth(permit = {ADMIN}) Integer adminId ); @ApiResponses( @@ -106,8 +106,8 @@ ResponseEntity getLand( @PutMapping("/admin/lands/{id}") ResponseEntity updateLand( @PathVariable("id") Integer id, - @RequestBody @Valid AdminLandRequest request - //@Auth(permit = {ADMIN}) Integer adminId + @RequestBody @Valid AdminLandRequest request, + @Auth(permit = {ADMIN}) Integer adminId ); @ApiResponses( @@ -122,7 +122,7 @@ ResponseEntity updateLand( @SecurityRequirement(name = "Jwt Authentication") @PostMapping("/admin/lands/{id}/undelete") ResponseEntity undeleteLand( - @PathVariable("id") Integer id - //@Auth(permit = {ADMIN}) Integer adminId + @PathVariable("id") Integer id, + @Auth(permit = {ADMIN}) Integer adminId ); } diff --git a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java index 6fb3cb6be..8d67fdc7f 100644 --- a/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java +++ b/src/main/java/in/koreatech/koin/admin/land/controller/AdminLandController.java @@ -57,8 +57,8 @@ public ResponseEntity deleteLand( @GetMapping("/admin/lands/{id}") public ResponseEntity getLand( - @PathVariable("id") Integer id - //@Auth(permit = {ADMIN}) Integer adminId + @PathVariable("id") Integer id, + @Auth(permit = {ADMIN}) Integer adminId ) { return ResponseEntity.ok().body(adminLandService.getLand(id)); } @@ -66,8 +66,8 @@ public ResponseEntity getLand( @PutMapping("/admin/lands/{id}") public ResponseEntity updateLand( @PathVariable("id") Integer id, - @RequestBody @Valid AdminLandRequest request - //@Auth(permit = {ADMIN}) Integer adminId + @RequestBody @Valid AdminLandRequest request, + @Auth(permit = {ADMIN}) Integer adminId ) { adminLandService.updateLand(id, request); return ResponseEntity.ok().build(); @@ -75,8 +75,8 @@ public ResponseEntity updateLand( @PostMapping("/admin/lands/{id}/undelete") public ResponseEntity undeleteLand( - @PathVariable("id") Integer id - //@Auth(permit = {ADMIN}) Integer adminId + @PathVariable("id") Integer id, + @Auth(permit = {ADMIN}) Integer adminId ) { adminLandService.undeleteLand(id); return ResponseEntity.ok().build(); diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java index 3953c16df..21a67044b 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java @@ -1,6 +1,5 @@ package in.koreatech.koin.admin.land.dto; - import java.util.List; import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; diff --git a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java index dd51ae3bf..834761963 100644 --- a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java +++ b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java @@ -78,32 +78,32 @@ void getLands() { @DisplayName("관리자 권한으로 복덕방을 추가한다.") void postLands() { String jsonBody = """ - { - "name": "금실타운", - "internal_name": "금실타운", - "size": "9.0", - "room_type": "원룸", - "latitude": "37.555", - "longitude": "126.555", - "phone": "041-111-1111", - "image_urls": ["http://image1.com", "http://image2.com"], - "address": "충청남도 천안시 동남구 병천면", - "description": "1년 계약시 20만원 할인", - "floor": 4, - "deposit": "30", - "monthly_fee": "200만원 (6개월)", - "charter_fee": "3500", - "management_fee": "21(1인 기준)", - "opt_closet": true, - "opt_tv": true, - "opt_microwave": true, - "opt_gas_range": false, - "opt_induction": true, - "opt_water_purifier": true, - "opt_air_conditioner": true, - "opt_washer": true - } - """; + { + "name": "금실타운", + "internal_name": "금실타운", + "size": "9.0", + "room_type": "원룸", + "latitude": "37.555", + "longitude": "126.555", + "phone": "041-111-1111", + "image_urls": ["http://image1.com", "http://image2.com"], + "address": "충청남도 천안시 동남구 병천면", + "description": "1년 계약시 20만원 할인", + "floor": 4, + "deposit": "30", + "monthly_fee": "200만원 (6개월)", + "charter_fee": "3500", + "management_fee": "21(1인 기준)", + "opt_closet": true, + "opt_tv": true, + "opt_microwave": true, + "opt_gas_range": false, + "opt_induction": true, + "opt_water_purifier": true, + "opt_air_conditioner": true, + "opt_washer": true + } + """; User adminUser = userFixture.코인_운영자(); String token = userFixture.getToken(adminUser); @@ -201,34 +201,34 @@ void getLand() { JsonAssertions.assertThat(response.asPrettyString()) .isEqualTo(String.format(""" - { - "id": %d, - "name": "금실타운", - "internal_name": "금실타운", - "size": null, - "room_type": "원룸", - "latitude": "37.555", - "longitude": "126.555", - "phone": null, - "image_urls": [], - "address": "가전리 123", - "description": "테스트용 복덕방", - "floor": null, - "deposit": null, - "monthly_fee": "100", - "charter_fee": "1000", - "management_fee": null, - "opt_closet": false, - "opt_tv": false, - "opt_microwave": false, - "opt_gas_range": false, - "opt_induction": false, - "opt_water_purifier": false, - "opt_air_conditioner": false, - "opt_washer": false, - "is_deleted": false - } - """, landId)); + { + "id": %d, + "name": "금실타운", + "internal_name": "금실타운", + "size": null, + "room_type": "원룸", + "latitude": "37.555", + "longitude": "126.555", + "phone": null, + "image_urls": [], + "address": "가전리 123", + "description": "테스트용 복덕방", + "floor": null, + "deposit": null, + "monthly_fee": "100", + "charter_fee": "1000", + "management_fee": null, + "opt_closet": false, + "opt_tv": false, + "opt_microwave": false, + "opt_gas_range": false, + "opt_induction": false, + "opt_water_purifier": false, + "opt_air_conditioner": false, + "opt_washer": false, + "is_deleted": false + } + """, landId)); } @Test @@ -336,5 +336,4 @@ void undeleteLand() { }); } - } From db706a4951642c595c02264fe0173f67ac3e6550 Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 03:37:05 +0900 Subject: [PATCH 11/13] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/acceptance/AdminLandApiTest.java | 64 +++++++++++-------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java index 834761963..b6a0a9836 100644 --- a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java +++ b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java @@ -201,34 +201,42 @@ void getLand() { JsonAssertions.assertThat(response.asPrettyString()) .isEqualTo(String.format(""" - { - "id": %d, - "name": "금실타운", - "internal_name": "금실타운", - "size": null, - "room_type": "원룸", - "latitude": "37.555", - "longitude": "126.555", - "phone": null, - "image_urls": [], - "address": "가전리 123", - "description": "테스트용 복덕방", - "floor": null, - "deposit": null, - "monthly_fee": "100", - "charter_fee": "1000", - "management_fee": null, - "opt_closet": false, - "opt_tv": false, - "opt_microwave": false, - "opt_gas_range": false, - "opt_induction": false, - "opt_water_purifier": false, - "opt_air_conditioner": false, - "opt_washer": false, - "is_deleted": false - } - """, landId)); + { + "id": %d, + "name": "금실타운", + "internal_name": "금실타운", + "size": null, + "room_type": "원룸", + "latitude": "37.555", + "longitude": "126.555", + "phone": null, + "image_urls": [], + "address": "가전리 123", + "description": "테스트용 복덕방", + "floor": null, + "deposit": null, + "monthly_fee": "100", + "charter_fee": "1000", + "management_fee": null, + "opt_closet": false, + "opt_tv": false, + "opt_microwave": false, + "opt_gas_range": false, + "opt_induction": false, + "opt_water_purifier": false, + "opt_air_conditioner": false, + "opt_washer": false, + "opt_bed": false, + "opt_bidet": false, + "opt_desk": false, + "opt_electronic_door_locks": false, + "opt_elevator": false, + "opt_refrigerator": false, + "opt_shoe_closet": false, + "opt_veranda": false, + "is_deleted": false + } + """, landId)); } @Test From 32cd1dc270354f2a20921a3c46666eeefff1dd8c Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 14:49:52 +0900 Subject: [PATCH 12/13] =?UTF-8?q?refactor:=20dto=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/land/dto/AdminLandRequest.java | 12 ++++++------ .../koin/admin/land/dto/AdminLandResponse.java | 12 ++++++------ .../koin/domain/land/dto/LandResponse.java | 2 +- .../koreatech/koin/domain/land/model/Land.java | 17 ++++++++++++----- .../koin/admin/acceptance/AdminLandApiTest.java | 11 ++++++----- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java index 21a67044b..1bab535fc 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandRequest.java @@ -28,17 +28,17 @@ public record AdminLandRequest( String internalName, @Schema(description = "크기", example = "9.0") - String size, + double size, @Schema(description = "종류 - 최대 20자", example = "원룸") @Size(max = 20, message = "방종류의 최대 길이는 20자입니다.") String roomType, @Schema(description = "위도", example = "36.766205") - String latitude, + double latitude, @Schema(description = "경도", example = "127.284638") - String longitude, + double longitude, @Schema(description = "전화번호 - 정규식 `^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$` 을 만족해야함", example = "041-111-1111") @Pattern(regexp = "^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$", message = "전화번호의 형식이 올바르지 않습니다.") @@ -127,10 +127,10 @@ public Land toLand() { return Land.builder() .name(name) .internalName(internalName) - .size(size) + .size(String.valueOf(size)) .roomType(roomType) - .latitude(latitude) - .longitude(longitude) + .latitude(String.valueOf(latitude)) + .longitude(String.valueOf(longitude)) .phone(phone) .imageUrls(imageUrls) .address(address) diff --git a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java index c2e6d27be..5958f27ad 100644 --- a/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java +++ b/src/main/java/in/koreatech/koin/admin/land/dto/AdminLandResponse.java @@ -21,16 +21,16 @@ public record AdminLandResponse( String internalName, @Schema(description = "크기", example = "9.0") - String size, + double size, @Schema(description = "종류", example = "원룸") String roomType, @Schema(description = "위도", example = "36.766205") - String latitude, + double latitude, @Schema(description = "경도", example = "127.284638") - String longitude, + double longitude, @Schema(description = "전화번호", example = "041-111-1111") String phone, @@ -115,10 +115,10 @@ public static AdminLandResponse from(Land land) { land.getId(), land.getName(), land.getInternalName(), - land.getSize(), + land.getSize() == null ? null : land.getSize(), land.getRoomType(), - land.getLatitude() != null ? land.getLatitude().toString() : null, - land.getLongitude() != null ? land.getLongitude().toString() : null, + land.getLatitude() == null ? null : land.getLatitude(), + land.getLongitude() == null ? null : land.getLongitude(), land.getPhone(), convertToList(land.getImageUrls()), land.getAddress(), diff --git a/src/main/java/in/koreatech/koin/domain/land/dto/LandResponse.java b/src/main/java/in/koreatech/koin/domain/land/dto/LandResponse.java index e296cbdcf..0735ec7ed 100644 --- a/src/main/java/in/koreatech/koin/domain/land/dto/LandResponse.java +++ b/src/main/java/in/koreatech/koin/domain/land/dto/LandResponse.java @@ -158,7 +158,7 @@ public static LandResponse of(Land land, List imageUrls, String permalin land.getLongitude(), land.getAddress(), land.isOptBed(), - land.getSize(), + String.valueOf(land.getSize()), land.getPhone(), land.isOptAirConditioner(), land.getName(), diff --git a/src/main/java/in/koreatech/koin/domain/land/model/Land.java b/src/main/java/in/koreatech/koin/domain/land/model/Land.java index f8350b3dc..f1ff262c2 100644 --- a/src/main/java/in/koreatech/koin/domain/land/model/Land.java +++ b/src/main/java/in/koreatech/koin/domain/land/model/Land.java @@ -235,6 +235,13 @@ public Double getLongitude() { return Double.parseDouble(longitude); } + public Double getSize(){ + if(this.size == null){ + return null; + } + return Double.parseDouble(size); + } + private String convertToSting(List imageUrls) { if (imageUrls == null || imageUrls.isEmpty()) { return null; @@ -252,8 +259,8 @@ public void undelete() { this.isDeleted = false; } - public void update(String internalName, String name, String size, String roomType, String latitude, - String longitude, + public void update(String internalName, String name, double size, String roomType, double latitude, + double longitude, String phone, List imageUrls, String address, String description, Integer floor, String deposit, String monthlyFee, String charterFee, String managementFee, boolean optRefrigerator, boolean optCloset, boolean optTv, boolean optMicrowave, boolean optGasRange, boolean optInduction, @@ -262,10 +269,10 @@ public void update(String internalName, String name, String size, String roomTyp boolean optElevator) { this.internalName = internalName; this.name = name; - this.size = size; + this.size = String.valueOf(size); this.roomType = roomType; - this.latitude = latitude; - this.longitude = longitude; + this.latitude = String.valueOf(latitude); + this.longitude = String.valueOf(longitude); this.phone = phone; this.imageUrls = convertToSting(imageUrls); this.address = address; diff --git a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java index b6a0a9836..cad868d9d 100644 --- a/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java +++ b/src/test/java/in/koreatech/koin/admin/acceptance/AdminLandApiTest.java @@ -169,7 +169,7 @@ void deleteLand() { } @Test - @DisplayName("특정 복덕방 정보를 조회한다.") + @DisplayName("관리자의 권한으로 특정 복덕방 정보를 조회한다.") void getLand() { // 복덕방 생성 Land request = Land.builder() @@ -178,6 +178,7 @@ void getLand() { .roomType("원룸") .latitude("37.555") .longitude("126.555") + .size("9.0") .monthlyFee("100") .charterFee("1000") .address("가전리 123") @@ -205,10 +206,10 @@ void getLand() { "id": %d, "name": "금실타운", "internal_name": "금실타운", - "size": null, + "size": 9.0, "room_type": "원룸", - "latitude": "37.555", - "longitude": "126.555", + "latitude": 37.555, + "longitude": 126.555, "phone": null, "image_urls": [], "address": "가전리 123", @@ -292,7 +293,7 @@ void updateLand() { assertSoftly(softly -> { softly.assertThat(updatedLand.getName()).isEqualTo("신안빌 수정"); softly.assertThat(updatedLand.getInternalName()).isEqualTo("신안빌"); - softly.assertThat(updatedLand.getSize()).isEqualTo("110.0"); + softly.assertThat(updatedLand.getSize()).isEqualTo(110.0); softly.assertThat(updatedLand.getRoomType()).isEqualTo("투룸"); softly.assertThat(updatedLand.getLatitude()).isEqualTo(37.556); softly.assertThat(updatedLand.getLongitude()).isEqualTo(126.556); From 76f662c3516213db2fdb21e4b0420b7393e6e64a Mon Sep 17 00:00:00 2001 From: Jang Jun Young Date: Wed, 26 Jun 2024 16:12:38 +0900 Subject: [PATCH 13/13] =?UTF-8?q?refactor:=20=EB=9D=BC=EC=9D=B8=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/in/koreatech/koin/domain/land/model/Land.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/in/koreatech/koin/domain/land/model/Land.java b/src/main/java/in/koreatech/koin/domain/land/model/Land.java index f1ff262c2..31f1fa325 100644 --- a/src/main/java/in/koreatech/koin/domain/land/model/Land.java +++ b/src/main/java/in/koreatech/koin/domain/land/model/Land.java @@ -235,8 +235,8 @@ public Double getLongitude() { return Double.parseDouble(longitude); } - public Double getSize(){ - if(this.size == null){ + public Double getSize() { + if (this.size == null) { return null; } return Double.parseDouble(size);