Skip to content
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.konkuk.medicarecall.data.api.elders

import com.konkuk.medicarecall.data.dto.request.ElderBulkHealthInfoRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderBulkRegisterRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderHealthRegisterRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderRegisterRequestDto
import com.konkuk.medicarecall.data.dto.response.ElderBulkRegisterResponseDto
import com.konkuk.medicarecall.data.dto.response.ElderRegisterResponseDto
import retrofit2.Response
import retrofit2.http.Body
Expand All @@ -11,12 +14,22 @@ import retrofit2.http.Path
interface ElderRegisterService {
@POST("elders")
suspend fun postElder(
@Body request: ElderRegisterRequestDto
@Body request: ElderRegisterRequestDto,
): Response<ElderRegisterResponseDto>

@POST("elders/{elderId}/health-info")
suspend fun postElderHealthInfo(
@Path("elderId") elderId: Int,
@Body request: ElderHealthRegisterRequestDto
@Body request: ElderHealthRegisterRequestDto,
): Response<Unit>

@POST("elders/bulk")
suspend fun postElderBulk(
@Body request: ElderBulkRegisterRequestDto,
): Response<ElderBulkRegisterResponseDto>

@POST("elders/health-info/bulk")
suspend fun postElderHealthInfoBulk(
@Body request: ElderBulkHealthInfoRequestDto,
): Response<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.konkuk.medicarecall.data.dto.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ElderBulkHealthInfoRequestDto(
@SerialName("healthInfos")
val healthInfos: List<HealthInfo>
) {
@Serializable
data class HealthInfo(
@SerialName("elderId")
val elderId: Int,
@SerialName("diseaseNames")
val diseaseNames: List<String>,
@SerialName("medicationSchedules")
val medicationSchedules: List<MedicationSchedule>,
@SerialName("notes")
val notes: List<String>
) {
@Serializable
data class MedicationSchedule(
@SerialName("medicationName")
val medicationName: String,
@SerialName("scheduleTimes")
val scheduleTimes: List<String>
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.konkuk.medicarecall.data.dto.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ElderBulkRegisterRequestDto(
@SerialName("elders")
val elders: List<ElderInfo>
) {
@Serializable
data class ElderInfo(
@SerialName("name")
val name: String,
@SerialName("birthDate")
val birthDate: String,
@SerialName("gender")
val gender: String,
@SerialName("phone")
val phone: String,
@SerialName("relationship")
val relationship: String,
@SerialName("residenceType")
val residenceType: String
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.konkuk.medicarecall.data.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

typealias ElderBulkRegisterResponseDto = List<ElderInfo>

@Serializable
data class ElderInfo(
@SerialName("id")
val id: Int,
@SerialName("name")
val name: String,
@SerialName("birthDate")
val birthDate: String,
@SerialName("phone")
val phone: String,
@SerialName("gender")
val gender: String,
@SerialName("relationship")
val relationship: String,
@SerialName("residenceType")
val residenceType: String,
@SerialName("guardianId")
val guardianId: Int,
@SerialName("guardianName")
val guardianName: String
)
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.konkuk.medicarecall.data.repository

import com.konkuk.medicarecall.data.dto.response.ElderBulkRegisterResponseDto
import com.konkuk.medicarecall.ui.model.ElderData
import com.konkuk.medicarecall.ui.model.ElderHealthData

interface ElderRegisterRepository {
suspend fun postElderHealthInfo(id: Int, elderHealthData: ElderHealthData)
suspend fun registerElderAndHealth(
elders: Int,
elderInfoList: List<ElderData>,
elderHealthInfo: List<ElderHealthData>
): Result<Unit>
suspend fun postElderBulk(elderList: List<ElderData>): Result<ElderBulkRegisterResponseDto>
suspend fun postElderHealthInfoBulk(elderHealthList: List<ElderHealthData>): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
package com.konkuk.medicarecall.data.repositoryimpl

import android.util.Log
import com.konkuk.medicarecall.data.api.elders.ElderRegisterService
import com.konkuk.medicarecall.data.dto.request.ElderBulkHealthInfoRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderBulkRegisterRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderHealthRegisterRequestDto
import com.konkuk.medicarecall.data.dto.request.ElderRegisterRequestDto
import com.konkuk.medicarecall.data.dto.response.ElderBulkRegisterResponseDto
import com.konkuk.medicarecall.data.dto.response.ElderRegisterResponseDto
import com.konkuk.medicarecall.data.mapper.ElderHealthMapper
import com.konkuk.medicarecall.data.repository.ElderIdRepository
import com.konkuk.medicarecall.data.repository.ElderRegisterRepository
import com.konkuk.medicarecall.ui.common.util.formatAsDate
import com.konkuk.medicarecall.ui.model.ElderData
import com.konkuk.medicarecall.ui.model.ElderHealthData
import com.konkuk.medicarecall.ui.type.ElderResidenceType
import com.konkuk.medicarecall.ui.type.GenderType
import com.konkuk.medicarecall.ui.type.HealthIssueType
import com.konkuk.medicarecall.ui.type.RelationshipType
import com.konkuk.medicarecall.ui.common.util.formatAsDate
import retrofit2.HttpException
import javax.inject.Inject
import javax.inject.Singleton
Expand Down Expand Up @@ -60,32 +62,50 @@ class ElderRegisterRepositoryImpl @Inject constructor(
}
}

override suspend fun registerElderAndHealth(
elders: Int,
elderInfoList: List<ElderData>,
elderHealthInfo: List<ElderHealthData>,
): Result<Unit> {
return runCatching {
repeat(elders) { index ->
// 이미 등록돼 있지 않은 어르신일 경우 실행
if (elderInfoList[index].id == null) {
val elderResponse = postElder(
elderInfoList[index],
override suspend fun postElderBulk(elderList: List<ElderData>): Result<ElderBulkRegisterResponseDto> = runCatching {
val response = elderRegisterService.postElderBulk(
ElderBulkRegisterRequestDto(
elders = elderList.map { elderData ->
ElderBulkRegisterRequestDto.ElderInfo(
name = elderData.name,
birthDate = elderData.birthDate.formatAsDate(),
gender = if (elderData.gender) GenderType.MALE.name else GenderType.FEMALE.name,
phone = elderData.phoneNumber,
relationship = RelationshipType.entries.find { it.displayName == elderData.relationship }!!.name,
residenceType = ElderResidenceType.entries.find { it.displayName == elderData.livingType }!!.name,
)
// postElder가 성공적으로 끝나야만 이 라인으로 넘어올 수 있음
val id = elderResponse.id
val name = elderResponse.name
elderIdRepository.addElderId(name, id)
elderInfoList[index].id = id
Log.d("httplog", "어르신 등록 성공, id: $id")
postElderHealthInfo(
id,
elderHealthInfo[index],
},
),
)
if (response.isSuccessful) {
response.body() ?: throw IllegalStateException("Response body is null")
} else {
throw HttpException(response)
}
}

override suspend fun postElderHealthInfoBulk(elderHealthList: List<ElderHealthData>): Result<Unit> = runCatching {
val response = elderRegisterService.postElderHealthInfoBulk(
ElderBulkHealthInfoRequestDto(
healthInfos = elderHealthList.map { elderHealthData ->
ElderBulkHealthInfoRequestDto.HealthInfo(
elderId = elderHealthData.id!!,
diseaseNames = elderHealthData.diseaseNames,
medicationSchedules = ElderHealthMapper.toRequestSchedules(elderHealthData.medicationMap).map { schedule ->
ElderBulkHealthInfoRequestDto.HealthInfo.MedicationSchedule(
medicationName = schedule.medicationName,
scheduleTimes = schedule.scheduleTimes.map { it.name },
)
},
notes = elderHealthData.notes.map { note ->
HealthIssueType.entries.find { it.displayName == note }!!.name
},
)
Log.d("httplog", "어르신 건강정보 등록 성공")
elderHealthInfo[index].id = id
}
}
},
),
)
if (!response.isSuccessful) {
throw HttpException(response)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ fun ElderChip(
selected: Boolean,
onRemove: () -> Unit,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Surface(
shape = RoundedCornerShape(100.dp),
color = if (selected) MediCareCallTheme.colors.g50 else MediCareCallTheme.colors.bg,
modifier = Modifier
modifier = modifier
.border(
(1.2).dp,
if (selected) MediCareCallTheme.colors.main
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ fun LoginElderScreen(
}
else {
loginElderViewModel.initElderHealthData()
loginElderViewModel.postElderBulk()
navController.navigate(Route.LoginElderMedInfoScreen.route)
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.konkuk.medicarecall.ui.feature.login.senior.viewmodel.LoginElderViewM
import com.konkuk.medicarecall.ui.theme.MediCareCallTheme
import com.konkuk.medicarecall.ui.type.CTAButtonType
import com.konkuk.medicarecall.ui.type.HealthIssueType
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

Expand Down Expand Up @@ -191,10 +192,7 @@ fun LoginElderMedInfoScreen(
"다음",
{
coroutineScope.launch {
loginElderViewModel.updateAllElders()
loginElderViewModel.updateAllEldersHealthInfo()
loginElderViewModel.postElderAndHealth()
delay(200L)
loginElderViewModel.postElderHealthInfoBulk()
navController.navigate(Route.SetCall.route) {
popUpTo(Route.LoginElderInfoScreen.route) {
inclusive = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import retrofit2.HttpException
import javax.inject.Inject

@HiltViewModel
Expand Down Expand Up @@ -117,11 +118,7 @@ class LoginElderViewModel @Inject constructor(

fun isInputComplete(): Boolean {
return elderUiState.value.eldersList.all {
it.name.isNotBlank() &&
it.birthDate.length == 8 &&
it.phoneNumber.length == 11 &&
it.relationship.isNotBlank() &&
it.livingType.isNotBlank()
it.name.isNotBlank() && it.birthDate.length == 8 && it.phoneNumber.length == 11 && it.relationship.isNotBlank() && it.livingType.isNotBlank()
}

}
Expand Down Expand Up @@ -224,10 +221,9 @@ class LoginElderViewModel @Inject constructor(
if (index == state.selectedIndex) {
val currentList = elder.medicationMap[time] ?: emptyList()

val updatedMap =
elder.medicationMap + if (medicine !in (elder.medicationMap[time]
?: emptyList())
) (time to (currentList + medicine)) else return
val updatedMap = elder.medicationMap + if (medicine !in (elder.medicationMap[time]
?: emptyList())
) (time to (currentList + medicine)) else return
elder.copy(medicationMap = updatedMap)
} else {
elder
Expand Down Expand Up @@ -272,23 +268,49 @@ class LoginElderViewModel @Inject constructor(


// ------------------API 요청------------------
fun postElderAndHealth() {
fun postElderBulk() {
viewModelScope.launch {
elderRegisterRepository.registerElderAndHealth(
elders = elderUiState.value.eldersList.size,
elderInfoList = elderUiState.value.eldersList,
elderHealthInfo = elderHealthUiState.value.elderHealthList,
)
.onSuccess {
Log.d("httplog", "어르신 및 건강정보 전부 등록 성공!")
elderRegisterRepository.postElderBulk(elderUiState.value.eldersList)
.onSuccess { response ->
_elderUiState.update { state ->
state.copy(
eldersList = state.eldersList.mapIndexed { index, elderData ->
elderData.copy(id = response[index].id)
},
)
}
_elderHealthUiState.update { state ->
state.copy(
elderHealthList = state.elderHealthList.mapIndexed { index, healthData ->
healthData.copy(id = response[index].id)
},
)
}
}
.onFailure { exception ->
Log.e("httplog", "어르신 정보 or 건강정보 등록 실패: ${exception.message}")
when (exception) {
is HttpException -> {
Log.e("httplog", "어르신 일괄등록 실패: ${exception.code()}, ${exception.message()}")
}
}
Comment on lines +271 to +295
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일괄처리 코드 깔끔하게 잘 작성하신 거 같아요 !

}

}
}

suspend fun postElderHealthInfoBulk() {
elderRegisterRepository.postElderHealthInfoBulk(elderHealthUiState.value.elderHealthList)
.onSuccess {
Log.d("elderHealthRegister", "Success")
}
.onFailure { exception ->
when (exception) {
is HttpException -> {
Log.e("elderHealthRegister", "어르신 건강정보 일괄등록 실패: ${exception.code()}, ${exception.message()}")
}
}
}
}

fun updateAllElders() { // getElderIds.isNotEmpty == true
viewModelScope.launch {
val elderIds = elderIdRepository.getElderIds()
Expand Down