Skip to content

Commit

Permalink
1차 작업
Browse files Browse the repository at this point in the history
  • Loading branch information
yongseongkim committed Mar 24, 2024
1 parent 0640b17 commit 7cc28f4
Show file tree
Hide file tree
Showing 15 changed files with 256 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,9 @@ class AccessibilityApplicationService(
createPlaceAccessibilityParams: PlaceAccessibilityRepository.CreateParams,
createPlaceAccessibilityCommentParams: PlaceAccessibilityCommentRepository.CreateParams?,
): RegisterPlaceAccessibilityResult {
if (createPlaceAccessibilityParams.isValid().not()) {
throw SccDomainException("잘못된 접근성 정보입니다. 필수 항목을 모두 입력해주세요.")
}
if (placeAccessibilityRepository.findByPlaceId(createPlaceAccessibilityParams.placeId) != null) {
throw SccDomainException("이미 접근성 정보가 등록된 장소입니다.")
}
Expand All @@ -233,9 +236,13 @@ class AccessibilityApplicationService(
PlaceAccessibility(
id = EntityIdGenerator.generateRandom(),
placeId = createPlaceAccessibilityParams.placeId,
floors = createPlaceAccessibilityParams.floors,
isFirstFloor = createPlaceAccessibilityParams.isFirstFloor,
isStairOnlyOption = createPlaceAccessibilityParams.isStairOnlyOption,
stairInfo = createPlaceAccessibilityParams.stairInfo,
stairHeightLevel = createPlaceAccessibilityParams.stairHeightLevel,
hasSlope = createPlaceAccessibilityParams.hasSlope,
entranceDoorTypes = createPlaceAccessibilityParams.entranceDoorTypes,
imageUrls = createPlaceAccessibilityParams.imageUrls,
userId = createPlaceAccessibilityParams.userId,
createdAt = clock.instant(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package club.staircrusher.accessibility.application.port.out.persistence

import club.staircrusher.accessibility.domain.model.EntranceDoorType
import club.staircrusher.accessibility.domain.model.PlaceAccessibility
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
Expand All @@ -15,12 +17,28 @@ interface PlaceAccessibilityRepository : EntityRepository<PlaceAccessibility, St
fun findByBuildingId(buildingId: String): List<PlaceAccessibility>
fun countAll(): Int
fun remove(id: String)

data class CreateParams(
val placeId: String,
val userId: String?,
val floors: List<Int>?,
val isFirstFloor: Boolean,
val isStairOnlyOption: Boolean?,
val stairInfo: StairInfo,
val stairHeightLevel: StairHeightLevel?,
val hasSlope: Boolean,
val userId: String?,
val entranceDoorTypes: List<EntranceDoorType>?,
val imageUrls: List<String>,
)
) {
fun isValid(): Boolean {
// 0401 버전에서 추가된 항목이 모두 있거나 모두 없거나
if (floors == null && isStairOnlyOption == null && stairHeightLevel == null && entranceDoorTypes == null) {
return true
}
if (floors != null && isStairOnlyOption != null && stairHeightLevel != null && entranceDoorTypes != null) {
return true
}
return false
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package club.staircrusher.accessibility.domain.model

enum class EntranceDoorType {
None,
Hinged,
Sliding,
Revolving,
Automatic,
ETC
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@ import java.time.Instant
data class PlaceAccessibility(
val id: String,
val placeId: String,
val floors: List<Int>?,
val isFirstFloor: Boolean,
val isStairOnlyOption: Boolean?,
val stairInfo: StairInfo,
val stairHeightLevel: StairHeightLevel?,
val hasSlope: Boolean,
val entranceDoorTypes: List<EntranceDoorType>?,
val imageUrls: List<String>,
val userId: String?,
val createdAt: Instant,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package club.staircrusher.accessibility.domain.model

enum class StairHeightLevel {
HALF_THUMB,
THUMB,
OVER_THUMB,
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ 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.EntranceDoorType
import club.staircrusher.api.spec.dto.RegisterPlaceAccessibilityPost200Response
import club.staircrusher.api.spec.dto.RegisterPlaceAccessibilityRequestDto
import club.staircrusher.api.spec.dto.StairHeightLevel
import club.staircrusher.challenge.application.port.out.persistence.ChallengeContributionRepository
import club.staircrusher.challenge.application.port.out.persistence.ChallengeParticipationRepository
import club.staircrusher.challenge.domain.model.Challenge
Expand All @@ -16,6 +18,7 @@ import club.staircrusher.challenge.domain.model.ChallengeAddressCondition
import club.staircrusher.challenge.domain.model.ChallengeCondition
import club.staircrusher.place.domain.model.BuildingAddress
import club.staircrusher.place.domain.model.Place
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.Assertions.assertNull
Expand Down Expand Up @@ -51,17 +54,13 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
}

@Test
fun testRegisterPlaceAccessibility() {
fun `240401 이전 버전에서 층 정보(1층인지), 매장 입구 정보(계단, 경사로 유무), 의견이 정상적으로 등록된다`() {
repeat(3) { idx ->
val expectedRegisteredUserOrder = idx + 1
val user = transactionManager.doInTransaction {
testDataGenerator.createUser()
}
val place = transactionManager.doInTransaction {
testDataGenerator.createBuildingAndPlace(placeName = "장소장소")
}
val user = transactionManager.doInTransaction { testDataGenerator.createUser() }
val place = transactionManager.doInTransaction { testDataGenerator.createBuildingAndPlace(placeName = "장소장소") }

val params = getDefaultRequestParams(place)
val params = getDefaultRegisterPlaceAccessibilityRequestParamsBefore240401(place)
mvc
.sccRequest("/registerPlaceAccessibility", params, user = user)
.apply {
Expand All @@ -88,6 +87,60 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
}
}

@Test
fun `기존 정보에서 추가된 정보(몇층인지, 계단 높이 단위, 출입문 유형)가 정상적으로 등록된다`() {
repeat(3) { idx ->
val expectedRegisteredUserOrder = idx + 1
val user = transactionManager.doInTransaction { testDataGenerator.createUser() }
val place = transactionManager.doInTransaction { testDataGenerator.createBuildingAndPlace(placeName = "장소장소") }
val nthFloorParams = getRegisterPlaceAccessibilityRequestParamsAfter240401(place, listOf(3, 4))
mvc
.sccRequest("/registerPlaceAccessibility", nthFloorParams, user = user)
.apply {
val result = getResult(RegisterPlaceAccessibilityPost200Response::class)
val accessibilityInfo = result.accessibilityInfo
assertNull(accessibilityInfo.buildingAccessibility)
assertTrue(accessibilityInfo.buildingAccessibilityComments.isEmpty())

val placeAccessibility = accessibilityInfo.placeAccessibility!!
assertEquals(place.id, placeAccessibility.placeId)
assertArrayEquals(nthFloorParams.floors?.toIntArray(), placeAccessibility.floors?.toIntArray())
assertFalse(placeAccessibility.isFirstFloor)
assertEquals(nthFloorParams.isStairOnlyOption, placeAccessibility.isStairOnlyOption)
assertEquals(nthFloorParams.stairInfo, placeAccessibility.stairInfo)
assertEquals(nthFloorParams.stairHeightLevel, placeAccessibility.stairHeightLevel)
assertEquals(nthFloorParams.hasSlope, placeAccessibility.hasSlope)
assertArrayEquals(nthFloorParams.imageUrls.toTypedArray(), placeAccessibility.imageUrls.toTypedArray())
assertArrayEquals(nthFloorParams.entranceDoorTypes?.toTypedArray(), placeAccessibility.entranceDoorTypes?.toTypedArray())

val placeAccessibilityComments = accessibilityInfo.placeAccessibilityComments
assertEquals(1, placeAccessibilityComments.size)
assertEquals(place.id, placeAccessibilityComments[0].placeId)
assertEquals(user.id, placeAccessibilityComments[0].user!!.id)
assertEquals("장소 코멘트", placeAccessibilityComments[0].comment)

assertEquals(expectedRegisteredUserOrder, result.registeredUserOrder)
}
}

// 1층인 경우
val user = transactionManager.doInTransaction { testDataGenerator.createUser() }
val place = transactionManager.doInTransaction { testDataGenerator.createBuildingAndPlace(placeName = "장소장소") }
val firstFloorPlaceParams = getRegisterPlaceAccessibilityRequestParamsAfter240401(place, listOf(1))
mvc
.sccRequest("/registerPlaceAccessibility", firstFloorPlaceParams, user = user)
.apply {
val result = getResult(RegisterPlaceAccessibilityPost200Response::class)
val accessibilityInfo = result.accessibilityInfo
assertNull(accessibilityInfo.buildingAccessibility)
assertTrue(accessibilityInfo.buildingAccessibilityComments.isEmpty())

val placeAccessibility = accessibilityInfo.placeAccessibility!!
assertEquals(place.id, placeAccessibility.placeId)
assertTrue(placeAccessibility.isFirstFloor)
}
}

@Test
fun `로그인되어 있지 않으면 등록이 안 된다`() {
val user = transactionManager.doInTransaction {
Expand All @@ -97,7 +150,7 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
testDataGenerator.createBuildingAndPlace(placeName = "장소장소")
}
mvc
.sccRequest("/registerPlaceAccessibility", getDefaultRequestParams(place))
.sccRequest("/registerPlaceAccessibility", getRegisterPlaceAccessibilityRequestParamsAfter240401(place, listOf(2)))
.andExpect {
status {
isUnauthorized()
Expand Down Expand Up @@ -125,7 +178,7 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
)
}
mvc
.sccRequest("/registerPlaceAccessibility", getDefaultRequestParams(place), user = user)
.sccRequest("/registerPlaceAccessibility", getRegisterPlaceAccessibilityRequestParamsAfter240401(place), user = user)
.andExpect {
status {
isBadRequest()
Expand Down Expand Up @@ -169,7 +222,7 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
mvc
.sccRequest(
"/registerPlaceAccessibility",
getDefaultRequestParams(place),
getRegisterPlaceAccessibilityRequestParamsAfter240401(place),
user = user
)
.andExpect { status { is2xxSuccessful() } }
Expand Down Expand Up @@ -246,7 +299,7 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
mvc
.sccRequest(
"/registerPlaceAccessibility",
getDefaultRequestParams(place),
getRegisterPlaceAccessibilityRequestParamsAfter240401(place),
user = user
)
.andExpect { status { is2xxSuccessful() } }
Expand Down Expand Up @@ -291,7 +344,7 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
mvc
.sccRequest(
"/registerPlaceAccessibility",
getDefaultRequestParams(place),
getRegisterPlaceAccessibilityRequestParamsAfter240401(place),
user = user
)
.andExpect { status { is2xxSuccessful() } }
Expand All @@ -301,7 +354,8 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
assertTrue(contributions.isEmpty())
}

private fun getDefaultRequestParams(place: Place): RegisterPlaceAccessibilityRequestDto {
// 240401 이후 버전부터 몇층인지, 계단 높이 단위, 출입문 유형을 추가로 등록할 수 있다.
private fun getDefaultRegisterPlaceAccessibilityRequestParamsBefore240401(place: Place): RegisterPlaceAccessibilityRequestDto {
return RegisterPlaceAccessibilityRequestDto(
placeId = place.id,
isFirstFloor = false,
Expand All @@ -311,4 +365,26 @@ class RegisterPlaceAccessibilityTest : AccessibilityITBase() {
comment = "장소 코멘트",
)
}

private fun getRegisterPlaceAccessibilityRequestParamsAfter240401(
place: Place,
floors: List<Int> = listOf(1),
isStairOnlyOption: Boolean = false,
stairInfo: StairInfo = StairInfo.ONE,
stairHeightLevel: StairHeightLevel = StairHeightLevel.hALFTHUMB,
hasSlope: Boolean = true,
entranceDoorTypes: List<EntranceDoorType> = listOf(EntranceDoorType.sliding, EntranceDoorType.automatic)
): RegisterPlaceAccessibilityRequestDto {
return RegisterPlaceAccessibilityRequestDto(
placeId = place.id,
floors = floors,
isStairOnlyOption = isStairOnlyOption,
imageUrls = emptyList(),
stairInfo = stairInfo.toDTO(),
stairHeightLevel = stairHeightLevel,
hasSlope = hasSlope,
entranceDoorTypes = entranceDoorTypes,
comment = "장소 코멘트",
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import club.staircrusher.accessibility.application.port.out.persistence.PlaceAcc
import club.staircrusher.accessibility.domain.model.AccessibilityRank
import club.staircrusher.accessibility.domain.model.BuildingAccessibility
import club.staircrusher.accessibility.domain.model.BuildingAccessibilityComment
import club.staircrusher.accessibility.domain.model.EntranceDoorType
import club.staircrusher.accessibility.domain.model.PlaceAccessibility
import club.staircrusher.accessibility.domain.model.PlaceAccessibilityComment
import club.staircrusher.accessibility.domain.model.StairHeightLevel
import club.staircrusher.accessibility.domain.model.StairInfo
import club.staircrusher.api.converter.toDTO
import club.staircrusher.api.spec.dto.AccessibilityInfoDto
Expand Down Expand Up @@ -96,11 +98,15 @@ fun PlaceAccessibility.toDTO(
isLastInBuilding: Boolean,
) = club.staircrusher.api.spec.dto.PlaceAccessibility(
id = id,
placeId = placeId,
floors = floors,
isFirstFloor = isFirstFloor,
isStairOnlyOption = isStairOnlyOption,
imageUrls = imageUrls,
stairInfo = stairInfo.toDTO(),
stairHeightLevel = stairHeightLevel?.toDTO(),
hasSlope = hasSlope,
imageUrls = imageUrls,
placeId = placeId,
entranceDoorTypes = entranceDoorTypes?.map { it.toDTO() },
registeredUserName = registeredAccessibilityRegisterer?.nickname,
deletionInfo = if (isDeletable(authUser?.id)) {
PlaceAccessibilityDeletionInfo(
Expand All @@ -127,13 +133,47 @@ fun StairInfo.toDTO() = when (this) {
StairInfo.OVER_SIX -> club.staircrusher.api.spec.dto.StairInfo.oVERSIX
}

fun club.staircrusher.api.spec.dto.StairHeightLevel.toModel() = when (this) {
club.staircrusher.api.spec.dto.StairHeightLevel.hALFTHUMB -> StairHeightLevel.HALF_THUMB
club.staircrusher.api.spec.dto.StairHeightLevel.tHUMB -> StairHeightLevel.THUMB
club.staircrusher.api.spec.dto.StairHeightLevel.oVERTHUMB -> StairHeightLevel.OVER_THUMB
}

fun StairHeightLevel.toDTO() = when (this) {
StairHeightLevel.HALF_THUMB -> club.staircrusher.api.spec.dto.StairHeightLevel.hALFTHUMB
StairHeightLevel.THUMB -> club.staircrusher.api.spec.dto.StairHeightLevel.tHUMB
StairHeightLevel.OVER_THUMB -> club.staircrusher.api.spec.dto.StairHeightLevel.oVERTHUMB
}

fun club.staircrusher.api.spec.dto.EntranceDoorType.toModel() = when (this) {
club.staircrusher.api.spec.dto.EntranceDoorType.none -> EntranceDoorType.None
club.staircrusher.api.spec.dto.EntranceDoorType.hinged -> EntranceDoorType.Hinged
club.staircrusher.api.spec.dto.EntranceDoorType.sliding -> EntranceDoorType.Sliding
club.staircrusher.api.spec.dto.EntranceDoorType.revolving -> EntranceDoorType.Revolving
club.staircrusher.api.spec.dto.EntranceDoorType.automatic -> EntranceDoorType.Automatic
club.staircrusher.api.spec.dto.EntranceDoorType.eTC -> EntranceDoorType.ETC
}

fun EntranceDoorType.toDTO() = when (this) {
EntranceDoorType.None -> club.staircrusher.api.spec.dto.EntranceDoorType.none
EntranceDoorType.Hinged -> club.staircrusher.api.spec.dto.EntranceDoorType.hinged
EntranceDoorType.Sliding -> club.staircrusher.api.spec.dto.EntranceDoorType.sliding
EntranceDoorType.Revolving -> club.staircrusher.api.spec.dto.EntranceDoorType.revolving
EntranceDoorType.Automatic -> club.staircrusher.api.spec.dto.EntranceDoorType.automatic
EntranceDoorType.ETC -> club.staircrusher.api.spec.dto.EntranceDoorType.eTC
}

fun RegisterPlaceAccessibilityRequestDto.toModel(userId: String?) =
PlaceAccessibilityRepository.CreateParams(
placeId = placeId,
isFirstFloor = isFirstFloor,
floors = floors,
isFirstFloor = isFirstFloor ?: floors?.let { it.size == 1 && it.firstOrNull() == 1 } ?: false,
isStairOnlyOption = isStairOnlyOption,
stairInfo = stairInfo.toModel(),
stairHeightLevel = stairHeightLevel?.toModel(),
hasSlope = hasSlope,
imageUrls = imageUrls,
entranceDoorTypes = entranceDoorTypes?.map { it.toModel() },
userId = userId,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,13 @@ fun BuildingAccessibilityUpvote.toPersistenceModel() = Building_accessibility_up
fun Place_accessibility.toDomainModel() = PlaceAccessibility(
id = id,
placeId = place_id,
floors = floors,
isFirstFloor = is_first_floor,
isStairOnlyOption = is_stair_only_option,
stairInfo = StairInfo.valueOf(stair_info),
stairHeightLevel = stair_height_level,
hasSlope = has_slope,
entranceDoorTypes = entrance_door_types,
imageUrls = image_urls,
userId = user_id,
createdAt = created_at.toInstant(),
Expand All @@ -137,9 +141,13 @@ fun Place_accessibility.toDomainModel() = PlaceAccessibility(
fun PlaceAccessibility.toPersistenceModel() = Place_accessibility(
id = id,
place_id = placeId,
floors = floors ?: emptyList(),
is_first_floor = isFirstFloor,
is_stair_only_option = isStairOnlyOption,
stair_info = stairInfo.name,
stair_height_level = stairHeightLevel,
has_slope = hasSlope,
entrance_door_types = entranceDoorTypes ?: emptyList(),
image_urls = imageUrls,
user_id = userId,
created_at = createdAt.toOffsetDateTime(),
Expand Down Expand Up @@ -187,9 +195,9 @@ fun Accessibility_rank.toDomainModel() = AccessibilityRank(
fun AccessibilityAllowedRegion.toPersistenceModel() = Accessibility_allowed_region(
id = id,
name = name,
boundary_vertices = boundaryVertices,
created_at = createdAt.toOffsetDateTime(),
updated_at = updatedAt.toOffsetDateTime(),
boundary_vertices = boundaryVertices,
created_at = createdAt.toOffsetDateTime(),
updated_at = updatedAt.toOffsetDateTime(),
)

fun Accessibility_allowed_region.toDomainModel() = AccessibilityAllowedRegion(
Expand Down
Loading

0 comments on commit 7cc28f4

Please sign in to comment.