From 7cf440211dd62b96db5813c352ba30bb39141f05 Mon Sep 17 00:00:00 2001 From: yongseongkim Date: Mon, 25 Mar 2024 22:02:11 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=86=A0=EC=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api_specification/api/scc-api/api-spec.yaml | 6 ++++++ ...level_and_door_types_to_place_accessibility_.sqm | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm diff --git a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml index ab3133572..beabb8f19 100644 --- a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml +++ b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml @@ -1340,10 +1340,16 @@ components: type: string entranceStairInfo: $ref: '#/components/schemas/StairInfo' + entranceStairHeightLevel: + $ref: '#/components/schemas/StairHeightLevel' entranceImageUrls: type: array items: type: string + entranceDoorTypes: + type: array + items: + $ref: '#/components/schemas/EntranceDoorType' hasSlope: type: boolean hasElevator: diff --git a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm new file mode 100644 index 000000000..252d3813a --- /dev/null +++ b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm @@ -0,0 +1,13 @@ +import club.staircrusher.accessibility.domain.model.EntranceDoorType; +import club.staircrusher.accessibility.domain.model.StairHeightLevel; +import kotlin.Int; +import kotlin.collections.List; + +-- floors, entrance type 이 빈 list 면 입력받지 않았다고 판단 +ALTER TABLE place_accessibility ADD COLUMN floors TEXT AS List NOT NULL DEFAULT '[]'; +ALTER TABLE place_accessibility ADD COLUMN is_stair_only_option BOOLEAN NULL; +ALTER TABLE place_accessibility ADD COLUMN stair_height_level VARCHAR(32) AS StairHeightLevel NULL; +ALTER TABLE place_accessibility ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]'; + +ALTER TABLE building_accessibility ADD COLUMN stair_height_level VARCHAR(32) AS StairHeightLevel NULL; +ALTER TABLE building_accessibility ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]'; From 85232f27734340d80c24d7ec9beab4eb220bfc02 Mon Sep 17 00:00:00 2001 From: yongseongkim Date: Sat, 30 Mar 2024 10:13:34 +0900 Subject: [PATCH 2/4] =?UTF-8?q?api=20spec=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subprojects/api_specification/api/scc-api/api-spec.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml index beabb8f19..84a0365d5 100644 --- a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml +++ b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml @@ -799,10 +799,16 @@ components: type: string entranceStairInfo: $ref: '#/components/schemas/StairInfo' + entranceStairHeightLevel: + $ref: '#/components/schemas/StairHeightLevel' entranceImageUrls: type: array items: type: string + entranceDoorTypes: + type: array + items: + $ref: '#/components/schemas/EntranceDoorType' hasSlope: type: boolean hasElevator: From 4322b1eb6b6cca3848b92703f2105f3726031105 Mon Sep 17 00:00:00 2001 From: yongseongkim Date: Sat, 30 Mar 2024 17:04:52 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EA=B1=B4=EB=AC=BC=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20=EA=B3=84=EB=8B=A8=20=EB=86=92=EC=9D=B4,=20?= =?UTF-8?q?=EC=B6=9C=EC=9E=85=EB=AC=B8=20=EC=9C=A0=ED=98=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/scc-api/api-spec.yaml | 4 ++ .../in/AccessibilityApplicationService.kt | 6 +++ .../BuildingAccessibilityRepository.kt | 15 +++++- .../domain/model/BuildingAccessibility.kt | 3 ++ .../RegisterBuildingAccessibilityTest.kt | 47 ++++++++++++------- .../infra/adapter/in/controller/Converters.kt | 6 +++ .../out/persistence/sqldelight/Converters.kt | 12 +++++ .../infra/persistence/sqldelight/DB.kt | 3 ++ ..._and_door_types_to_place_accessibility.sqm | 5 ++ ...and_door_types_to_place_accessibility_.sqm | 13 ----- .../testing/spring_it/ITDataGenerator.kt | 22 +++++++-- 11 files changed, 101 insertions(+), 35 deletions(-) delete mode 100644 app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm diff --git a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml index 84a0365d5..339d65aea 100644 --- a/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml +++ b/app-server/subprojects/api_specification/api/scc-api/api-spec.yaml @@ -815,6 +815,8 @@ components: type: boolean elevatorStairInfo: $ref: '#/components/schemas/StairInfo' + elevatorStairHeightLevel: + $ref: '#/components/schemas/StairHeightLevel' elevatorImageUrls: type: array items: @@ -1362,6 +1364,8 @@ components: type: boolean elevatorStairInfo: $ref: '#/components/schemas/StairInfo' + elevatorStairHeightLevel: + $ref: '#/components/schemas/StairHeightLevel' elevatorImageUrls: type: array items: diff --git a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/in/AccessibilityApplicationService.kt b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/in/AccessibilityApplicationService.kt index 1dc47687a..4a6cb380d 100644 --- a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/in/AccessibilityApplicationService.kt +++ b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/in/AccessibilityApplicationService.kt @@ -174,6 +174,9 @@ class AccessibilityApplicationService( createBuildingAccessibilityParams: BuildingAccessibilityRepository.CreateParams, createBuildingAccessibilityCommentParams: BuildingAccessibilityCommentRepository.CreateParams?, ): RegisterBuildingAccessibilityResult { + if (createBuildingAccessibilityParams.isValid().not()) { + throw SccDomainException("잘못된 접근성 정보입니다. 필수 입력을 빠트렸거나 조건을 다시 한 번 확인해주세요.", SccDomainException.ErrorCode.INVALID_ARGUMENTS) + } val buildingId = createBuildingAccessibilityParams.buildingId if (buildingAccessibilityRepository.findByBuildingId(buildingId) != null) { throw SccDomainException("이미 접근성 정보가 등록된 건물입니다.") @@ -194,10 +197,13 @@ class AccessibilityApplicationService( id = EntityIdGenerator.generateRandom(), buildingId = it.buildingId, entranceStairInfo = it.entranceStairInfo, + entranceStairHeightLevel = it.entranceStairHeightLevel, entranceImageUrls = it.entranceImageUrls, hasSlope = it.hasSlope, hasElevator = it.hasElevator, + entranceDoorTypes = it.entranceDoorTypes, elevatorStairInfo = it.elevatorStairInfo, + elevatorStairHeightLevel = it.elevatorStairHeightLevel, elevatorImageUrls = it.elevatorImageUrls, userId = it.userId, createdAt = clock.instant(), diff --git a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt index 675ad576c..385cb39ba 100644 --- a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt +++ b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt @@ -1,6 +1,8 @@ package club.staircrusher.accessibility.application.port.out.persistence import club.staircrusher.accessibility.domain.model.BuildingAccessibility +import club.staircrusher.accessibility.domain.model.EntranceDoorType +import club.staircrusher.accessibility.domain.model.StairHeightLevel import club.staircrusher.accessibility.domain.model.StairInfo import club.staircrusher.stdlib.domain.repository.EntityRepository import club.staircrusher.stdlib.geography.EupMyeonDong @@ -12,14 +14,25 @@ interface BuildingAccessibilityRepository : EntityRepository fun countByUserId(userId: String): Int fun remove(id: String) + data class CreateParams( val buildingId: String, val entranceStairInfo: StairInfo, + val entranceStairHeightLevel: StairHeightLevel?, val entranceImageUrls: List, val hasSlope: Boolean, val hasElevator: Boolean, + val entranceDoorTypes: List?, val elevatorStairInfo: StairInfo, + val elevatorStairHeightLevel: StairHeightLevel?, val elevatorImageUrls: List, val userId: String?, - ) + ) { + fun isValid(): Boolean { + // 0401 버전에서 추가된 항목이 모두 있거나 모두 없거나 + val isInputValid = listOf(entranceStairHeightLevel, elevatorStairHeightLevel, entranceDoorTypes).all { it == null } || listOf(entranceStairHeightLevel, elevatorStairHeightLevel, entranceDoorTypes).all { it != null } + val isDoorTypesInvalid = entranceDoorTypes?.isEmpty() == true || entranceDoorTypes?.let { it.contains(EntranceDoorType.None) && it.count() > 1 } ?: false + return isInputValid && isDoorTypesInvalid.not() + } + } } diff --git a/app-server/subprojects/bounded_context/accessibility/domain/src/main/kotlin/club/staircrusher/accessibility/domain/model/BuildingAccessibility.kt b/app-server/subprojects/bounded_context/accessibility/domain/src/main/kotlin/club/staircrusher/accessibility/domain/model/BuildingAccessibility.kt index 20df88d49..79057e050 100644 --- a/app-server/subprojects/bounded_context/accessibility/domain/src/main/kotlin/club/staircrusher/accessibility/domain/model/BuildingAccessibility.kt +++ b/app-server/subprojects/bounded_context/accessibility/domain/src/main/kotlin/club/staircrusher/accessibility/domain/model/BuildingAccessibility.kt @@ -6,10 +6,13 @@ data class BuildingAccessibility( val id: String, val buildingId: String, val entranceStairInfo: StairInfo, + val entranceStairHeightLevel: StairHeightLevel?, val entranceImageUrls: List, val hasSlope: Boolean, val hasElevator: Boolean, + val entranceDoorTypes: List?, val elevatorStairInfo: StairInfo, + val elevatorStairHeightLevel: StairHeightLevel?, val elevatorImageUrls: List, val userId: String?, val createdAt: Instant, diff --git a/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt b/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt index 5190705a2..4541505f3 100644 --- a/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt +++ b/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt @@ -2,9 +2,10 @@ package club.staircrusher.accesssibility.infra.adapter.`in`.controller import club.staircrusher.accessibility.application.port.out.persistence.BuildingAccessibilityRepository import club.staircrusher.accessibility.application.port.out.persistence.BuildingAccessibilityUpvoteRepository +import club.staircrusher.accessibility.domain.model.EntranceDoorType +import club.staircrusher.accessibility.domain.model.StairHeightLevel import club.staircrusher.accessibility.domain.model.StairInfo import club.staircrusher.accessibility.infra.adapter.`in`.controller.toDTO -import club.staircrusher.accessibility.infra.adapter.`in`.controller.toModel import club.staircrusher.accesssibility.infra.adapter.`in`.controller.base.AccessibilityITBase import club.staircrusher.api.spec.dto.AccessibilityInfoDto import club.staircrusher.api.spec.dto.GetAccessibilityPostRequest @@ -13,7 +14,6 @@ import club.staircrusher.place.domain.model.Building import club.staircrusher.place.domain.model.BuildingAddress import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired @@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired class RegisterBuildingAccessibilityTest : AccessibilityITBase() { @Autowired private lateinit var buildingAccessibilityRepository: BuildingAccessibilityRepository + @Autowired private lateinit var buildingAccessibilityUpvoteRepository: BuildingAccessibilityUpvoteRepository @@ -31,7 +32,7 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { } @Test - fun testRegisterBuildingAccessibility() { + fun `정상적으로 등록된다`() { repeat(3) { idx -> val expectedRegisteredUserOrder = idx + 1 val user = transactionManager.doInTransaction { @@ -49,15 +50,17 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { val result = getResult(AccessibilityInfoDto::class) val buildingAccessibility = result.buildingAccessibility!! assertEquals(place.building.id, buildingAccessibility.buildingId) - assertEquals(StairInfo.NONE, buildingAccessibility.entranceStairInfo.toModel()) - assertEquals(1, buildingAccessibility.entranceImageUrls.size) - assertEquals("buildingAccessibilityEntranceImage", buildingAccessibility.entranceImageUrls[0]) - assertTrue(buildingAccessibility.hasSlope) - assertTrue(buildingAccessibility.hasElevator) - assertEquals(StairInfo.TWO_TO_FIVE, buildingAccessibility.elevatorStairInfo.toModel()) + assertEquals(params.entranceStairInfo, buildingAccessibility.entranceStairInfo) + assertEquals(params.entranceStairHeightLevel, buildingAccessibility.entranceStairHeightLevel) + assertEquals(params.entranceImageUrls.size, buildingAccessibility.entranceImageUrls.size) + assertEquals(params.entranceImageUrls.first(), buildingAccessibility.entranceImageUrls[0]) + assertEquals(params.hasSlope, buildingAccessibility.hasSlope) + assertEquals(params.hasElevator, buildingAccessibility.hasElevator) + assertEquals(params.elevatorStairInfo, buildingAccessibility.elevatorStairInfo) + assertEquals(params.elevatorStairHeightLevel, buildingAccessibility.elevatorStairHeightLevel) assertEquals(2, buildingAccessibility.elevatorImageUrls.size) - assertEquals("buildingAccessibilityElevatorImage1", buildingAccessibility.elevatorImageUrls[0]) - assertEquals("buildingAccessibilityElevatorImage2", buildingAccessibility.elevatorImageUrls[1]) + assertEquals(params.elevatorImageUrls.first(), buildingAccessibility.elevatorImageUrls[0]) + assertEquals(params.elevatorImageUrls[1], buildingAccessibility.elevatorImageUrls[1]) assertFalse(buildingAccessibility.isUpvoted) assertEquals(0, buildingAccessibility.totalUpvoteCount) @@ -144,14 +147,26 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { } } - private fun getDefaultRequestParams(building: Building): RegisterBuildingAccessibilityRequestDto { + private fun getDefaultRequestParams( + building: Building, + entranceStairInfo: StairInfo = StairInfo.ONE, + entranceStairHeightLevel: StairHeightLevel = StairHeightLevel.HALF_THUMB, + hasSlope: Boolean = true, + hasElevator: Boolean = true, + elevatorStairInfo: StairInfo = StairInfo.TWO_TO_FIVE, + elevatorStairHeightLevel: StairHeightLevel = StairHeightLevel.OVER_THUMB, + entranceDoorTypes: List = listOf(EntranceDoorType.Sliding, EntranceDoorType.Automatic) + ): RegisterBuildingAccessibilityRequestDto { return RegisterBuildingAccessibilityRequestDto( buildingId = building.id, - entranceStairInfo = StairInfo.NONE.toDTO(), + entranceStairInfo = entranceStairInfo.toDTO(), + entranceStairHeightLevel = entranceStairHeightLevel.toDTO(), entranceImageUrls = listOf("buildingAccessibilityEntranceImage"), - hasSlope = true, - hasElevator = true, - elevatorStairInfo = StairInfo.TWO_TO_FIVE.toDTO(), + entranceDoorTypes = entranceDoorTypes.map { it.toDTO() }, + hasSlope = hasSlope, + hasElevator = hasElevator, + elevatorStairInfo = elevatorStairInfo.toDTO(), + elevatorStairHeightLevel = elevatorStairHeightLevel.toDTO(), elevatorImageUrls = listOf( "buildingAccessibilityElevatorImage1", "buildingAccessibilityElevatorImage2", diff --git a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt index 8d93c880f..f8bbcc158 100644 --- a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt +++ b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt @@ -37,10 +37,13 @@ fun BuildingAccessibility.toDTO( ) = club.staircrusher.api.spec.dto.BuildingAccessibility( id = id, entranceStairInfo = entranceStairInfo.toDTO(), + entranceStairHeightLevel = entranceStairHeightLevel?.toDTO(), entranceImageUrls = entranceImageUrls, hasSlope = hasSlope, hasElevator = hasElevator, + entranceDoorTypes = entranceDoorTypes?.map { it.toDTO() }, elevatorStairInfo = elevatorStairInfo.toDTO(), + elevatorStairHeightLevel = elevatorStairHeightLevel?.toDTO(), elevatorImageUrls = elevatorImageUrls, buildingId = buildingId, isUpvoted = isUpvoted, @@ -76,10 +79,13 @@ fun RegisterBuildingAccessibilityRequestDto.toModel(userId: String?) = BuildingAccessibilityRepository.CreateParams( buildingId = buildingId, entranceStairInfo = entranceStairInfo.toModel(), + entranceStairHeightLevel = entranceStairHeightLevel?.toModel(), entranceImageUrls = entranceImageUrls, hasSlope = hasSlope, hasElevator = hasElevator, + entranceDoorTypes = entranceDoorTypes?.map { it.toModel() } ?: emptyList(), elevatorStairInfo = elevatorStairInfo.toModel(), + elevatorStairHeightLevel = elevatorStairHeightLevel?.toModel(), elevatorImageUrls = elevatorImageUrls, userId = userId, ) diff --git a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/out/persistence/sqldelight/Converters.kt b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/out/persistence/sqldelight/Converters.kt index 4ba6a4dfe..b8ac3e407 100644 --- a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/out/persistence/sqldelight/Converters.kt +++ b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/out/persistence/sqldelight/Converters.kt @@ -25,10 +25,13 @@ fun Building_accessibility.toDomainModel() = BuildingAccessibility( id = id, buildingId = building_id, entranceStairInfo = StairInfo.valueOf(entrance_stair_info), + entranceStairHeightLevel = entrance_stair_height_level, entranceImageUrls = entrance_image_urls, hasSlope = has_slope, hasElevator = has_elevator, + entranceDoorTypes = entrance_door_types, elevatorStairInfo = StairInfo.valueOf(elevator_stair_info), + elevatorStairHeightLevel = elevator_stair_height_level, elevatorImageUrls = elevator_image_urls, userId = user_id, createdAt = created_at.toInstant(), @@ -39,10 +42,13 @@ fun BuildingAccessibility.toPersistenceModel() = Building_accessibility( id = id, building_id = buildingId, entrance_stair_info = entranceStairInfo.name, + entrance_stair_height_level = entranceStairHeightLevel, entrance_image_urls = entranceImageUrls, has_slope = hasSlope, has_elevator = hasElevator, + entrance_door_types = entranceDoorTypes ?: emptyList(), elevator_stair_info = elevatorStairInfo.name, + elevator_stair_height_level = elevatorStairHeightLevel, elevator_image_urls = elevatorImageUrls, user_id = userId, created_at = createdAt.toOffsetDateTime(), @@ -74,10 +80,13 @@ fun BuildingAccessibilityUpvoteFindById.toDomainModel(): BuildingAccessibilityUp id = id_, buildingId = building_id, entranceStairInfo = StairInfo.valueOf(entrance_stair_info), + entranceStairHeightLevel = entrance_stair_height_level, entranceImageUrls = entrance_image_urls, hasSlope = has_slope, hasElevator = has_elevator, + entranceDoorTypes = entrance_door_types, elevatorStairInfo = StairInfo.valueOf(elevator_stair_info), + elevatorStairHeightLevel = elevator_stair_height_level, elevatorImageUrls = elevator_image_urls, userId = user_id_, createdAt = created_at_.toInstant(), @@ -96,10 +105,13 @@ fun FindByUserAndBuildingAccessibilityAndNotDeleted.toDomainModel(): BuildingAcc id = id_, buildingId = building_id, entranceStairInfo = StairInfo.valueOf(entrance_stair_info), + entranceStairHeightLevel = entrance_stair_height_level, entranceImageUrls = entrance_image_urls, hasSlope = has_slope, hasElevator = has_elevator, + entranceDoorTypes = entrance_door_types, elevatorStairInfo = StairInfo.valueOf(elevator_stair_info), + elevatorStairHeightLevel = elevator_stair_height_level, elevatorImageUrls = elevator_image_urls, userId = user_id_, createdAt = created_at_.toInstant(), diff --git a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/kotlin/club/staircrusher/infra/persistence/sqldelight/DB.kt b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/kotlin/club/staircrusher/infra/persistence/sqldelight/DB.kt index 7c6467efd..d38494a18 100644 --- a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/kotlin/club/staircrusher/infra/persistence/sqldelight/DB.kt +++ b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/kotlin/club/staircrusher/infra/persistence/sqldelight/DB.kt @@ -47,6 +47,9 @@ class DB(dataSource: DataSource) : TransactionManager { building_accessibilityAdapter = Building_accessibility.Adapter( entrance_image_urlsAdapter = StringListToTextColumnAdapter, elevator_image_urlsAdapter = StringListToTextColumnAdapter, + entrance_stair_height_levelAdapter = StairHeightLevelStringColumnAdapter, + entrance_door_typesAdapter = EntranceDoorTypeListStringColumnAdapter, + elevator_stair_height_levelAdapter = StairHeightLevelStringColumnAdapter ), club_questAdapter = Club_quest.Adapter( target_buildingsAdapter = object : ListToTextColumnAdapter() { diff --git a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility.sqm b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility.sqm index 3176b261b..e29d38efc 100644 --- a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility.sqm +++ b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility.sqm @@ -9,3 +9,8 @@ ALTER TABLE place_accessibility ADD COLUMN is_stair_only_option BOOLEAN NULL, ADD COLUMN stair_height_level VARCHAR(32) AS StairHeightLevel NULL, ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]'; + +ALTER TABLE building_accessibility + ADD COLUMN entrance_stair_height_level VARCHAR(32) AS StairHeightLevel NULL, + ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]', + ADD COLUMN elevator_stair_height_level VARCHAR(32) AS StairHeightLevel NULL; diff --git a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm b/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm deleted file mode 100644 index 252d3813a..000000000 --- a/app-server/subprojects/cross_cutting_concern/infra/persistence_model/src/main/sqldelight/club/staircrusher/infra/persistence/sqldelight/migration/V14__add_floors_and_stair_height_level_and_door_types_to_place_accessibility_.sqm +++ /dev/null @@ -1,13 +0,0 @@ -import club.staircrusher.accessibility.domain.model.EntranceDoorType; -import club.staircrusher.accessibility.domain.model.StairHeightLevel; -import kotlin.Int; -import kotlin.collections.List; - --- floors, entrance type 이 빈 list 면 입력받지 않았다고 판단 -ALTER TABLE place_accessibility ADD COLUMN floors TEXT AS List NOT NULL DEFAULT '[]'; -ALTER TABLE place_accessibility ADD COLUMN is_stair_only_option BOOLEAN NULL; -ALTER TABLE place_accessibility ADD COLUMN stair_height_level VARCHAR(32) AS StairHeightLevel NULL; -ALTER TABLE place_accessibility ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]'; - -ALTER TABLE building_accessibility ADD COLUMN stair_height_level VARCHAR(32) AS StairHeightLevel NULL; -ALTER TABLE building_accessibility ADD COLUMN entrance_door_types TEXT AS List NOT NULL DEFAULT '[]'; diff --git a/app-server/subprojects/cross_cutting_concern/test/spring_it/src/main/kotlin/club/staircrusher/testing/spring_it/ITDataGenerator.kt b/app-server/subprojects/cross_cutting_concern/test/spring_it/src/main/kotlin/club/staircrusher/testing/spring_it/ITDataGenerator.kt index 14244076e..43ae2d318 100644 --- a/app-server/subprojects/cross_cutting_concern/test/spring_it/src/main/kotlin/club/staircrusher/testing/spring_it/ITDataGenerator.kt +++ b/app-server/subprojects/cross_cutting_concern/test/spring_it/src/main/kotlin/club/staircrusher/testing/spring_it/ITDataGenerator.kt @@ -279,16 +279,28 @@ class ITDataGenerator { ) } - fun registerBuildingAccessibilityIfNotExists(building: Building, user: User? = null): BuildingAccessibility { + fun registerBuildingAccessibilityIfNotExists( + building: Building, + entranceStairInfo: StairInfo = StairInfo.NONE, + entranceStairHeightLevel: StairHeightLevel = StairHeightLevel.THUMB, + hasSlope: Boolean = true, + hasElevator: Boolean = true, + entranceDoorTypes: List = listOf(EntranceDoorType.Sliding, EntranceDoorType.Automatic), + elevatorStairHeightLevel: StairHeightLevel = StairHeightLevel.HALF_THUMB, + user: User? = null + ): BuildingAccessibility { return buildingAccessibilityRepository.findByBuildingId(building.id) ?: buildingAccessibilityRepository.save( BuildingAccessibility( id = EntityIdGenerator.generateRandom(), buildingId = building.id, - entranceStairInfo = StairInfo.NONE, + entranceStairInfo = entranceStairInfo, + entranceStairHeightLevel = entranceStairHeightLevel, entranceImageUrls = emptyList(), - hasSlope = true, - hasElevator = true, + hasSlope = hasSlope, + hasElevator = hasElevator, + entranceDoorTypes = entranceDoorTypes, elevatorStairInfo = StairInfo.NONE, + elevatorStairHeightLevel = elevatorStairHeightLevel, elevatorImageUrls = emptyList(), userId = user?.id, createdAt = clock.instant(), @@ -302,7 +314,7 @@ class ITDataGenerator { ): Pair { return Pair( registerPlaceAccessibility(place = place, user = user), - registerBuildingAccessibilityIfNotExists(place.building, user), + registerBuildingAccessibilityIfNotExists(place.building, user = user), ) } From 7764dccb1b652863dccfe8eb5be26a75e6f3abe3 Mon Sep 17 00:00:00 2001 From: yongseongkim Date: Sat, 30 Mar 2024 17:31:04 +0900 Subject: [PATCH 4/4] Make CI Success --- .../BuildingAccessibilityRepository.kt | 2 +- .../RegisterBuildingAccessibilityTest.kt | 73 ++++++++++++++++++- .../infra/adapter/in/controller/Converters.kt | 2 +- .../data_restore/AccessibilityInserter.kt | 4 + 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt index 385cb39ba..7a227d6e4 100644 --- a/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt +++ b/app-server/subprojects/bounded_context/accessibility/application/src/main/kotlin/club/staircrusher/accessibility/application/port/out/persistence/BuildingAccessibilityRepository.kt @@ -30,7 +30,7 @@ interface BuildingAccessibilityRepository : EntityRepository 1 } ?: false return isInputValid && isDoorTypesInvalid.not() } diff --git a/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt b/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt index 4541505f3..cfae95bf2 100644 --- a/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt +++ b/app-server/subprojects/bounded_context/accessibility/infra/src/integrationTest/kotlin/club/staircrusher/accesssibility/infra/adapter/in/controller/RegisterBuildingAccessibilityTest.kt @@ -12,6 +12,7 @@ import club.staircrusher.api.spec.dto.GetAccessibilityPostRequest import club.staircrusher.api.spec.dto.RegisterBuildingAccessibilityRequestDto import club.staircrusher.place.domain.model.Building import club.staircrusher.place.domain.model.BuildingAddress +import org.junit.jupiter.api.Assertions.assertArrayEquals import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.BeforeEach @@ -53,13 +54,14 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { assertEquals(params.entranceStairInfo, buildingAccessibility.entranceStairInfo) assertEquals(params.entranceStairHeightLevel, buildingAccessibility.entranceStairHeightLevel) assertEquals(params.entranceImageUrls.size, buildingAccessibility.entranceImageUrls.size) - assertEquals(params.entranceImageUrls.first(), buildingAccessibility.entranceImageUrls[0]) + assertEquals(params.entranceImageUrls[0], buildingAccessibility.entranceImageUrls[0]) assertEquals(params.hasSlope, buildingAccessibility.hasSlope) assertEquals(params.hasElevator, buildingAccessibility.hasElevator) + assertArrayEquals(params.entranceDoorTypes?.toTypedArray(), buildingAccessibility.entranceDoorTypes?.toTypedArray()) assertEquals(params.elevatorStairInfo, buildingAccessibility.elevatorStairInfo) assertEquals(params.elevatorStairHeightLevel, buildingAccessibility.elevatorStairHeightLevel) assertEquals(2, buildingAccessibility.elevatorImageUrls.size) - assertEquals(params.elevatorImageUrls.first(), buildingAccessibility.elevatorImageUrls[0]) + assertEquals(params.elevatorImageUrls[0], buildingAccessibility.elevatorImageUrls[0]) assertEquals(params.elevatorImageUrls[1], buildingAccessibility.elevatorImageUrls[1]) assertFalse(buildingAccessibility.isUpvoted) assertEquals(0, buildingAccessibility.totalUpvoteCount) @@ -72,6 +74,45 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { } } + @Test + fun `240401 이전 버전에서도 정상적으로 등록된다`() { + val user = transactionManager.doInTransaction { + testDataGenerator.createUser() + } + val place = transactionManager.doInTransaction { + testDataGenerator.createBuildingAndPlace(placeName = "장소장소") + } + val params = getDefaultRequestParamsBefore2404(place.building) + mvc.sccRequest("/registerBuildingAccessibility", params, user = user) + mvc + .sccRequest("/getAccessibility", GetAccessibilityPostRequest(place.id), user = user) + .apply { + val result = getResult(AccessibilityInfoDto::class) + val buildingAccessibility = result.buildingAccessibility!! + assertEquals(place.building.id, buildingAccessibility.buildingId) + assertEquals(params.entranceStairInfo, buildingAccessibility.entranceStairInfo) + assertEquals(params.entranceStairHeightLevel, null) + assertEquals(params.entranceImageUrls.size, buildingAccessibility.entranceImageUrls.size) + assertEquals(params.entranceImageUrls[0], buildingAccessibility.entranceImageUrls[0]) + assertEquals(params.hasSlope, buildingAccessibility.hasSlope) + assertEquals(params.hasElevator, buildingAccessibility.hasElevator) + assertEquals(params.entranceDoorTypes, null) + assertEquals(params.elevatorStairInfo, buildingAccessibility.elevatorStairInfo) + assertEquals(params.elevatorStairHeightLevel, null) + assertEquals(2, buildingAccessibility.elevatorImageUrls.size) + assertEquals(params.elevatorImageUrls[0], buildingAccessibility.elevatorImageUrls[0]) + assertEquals(params.elevatorImageUrls[1], buildingAccessibility.elevatorImageUrls[1]) + assertFalse(buildingAccessibility.isUpvoted) + assertEquals(0, buildingAccessibility.totalUpvoteCount) + + assertEquals(1, result.buildingAccessibilityComments.size) + assertEquals(place.building.id, result.buildingAccessibilityComments[0].buildingId) + assertEquals(user.id, result.buildingAccessibilityComments[0].user!!.id) + assertEquals("건물 코멘트", result.buildingAccessibilityComments[0].comment) + } + } + + @Test fun `클라이언트에서 올려준 정보의 정합성이 맞지 않는 경우 에러가 난다`() { val user = transactionManager.doInTransaction { @@ -162,9 +203,9 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { entranceStairInfo = entranceStairInfo.toDTO(), entranceStairHeightLevel = entranceStairHeightLevel.toDTO(), entranceImageUrls = listOf("buildingAccessibilityEntranceImage"), - entranceDoorTypes = entranceDoorTypes.map { it.toDTO() }, hasSlope = hasSlope, hasElevator = hasElevator, + entranceDoorTypes = entranceDoorTypes.map { it.toDTO() }, elevatorStairInfo = elevatorStairInfo.toDTO(), elevatorStairHeightLevel = elevatorStairHeightLevel.toDTO(), elevatorImageUrls = listOf( @@ -174,4 +215,30 @@ class RegisterBuildingAccessibilityTest : AccessibilityITBase() { comment = "건물 코멘트", ) } + + private fun getDefaultRequestParamsBefore2404( + building: Building, + entranceStairInfo: StairInfo = StairInfo.ONE, + hasSlope: Boolean = true, + hasElevator: Boolean = true, + elevatorStairInfo: StairInfo = StairInfo.TWO_TO_FIVE, + ): RegisterBuildingAccessibilityRequestDto { + return RegisterBuildingAccessibilityRequestDto( + buildingId = building.id, + entranceStairInfo = entranceStairInfo.toDTO(), + entranceStairHeightLevel = null, + entranceImageUrls = listOf("buildingAccessibilityEntranceImage"), + entranceDoorTypes = null, + hasSlope = hasSlope, + hasElevator = hasElevator, + elevatorStairInfo = elevatorStairInfo.toDTO(), + elevatorStairHeightLevel = null, + elevatorImageUrls = listOf( + "buildingAccessibilityElevatorImage1", + "buildingAccessibilityElevatorImage2", + ), + comment = "건물 코멘트", + ) + } + } diff --git a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt index f8bbcc158..9ddef5a2a 100644 --- a/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt +++ b/app-server/subprojects/bounded_context/accessibility/infra/src/main/kotlin/club/staircrusher/accessibility/infra/adapter/in/controller/Converters.kt @@ -83,7 +83,7 @@ fun RegisterBuildingAccessibilityRequestDto.toModel(userId: String?) = entranceImageUrls = entranceImageUrls, hasSlope = hasSlope, hasElevator = hasElevator, - entranceDoorTypes = entranceDoorTypes?.map { it.toModel() } ?: emptyList(), + entranceDoorTypes = entranceDoorTypes?.map { it.toModel() }, elevatorStairInfo = elevatorStairInfo.toModel(), elevatorStairHeightLevel = elevatorStairHeightLevel?.toModel(), elevatorImageUrls = elevatorImageUrls, diff --git a/app-server/subprojects/deploying_apps/local_script/src/main/kotlin/club/staircrusher/data_restore/AccessibilityInserter.kt b/app-server/subprojects/deploying_apps/local_script/src/main/kotlin/club/staircrusher/data_restore/AccessibilityInserter.kt index 4eac2c09e..4e30f7e83 100644 --- a/app-server/subprojects/deploying_apps/local_script/src/main/kotlin/club/staircrusher/data_restore/AccessibilityInserter.kt +++ b/app-server/subprojects/deploying_apps/local_script/src/main/kotlin/club/staircrusher/data_restore/AccessibilityInserter.kt @@ -129,14 +129,18 @@ private fun parseTsvToBuildingList(): List { } val elevatorStairInfo = line[14].parseToStairInfo() + // TODO: 새로운 필드 채우기? BuildingAccessibility( id = EntityIdGenerator.generateRandom(), buildingId = Building.generateId(roadAddress), entranceStairInfo = entranceStairInfo, + entranceStairHeightLevel = null, entranceImageUrls = imageUrls, // TODO: 입구 사진과 엘레베이터 사진으로 나누기 hasSlope = hasSlope, hasElevator = hasElevator, + entranceDoorTypes = emptyList(), elevatorStairInfo = elevatorStairInfo, + elevatorStairHeightLevel = null, elevatorImageUrls = emptyList(), userId = null, createdAt = Instant.now(),