diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0088a48dc..181288abb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,13 +53,12 @@ android { checkDependencies = true ignoreTestSources = true } + hilt { + enableAggregatingTask = true + } } -hilt { - enableAggregatingTask = true -} - dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b2e30ebc1..5c1534f26 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_medilenz" android:label="@string/app_name" + android:supportsRtl="false" android:theme="@style/Theme.MediProject" android:usesCleartextTraffic="true"> (ActivityMa @Inject lateinit var layoutController: LayoutController @Inject lateinit var systemBarController: SystemBarController - @Inject lateinit var internetNetworkListener: InternetNetworkListener + @Inject lateinit var networkStatusManager: NetworkStatusManager @Inject lateinit var systemBarColorAnalyzer: SystemBarColorAnalyzer override val activityViewModel: MainViewModel by viewModels() private lateinit var navController: NavController - @OptIn(NavigationUiSaveStateControl::class) override fun afterBinding() { systemBarController.init(this, window, this) systemBarColorAnalyzer.init(this, systemBarController, lifecycle) - internetNetworkListener.activityLifeCycle = lifecycle - internetNetworkListener.networkStateCallback = InternetNetworkListener.NetworkStateCallback { isConnected -> + networkStatusManager.activityLifeCycle = lifecycle + networkStatusManager.networkStateCallback = NetworkStatusManager.NetworkStateCallback { isConnected -> if (!isConnected) { NetworkStateDialogFragment().show(supportFragmentManager, NetworkStateDialogFragment::class.java.name) } diff --git a/app/src/main/java/com/android/mediproject/MainViewModel.kt b/app/src/main/java/com/android/mediproject/MainViewModel.kt index 5b946cca0..72132a2fd 100644 --- a/app/src/main/java/com/android/mediproject/MainViewModel.kt +++ b/app/src/main/java/com/android/mediproject/MainViewModel.kt @@ -1,11 +1,11 @@ package com.android.mediproject -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import android.content.res.Resources import androidx.annotation.ArrayRes import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.sign.GetAccountStateUseCase import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 06301e4bd..c9e07e4f4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -17,7 +17,7 @@ { metricParameters.add("plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath) } return metricParameters.toList() -} \ No newline at end of file +} diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 0c690e646..cfbcf160a 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -21,10 +21,10 @@ android { buildConfigField("String", "AWS_BASE_URL", "\"${properties["awsUrl"]}\"") buildConfigField("String", "VERTEX_ENDPOINT_URL", "\"${properties["vertexEndpointUrl"]}\"") } -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } dependencies { diff --git a/core/common/src/main/java/com/android/mediproject/core/common/CoroutineExt.kt b/core/common/src/main/java/com/android/mediproject/core/common/CoroutineExt.kt deleted file mode 100644 index aae91441f..000000000 --- a/core/common/src/main/java/com/android/mediproject/core/common/CoroutineExt.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.android.mediproject.core.common - -import androidx.lifecycle.LifecycleOwner -import kotlinx.coroutines.flow.SharedFlow - - -inline fun SharedFlow.collectWithDialog(message: String, lifecycleOwner: LifecycleOwner, crossinline action: suspend (T) -> Unit) { - -} \ No newline at end of file diff --git a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt index 9ab7a1b8c..2b34a8a88 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt @@ -1,6 +1,5 @@ package com.android.mediproject.core.common.bindingadapter -import android.content.res.ColorStateList import android.graphics.Bitmap import android.text.Spanned import android.view.View @@ -27,15 +26,14 @@ object BindingAdapter { textView.text = arr[type.ordinal] } - @BindingAdapter("img") + @BindingAdapter(value = ["img", "caching"], requireAll = false) @JvmStatic - fun loadImage(imageView: ImageView, img: String) { + fun loadImage(imageView: ImageView, img: String, caching: Boolean = true) { if (img.isEmpty()) { imageView.setBackgroundResource(R.drawable.baseline_hide_image_24) - imageView.imageTintList = ColorStateList.valueOf(android.graphics.Color.BLUE) return } - GlideApp.with(imageView.context).load(img).centerInside().skipMemoryCache(false).into(imageView) + GlideApp.with(imageView.context).load(img).centerInside().skipMemoryCache(caching).into(imageView) } @BindingAdapter("img") diff --git a/core/common/src/main/java/com/android/mediproject/core/common/di/CommonModule.kt b/core/common/src/main/java/com/android/mediproject/core/common/di/CommonModule.kt index 19b40e55f..1f1c6fa54 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/di/CommonModule.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/di/CommonModule.kt @@ -1,8 +1,8 @@ package com.android.mediproject.core.common.di -import com.android.mediproject.core.common.uiutil.LayoutController -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.LayoutController +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/core/common/src/main/java/com/android/mediproject/core/common/dialog/ProgressIndicator.kt b/core/common/src/main/java/com/android/mediproject/core/common/dialog/ProgressIndicator.kt index bc71d7746..4ff696dd2 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/dialog/ProgressIndicator.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/dialog/ProgressIndicator.kt @@ -10,7 +10,7 @@ import androidx.core.content.ContextCompat import com.airbnb.lottie.LottieAnimationView import com.airbnb.lottie.LottieDrawable.INFINITE import com.android.mediproject.core.common.R -import com.android.mediproject.core.common.uiutil.dpToPx +import com.android.mediproject.core.common.util.dpToPx class ProgressIndicator(context: Context, textMessage: String?) : ConstraintLayout(context) { @@ -34,18 +34,24 @@ class ProgressIndicator(context: Context, textMessage: String?) : ConstraintLayo init { background = ContextCompat.getDrawable(context, R.drawable.progress_background) - addView(lottie, LayoutParams(LayoutParams.WRAP_CONTENT, dpToPx(context, 31)).apply { - topToTop = LayoutParams.PARENT_ID - startToStart = LayoutParams.PARENT_ID - endToEnd = LayoutParams.PARENT_ID - }) - addView(textView, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { - topToBottom = lottie.id - topMargin = dpToPx(context, 16) - startToStart = LayoutParams.PARENT_ID - endToEnd = LayoutParams.PARENT_ID - }) + addView( + lottie, + LayoutParams(LayoutParams.WRAP_CONTENT, 31.dpToPx()).apply { + topToTop = LayoutParams.PARENT_ID + startToStart = LayoutParams.PARENT_ID + endToEnd = LayoutParams.PARENT_ID + }, + ) + addView( + textView, + LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { + topToBottom = lottie.id + topMargin = 16.dpToPx() + startToStart = LayoutParams.PARENT_ID + endToEnd = LayoutParams.PARENT_ID + }, + ) lottie.playAnimation() } -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt b/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt index 61685fb97..29e702f5e 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt @@ -13,8 +13,8 @@ import android.text.style.UnderlineSpan import androidx.core.content.ContextCompat import androidx.core.text.toSpanned import com.android.mediproject.core.common.R -import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfo -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoDto +import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail +import com.android.mediproject.core.model.granule.GranuleIdentificationInfo import com.android.mediproject.core.model.util.XMLParsedResult import java.lang.ref.WeakReference import javax.inject.Inject @@ -36,9 +36,7 @@ class MedicineInfoMapper @Inject constructor() { * 용법용량 정보 데이터를 UI에 맞게 변환 */ fun toDosageInfo(xmlParsedResult: XMLParsedResult): Spanned { - val stringBuilder = WeakReference(StringBuilder()) - - return stringBuilder.get()?.let { builder -> + return WeakReference(StringBuilder()).get()?.let { builder -> xmlParsedResult.articleList.forEach { article -> builder.append("${article.title}
") article.contentList.forEach { content -> @@ -49,7 +47,6 @@ class MedicineInfoMapper @Inject constructor() { val result = Html.fromHtml(builder.toString(), Html.FROM_HTML_MODE_COMPACT) builder.clear() - stringBuilder.clear() result } ?: "".toSpanned() } @@ -58,9 +55,7 @@ class MedicineInfoMapper @Inject constructor() { * 효능효과 데이터를 UI에 맞게 변환 */ fun toEfficacyEffect(xmlParsedResult: XMLParsedResult): Spanned { - val stringBuilder = WeakReference(StringBuilder()) - - return stringBuilder.get()?.let { builder -> + return WeakReference(StringBuilder()).get()?.let { builder -> xmlParsedResult.articleList.forEach { article -> article.contentList.forEach { content -> builder.append("$content
") @@ -70,7 +65,6 @@ class MedicineInfoMapper @Inject constructor() { val result = Html.fromHtml(builder.toString(), Html.FROM_HTML_MODE_COMPACT) builder.clear() - stringBuilder.clear() result } ?: "".toSpanned() } @@ -78,29 +72,25 @@ class MedicineInfoMapper @Inject constructor() { /** * 의약품 기본 정보 데이터를 UI에 맞게 변환 */ - fun toMedicineInfo(medicineDetailInfo: MedicineDetailInfo): Spanned { - val stringBuilder = WeakReference(StringBuilder()) - - return stringBuilder.get()?.let { builder -> - with(medicineDetailInfo) { + fun toMedicineInfo(medicineDetail: MedicineDetail): Spanned { + return WeakReference(StringBuilder()).get()?.let { builder -> + with(medicineDetail) { builder.append("

의약품 이름: $itemName

").append("

의약품 영문 이름: $itemEnglishName

") .append("

의약품 시퀀스 번호: $itemSequence

").append("

의약품 허가 날짜: $itemPermitDate

") .append("

제조사 이름: $entpName

").append("

제조사 영문 이름: $entpEnglishName

") .append("

제조및수입사: $consignmentManufacturer

").append("

성분 이름: $ingredientName

") .append("

주성분의 영문 이름: $mainIngredientEnglish

").append("

총 함량: $totalContent

") - .append("

저장 방법: $storageMethod

").append("

유효 기간: $validTerm

") - .append("

패키지 단위: $packUnit

") + .append("

저장 방법: $storageMethod

").append("

유효 기간: $validTerm

").append("

패키지 단위: $packUnit

") } val result = Html.fromHtml(builder.toString(), Html.FROM_HTML_MODE_COMPACT) builder.clear() - stringBuilder.clear() result } ?: "".toSpanned() } - suspend fun toGranuleInfo(context: Context, granuleDto: GranuleIdentificationInfoDto): Spanned = + suspend fun toGranuleInfo(context: Context, granuleDto: GranuleIdentificationInfo): Spanned = mutableMapOf>>().apply { // 그룹 1: 의약품 정보 context.resources.getStringArray(R.array.medicineInfo).also { @@ -173,18 +163,16 @@ class MedicineInfoMapper @Inject constructor() { ) } }.let { dataMap -> - val builder = WeakReference(StringBuilder()) - val result = builder.get()?.let { builder -> + val result = WeakReference(StringBuilder()).get()?.run { dataMap.forEach { (title, data) -> - builder.append("

$title

") + append("

$title

") data.forEach { (key, value) -> - builder.append("

$key: $value

") + append("

$key: $value

") } } - Html.fromHtml(builder.toString(), Html.FROM_HTML_MODE_COMPACT).toSpanned() + Html.fromHtml(toString(), Html.FROM_HTML_MODE_COMPACT).toSpanned() } ?: "".toSpanned() - builder.clear() dataMap.clear() result } diff --git a/core/common/src/main/java/com/android/mediproject/core/common/network/di/DispatchersModule.kt b/core/common/src/main/java/com/android/mediproject/core/common/network/di/DispatchersModule.kt index 546bd74fd..89ff38d93 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/network/di/DispatchersModule.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/network/di/DispatchersModule.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.Dispatchers object DispatchersModule { @Provides @Dispatcher(MediDispatchers.IO) - fun providesIODispatcher(): CoroutineDispatcher = Dispatchers.IO + fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO @Provides @Dispatcher(MediDispatchers.Default) @@ -23,4 +23,4 @@ object DispatchersModule { @Provides @Dispatcher(MediDispatchers.Main) fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/paging/PagingUtil.kt b/core/common/src/main/java/com/android/mediproject/core/common/paging/PagingUtil.kt index 13443de22..ab748a5cd 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/paging/PagingUtil.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/paging/PagingUtil.kt @@ -19,9 +19,9 @@ fun PagingDataAdapter<*, *>.setOnStateChangedListener( msgTextView: TextView, listView: RecyclerView, progressBar: CircularProgressIndicator, - emptyMsg: String + emptyMsg: String, ) { - var isFirstLoad = true + var isFirstLoad: Boolean addLoadStateListener { loadState -> isFirstLoad = loadState.refresh is LoadState.Loading if (isFirstLoad) listView.scrollToPosition(0) @@ -30,7 +30,6 @@ fun PagingDataAdapter<*, *>.setOnStateChangedListener( progressBar.isVisible = isFirstLoad listView.isVisible = (!isFirstLoad && (loadState.source.refresh !is LoadState.Loading)) - msgTextView.isVisible = - ((!isFirstLoad && loadState.source.refresh !is LoadState.Loading) && itemCount == 0) + msgTextView.isVisible = ((!isFirstLoad && loadState.source.refresh !is LoadState.Loading) && itemCount == 0) } -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/recyclerview/MListAdapter.kt b/core/common/src/main/java/com/android/mediproject/core/common/recyclerview/MListAdapter.kt new file mode 100644 index 000000000..71cc5a003 --- /dev/null +++ b/core/common/src/main/java/com/android/mediproject/core/common/recyclerview/MListAdapter.kt @@ -0,0 +1,71 @@ +package com.android.mediproject.core.common.recyclerview + +import android.util.Log +import android.view.View +import android.widget.TextView +import androidx.recyclerview.widget.AsyncDifferConfig +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.progressindicator.CircularProgressIndicator + +abstract class MListAdapter : ListAdapter { + private var init = true + private var iView: IView? = null + + constructor(diffCallback: DiffUtil.ItemCallback) : super(diffCallback) + constructor(config: AsyncDifferConfig) : super(config) + + override fun onCurrentListChanged(previousList: MutableList, currentList: MutableList) { + super.onCurrentListChanged(previousList, currentList) + iView?.run { + Log.d( + "MListAdapter", "previousListEmpty : ${previousList.isEmpty()}, currentListEmpty : ${currentList.isEmpty()}", + ) + + msgTextViewIsVisible(if (!init and previousList.isEmpty() and currentList.isEmpty()) View.VISIBLE else View.GONE) + loadTextViewIsVisible(if (init) View.VISIBLE else View.GONE) + progressBarIsVisible(if (init) View.VISIBLE else View.GONE) + listViewIsVisible(if (currentList.isNotEmpty()) View.VISIBLE else View.GONE) + + if (previousList.isEmpty() and currentList.isNotEmpty()) listViewScrollToPosition(0) + init = false + } + } + + fun setOnStateChangedListener( + msgTextView: TextView, + loadTextView: TextView, + listView: RecyclerView, + progressBar: CircularProgressIndicator, + emptyMsg: String, + loadMsg: String, + ) { + iView = IView(msgTextView, loadTextView, listView, progressBar, emptyMsg, loadMsg) + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + iView = null + } + + private class IView( + msgTextView: TextView, + loadTextView: TextView, + listView: RecyclerView, + progressBar: CircularProgressIndicator, + emptyMsg: String, + loadMsg: String, + ) { + val msgTextViewIsVisible: (Int) -> Unit = msgTextView::setVisibility + val loadTextViewIsVisible: (Int) -> Unit = loadTextView::setVisibility + val progressBarIsVisible: (Int) -> Unit = progressBar::setVisibility + val listViewIsVisible: (Int) -> Unit = listView::setVisibility + val listViewScrollToPosition: (Int) -> Unit = listView::scrollToPosition + + init { + msgTextView.text = emptyMsg + loadTextView.text = loadMsg + } + } +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/DimensionUtil.kt b/core/common/src/main/java/com/android/mediproject/core/common/uiutil/DimensionUtil.kt deleted file mode 100644 index ff413156c..000000000 --- a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/DimensionUtil.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.android.mediproject.core.common.uiutil - -import android.content.Context -import android.util.TypedValue - -fun dpToPx(context: Context, dp: Int): Int = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), context.resources.displayMetrics -).toInt() - -fun spToPx(context: Context, sp: Int): Int = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_SP, sp.toFloat(), context.resources.displayMetrics -).toInt() - -fun Int.dpToPx(context: Context): Int = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), context.resources.displayMetrics -).toInt() - -fun Int.spToPx(context: Context): Int = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics -).toInt() \ No newline at end of file diff --git a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/EditableUtil.kt b/core/common/src/main/java/com/android/mediproject/core/common/uiutil/EditableUtil.kt deleted file mode 100644 index 96bf6c8ec..000000000 --- a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/EditableUtil.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.android.mediproject.core.common.uiutil - -import android.text.Editable - - -fun Editable?.isNotEmpty(): Boolean { - return this?.toString()?.length != (0 ?: false) -} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/util/AesCoder.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/AesCoder.kt index 6bc0c2f6a..975812674 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/util/AesCoder.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/AesCoder.kt @@ -12,7 +12,7 @@ import javax.inject.Singleton import kotlin.io.encoding.Base64 import kotlin.io.encoding.ExperimentalEncodingApi - +@Suppress("DEPRECATION") @Singleton class AesCoder @Inject constructor(@ApplicationContext context: Context) { private var secretKey: SecretKeySpec? = null @@ -26,12 +26,10 @@ class AesCoder @Inject constructor(@ApplicationContext context: Context) { ) else context.packageManager.getPackageInfo(context.packageName, 0) - var key: String? = "${packageInfo.firstInstallTime}".repeat(4).substring(0, 32) - key?.apply { + "${packageInfo.firstInstallTime}".repeat(4).substring(0, 32).run { secretKey = SecretKeySpec(toByteArray(charset("UTF-8")), "AES") ivParameterSpec = IvParameterSpec(encodeToByteArray(0, 16)) } - key = null } private fun createSecretKey(plainArray: CharArray): Pair { @@ -44,7 +42,7 @@ class AesCoder @Inject constructor(@ApplicationContext context: Context) { } if (extraLength > 0) { val extra = "5".toByte() - IntRange(0, extraLength - 1).forEachIndexed { index, i -> + IntRange(0, extraLength - 1).forEachIndexed { index, _ -> this[keyLength + index] = extra } } diff --git a/core/common/src/main/java/com/android/mediproject/core/common/util/DimensionUtil.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/DimensionUtil.kt new file mode 100644 index 000000000..11076de7c --- /dev/null +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/DimensionUtil.kt @@ -0,0 +1,13 @@ +package com.android.mediproject.core.common.util + +import android.content.res.Resources +import android.util.TypedValue + + +fun Int.dpToPx(): Int = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics, +).toInt() + +fun Int.spToPx(): Int = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics, +).toInt() diff --git a/core/common/src/main/java/com/android/mediproject/core/common/util/EditableUtil.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/EditableUtil.kt new file mode 100644 index 000000000..2590b6699 --- /dev/null +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/EditableUtil.kt @@ -0,0 +1,8 @@ +package com.android.mediproject.core.common.util + +import android.text.Editable + + +fun Editable?.isNotEmpty(): Boolean { + return this?.toString()?.length != 0 +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/util/KeepFragmentNavigator.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/KeepFragmentNavigator.kt index dbd8ec8da..678db0f6e 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/util/KeepFragmentNavigator.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/KeepFragmentNavigator.kt @@ -25,7 +25,6 @@ import androidx.navigation.Navigator import androidx.navigation.NavigatorProvider import androidx.navigation.NavigatorState import com.android.mediproject.core.common.R -import com.android.mediproject.core.common.uiutil.SystemBarColorAnalyzer import java.lang.ref.WeakReference @Navigator.Name("keep_fragment") @@ -50,7 +49,6 @@ class KeepFragmentNavigator( private val backStack get() = state.backStack private fun createFragmentTransaction( entry: NavBackStackEntry, - navOptions: NavOptions?, ): FragmentTransaction { val destination = entry.destination as Destination var className = destination.className @@ -151,7 +149,7 @@ class KeepFragmentNavigator( } if (!pop) { requireNotNull(entry) { - "The fragment " + fragment + " is unknown to the FragmentNavigator. " + "Please use the navigate() function to add fragments to the " + "FragmentNavigator managed FragmentManager." + "The fragment $fragment is unknown to the FragmentNavigator. Please use the navigate() function to add fragments to the FragmentNavigator managed FragmentManager." } } if (entry != null) { @@ -258,34 +256,6 @@ class KeepFragmentNavigator( override fun createDestination(): Destination = Destination(this) - /** - * Instantiates the Fragment via the FragmentManager's - * [androidx.fragment.app.FragmentFactory]. - * - * Note that this method is **not** responsible for calling - * [Fragment.setArguments] on the returned Fragment instance. - * - * @param context Context providing the correct [ClassLoader] - * @param fragmentManager FragmentManager the Fragment will be added to - * @param className The Fragment to instantiate - * @param args The Fragment's arguments, if any - * @return A new fragment instance. - */ - @Suppress("DeprecatedCallableAddReplaceWith") - @Deprecated( - """Set a custom {@link androidx.fragment.app.FragmentFactory} via - {@link FragmentManager#setFragmentFactory(FragmentFactory)} to control - instantiation of Fragments.""", - ) - private fun instantiateFragment( - context: Context, - fragmentManager: FragmentManager, - className: String, - args: Bundle?, - ): Fragment { - return fragmentManager.fragmentFactory.instantiate(context.classLoader, className) - } - /** * {@inheritDoc} * @@ -329,7 +299,7 @@ class KeepFragmentNavigator( state.pushWithTransition(entry) return } - val ft = createFragmentTransaction(entry, navOptions) + val ft = createFragmentTransaction(entry) if (!initialNavigation) { ft.addToBackStack(entry.id) @@ -367,7 +337,7 @@ class KeepFragmentNavigator( ) return } - val ft = createFragmentTransaction(backStackEntry, null) + val ft = createFragmentTransaction(backStackEntry) if (state.backStack.value.size > 1) { // If the Fragment to be replaced is on the FragmentManager's // back stack, a simple replace() isn't enough so we @@ -384,14 +354,14 @@ class KeepFragmentNavigator( state.onLaunchSingleTop(backStackEntry) } - public override fun onSaveState(): Bundle? { + override fun onSaveState(): Bundle? { if (savedIds.isEmpty()) { return null } return bundleOf(KEY_SAVED_IDS to ArrayList(savedIds)) } - public override fun onRestoreState(savedState: Bundle) { + override fun onRestoreState(savedState: Bundle) { val savedIds = savedState.getStringArrayList(KEY_SAVED_IDS) if (savedIds != null) { this.savedIds.clear() @@ -400,8 +370,7 @@ class KeepFragmentNavigator( } @NavDestination.ClassType(Fragment::class) - public open class Destination - public constructor(fragmentNavigator: Navigator) : NavDestination(fragmentNavigator) { + open class Destination(fragmentNavigator: Navigator) : NavDestination(fragmentNavigator) { /** * Construct a new fragment destination. This destination is not valid until you set the @@ -410,10 +379,10 @@ class KeepFragmentNavigator( * @param navigatorProvider The [NavController] which this destination * will be associated with. */ - public constructor(navigatorProvider: NavigatorProvider) : this(navigatorProvider.getNavigator(KeepFragmentNavigator::class.java)) + constructor(navigatorProvider: NavigatorProvider) : this(navigatorProvider.getNavigator(KeepFragmentNavigator::class.java)) @CallSuper - public override fun onInflate(context: Context, attrs: AttributeSet) { + override fun onInflate(context: Context, attrs: AttributeSet) { super.onInflate(context, attrs) context.resources.obtainAttributes(attrs, R.styleable.KeepFragmentNavigator).use { array -> val className = array.getString(R.styleable.KeepFragmentNavigator_android_name) @@ -427,7 +396,7 @@ class KeepFragmentNavigator( * destination * @return this [Destination] */ - public fun setClassName(className: String): Destination { + fun setClassName(className: String): Destination { _className = className return this } @@ -439,13 +408,13 @@ class KeepFragmentNavigator( * * @throws IllegalStateException when no Fragment class was set. */ - public val className: String + val className: String get() { checkNotNull(_className) { "Fragment class was not set" } return _className as String } - public override fun toString(): String { + override fun toString(): String { val sb = StringBuilder() sb.append(super.toString()) sb.append(" class=") @@ -472,21 +441,21 @@ class KeepFragmentNavigator( /** * Extras that can be passed to FragmentNavigator to enable Fragment specific behavior */ - public class Extras internal constructor(sharedElements: Map) : Navigator.Extras { + class Extras internal constructor(sharedElements: Map) : Navigator.Extras { private val _sharedElements = LinkedHashMap() /** * The map of shared elements associated with these Extras. The returned map * is an [unmodifiable][Map] copy of the underlying map and should be treated as immutable. */ - public val sharedElements: Map + val sharedElements: Map get() = _sharedElements.toMap() /** * Builder for constructing new [Extras] instances. The resulting instances are * immutable. */ - public class Builder { + class Builder { private val _sharedElements = LinkedHashMap() /** @@ -496,7 +465,7 @@ class KeepFragmentNavigator( * @param sharedElements Shared element pairs to add * @return this [Builder] */ - public fun addSharedElements(sharedElements: Map): Builder { + fun addSharedElements(sharedElements: Map): Builder { for ((view, name) in sharedElements) { addSharedElement(view, name) } @@ -514,7 +483,7 @@ class KeepFragmentNavigator( * @return this [Builder] * @see FragmentTransaction.addSharedElement */ - public fun addSharedElement(sharedElement: View, name: String): Builder { + fun addSharedElement(sharedElement: View, name: String): Builder { _sharedElements[sharedElement] = name return this } @@ -524,7 +493,7 @@ class KeepFragmentNavigator( * * @return An immutable [Extras] instance. */ - public fun build(): Extras { + fun build(): Extras { return Extras(_sharedElements) } } diff --git a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/Keyboard.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/Keyboard.kt similarity index 85% rename from core/common/src/main/java/com/android/mediproject/core/common/uiutil/Keyboard.kt rename to core/common/src/main/java/com/android/mediproject/core/common/util/Keyboard.kt index 557e7e4ea..eb283e888 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/Keyboard.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/Keyboard.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.common.uiutil +package com.android.mediproject.core.common.util import android.content.Context import android.view.inputmethod.InputMethodManager @@ -9,13 +9,13 @@ import androidx.fragment.app.Fragment * @return Unit */ fun Fragment.hideKeyboard() { - activity?.also { it -> + activity?.also { // 현재 포커스가 있는 뷰를 찾는다. if (it.currentFocus != null) { // 키보드 숨기기 (it.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow( - it.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS + it.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS, ) } } -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarColorAnalyzer.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarColorAnalyzer.kt similarity index 92% rename from core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarColorAnalyzer.kt rename to core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarColorAnalyzer.kt index 08869f180..c4045223e 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarColorAnalyzer.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarColorAnalyzer.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.common.uiutil +package com.android.mediproject.core.common.util import android.annotation.SuppressLint import android.app.Activity @@ -55,6 +55,8 @@ class SystemBarColorAnalyzer @Inject constructor() { private val criteriaColor = 140 private var systemBarController: SystemBarController? = null + private val delayTime = 80L + private val _statusBarColor = MutableSharedFlow( onBufferOverflow = BufferOverflow.DROP_OLDEST, replay = 1, extraBufferCapacity = 5, @@ -86,12 +88,11 @@ class SystemBarColorAnalyzer @Inject constructor() { } private suspend fun startConvert(): Pair { - val start = System.currentTimeMillis() val statusBarBitmap = Bitmap.createBitmap(decorView.width, statusBarHeight, Bitmap.Config.ARGB_8888) val navigationBarBitmap = Bitmap.createBitmap(decorView.width, navigationBarHeight, Bitmap.Config.ARGB_8888) - val statusBarCopyResult = pixelCopy(Rect(0, 0, decorView.width, statusBarHeight), statusBarBitmap) - val navBarCopyResult = pixelCopy(Rect(0, decorView.height - navigationBarHeight, decorView.width, decorView.height), navigationBarBitmap) + pixelCopy(Rect(0, 0, decorView.width, statusBarHeight), statusBarBitmap) + pixelCopy(Rect(0, decorView.height - navigationBarHeight, decorView.width, decorView.height), navigationBarBitmap) val statusBarColor = statusBarBitmap[10, 10].toColor() val navigationBarColor = navigationBarBitmap[10, 10].toColor() @@ -111,9 +112,6 @@ class SystemBarColorAnalyzer @Inject constructor() { window = activity.window lifecycle.addObserver( object : DefaultLifecycleObserver { - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - } override fun onStart(owner: LifecycleOwner) { super.onStart(owner) @@ -162,7 +160,7 @@ class SystemBarColorAnalyzer @Inject constructor() { waitLock.withLock { if (waiting?.isActive == true) waiting?.cancel() waiting = launch(Dispatchers.Default) { - delay(80) + delay(delayTime) onChangedFragmentFlow.emit(Unit) } } diff --git a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarStyler.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarStyler.kt similarity index 98% rename from core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarStyler.kt rename to core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarStyler.kt index 6d0c64497..33b6871a3 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/uiutil/SystemBarStyler.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/SystemBarStyler.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.common.uiutil +package com.android.mediproject.core.common.util import android.annotation.SuppressLint import android.content.Context diff --git a/core/common/src/main/java/com/android/mediproject/core/common/util/UriBuilder.kt b/core/common/src/main/java/com/android/mediproject/core/common/util/UriBuilder.kt index 5ae76c1bc..2a7ca24df 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/util/UriBuilder.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/util/UriBuilder.kt @@ -13,7 +13,7 @@ import androidx.navigation.NavDeepLinkRequest import androidx.navigation.NavDestination import androidx.navigation.NavOptions import androidx.navigation.NavType -import com.android.mediproject.core.model.local.navargs.BaseNavArgs +import com.android.mediproject.core.model.navargs.BaseNavArgs /** * Uri Builder @@ -70,7 +70,7 @@ private fun toBaseUri(deepLinkUrl: String, parameter: Map): Uri = * @param parameter DeepLink에 들어갈 파라미터 */ fun NavController.navigateByDeepLink( - deepLinkUrl: String, parameter: BaseNavArgs, navOptions: NavOptions? = null + deepLinkUrl: String, parameter: BaseNavArgs, navOptions: NavOptions? = null, ) { val parameterMap = parameter.toMap() toQueryUri(deepLinkUrl, parameterMap).also { finalUri -> @@ -88,8 +88,10 @@ fun NavController.navigateByDeepLink( else -> NavType.ReferenceType } - deepLinkMatch.destination.addArgument(key, - NavArgument.Builder().setType(navType).setIsNullable(true).setDefaultValue(value).build()) + deepLinkMatch.destination.addArgument( + key, + NavArgument.Builder().setType(navType).setIsNullable(true).setDefaultValue(value).build(), + ) } } } @@ -99,7 +101,7 @@ fun NavController.navigateByDeepLink( fun NavController.deepNavigate( - deepLinkUrl: String, parameter: BaseNavArgs, navOptions: NavOptions? = null + deepLinkUrl: String, parameter: BaseNavArgs, navOptions: NavOptions? = null, ) { val parameterMap = parameter.toMap() @@ -121,7 +123,6 @@ fun NavController.deepNavigate( inline fun NavDestination.setArguments(navArgs: N) { navArgs.toMap().forEach { (key, value) -> - if (value == null) return@forEach val navType: NavType = when (value) { is String -> NavType.StringType is Int -> NavType.IntType @@ -146,4 +147,4 @@ inline fun Fragment.navArgs(): NavArgsLazy : Flow { interface MutableEventFlow : EventFlow, FlowCollector -@Suppress("FunctionName") fun MutableEventFlow( - replay: Int = EventFlow.DEFAULT_REPLAY + replay: Int = EventFlow.DEFAULT_REPLAY, ): MutableEventFlow = EventFlowImpl(replay) fun MutableEventFlow.asEventFlow(): EventFlow = ReadOnlyEventFlow(this) @@ -24,7 +25,7 @@ fun MutableEventFlow.asEventFlow(): EventFlow = ReadOnlyEventFlow(this private class ReadOnlyEventFlow(flow: EventFlow) : EventFlow by flow private class EventFlowImpl( - replay: Int + replay: Int, ) : MutableEventFlow { private val flow: MutableSharedFlow> = MutableSharedFlow(replay = replay) @@ -47,4 +48,4 @@ private class EventFlowSlot(val value: T) { private val consumed: AtomicBoolean = AtomicBoolean(false) fun markConsumed(): Boolean = consumed.getAndSet(true) -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/LifecycleExtension.kt b/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/LifecycleExtension.kt index b820413dd..a11315da3 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/LifecycleExtension.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/LifecycleExtension.kt @@ -1,3 +1,5 @@ +package com.android.mediproject.core.common.viewmodel + import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope @@ -9,4 +11,4 @@ fun LifecycleOwner.repeatOnStarted(block: suspend CoroutineScope.() -> Unit) { lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED, block) } -} \ No newline at end of file +} diff --git a/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/UiState.kt b/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/UiState.kt index d7619c1c9..6aa0900e3 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/UiState.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/viewmodel/UiState.kt @@ -9,9 +9,29 @@ package com.android.mediproject.core.common.viewmodel * @see UiState.Error * */ -sealed class UiState { - object Initial : UiState() - object Loading : UiState() - data class Success(val data: R) : UiState() - data class Error(val message: String) : UiState() -} \ No newline at end of file +sealed interface UiState { + object Initial : UiState + object Loading : UiState + data class Success(val data: R) : UiState + data class Error(val message: String) : UiState +} + +fun UiState.isInitalizing(block: () -> Unit): UiState { + if (this is UiState.Initial) block() + return this +} + +fun UiState.isLoading(block: () -> Unit): UiState { + if (this is UiState.Loading) block() + return this +} + +fun UiState.isSuccess(block: (T) -> Unit): UiState { + if (this is UiState.Success) block(data) + return this +} + +fun UiState.isError(block: (String) -> Unit): UiState { + if (this is UiState.Error) block(message) + return this +} diff --git a/core/common/src/main/res/values/navs.xml b/core/common/src/main/res/values/navs.xml new file mode 100644 index 000000000..4140a0109 --- /dev/null +++ b/core/common/src/main/res/values/navs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/core/common/src/main/res/values/strings.xml b/core/common/src/main/res/values/strings.xml index 4f1e71478..5aab4a6ea 100644 --- a/core/common/src/main/res/values/strings.xml +++ b/core/common/src/main/res/values/strings.xml @@ -62,16 +62,6 @@ 이미지 등록 일시 안전 사용 - - 병용 금기 - 특정 연령대 금기 - 임부 금기 - 용량 주의 - 투여기간 주의 - 노인 주의 - 효능군 중복 - 분할 주의 - 첨가제 주의 인터넷 연결이 필요합니다. 찾고 diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index c2ce1d804..a6042ace9 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -5,9 +5,11 @@ plugins { android { namespace = "com.android.mediproject.core.data" -} -hilt { - enableAggregatingTask = true + + hilt { + enableAggregatingTask = true + } + } dependencies { diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/di/RepositoryModule.kt b/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt similarity index 65% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/di/RepositoryModule.kt rename to core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt index a05851322..c5c653780 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/di/RepositoryModule.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt @@ -1,41 +1,41 @@ -package com.android.mediproject.core.data.remote.di +package com.android.mediproject.core.data import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers -import com.android.mediproject.core.data.remote.adminaction.AdminActionRepository -import com.android.mediproject.core.data.remote.adminaction.AdminActionRepositoryImpl -import com.android.mediproject.core.data.remote.comments.CommentsRepository -import com.android.mediproject.core.data.remote.comments.CommentsRepositoryImpl -import com.android.mediproject.core.data.remote.dur.DurRepository -import com.android.mediproject.core.data.remote.dur.DurRepositoryImpl -import com.android.mediproject.core.data.remote.elderlycaution.ElderlyCautionRepository -import com.android.mediproject.core.data.remote.elderlycaution.ElderlyCautionRepositoryImpl -import com.android.mediproject.core.data.remote.favoritemedicine.FavoriteMedicineRepository -import com.android.mediproject.core.data.remote.favoritemedicine.FavoriteMedicineRepositoryImpl -import com.android.mediproject.core.data.remote.granule.GranuleIdentificationRepository -import com.android.mediproject.core.data.remote.granule.GranuleIdentificationRepositoryImpl -import com.android.mediproject.core.data.remote.medicineapproval.MedicineApprovalRepository -import com.android.mediproject.core.data.remote.medicineapproval.MedicineApprovalRepositoryImpl -import com.android.mediproject.core.data.remote.medicineid.MedicineIdRepository -import com.android.mediproject.core.data.remote.medicineid.MedicineIdRepositoryImpl -import com.android.mediproject.core.data.remote.recallsuspension.RecallSuspensionRepository -import com.android.mediproject.core.data.remote.recallsuspension.RecallSuspensionRepositoryImpl -import com.android.mediproject.core.data.remote.sign.SignRepository -import com.android.mediproject.core.data.remote.sign.SignRepositoryImpl -import com.android.mediproject.core.data.remote.token.TokenRepository -import com.android.mediproject.core.data.remote.token.TokenRepositoryImpl -import com.android.mediproject.core.data.remote.user.UserInfoRepository -import com.android.mediproject.core.data.remote.user.UserInfoRepositoryImpl -import com.android.mediproject.core.data.remote.user.UserRepository -import com.android.mediproject.core.data.remote.user.UserRepositoryImpl +import com.android.mediproject.core.data.adminaction.AdminActionRepository +import com.android.mediproject.core.data.adminaction.AdminActionRepositoryImpl +import com.android.mediproject.core.data.comments.CommentsRepository +import com.android.mediproject.core.data.comments.CommentsRepositoryImpl +import com.android.mediproject.core.data.dur.duringr.DurIngrRepository +import com.android.mediproject.core.data.dur.duringr.DurIngrRepositoryImpl +import com.android.mediproject.core.data.dur.durproduct.DurProductRepository +import com.android.mediproject.core.data.dur.durproduct.DurProductRepositoryImpl +import com.android.mediproject.core.data.favoritemedicine.FavoriteMedicineRepository +import com.android.mediproject.core.data.favoritemedicine.FavoriteMedicineRepositoryImpl +import com.android.mediproject.core.data.granule.GranuleIdentificationRepository +import com.android.mediproject.core.data.granule.GranuleIdentificationRepositoryImpl +import com.android.mediproject.core.data.medicineapproval.MedicineApprovalRepository +import com.android.mediproject.core.data.medicineapproval.MedicineApprovalRepositoryImpl +import com.android.mediproject.core.data.medicineid.MedicineIdRepository +import com.android.mediproject.core.data.medicineid.MedicineIdRepositoryImpl +import com.android.mediproject.core.data.recallsuspension.RecallSuspensionRepository +import com.android.mediproject.core.data.recallsuspension.RecallSuspensionRepositoryImpl import com.android.mediproject.core.data.search.SearchHistoryRepository import com.android.mediproject.core.data.search.SearchHistoryRepositoryImpl +import com.android.mediproject.core.data.sign.SignRepository +import com.android.mediproject.core.data.sign.SignRepositoryImpl +import com.android.mediproject.core.data.token.TokenRepository +import com.android.mediproject.core.data.token.TokenRepositoryImpl +import com.android.mediproject.core.data.user.UserInfoRepository +import com.android.mediproject.core.data.user.UserInfoRepositoryImpl +import com.android.mediproject.core.data.user.UserRepository +import com.android.mediproject.core.data.user.UserRepositoryImpl import com.android.mediproject.core.database.cache.manager.MedicineDataCacheManager import com.android.mediproject.core.database.searchhistory.SearchHistoryDao import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.network.datasource.comments.CommentsDataSource -import com.android.mediproject.core.network.datasource.dur.DurDataSource -import com.android.mediproject.core.network.datasource.elderlycaution.ElderlyCautionDataSource +import com.android.mediproject.core.network.datasource.dur.DurIngrDataSource +import com.android.mediproject.core.network.datasource.dur.DurProductDataSource import com.android.mediproject.core.network.datasource.favoritemedicine.FavoriteMedicineDataSource import com.android.mediproject.core.network.datasource.granule.GranuleIdentificationDataSource import com.android.mediproject.core.network.datasource.medicineapproval.MedicineApprovalDataSource @@ -100,13 +100,12 @@ object RepositoryModule { @Provides @Singleton - fun providesElderlyCautionRepository(elderlyCautionDataSource: ElderlyCautionDataSource): ElderlyCautionRepository = - ElderlyCautionRepositoryImpl(elderlyCautionDataSource) + fun providesDurProductRepository(durProductDataSource: DurProductDataSource): DurProductRepository = + DurProductRepositoryImpl(durProductDataSource) @Provides @Singleton - fun providesDurRepository(durDataSource: DurDataSource): DurRepository = DurRepositoryImpl(durDataSource) - + fun providesDurIngrRepository(durIngrDataSource: DurIngrDataSource): DurIngrRepository = DurIngrRepositoryImpl(durIngrDataSource) @Provides @Singleton diff --git a/core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepository.kt new file mode 100644 index 000000000..320dd78d9 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepository.kt @@ -0,0 +1,11 @@ +package com.android.mediproject.core.data.adminaction + +import androidx.paging.PagingData +import com.android.mediproject.core.model.adminaction.AdminActionListResponse +import kotlinx.coroutines.flow.Flow + +interface AdminActionRepository { + suspend fun getAdminActionList( + ): Flow> + +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepositoryImpl.kt similarity index 59% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepositoryImpl.kt index 7b2878ec0..bfe26b55c 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/adminaction/AdminActionRepositoryImpl.kt @@ -1,10 +1,10 @@ -package com.android.mediproject.core.data.remote.adminaction +package com.android.mediproject.core.data.adminaction import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE -import com.android.mediproject.core.model.remote.adminaction.AdminActionListResponse +import com.android.mediproject.core.model.adminaction.AdminActionListResponse import com.android.mediproject.core.network.datasource.penalties.adminaction.AdminActionListDataSourceImpl import kotlinx.coroutines.flow.Flow import javax.inject.Inject @@ -12,9 +12,12 @@ import javax.inject.Inject class AdminActionRepositoryImpl @Inject constructor( private val adminActionListDataSource: AdminActionListDataSourceImpl, ) : AdminActionRepository { - override suspend fun getAdminActionList(): Flow> = - Pager(config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE, prefetchDistance = 5), pagingSourceFactory = { - adminActionListDataSource - }).flow + override suspend fun getAdminActionList(): Flow> = + Pager( + config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE, prefetchDistance = 5), + pagingSourceFactory = { + adminActionListDataSource + }, + ).flow -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepository.kt similarity index 88% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepository.kt index 1568281c9..fcb2c4037 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepository.kt @@ -1,10 +1,10 @@ -package com.android.mediproject.core.data.remote.comments +package com.android.mediproject.core.data.comments import androidx.paging.PagingData import com.android.mediproject.core.model.comments.CommentChangedResponse import com.android.mediproject.core.model.comments.CommentListResponse import com.android.mediproject.core.model.comments.LikeResponse -import com.android.mediproject.core.model.comments.MyCommentDto +import com.android.mediproject.core.model.comments.MyComment import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -19,7 +19,7 @@ interface CommentsRepository { /** * 내가 작성한 댓글을 가져오는 메서드입니다. */ - fun getMyComments(userId: Int): Flow> + fun getMyComments(userId: Int): Flow> /** * 댓글을 수정합니다. @@ -41,4 +41,4 @@ interface CommentsRepository { * 댓글 좋아요 클릭 */ fun likeComment(parameter: LikeCommentParameter): Flow> -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepositoryImpl.kt similarity index 89% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepositoryImpl.kt index 058685318..e685678d1 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/comments/CommentsRepositoryImpl.kt @@ -1,15 +1,15 @@ -package com.android.mediproject.core.data.remote.comments +package com.android.mediproject.core.data.comments import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData -import com.android.mediproject.core.common.AWS_LOAD_PAGE_SIZE -import com.android.mediproject.core.data.remote.token.TokenRepository +import com.android.mediproject.core.common.SERVER_PAGE_SIZE +import com.android.mediproject.core.data.token.TokenRepository import com.android.mediproject.core.model.comments.CommentChangedResponse import com.android.mediproject.core.model.comments.CommentListResponse import com.android.mediproject.core.model.comments.LikeResponse -import com.android.mediproject.core.model.comments.MyCommentDto -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.comments.MyComment +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -28,13 +28,13 @@ class CommentsRepositoryImpl @Inject constructor( ) : CommentsRepository { override fun getCommentsForAMedicine(medicineId: Long): Flow> = Pager( - config = PagingConfig(pageSize = AWS_LOAD_PAGE_SIZE, prefetchDistance = 0), + config = PagingConfig(pageSize = SERVER_PAGE_SIZE, prefetchDistance = 0), pagingSourceFactory = { CommentsListDataSourceImpl(commentsDataSource, medicineId) }, ).flow - override fun getMyComments(userId: Int): Flow> { + override fun getMyComments(userId: Int): Flow> { TODO("Not yet implemented") } diff --git a/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepository.kt new file mode 100644 index 000000000..2ce6f6348 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepository.kt @@ -0,0 +1,4 @@ +package com.android.mediproject.core.data.dur.duringr + +interface DurIngrRepository { +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepositoryImpl.kt new file mode 100644 index 000000000..2c0e76319 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/dur/duringr/DurIngrRepositoryImpl.kt @@ -0,0 +1,8 @@ +package com.android.mediproject.core.data.dur.duringr + +import com.android.mediproject.core.network.datasource.dur.DurIngrDataSource +import javax.inject.Inject + +class DurIngrRepositoryImpl @Inject constructor( + durIngrDataSource: DurIngrDataSource, +) : DurIngrRepository {} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepository.kt new file mode 100644 index 000000000..1b177b559 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepository.kt @@ -0,0 +1,12 @@ +package com.android.mediproject.core.data.dur.durproduct + +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.core.model.dur.DurType +import kotlinx.coroutines.flow.Flow + +interface DurProductRepository { + + fun hasDur(itemName: String?, itemSeq: String?): Flow>> + + fun getDur(itemSeq: String, durTypes: List): Flow>>> +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepositoryImpl.kt new file mode 100644 index 000000000..407b12d37 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/dur/durproduct/DurProductRepositoryImpl.kt @@ -0,0 +1,57 @@ +package com.android.mediproject.core.data.dur.durproduct + +import com.android.mediproject.core.model.DataGoKrResponse +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.core.model.dur.DurItemWrapperFactory +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.network.datasource.dur.DurProductDataSource +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.channelFlow +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import javax.inject.Inject + +class DurProductRepositoryImpl @Inject constructor( + private val durProductDataSource: DurProductDataSource, +) : DurProductRepository { + + private val mapCacheMaxSize = 5 + private val durProductCacheMap = mutableMapOf>>() + private val mutex = Mutex() + + override fun hasDur(itemName: String?, itemSeq: String?): Flow>> = channelFlow { + val response = durProductDataSource.getDurProductList(itemName = itemName, itemSeq = itemSeq) + response.onSuccess { + val durTypeList = it.body.items.firstOrNull()?.typeNames?.map { type -> DurType.typeOf(type) } ?: emptyList() + send(Result.success(durTypeList)) + }.onFailure { + send(Result.failure(it)) + } + } + + override fun getDur(itemSeq: String, durTypes: List): Flow>>> = channelFlow { + val filteredDurTypes = mutex.withLock { + durProductCacheMap[itemSeq]?.keys?.filter { it !in durTypes } ?: durTypes + } + val map = mutableMapOf>>() + durProductDataSource.getDurList(itemSeq, filteredDurTypes).collect { resultMap -> + resultMap.forEach { (durType, response) -> + response.onSuccess { + cache(itemSeq, durType, it) + map[durType] = Result.success(DurItemWrapperFactory.createForDurProduct(durType, it).convert()) + }.onFailure { + map[durType] = Result.failure(it) + } + } + + send(map) + } + } + + private suspend fun cache(key: String, durType: DurType, response: DataGoKrResponse<*>) { + mutex.withLock { + if (durProductCacheMap.size > mapCacheMaxSize) durProductCacheMap.remove(durProductCacheMap.keys.first()) + durProductCacheMap[key] = durProductCacheMap[key]?.apply { this[durType] = response } ?: mutableMapOf(durType to response) + } + } +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepository.kt similarity index 93% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepository.kt index b2810fdbe..5dd19ce39 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepository.kt @@ -1,9 +1,9 @@ -package com.android.mediproject.core.data.remote.favoritemedicine +package com.android.mediproject.core.data.favoritemedicine +import com.android.mediproject.core.model.favoritemedicine.CheckFavoriteMedicineResponse import com.android.mediproject.core.model.favoritemedicine.DeleteFavoriteMedicineResponse import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineListResponse -import com.android.mediproject.core.model.favoritemedicine.CheckFavoriteMedicineResponse import com.android.mediproject.core.model.favoritemedicine.NewFavoriteMedicineResponse import com.android.mediproject.core.model.requestparameters.AddFavoriteMedicineParameter import kotlinx.coroutines.flow.Flow @@ -16,4 +16,4 @@ interface FavoriteMedicineRepository { fun deleteFavoriteMedicine(medicineId: Long): Flow> fun checkFavoriteMedicine(itemSeq: Long): Flow> -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepositoryImpl.kt similarity index 96% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepositoryImpl.kt index 016f03501..c3e0130e0 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/favoritemedicine/FavoriteMedicineRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/favoritemedicine/FavoriteMedicineRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.favoritemedicine +package com.android.mediproject.core.data.favoritemedicine import com.android.mediproject.core.model.favoritemedicine.DeleteFavoriteMedicineResponse import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineListResponse @@ -29,4 +29,4 @@ class FavoriteMedicineRepositoryImpl @Inject constructor(private val favoriteMed override fun checkFavoriteMedicine(itemSeq: Long): Flow> = favoriteMedicineDataSource.checkFavoriteMedicine(itemSeq) -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepository.kt new file mode 100644 index 000000000..ac90ebbd1 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepository.kt @@ -0,0 +1,12 @@ +package com.android.mediproject.core.data.granule + +import com.android.mediproject.core.model.granule.GranuleIdentificationInfoResponse +import kotlinx.coroutines.flow.Flow + +interface GranuleIdentificationRepository { + fun getGranuleIdentificationInfo( + itemName: String?, + entpName: String?, + itemSeq: String?, + ): Flow> +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepositoryImpl.kt similarity index 53% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepositoryImpl.kt index e9d838379..9cb1a4af2 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/granule/GranuleIdentificationRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.granule +package com.android.mediproject.core.data.granule import com.android.mediproject.core.network.datasource.granule.GranuleIdentificationDataSource import kotlinx.coroutines.flow.flatMapLatest @@ -6,18 +6,21 @@ import kotlinx.coroutines.flow.flowOf import javax.inject.Inject class GranuleIdentificationRepositoryImpl @Inject constructor( - private val dataSource: GranuleIdentificationDataSource + private val dataSource: GranuleIdentificationDataSource, ) : GranuleIdentificationRepository { override fun getGranuleIdentificationInfo( - itemName: String?, entpName: String?, itemSeq: String? + itemName: String?, entpName: String?, itemSeq: String?, ) = dataSource.getGranuleIdentificationInfo(itemName = itemName, entpName = entpName, itemSeq = itemSeq).flatMapLatest { result -> - result.fold(onSuccess = { response -> - flowOf(Result.success(response.body.items.first())) - }, onFailure = { - flowOf(Result.failure(it)) - }) + result.fold( + onSuccess = { response -> + flowOf(Result.success(response.body.items.first())) + }, + onFailure = { + flowOf(Result.failure(it)) + }, + ) } -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepository.kt similarity index 63% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepository.kt index 9d51c5ccb..2e2a9a4ab 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepository.kt @@ -1,17 +1,17 @@ -package com.android.mediproject.core.data.remote.medicineapproval +package com.android.mediproject.core.data.medicineapproval import androidx.paging.PagingData -import com.android.mediproject.core.model.medicine.medicineapproval.Item +import com.android.mediproject.core.model.medicine.medicineapproval.MedicineApprovalListResponse import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfoResponse import kotlinx.coroutines.flow.Flow interface MedicineApprovalRepository { - fun getMedicineApprovalList( + suspend fun getMedicineApprovalList( itemName: String?, entpName: String?, medicationType: String?, - ): Flow> + ): Flow> - fun getMedicineDetailInfo(itemName: String): Flow> - fun getMedicineDetailInfoByItemSeq(itemSeqs: List): Flow>> -} \ No newline at end of file + fun getMedicineDetailInfo(itemName: String): Flow> + fun getMedicineDetailInfoByItemSeq(itemSeqs: List): Flow>> +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepositoryImpl.kt similarity index 90% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepositoryImpl.kt index 2e3230f86..e5e78557a 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineapproval/MedicineApprovalRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/medicineapproval/MedicineApprovalRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.medicineapproval +package com.android.mediproject.core.data.medicineapproval import androidx.paging.Pager import androidx.paging.PagingConfig @@ -7,7 +7,7 @@ import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE import com.android.mediproject.core.data.search.SearchHistoryRepository import com.android.mediproject.core.database.cache.manager.MedicineDataCacheManager import com.android.mediproject.core.database.searchhistory.SearchHistoryDto -import com.android.mediproject.core.model.medicine.medicineapproval.Item +import com.android.mediproject.core.model.medicine.medicineapproval.MedicineApprovalListResponse import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfoResponse import com.android.mediproject.core.network.datasource.medicineapproval.MedicineApprovalDataSource import com.android.mediproject.core.network.datasource.medicineapproval.MedicineApprovalListDataSourceImpl @@ -34,7 +34,8 @@ class MedicineApprovalRepositoryImpl @Inject constructor( * @param entpName 업체명 * */ - override fun getMedicineApprovalList(itemName: String?, entpName: String?, medicationType: String?): Flow> { + override suspend fun getMedicineApprovalList(itemName: String?, entpName: String?, medicationType: String?): + Flow> { searchHistoryRepository.insertSearchHistory(SearchHistoryDto(itemName ?: entpName!!)) return Pager( config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE, prefetchDistance = 5), @@ -45,7 +46,7 @@ class MedicineApprovalRepositoryImpl @Inject constructor( } - override fun getMedicineDetailInfo(itemName: String): Flow> = + override fun getMedicineDetailInfo(itemName: String): Flow> = medicineApprovalDataSource.getMedicineDetailInfo(itemName).map { result -> result.fold( onSuccess = { diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepository.kt similarity index 84% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepository.kt index 5cbed655f..463cda481 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepository.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.medicineid +package com.android.mediproject.core.data.medicineid import com.android.mediproject.core.model.medicine.MedicineIdResponse import com.android.mediproject.core.model.requestparameters.GetMedicineIdParameter @@ -6,4 +6,4 @@ import kotlinx.coroutines.flow.Flow interface MedicineIdRepository { fun getMedicineId(getMedicineIdParameter: GetMedicineIdParameter): Flow> -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepositoryImpl.kt similarity index 82% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepositoryImpl.kt index 938f937d7..871654d7c 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/medicineid/MedicineIdRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/medicineid/MedicineIdRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.medicineid +package com.android.mediproject.core.data.medicineid import com.android.mediproject.core.model.medicine.MedicineIdResponse import com.android.mediproject.core.model.requestparameters.GetMedicineIdParameter @@ -7,8 +7,8 @@ import kotlinx.coroutines.flow.Flow import javax.inject.Inject class MedicineIdRepositoryImpl @Inject constructor( - private val medicineIdDataSource: MedicineIdDataSource + private val medicineIdDataSource: MedicineIdDataSource, ) : MedicineIdRepository { override fun getMedicineId(getMedicineIdParameter: GetMedicineIdParameter): Flow> = medicineIdDataSource.getMedicineId(getMedicineIdParameter) -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepository.kt new file mode 100644 index 000000000..f3f819732 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepository.kt @@ -0,0 +1,19 @@ +package com.android.mediproject.core.data.recallsuspension + +import androidx.paging.PagingData +import com.android.mediproject.core.model.recall.DetailRecallSuspensionResponse +import com.android.mediproject.core.model.recall.RecallSuspensionListResponse +import kotlinx.coroutines.flow.Flow + +interface RecallSuspensionRepository { + fun getRecallDisposalList( + ): Flow> + + suspend fun getRecentRecallDisposalList( + pageNo: Int = 1, numOfRows: Int = 15, + ): Result> + + fun getDetailRecallSuspension( + company: String?, product: String?, + ): Flow> +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepositoryImpl.kt similarity index 50% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepositoryImpl.kt index 9ce5abc4a..94c5389ab 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/recallsuspension/RecallSuspensionRepositoryImpl.kt @@ -1,11 +1,11 @@ -package com.android.mediproject.core.data.remote.recallsuspension +package com.android.mediproject.core.data.recallsuspension import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionResponse -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListResponse +import com.android.mediproject.core.model.recall.DetailRecallSuspensionResponse +import com.android.mediproject.core.model.recall.RecallSuspensionListResponse import com.android.mediproject.core.network.datasource.penalties.recallsuspension.RecallSuspensionDataSource import com.android.mediproject.core.network.datasource.penalties.recallsuspension.RecallSuspensionListDataSourceImpl import kotlinx.coroutines.flow.Flow @@ -17,33 +17,36 @@ class RecallSuspensionRepositoryImpl @Inject constructor( private val recallSuspensionListDataSource: RecallSuspensionListDataSourceImpl, ) : RecallSuspensionRepository { - override fun getRecallDisposalList(): Flow> = - Pager(config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE), pagingSourceFactory = { + override fun getRecallDisposalList(): Flow> = Pager( + config = PagingConfig(pageSize = DATA_GO_KR_PAGE_SIZE), + pagingSourceFactory = { recallSuspensionListDataSource - }).flow + }, + ).flow override suspend fun getRecentRecallDisposalList( - pageNo: Int, numOfRows: Int - ): Result> = - recallSuspensionDataSource.getRecallSuspensionList( - pageNo, numOfRows - ).map { - it.body.items.map { item -> - item.item - } + pageNo: Int, numOfRows: Int, + ): Result> = recallSuspensionDataSource.getRecallSuspensionList( + pageNo, numOfRows, + ).map { + it.body.items.map { item -> + item.item } + } override fun getDetailRecallSuspension( - company: String?, product: String? - ): Flow> = - recallSuspensionDataSource.getDetailRecallSuspensionInfo( - company = company, product = product - ).map { result -> - result.fold(onSuccess = { + company: String?, product: String?, + ): Flow> = recallSuspensionDataSource.getDetailRecallSuspensionInfo( + company = company, product = product, + ).map { result -> + result.fold( + onSuccess = { Result.success(it.body.items.first().item) - }, onFailure = { + }, + onFailure = { Result.failure(it) - }) - } + }, + ) + } -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepository.kt deleted file mode 100644 index ae441037e..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/adminaction/AdminActionRepository.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.android.mediproject.core.data.remote.adminaction - -import androidx.paging.PagingData -import com.android.mediproject.core.model.remote.adminaction.AdminActionListResponse -import kotlinx.coroutines.flow.Flow - -interface AdminActionRepository { - suspend fun getAdminActionList( - ): Flow> - -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepository.kt deleted file mode 100644 index a7b3e7745..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepository.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.android.mediproject.core.data.remote.dur - -import com.android.mediproject.core.model.remote.dur.DurResponse -import kotlinx.coroutines.flow.Flow - -interface DurRepository { - suspend fun getDur( - itemName: String?, - itemSeq: String?, - ): Flow> -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepositoryImpl.kt deleted file mode 100644 index b94196a7e..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/dur/DurRepositoryImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.android.mediproject.core.data.remote.dur - -import com.android.mediproject.core.network.datasource.dur.DurDataSource -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map -import javax.inject.Inject - -class DurRepositoryImpl @Inject constructor( - private val dataSource: DurDataSource -) : DurRepository { - override suspend fun getDur(itemName: String?, itemSeq: String?) = channelFlow { - dataSource.getDur(itemName = itemName, itemSeq = itemSeq).map { result -> - result.fold(onSuccess = { Result.success(it.body.items.first()) }, onFailure = { Result.failure(it) }) - }.collectLatest { - send(it) - } - } -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepository.kt deleted file mode 100644 index 2dc6101b4..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepository.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.android.mediproject.core.data.remote.elderlycaution - -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionResponse - -interface ElderlyCautionRepository { - suspend fun getElderlyCaution( - itemName: String?, - itemSeq: String?, - ): Result -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepositoryImpl.kt deleted file mode 100644 index 1e5f0cda9..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/elderlycaution/ElderlyCautionRepositoryImpl.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.android.mediproject.core.data.remote.elderlycaution - -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionResponse -import com.android.mediproject.core.network.datasource.elderlycaution.ElderlyCautionDataSource -import javax.inject.Inject - -class ElderlyCautionRepositoryImpl @Inject constructor(private val dataSource: ElderlyCautionDataSource) : ElderlyCautionRepository { - - override suspend fun getElderlyCaution(itemName: String?, itemSeq: String?): Result = - dataSource.getElderlyCaution(itemName = itemName, itemSeq = itemSeq).map { - it.body.items.first() - } -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepository.kt deleted file mode 100644 index dba517bac..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/granule/GranuleIdentificationRepository.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.android.mediproject.core.data.remote.granule - -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoResponse -import kotlinx.coroutines.flow.Flow - -interface GranuleIdentificationRepository { - fun getGranuleIdentificationInfo( - itemName: String?, - entpName: String?, - itemSeq: String?, - ): Flow> -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepository.kt deleted file mode 100644 index ab3846d6f..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/recallsuspension/RecallSuspensionRepository.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.android.mediproject.core.data.remote.recallsuspension - -import androidx.paging.PagingData -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionResponse -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListResponse -import kotlinx.coroutines.flow.Flow - -interface RecallSuspensionRepository { - fun getRecallDisposalList( - ): Flow> - - suspend fun getRecentRecallDisposalList( - pageNo: Int = 1, numOfRows: Int = 15 - ): Result> - - fun getDetailRecallSuspension( - company: String?, product: String? - ): Flow> -} \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepository.kt deleted file mode 100644 index 5a74740cf..000000000 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepository.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.android.mediproject.core.data.remote.token - -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState -import kotlinx.coroutines.flow.Flow - -interface TokenRepository { - fun getCurrentTokens(): Flow> -} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepository.kt index 6642fa73b..3c5120d82 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepository.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.flow.Flow interface SearchHistoryRepository { @WorkerThread - fun insertSearchHistory(searchHistoryDto: SearchHistoryDto) + suspend fun insertSearchHistory(searchHistoryDto: SearchHistoryDto) @WorkerThread @@ -19,4 +19,4 @@ interface SearchHistoryRepository { @WorkerThread suspend fun deleteAllSearchHistory() -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepositoryImpl.kt index e2b478b81..1c734bc78 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/search/SearchHistoryRepositoryImpl.kt @@ -3,19 +3,20 @@ package com.android.mediproject.core.data.search import com.android.mediproject.core.database.searchhistory.SearchHistoryDao import com.android.mediproject.core.database.searchhistory.SearchHistoryDto import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.runBlocking import javax.inject.Inject class SearchHistoryRepositoryImpl @Inject constructor( - private val searchHistoryDao: SearchHistoryDao + private val searchHistoryDao: SearchHistoryDao, ) : SearchHistoryRepository { - override fun insertSearchHistory(searchHistoryDto: SearchHistoryDto) = runBlocking { - searchHistoryDao.insert(searchHistoryDto.apply - { - query = query.trim() - }) + override suspend fun insertSearchHistory(searchHistoryDto: SearchHistoryDto) { + searchHistoryDao.insert( + searchHistoryDto.apply { + query = query.trim() + }, + ) } + override fun getSearchHistoryList(count: Int): Flow> = searchHistoryDao.select(count) @@ -29,4 +30,4 @@ class SearchHistoryRepositoryImpl @Inject constructor( } -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt similarity index 87% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt index 0122d8e71..a7bef078b 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.sign +package com.android.mediproject.core.data.sign import com.android.mediproject.core.model.requestparameters.LoginParameter diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt similarity index 95% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt index 9cd5d7e8b..0b8cf97c7 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt @@ -1,6 +1,6 @@ -package com.android.mediproject.core.data.remote.sign +package com.android.mediproject.core.data.sign -import com.android.mediproject.core.data.remote.user.UserInfoRepository +import com.android.mediproject.core.data.user.UserInfoRepository import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.requestparameters.LoginParameter diff --git a/core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepository.kt new file mode 100644 index 000000000..1bbea79d2 --- /dev/null +++ b/core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepository.kt @@ -0,0 +1,9 @@ +package com.android.mediproject.core.data.token + +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState +import kotlinx.coroutines.flow.Flow + +interface TokenRepository { + fun getCurrentTokens(): Flow> +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepositoryImpl.kt similarity index 90% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepositoryImpl.kt index d10e5990e..40e5bf050 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/token/TokenRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/token/TokenRepositoryImpl.kt @@ -1,8 +1,8 @@ -package com.android.mediproject.core.data.remote.token +package com.android.mediproject.core.data.token import android.util.Log -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.network.datasource.tokens.TokenDataSource import com.android.mediproject.core.network.tokens.TokenServer import kotlinx.coroutines.flow.Flow diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt similarity index 88% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt index cd2ac7a15..f1ca20b72 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepository.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.user +package com.android.mediproject.core.data.user import com.android.mediproject.core.model.user.AccountState import com.android.mediproject.core.model.user.remote.UserResponse @@ -12,4 +12,4 @@ interface UserInfoRepository { suspend fun updateMyAccountInfo(accountState: AccountState) suspend fun loadAccountState() -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt similarity index 96% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt index 4c035fda0..2048399c3 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserInfoRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.user +package com.android.mediproject.core.data.user import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.user.AccountState @@ -13,7 +13,7 @@ import javax.inject.Singleton @Singleton class UserInfoRepositoryImpl @Inject constructor( - private val userInfoDataSource: UserInfoDataSource, private val appDataStore: AppDataStore + private val userInfoDataSource: UserInfoDataSource, private val appDataStore: AppDataStore, ) : UserInfoRepository { private val _myAccountInfo = MutableStateFlow(AccountState.Unknown) @@ -66,4 +66,4 @@ class UserInfoRepositoryImpl @Inject constructor( } } -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt similarity index 93% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepository.kt rename to core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt index f6e6edd36..2c6881027 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.user +package com.android.mediproject.core.data.user import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordParamter @@ -11,4 +11,4 @@ interface UserRepository { suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Flow> suspend fun changePassword(changePasswordParamter: ChangePasswordParamter): Flow> suspend fun withdrawal(): Flow> -} \ No newline at end of file +} diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt similarity index 76% rename from core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepositoryImpl.kt rename to core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt index 7ba371d6a..87b5b3428 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.data.remote.user +package com.android.mediproject.core.data.user import android.util.Log import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter @@ -17,23 +17,23 @@ class UserRepositoryImpl @Inject constructor(private val userDataSource: UserDat UserRepository { override suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Flow> = channelFlow { - userDataSource.changeNickname(changeNicknameParameter).map { - it.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) + userDataSource.changeNickname(changeNicknameParameter).map { result -> + result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) }.collectLatest { trySend(it) } } override suspend fun changePassword(changePasswordParamter: ChangePasswordParamter): Flow> = channelFlow { - userDataSource.changePassword(changePasswordParamter).map { - it.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) + userDataSource.changePassword(changePasswordParamter).map { result -> + result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) }.collectLatest { trySend(it) } } override suspend fun withdrawal(): Flow> = channelFlow { Log.d("wap", "UserRepository : withdrawal()") - userDataSource.withdrawal().map { - Log.d("wap", "UserRepository : withdrawal()"+it.toString()) - it.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) + userDataSource.withdrawal().map { result -> + Log.d("wap", "UserRepository : withdrawal()$result") + result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) }.collectLatest { trySend(it) } } -} \ No newline at end of file +} diff --git a/core/database/src/main/java/com/android/mediproject/core/database/RoomDB.kt b/core/database/src/main/java/com/android/mediproject/core/database/RoomDB.kt index fbe08a7ae..7b2faf68d 100644 --- a/core/database/src/main/java/com/android/mediproject/core/database/RoomDB.kt +++ b/core/database/src/main/java/com/android/mediproject/core/database/RoomDB.kt @@ -11,7 +11,7 @@ import com.android.mediproject.core.database.searchhistory.SearchHistoryDao import com.android.mediproject.core.database.searchhistory.SearchHistoryDto -@Database(entities = [SearchHistoryDto::class, MedicineDetailCacheDto::class, MedicineImageCacheDto::class], version = 1, exportSchema = true) +@Database(entities = [SearchHistoryDto::class, MedicineDetailCacheDto::class, MedicineImageCacheDto::class], version = 1, exportSchema = false) @TypeConverters(RoomTypeConverter::class) abstract class RoomDB : RoomDatabase() { abstract fun searchHistoryDao(): SearchHistoryDao diff --git a/core/database/src/main/java/com/android/mediproject/core/database/cache/join/MedicineCacheJoinResult.kt b/core/database/src/main/java/com/android/mediproject/core/database/cache/join/MedicineCacheJoinResult.kt index 310c82436..faa44b383 100644 --- a/core/database/src/main/java/com/android/mediproject/core/database/cache/join/MedicineCacheJoinResult.kt +++ b/core/database/src/main/java/com/android/mediproject/core/database/cache/join/MedicineCacheJoinResult.kt @@ -9,6 +9,7 @@ data class MedicineCacheJoinResult( val itemSeq: String, @ColumnInfo(name = "data") val data: ByteArray, @ColumnInfo(name = "image_url") val imageUrl: String, + @ColumnInfo(name = "change_date") val changeDate: String, ) { override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryDao.kt b/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryDao.kt index 8f0dcfbf3..9353695d8 100644 --- a/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryDao.kt +++ b/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryDao.kt @@ -20,7 +20,7 @@ abstract class SearchHistoryDao { } @Insert(entity = SearchHistoryDto::class, onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun realInsert(SearchHistoryDto: SearchHistoryDto) + abstract suspend fun realInsert(searchHistoryDto: SearchHistoryDto) /** * id에 해당하는 검색 기록을 삭제한다. diff --git a/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryMapper.kt b/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryMapper.kt index aeb0683b2..2d186014a 100644 --- a/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryMapper.kt +++ b/core/database/src/main/java/com/android/mediproject/core/database/searchhistory/SearchHistoryMapper.kt @@ -1,7 +1,9 @@ package com.android.mediproject.core.database.searchhistory -fun SearchHistoryDto.toSearchHistoryItemDto(): com.android.mediproject.core.model.search.local.SearchHistoryItemDto { - return com.android.mediproject.core.model.search.local.SearchHistoryItemDto( +import com.android.mediproject.core.model.search.SearchHistory + +fun SearchHistoryDto.toSearchHistoryItemDto(): SearchHistory { + return SearchHistory( id = id, query = query, searchedAt = searchDateTime, ) } diff --git a/core/datastore/src/main/java/com/android/mediproject/core/datastore/DataStoreModule.kt b/core/datastore/src/main/java/com/android/mediproject/core/datastore/DataStoreModule.kt index 5900ebdda..1c5332013 100644 --- a/core/datastore/src/main/java/com/android/mediproject/core/datastore/DataStoreModule.kt +++ b/core/datastore/src/main/java/com/android/mediproject/core/datastore/DataStoreModule.kt @@ -26,11 +26,13 @@ object DataStoreModule { @ApplicationContext context: Context, @Dispatcher(MediDispatchers.IO) ioDispatcher: CoroutineDispatcher, serializer: SavedTokenSerializer, - ): DataStore = DataStoreFactory.create( - serializer = serializer, - scope = CoroutineScope(ioDispatcher + SupervisorJob()), - ) { - context.dataStoreFile("saved_token.pb") + ): DataStore = synchronized(this) { + DataStoreFactory.create( + serializer = serializer, + scope = CoroutineScope(ioDispatcher + SupervisorJob()), + ) { + context.dataStoreFile("saved_token.pb") + } } @Provides diff --git a/core/datastore/src/main/java/com/android/mediproject/core/datastore/SavedTokenSerializer.kt b/core/datastore/src/main/java/com/android/mediproject/core/datastore/SavedTokenSerializer.kt index 2772934cf..2e062125a 100644 --- a/core/datastore/src/main/java/com/android/mediproject/core/datastore/SavedTokenSerializer.kt +++ b/core/datastore/src/main/java/com/android/mediproject/core/datastore/SavedTokenSerializer.kt @@ -14,7 +14,6 @@ class SavedTokenSerializer @Inject constructor() : Serializer { override suspend fun readFrom(input: InputStream): SavedToken { try { - @Suppress("BlockingMethodInNonBlockingContext") return SavedToken.parseFrom(input) } catch (exception: Exception) { throw CorruptionException("Failed to read proto.", exception) @@ -22,8 +21,7 @@ class SavedTokenSerializer @Inject constructor() : Serializer { } override suspend fun writeTo(t: SavedToken, output: OutputStream) { - @Suppress("BlockingMethodInNonBlockingContext") t.writeTo(output) } -} \ No newline at end of file +} diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index ee43d2c4d..b02ec3028 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -7,10 +7,13 @@ plugins { android { namespace = "com.android.mediproject.core.domain" + + hilt { + enableAggregatingTask = true + } + } -hilt { - enableAggregatingTask = true -} + dependencies { implementation(project(":core:common")) diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt index 0a2b2b29f..d9d74423a 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt @@ -2,10 +2,10 @@ package com.android.mediproject.core.domain import androidx.paging.PagingData import androidx.paging.flatMap -import com.android.mediproject.core.data.remote.comments.CommentsRepository -import com.android.mediproject.core.model.comments.CommentDto -import com.android.mediproject.core.model.comments.MyCommentDto -import com.android.mediproject.core.model.comments.toCommentDto +import com.android.mediproject.core.data.comments.CommentsRepository +import com.android.mediproject.core.model.comments.Comment +import com.android.mediproject.core.model.comments.MyComment +import com.android.mediproject.core.model.comments.toComment import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -31,17 +31,17 @@ class CommentsUseCase @Inject constructor( * * @param medicineId 약의 고유 번호 */ - fun getCommentsForAMedicine(medicineId: Long, myUserId: Long): Flow> = channelFlow { + fun getCommentsForAMedicine(medicineId: Long, myUserId: Long): Flow> = channelFlow { commentsRepository.getCommentsForAMedicine(medicineId).collectLatest { pagingData -> val result = pagingData.flatMap { (it.replies.map { reply -> - reply.toCommentDto().apply { + reply.toComment().apply { reply.likeList.forEach { like -> if (like.userId == myUserId) this.isLiked = true } } }.toList().reversed()) + listOf( - it.toCommentDto().apply { + it.toComment().apply { it.likeList.forEach { like -> if (like.userId == myUserId) this.isLiked = true } @@ -55,7 +55,7 @@ class CommentsUseCase @Inject constructor( /** * 내가 작성한 댓글을 가져오는 메서드입니다. */ - fun getMyComments(userId: Int): Flow> { + fun getMyComments(userId: Int): Flow> { TODO() } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetAdminActionInfoUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetAdminActionInfoUseCase.kt index 2ba659139..c5bfcdb1a 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetAdminActionInfoUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetAdminActionInfoUseCase.kt @@ -2,9 +2,9 @@ package com.android.mediproject.core.domain import androidx.paging.PagingData import androidx.paging.map -import com.android.mediproject.core.data.remote.adminaction.AdminActionRepository -import com.android.mediproject.core.model.remote.adminaction.AdminActionListItemDto -import com.android.mediproject.core.model.remote.adminaction.toDto +import com.android.mediproject.core.data.adminaction.AdminActionRepository +import com.android.mediproject.core.model.adminaction.AdminAction +import com.android.mediproject.core.model.adminaction.toAdminAction import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject @@ -14,13 +14,13 @@ class GetAdminActionInfoUseCase @Inject constructor( ) { suspend fun getAdminActionList( - ): Flow> = + ): Flow> = adminActionRepository.getAdminActionList().let { pager -> pager.map { pagingData -> pagingData.map { - it.toDto() + it.toAdminAction() } } } -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetDurUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetDurUseCase.kt index c2bdf36c5..e348f2c8f 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetDurUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetDurUseCase.kt @@ -1,26 +1,21 @@ package com.android.mediproject.core.domain -import com.android.mediproject.core.data.remote.dur.DurRepository -import com.android.mediproject.core.model.remote.dur.toDto -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map +import com.android.mediproject.core.data.dur.durproduct.DurProductRepository +import com.android.mediproject.core.model.dur.DurType +import kotlinx.coroutines.flow.last import javax.inject.Inject +import javax.inject.Singleton -class GetDurUseCase @Inject constructor(private val durRepository: DurRepository) { +@Singleton +class GetDurUseCase @Inject constructor( + private val durProductRepository: DurProductRepository, + private val durIngrRepository: DurProductRepository, +) { + suspend fun hasDur( + itemName: String?, itemSeq: String?, + ) = durProductRepository.hasDur(itemName, itemSeq).last() - suspend operator fun invoke( - itemName: String?, - itemSeq: String?, - ) = channelFlow { - durRepository.getDur(itemName, itemSeq).map { result -> - result.fold(onSuccess = { - Result.success(it.toDto()) - }, onFailure = { - Result.failure(it) - }) - }.collectLatest { - send(it) - } - } -} \ No newline at end of file + suspend fun getDur( + itemSeq: String, durTypes: List, + ) = durProductRepository.getDur(itemSeq, durTypes).last() +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetElderlyCautionUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetElderlyCautionUseCase.kt deleted file mode 100644 index cd88f2e99..000000000 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetElderlyCautionUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.android.mediproject.core.domain - -import com.android.mediproject.core.data.remote.elderlycaution.ElderlyCautionRepository -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionDto -import com.android.mediproject.core.model.remote.elderlycaution.toElderlyCautionDto -import javax.inject.Inject - -class GetElderlyCautionUseCase @Inject constructor( - private val repository: ElderlyCautionRepository, -) { - - - suspend operator fun invoke( - itemName: String?, itemSeq: String?, - ): Result = repository.getElderlyCaution(itemName = itemName, itemSeq = itemSeq) - .fold(onSuccess = { Result.success(it.toElderlyCautionDto()) }, onFailure = { Result.failure(it) }) -} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetFavoriteMedicineUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetFavoriteMedicineUseCase.kt index ea1ce188f..c1da445be 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetFavoriteMedicineUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetFavoriteMedicineUseCase.kt @@ -1,9 +1,9 @@ package com.android.mediproject.core.domain -import com.android.mediproject.core.data.remote.favoritemedicine.FavoriteMedicineRepository +import com.android.mediproject.core.data.favoritemedicine.FavoriteMedicineRepository import com.android.mediproject.core.model.favoritemedicine.CheckFavoriteMedicineResponse -import com.android.mediproject.core.model.favoritemedicine.toFavoriteMedicineDto -import com.android.mediproject.core.model.favoritemedicine.toFavoriteMedicineMoreDto +import com.android.mediproject.core.model.favoritemedicine.toFavoriteMedicine +import com.android.mediproject.core.model.favoritemedicine.toFavoriteMedicineMoreInfo import com.android.mediproject.core.model.requestparameters.AddFavoriteMedicineParameter import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow @@ -16,16 +16,18 @@ class GetFavoriteMedicineUseCase @Inject constructor(private val favoriteMedicin suspend fun getFavoriteMedicineList() = channelFlow { favoriteMedicineRepository.getFavoriteMedicineList().map { result -> result.fold( - onSuccess = { Result.success(it.map { it.toFavoriteMedicineDto() }) }, - onFailure = { Result.failure(it) }) + onSuccess = { it -> Result.success(it.map { it.toFavoriteMedicine() }) }, + onFailure = { Result.failure(it) }, + ) }.collectLatest { trySend(it) } } suspend fun getFavoriteMedicineMoreList() = channelFlow { favoriteMedicineRepository.getFavoriteMedicineList().map { result -> result.fold( - onSuccess = { Result.success(it.map { it.toFavoriteMedicineMoreDto() }) }, - onFailure = { Result.failure(it) }) + onSuccess = { it -> Result.success(it.map { it.toFavoriteMedicineMoreInfo() }) }, + onFailure = { Result.failure(it) }, + ) }.collectLatest { trySend(it) } } @@ -36,7 +38,8 @@ class GetFavoriteMedicineUseCase @Inject constructor(private val favoriteMedicin val result = addFavoriteMedicineResponseResult.fold( onSuccess = { Result.success(Unit) }, - onFailure = { Result.failure(it) }) + onFailure = { Result.failure(it) }, + ) trySend(result) } } else { @@ -45,7 +48,8 @@ class GetFavoriteMedicineUseCase @Inject constructor(private val favoriteMedicin val result = deleteFavoriteMedicineResponseResult.fold( onSuccess = { Result.success(Unit) }, - onFailure = { Result.failure(it) }) + onFailure = { Result.failure(it) }, + ) trySend(result) } } @@ -53,4 +57,4 @@ class GetFavoriteMedicineUseCase @Inject constructor(private val favoriteMedicin fun checkFavoriteMedicine(medicineId: Long): Flow> = favoriteMedicineRepository.checkFavoriteMedicine(medicineId) -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetGranuleIdentificationUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetGranuleIdentificationUseCase.kt index 688bb7da5..8d58807dd 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetGranuleIdentificationUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetGranuleIdentificationUseCase.kt @@ -1,14 +1,15 @@ package com.android.mediproject.core.domain -import com.android.mediproject.core.data.remote.granule.GranuleIdentificationRepository -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoDto -import com.android.mediproject.core.model.remote.granule.toDto +import com.android.mediproject.core.data.granule.GranuleIdentificationRepository +import com.android.mediproject.core.model.granule.GranuleIdentificationInfo +import com.android.mediproject.core.model.granule.toGranuleIdentificationInfo import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject class GetGranuleIdentificationUseCase @Inject constructor( - private val repository: GranuleIdentificationRepository) { + private val repository: GranuleIdentificationRepository, +) { /** @@ -19,12 +20,16 @@ class GetGranuleIdentificationUseCase @Inject constructor( * @param itemSeq 약품 고유 번호 */ operator fun invoke( - itemName: String?, entpName: String?, itemSeq: String?): Flow> = + itemName: String?, entpName: String?, itemSeq: String?, + ): Flow> = repository.getGranuleIdentificationInfo(itemName = itemName, entpName = entpName, itemSeq = itemSeq).map { result -> - result.fold(onSuccess = { response -> - Result.success(response.toDto()) - }, onFailure = { - Result.failure(it) - }) + result.fold( + onSuccess = { response -> + Result.success(response.toGranuleIdentificationInfo()) + }, + onFailure = { + Result.failure(it) + }, + ) } -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt index e41357038..fd81a8858 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt @@ -1,9 +1,9 @@ package com.android.mediproject.core.domain import androidx.paging.map -import com.android.mediproject.core.data.remote.medicineapproval.MedicineApprovalRepository +import com.android.mediproject.core.data.medicineapproval.MedicineApprovalRepository import com.android.mediproject.core.model.constants.MedicationType -import com.android.mediproject.core.model.medicine.medicineapproval.toDto +import com.android.mediproject.core.model.medicine.medicineapproval.toApprovedMedicine import com.android.mediproject.core.model.requestparameters.ApprovalListSearchParameter import kotlinx.coroutines.flow.map import javax.inject.Inject @@ -15,7 +15,7 @@ class GetMedicineApprovalListUseCase @Inject constructor( /** * 약품 목록 조회 UseCase */ - operator fun invoke( + suspend operator fun invoke( parameter: ApprovalListSearchParameter, ) = medicineApprovalRepository.getMedicineApprovalList( itemName = parameter.itemName, @@ -26,7 +26,7 @@ class GetMedicineApprovalListUseCase @Inject constructor( }, ).map { pagingData -> pagingData.map { item -> - item.toDto() + item.toApprovedMedicine() } } } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineDetailsUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineDetailsUseCase.kt index a548949a9..f1c1dee29 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineDetailsUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineDetailsUseCase.kt @@ -1,12 +1,12 @@ package com.android.mediproject.core.domain -import com.android.mediproject.core.data.remote.medicineapproval.MedicineApprovalRepository -import com.android.mediproject.core.data.remote.medicineid.MedicineIdRepository +import com.android.mediproject.core.data.medicineapproval.MedicineApprovalRepository +import com.android.mediproject.core.data.medicineid.MedicineIdRepository import com.android.mediproject.core.database.cache.manager.MedicineDataCacheManager -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs -import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfo +import com.android.mediproject.core.model.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail import com.android.mediproject.core.model.medicine.medicinedetailinfo.cache.MedicineCacheEntity -import com.android.mediproject.core.model.medicine.medicinedetailinfo.toMedicineDetailInfoDto +import com.android.mediproject.core.model.medicine.medicinedetailinfo.toMedicineDetail import com.android.mediproject.core.model.requestparameters.GetMedicineIdParameter import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow @@ -22,7 +22,7 @@ class GetMedicineDetailsUseCase @Inject constructor( operator fun invoke( medicineInfoArgs: MedicineInfoArgs, - ): Flow> = channelFlow { + ): Flow> = channelFlow { medicineApprovalRepository.getMedicineDetailInfo( itemName = medicineInfoArgs.itemKorName, ).zip( @@ -53,7 +53,7 @@ class GetMedicineDetailsUseCase @Inject constructor( val medicineInfo = medicineInfoResult.fold( onSuccess = { item -> - Result.success(item.toMedicineDetailInfoDto(medicineId)) + Result.success(item.toMedicineDetail(medicineId)) }, onFailure = { Result.failure(it) @@ -74,13 +74,13 @@ class GetMedicineDetailsUseCase @Inject constructor( } - fun getMedicineDetailInfoByItemSeq(itemSeqs: List): Flow>> = channelFlow { + fun getMedicineDetailInfoByItemSeq(itemSeqs: List): Flow>> = channelFlow { medicineApprovalRepository.getMedicineDetailInfoByItemSeq(itemSeqs).collectLatest { medicineInfoResult -> val medicineInfo = medicineInfoResult.fold( onSuccess = { item -> Result.success( item.map { - it.toMedicineDetailInfoDto() + it.toMedicineDetail() }, ) }, diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetRecallSuspensionInfoUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetRecallSuspensionInfoUseCase.kt index f5d6f6247..d11538c6a 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetRecallSuspensionInfoUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetRecallSuspensionInfoUseCase.kt @@ -2,10 +2,10 @@ package com.android.mediproject.core.domain import androidx.paging.PagingData import androidx.paging.map -import com.android.mediproject.core.data.remote.recallsuspension.RecallSuspensionRepository -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionItemDto -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto -import com.android.mediproject.core.model.remote.recall.toRecallSuspensionItemDto +import com.android.mediproject.core.data.recallsuspension.RecallSuspensionRepository +import com.android.mediproject.core.model.recall.DetailRecallSuspension +import com.android.mediproject.core.model.recall.RecallSuspension +import com.android.mediproject.core.model.recall.toRecallSuspension import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject @@ -15,35 +15,32 @@ class GetRecallSuspensionInfoUseCase @Inject constructor( ) { fun getRecallDisposalList( - ): Flow> = - recallSuspensionRepository.getRecallDisposalList().let { pager -> - pager.map { pagingData -> - pagingData.map { - it.toRecallSuspensionItemDto() - } + ): Flow> = recallSuspensionRepository.getRecallDisposalList().let { pager -> + pager.map { pagingData -> + pagingData.map { + it.toRecallSuspension() } } + } suspend fun getRecentRecallDisposalList( pageNo: Int = 1, numOfRows: Int = 15, - ): Result> = - recallSuspensionRepository.getRecentRecallDisposalList(pageNo, numOfRows).map { - it.map { item -> - item.toRecallSuspensionItemDto() - } + ): Result> = recallSuspensionRepository.getRecentRecallDisposalList(pageNo, numOfRows).map { + it.map { item -> + item.toRecallSuspension() } + } fun getDetailRecallSuspension( company: String?, product: String?, - ): Flow> = - recallSuspensionRepository.getDetailRecallSuspension(company, product).map { - it.fold( - onSuccess = { item -> - Result.success(item.toRecallSuspensionItemDto()) - }, - onFailure = { throwable -> - Result.failure(throwable) - }, - ) - } + ): Flow> = recallSuspensionRepository.getDetailRecallSuspension(company, product).map { + it.fold( + onSuccess = { item -> + Result.success(item.toRecallSuspension()) + }, + onFailure = { throwable -> + Result.failure(throwable) + }, + ) + } } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetSkippableIntroUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetSkippableIntroUseCase.kt index b2f70458a..957656add 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetSkippableIntroUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetSkippableIntroUseCase.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.flow.collectLatest import javax.inject.Inject class GetSkippableIntroUseCase @Inject constructor( - private val appDataStore: AppDataStore + private val appDataStore: AppDataStore, ) { suspend operator fun invoke() = callbackFlow { appDataStore.skipIntro.collectLatest { @@ -16,4 +16,4 @@ class GetSkippableIntroUseCase @Inject constructor( } suspend fun saveSkipIntro(skipIntro: Boolean) = appDataStore.saveSkipIntro(skipIntro) -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt index 6f10de21d..de760b8f5 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt @@ -1,9 +1,9 @@ package com.android.mediproject.core.domain import android.util.Log -import com.android.mediproject.core.data.remote.token.TokenRepository -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.data.token.TokenRepository +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.collectLatest diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/SearchHistoryUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/SearchHistoryUseCase.kt index ecde3650d..3abf9dab0 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/SearchHistoryUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/SearchHistoryUseCase.kt @@ -1,7 +1,6 @@ package com.android.mediproject.core.domain import com.android.mediproject.core.data.search.SearchHistoryRepository -import com.android.mediproject.core.database.searchhistory.SearchHistoryDto import com.android.mediproject.core.database.searchhistory.toSearchHistoryItemDto import kotlinx.coroutines.flow.mapLatest import javax.inject.Inject @@ -9,11 +8,8 @@ import javax.inject.Singleton @Singleton class SearchHistoryUseCase @Inject constructor( - private val searchHistoryRepository: SearchHistoryRepository + private val searchHistoryRepository: SearchHistoryRepository, ) { - suspend fun insertSearchHistory(query: String) = - searchHistoryRepository.insertSearchHistory(SearchHistoryDto(query)) - fun getSearchHistoryList(count: Int) = searchHistoryRepository.getSearchHistoryList(count).mapLatest { it.map { dto -> @@ -24,4 +20,4 @@ class SearchHistoryUseCase @Inject constructor( suspend fun deleteSearchHistory(id: Long) = searchHistoryRepository.deleteSearchHistory(id) suspend fun deleteAllSearchHistory() = searchHistoryRepository.deleteAllSearchHistory() -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetAccountStateUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetAccountStateUseCase.kt index 9dbd5669a..ae0e084f6 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetAccountStateUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetAccountStateUseCase.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.domain.sign -import com.android.mediproject.core.data.remote.user.UserInfoRepository +import com.android.mediproject.core.data.user.UserInfoRepository import com.android.mediproject.core.model.user.AccountState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow @@ -17,4 +17,4 @@ class GetAccountStateUseCase @Inject constructor(private val userInfoRepository: } suspend fun loadAccountState() = userInfoRepository.loadAccountState() -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetUserUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetUserUseCase.kt index 9bcdbabf4..e730ece2d 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetUserUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/GetUserUseCase.kt @@ -2,17 +2,17 @@ package com.android.mediproject.core.domain.sign import android.util.Log import com.android.mediproject.core.datastore.AppDataStore -import com.android.mediproject.core.model.user.UserDto +import com.android.mediproject.core.model.user.User import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import javax.inject.Inject class GetUserUseCase @Inject constructor(private val appDataStore: AppDataStore) { - suspend operator fun invoke(): Flow = channelFlow { + suspend operator fun invoke(): Flow = channelFlow { appDataStore.nickName.collect { nickName -> - Log.d("wap",nickName) - trySend(UserDto(nickName = nickName)) + Log.d("wap", nickName) + trySend(User(nickName = nickName)) } } -} \ No newline at end of file +} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/SignUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/SignUseCase.kt index 76839d2b4..47d159846 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/sign/SignUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/sign/SignUseCase.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.domain.sign -import com.android.mediproject.core.data.remote.sign.SignRepository -import com.android.mediproject.core.data.remote.user.UserInfoRepository +import com.android.mediproject.core.data.sign.SignRepository +import com.android.mediproject.core.data.user.UserInfoRepository import com.android.mediproject.core.model.requestparameters.LoginParameter import com.android.mediproject.core.model.requestparameters.SignUpParameter import com.android.mediproject.core.model.user.AccountState @@ -13,7 +13,7 @@ import javax.inject.Singleton @Singleton class SignUseCase @Inject constructor( - private val signRepository: SignRepository, private val userInfoRepository: UserInfoRepository + private val signRepository: SignRepository, private val userInfoRepository: UserInfoRepository, ) { suspend fun login(loginParameter: LoginParameter): Flow> = signRepository.login(loginParameter) diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/user/UserUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/user/UserUseCase.kt index a3705ec24..2917e1aa2 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/user/UserUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/user/UserUseCase.kt @@ -1,15 +1,14 @@ package com.android.mediproject.core.domain.user import android.util.Log -import com.android.mediproject.core.data.remote.sign.SignRepository -import com.android.mediproject.core.data.remote.user.UserInfoRepository -import com.android.mediproject.core.data.remote.user.UserRepository +import com.android.mediproject.core.data.sign.SignRepository +import com.android.mediproject.core.data.user.UserInfoRepository +import com.android.mediproject.core.data.user.UserRepository import com.android.mediproject.core.datastore.AppDataStore -import com.android.mediproject.core.domain.GetTokenUseCase import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordParamter import com.android.mediproject.core.model.user.AccountState -import com.android.mediproject.core.model.user.UserDto +import com.android.mediproject.core.model.user.User import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.collectLatest @@ -21,44 +20,55 @@ class UserUseCase @Inject constructor( private val appDataStore: AppDataStore, private val userRepository: UserRepository, private val getUserInfoRepository: UserInfoRepository, - private val signRepository: SignRepository + private val signRepository: SignRepository, ) { - suspend operator fun invoke(): Flow = channelFlow { + suspend operator fun invoke(): Flow = channelFlow { appDataStore.nickName.collect { nickName -> - trySend(UserDto(nickName = nickName)) + trySend(User(nickName = nickName)) } } suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter) = channelFlow { - userRepository.changeNickname(changeNicknameParameter).map { - it.fold(onSuccess = { - appDataStore.saveNickName(changeNicknameParameter.newNickname) - Result.success(it) - }, onFailure = { Result.failure(it) }) + userRepository.changeNickname(changeNicknameParameter).map { result -> + result.fold( + onSuccess = { + appDataStore.saveNickName(changeNicknameParameter.newNickname) + Result.success(it) + }, + onFailure = { Result.failure(it) }, + ) }.collectLatest { trySend(it) } } suspend fun changePassword(changePasswordParamter: ChangePasswordParamter) = channelFlow { val email = (getUserInfoRepository.myAccountInfo.value as AccountState.SignedIn).email.toCharArray() - userRepository.changePassword(changePasswordParamter.apply { - this.email = email - }).map { - it.fold(onSuccess = { - Result.success(it) - }, onFailure = { Result.failure(it) }) + userRepository.changePassword( + changePasswordParamter.apply { + this.email = email + }, + ).map { result -> + result.fold( + onSuccess = { + Result.success(it) + }, + onFailure = { Result.failure(it) }, + ) }.collectLatest { trySend(it) } } suspend fun withdrawal() = channelFlow { Log.d("wap", "UserUseCase : withdrawal()") - userRepository.withdrawal().map { - Log.d("wap", "UserUseCase : withdrawal()" + it.toString()) - it.fold(onSuccess = { - signRepository.signOut() - appDataStore.clearMyAccountInfo() - Result.success(it) - }, onFailure = { Result.failure(it) }) + userRepository.withdrawal().map { result -> + Log.d("wap", "UserUseCase : withdrawal()$result") + result.fold( + onSuccess = { + signRepository.signOut() + appDataStore.clearMyAccountInfo() + Result.success(it) + }, + onFailure = { Result.failure(it) }, + ) }.collectLatest { trySend(it) } } -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrBaseResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrBaseResponse.kt deleted file mode 100644 index 6fd0f088a..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrBaseResponse.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.android.mediproject.core.model - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -abstract class DataGoKrBaseResponse { - @SerialName("header") val header: Header? = null - - @Serializable - data class Header( - @SerialName("resultCode") val resultCode: String, // 00 - @SerialName("resultMsg") val resultMsg: String, // NORMAL SERVICE. - ) - -} - -inline fun T.toResult(): Result = header?.run { - if (resultCode == "00") Result.success(this@toResult as T) - else Result.failure(Throwable(resultMsg)) -} ?: Result.failure(Throwable("Response Failed")) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrResponse.kt new file mode 100644 index 000000000..41e8f6580 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/DataGoKrResponse.kt @@ -0,0 +1,34 @@ +package com.android.mediproject.core.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +abstract class DataGoKrResponse { + @SerialName("header") val header: Header? = null + @SerialName("body") val _body: Body? = null + + val body: Body + get() = _body!! + + @Serializable + data class Header( + @SerialName("resultCode") val resultCode: String, // 00 + @SerialName("resultMsg") val resultMsg: String, // NORMAL SERVICE. + ) + + @Serializable + data class Body( + @SerialName("items") val items: List = listOf(), + @SerialName("numOfRows") val numOfRows: Int = 0, + @SerialName("pageNo") val pageNo: Int = 0, + @SerialName("totalCount") val totalCount: Int = 0, + ) + + interface LeafItem +} + +inline fun > T.toResult(): Result = header?.run { + if (resultCode == "00") Result.success(this@toResult) + else Result.failure(Throwable(resultMsg)) +} ?: Result.failure(Throwable("Response Failed")) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/DataState.kt b/core/model/src/main/java/com/android/mediproject/core/model/DataState.kt index 0a14964e1..7b3a2e818 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/DataState.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/DataState.kt @@ -7,8 +7,24 @@ package com.android.mediproject.core.model * @see DataState.Success * @see DataState.Error */ -sealed class DataState { - object Empty : DataState() - data class Success(val data: R) : DataState() - data class Error(val message: String) : DataState() -} \ No newline at end of file +sealed interface DataState { + object Empty : DataState + data class Success(val data: R) : DataState + data class Error(val message: String) : DataState +} + + +fun DataState.isEmpty(block: () -> Unit): DataState { + if (this is DataState.Empty) block() + return this +} + +fun DataState.isSuccess(block: (T) -> Unit): DataState { + if (this is DataState.Success) block(data) + return this +} + +fun DataState.isError(block: (String) -> Unit): DataState { + if (this is DataState.Error) block(message) + return this +} diff --git a/core/model/src/main/java/com/android/mediproject/core/DateTime.kt b/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt similarity index 89% rename from core/model/src/main/java/com/android/mediproject/core/DateTime.kt rename to core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt index d5932ba9b..226f17556 100644 --- a/core/model/src/main/java/com/android/mediproject/core/DateTime.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core +package com.android.mediproject.core.model import java.time.LocalDate import java.time.LocalDateTime diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminAction.kt similarity index 84% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminAction.kt index ac9fdc15e..45bd30870 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListItemDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminAction.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.remote.adminaction +package com.android.mediproject.core.model.adminaction import android.os.Parcelable @@ -24,7 +24,7 @@ import java.time.format.DateTimeFormatter * @property violation 위반 내용 * */ -data class AdminActionListItemDto( +data class AdminAction( val address: String, // 경기도 화성시 향남읍 제약공단3길27 val disposition: String, // ○ 의약품 ‘아빌리파이정2밀리그램(아리피프라졸)’<제28호>에 대하여 해당 품목 제조업무정지 1개월(2023. 5. 12.~2023. 6. 11.) val enforcementNumber: String, // 2023003342 @@ -37,25 +37,25 @@ data class AdminActionListItemDto( val itemSeq: String, // 200808451 val lastSettleDate: LocalDate, // 20230526 val publicEndDate: LocalDate, // 20230910 - var onClick: (() -> Unit)? = null + var onClick: (() -> Unit)? = null, ) : Parcelable -fun AdminActionListResponse.Body.Item.toDto(): AdminActionListItemDto { - return AdminActionListItemDto( - address = aDDR, +fun AdminActionListResponse.Item.toAdminAction(): AdminAction { + return AdminAction( + address = address, disposition = aDMDISPSNAME, enforcementNumber = aDMDISPSSEQ, applyLaw = bEFAPPLYLAW, - bizrNo = bIZRNO ?: "", - entpName = eNTPNAME, + bizrNo = bizrNo ?: "", + entpName = entpName, entpNo = eNTPNO, violation = eXPOSECONT, - itemName = iTEMNAME ?: "", - itemSeq = iTEMSEQ ?: "", + itemName = itemName ?: "", + itemSeq = itemSeq ?: "", lastSettleDate = LocalDate.parse(lASTSETTLEDATE, dateFormatter), - publicEndDate = LocalDate.parse(rLSENDDATE, dateFormatter) + publicEndDate = LocalDate.parse(rLSENDDATE, dateFormatter), - ) + ) } -private val dateFormatter by lazy { DateTimeFormatter.ofPattern("yyyyMMdd") } \ No newline at end of file +private val dateFormatter by lazy { DateTimeFormatter.ofPattern("yyyyMMdd") } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminActionListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminActionListResponse.kt new file mode 100644 index 000000000..edc1f3092 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/adminaction/AdminActionListResponse.kt @@ -0,0 +1,52 @@ +package com.android.mediproject.core.model.adminaction + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * 행정처분 목록 조회 응답 + * + * @property body + * @property header + */ +@Serializable +class AdminActionListResponse : DataGoKrResponse() { + + /** + * 행정처분 목록 별 데이터 클래스 + * + * @property address 소재지 + * @property aDMDISPSNAME 처분사항 + * @property aDMDISPSSEQ 행정처분 일련번호 + * @property bEFAPPLYLAW 근거법령 + * @property bizrNo 사업자등록번호 + * @property entpName 업체명 + * @property itemSeq 품목 일련번호 + * @property itemName 품목명 + * @property eNTPNO 업체번호 + * @property lASTSETTLEDATE 처분 일자 + * @property rLSENDDATE 공개 종료 일자 + * @property eXPOSECONT 위반내용 + * + */ + @Serializable + data class Item( + @SerialName("ADDR") val address: String, // 경기도 화성시 향남읍 제약공단3길27 + @SerialName("ADM_DISPS_NAME") val aDMDISPSNAME: String, // ○ 의약품 ‘아빌리파이정2밀리그램(아리피프라졸)’<제28호>에 대하여 해당 품목 제조업무정지 1개월(2023. 5. 12.~2023. 6. 11.) + @SerialName("ADM_DISPS_SEQ") val aDMDISPSSEQ: String, // 2023003342 + @SerialName("BEF_APPLY_LAW") + val bEFAPPLYLAW: String, // ○「약사법」제38조제1항,「의약품 등의 안전에 관한 규칙」제48조제15호,「의약품 소량포장단위 공급에 관한 규정(식품의약품안전처 고시)」 ○「약사법」제76조제1항제3호 및 제3항,「의약품 등의 안전에 관한 규칙」제95조 관련 [별표 8] “행정처분의 기준” Ⅱ. 개별기준 제25호마목 + @SerialName("BIZRNO") val bizrNo: String?, // 2208114465 + @SerialName("ENTP_NAME") val entpName: String, // 한국오츠카제약(주) + @SerialName("ENTP_NO") val eNTPNO: String, // 19830009 + @SerialName("EXPOSE_CONT") val eXPOSECONT: String, // ○ 2021년도 의약품 소량포장단위 공급기준 미준수 + @SerialName("ITEM_NAME") val itemName: String?, // 아빌리파이정2밀리그램(아리피프라졸) + @SerialName("ITEM_SEQ") val itemSeq: String?, // 200808451 + @SerialName("LAST_SETTLE_DATE") val lASTSETTLEDATE: String, // 20230526 + @SerialName("RLS_END_DATE") val rLSENDDATE: String, // 20230910 + ) + + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/ai/ClassificationResult.kt b/core/model/src/main/java/com/android/mediproject/core/model/ai/ClassificationResult.kt index 0489d39e9..c41fa8679 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/ai/ClassificationResult.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/ai/ClassificationResult.kt @@ -1,10 +1,10 @@ package com.android.mediproject.core.model.ai -import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfo +import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail data class ClassificationResult( val detectionObject: DetectionObject, val classificationRecognition: ClassificationRecognition, ) { - var medicineDetailInfo: MedicineDetailInfo? = null - var onClick: ((MedicineDetailInfo) -> Unit)? = null + var medicineDetail: MedicineDetail? = null + var onClick: ((MedicineDetail) -> Unit)? = null } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/Comment.kt similarity index 91% rename from core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/comments/Comment.kt index 3c46fda4a..eeb7d5957 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/Comment.kt @@ -23,7 +23,7 @@ import java.time.format.DateTimeFormatter * @property onClickEdit 답글 수정 버튼 클릭 시 실행되는 람다 함수 * @property isMine 내가 쓴 댓글인지 여부 */ -data class CommentDto( +data class Comment( val commentId: Long, val userId: Long, val userName: String, @@ -35,8 +35,8 @@ data class CommentDto( var onClickReply: ((String, Long) -> Unit)?, var onClickLike: ((Long, Boolean) -> Unit)?, var onClickDelete: ((Long) -> Unit)?, - var onClickEdit: ((CommentDto, Int) -> Unit)?, - var onClickApplyEdited: ((CommentDto) -> Unit)?, + var onClickEdit: ((Comment, Int) -> Unit)?, + var onClickApplyEdited: ((Comment) -> Unit)?, var isMine: Boolean = false, ) { @@ -55,7 +55,7 @@ CREATED_AT DATETIME 작성 시각 UPDATED_AT DATETIME 수정 시각 */ -fun CommentListResponse.Comment.toCommentDto() = CommentDto( +fun CommentListResponse.Comment.toComment() = Comment( commentId = id, userId = userId, userName = nickName, @@ -71,7 +71,7 @@ fun CommentListResponse.Comment.toCommentDto() = CommentDto( onClickApplyEdited = null, ) -fun CommentListResponse.Comment.Reply.toCommentDto() = CommentDto( +fun CommentListResponse.Comment.Reply.toComment() = Comment( commentId = id, userId = userId, userName = nickName, diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt index 1e4479c1e..82b16672a 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.model.comments -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.Serializable /** @@ -9,4 +9,4 @@ import kotlinx.serialization.Serializable @Serializable data class CommentChangedResponse( val commentId: Long = 0L, -) : BaseAwsQueryResponse() \ No newline at end of file +) : ServerQueryResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt index eb293a6ad..e2152dea8 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt @@ -1,14 +1,14 @@ package com.android.mediproject.core.model.comments -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class CommentListResponse( - @SerialName("commentList") val commentList: List -) : BaseAwsQueryResponse() { + @SerialName("commentList") val commentList: List, +) : ServerQueryResponse() { @Serializable data class Comment( @@ -21,7 +21,7 @@ data class CommentListResponse( @SerialName("USERID") val userId: Long, // 2 @SerialName("likeList") val likeList: List, @SerialName("nickname") val nickName: String, - @SerialName("updatedAt") val updatedAt: String + @SerialName("updatedAt") val updatedAt: String, ) { @Serializable data class Reply( @@ -31,7 +31,7 @@ data class CommentListResponse( @SerialName("likeList") val likeList: List, @SerialName("MEDICINEID") val medicineId: Long, // 41 @SerialName("SUBORDINATION") val subordination: Long, // 2 @SerialName("USERID") val userId: Long, // 3 - @SerialName("nickname") val nickName: String, @SerialName("updatedAt") val updatedAt: String + @SerialName("nickname") val nickName: String, @SerialName("updatedAt") val updatedAt: String, ) } } @@ -40,5 +40,5 @@ data class CommentListResponse( data class Like( @SerialName("COMMENTID") val commentId: Long, // 2 @SerialName("ID") val id: Long, // 1 - @SerialName("USERID") val userId: Long -) \ No newline at end of file + @SerialName("USERID") val userId: Long, +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/EditedCommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/EditedComment.kt similarity index 89% rename from core/model/src/main/java/com/android/mediproject/core/model/comments/EditedCommentDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/comments/EditedComment.kt index 56893d873..700eefdc6 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/EditedCommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/EditedComment.kt @@ -6,7 +6,7 @@ package com.android.mediproject.core.model.comments * @property commentId 댓글 id * @property content 댓글 내용 */ -data class EditedCommentDto( +data class EditedComment( val commentId: Int, val content: String, -) \ No newline at end of file +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt index e48daaf89..952c23894 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.model.comments -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.Serializable /** @@ -9,4 +9,4 @@ import kotlinx.serialization.Serializable @Serializable data class LikeResponse( val likeId: Long = 0L, -) : BaseAwsQueryResponse() \ No newline at end of file +) : ServerQueryResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/MyCommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/MyComment.kt similarity index 83% rename from core/model/src/main/java/com/android/mediproject/core/model/comments/MyCommentDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/comments/MyComment.kt index fd7057a5e..6bca44671 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/MyCommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/MyComment.kt @@ -10,11 +10,11 @@ package com.android.mediproject.core.model.comments * @property createdAt 작성 시각 */ -data class MyCommentDto( +data class MyComment( val commentId: Int, val medicineName: String, val content: String, val createdAt: String, val replyCount: Int, - var onClick: ((MyCommentDto) -> Unit)? = null, + var onClick: ((MyComment) -> Unit)? = null, ) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/NewCommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/NewComment.kt similarity index 93% rename from core/model/src/main/java/com/android/mediproject/core/model/comments/NewCommentDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/comments/NewComment.kt index beae3d01a..5a1085b7e 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/NewCommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/NewComment.kt @@ -8,9 +8,9 @@ package com.android.mediproject.core.model.comments * @property content 댓글 내용 * @property subordinationId 댓글 종속성 */ -data class NewCommentDto( +data class NewComment( val medicineId: String, val userId: Int, val content: String, val subordinationId: Int = -1, -) \ No newline at end of file +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItem.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItem.kt new file mode 100644 index 000000000..95b374710 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItem.kt @@ -0,0 +1,10 @@ +package com.android.mediproject.core.model.dur + +import android.text.Html +import android.text.Spanned + +interface DurItem { + + val content: Spanned + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapper.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapper.kt new file mode 100644 index 000000000..80e136b26 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapper.kt @@ -0,0 +1,9 @@ +package com.android.mediproject.core.model.dur + +import com.android.mediproject.core.model.DataGoKrResponse + +abstract class DurItemWrapper( + open val response: DataGoKrResponse<*>, +) { + abstract fun convert(): List +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapperFactory.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapperFactory.kt new file mode 100644 index 000000000..161ee65ca --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurItemWrapperFactory.kt @@ -0,0 +1,35 @@ +package com.android.mediproject.core.model.dur + +import com.android.mediproject.core.model.DataGoKrResponse +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionWrapper +import com.android.mediproject.core.model.dur.durproduct.combination.DurProductCombinationTabooResponse +import com.android.mediproject.core.model.dur.durproduct.combination.DurProductCombinationTabooWrapper +import com.android.mediproject.core.model.dur.durproduct.dosing.DurProductDosingCautionResponse +import com.android.mediproject.core.model.dur.durproduct.dosing.DurProductDosingCautionWrapper +import com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication.DurProductEfficacyGroupDuplicationResponse +import com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication.DurProductEfficacyGroupDuplicationWrapper +import com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet.DurProductExReleaseTableSplitAttentionWrapper +import com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet.DurProductExReleaseTabletSplitAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.pregnancy.DurProductPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.durproduct.pregnancy.DurProductPregnantWomanTabooWrapper +import com.android.mediproject.core.model.dur.durproduct.senior.DurProductSeniorCautionResponse +import com.android.mediproject.core.model.dur.durproduct.senior.DurProductSeniorCautionWrapper +import com.android.mediproject.core.model.dur.durproduct.specialtyagegroup.DurProductSpecialtyAgeGroupTabooResponse +import com.android.mediproject.core.model.dur.durproduct.specialtyagegroup.DurProductSpecialtyAgeGroupTabooWrapper + +class DurItemWrapperFactory { + companion object { + inline fun > createForDurProduct(durType: DurType, response: T): DurItemWrapper = when (durType) { + DurType.SPECIALTY_AGE_GROUP_TABOO -> DurProductSpecialtyAgeGroupTabooWrapper(response as DurProductSpecialtyAgeGroupTabooResponse) + DurType.SENIOR_CAUTION -> DurProductSeniorCautionWrapper(response as DurProductSeniorCautionResponse) + DurType.DOSING_CAUTION -> DurProductDosingCautionWrapper(response as DurProductDosingCautionResponse) + DurType.EFFICACY_GROUP_DUPLICATION -> DurProductEfficacyGroupDuplicationWrapper(response as DurProductEfficacyGroupDuplicationResponse) + DurType.EX_RELEASE_TABLET_SPLIT_ATTENTION -> DurProductExReleaseTableSplitAttentionWrapper(response as DurProductExReleaseTabletSplitAttentionResponse) + DurType.COMBINATION_TABOO -> DurProductCombinationTabooWrapper(response as DurProductCombinationTabooResponse) + DurType.PREGNANT_WOMAN_TABOO -> DurProductPregnantWomanTabooWrapper(response as DurProductPregnantWomanTabooResponse) + DurType.CAPACITY_ATTENTION -> DurProductCapacityAttentionWrapper(response as DurProductCapacityAttentionResponse) + } + + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/DurListItem.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurListItem.kt new file mode 100644 index 000000000..58e062aa3 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurListItem.kt @@ -0,0 +1,11 @@ +package com.android.mediproject.core.model.dur + +import android.text.Spanned + +class DurListItem( + val durType: DurType, + val title: Spanned, + val description: Spanned, +) { + var durItems: Result>? = null +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/DurType.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurType.kt new file mode 100644 index 000000000..aefa7b237 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/DurType.kt @@ -0,0 +1,14 @@ +package com.android.mediproject.core.model.dur + +enum class DurType(val type: String) { + CAPACITY_ATTENTION("용량주의"), DOSING_CAUTION("투여기간주의"), EFFICACY_GROUP_DUPLICATION("효능군중복"), EX_RELEASE_TABLET_SPLIT_ATTENTION("서방정분할주의"), + COMBINATION_TABOO("병용금기"), SPECIALTY_AGE_GROUP_TABOO("특정연령대금기"), SENIOR_CAUTION("노인주의"), PREGNANT_WOMAN_TABOO("임부금기"); + + companion object { + fun typeOf(type: String): DurType { + return DurType.values().find { it.type == type } ?: throw IllegalArgumentException("Unknown DurType: $type") + } + + const val excludeType = "첨가제주의" + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/capacity/DurIngrCapacityAttentionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/capacity/DurIngrCapacityAttentionResponse.kt new file mode 100644 index 000000000..47680c11a --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/capacity/DurIngrCapacityAttentionResponse.kt @@ -0,0 +1,53 @@ +package com.android.mediproject.core.model.dur.duringr.capacity + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrCapacityAttentionResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrName DUR성분명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param className 약효분류 + * @param formName 제형 + * @param maxQty 1일 최대용량 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("CLASS_NAME") val className: String = "", // [01120]최면진정제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 636 + @SerialName("FORM_NAME") val formName: String = "", // 정제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000592 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Triazolam + @SerialName("INGR_NAME") val ingrName: String = "", // 트리아졸람 + @SerialName("MAX_QTY") val maxQty: String = "", // 0.25밀리그램 + @SerialName("MIX_INGR") val mixIngr: String = "", // 복합제 + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20130703 + @SerialName("ORI_INGR") val oriIngr: String = "", // [I005603]트리아졸람/[M088380]트리아졸람 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 금기내용 + @SerialName("REMARK") val remark: String = "", // 비고 + @SerialName("TYPE_NAME") val typeName: String = "", // 용량주의 + ) : LeafItem + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTaboo.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTaboo.kt new file mode 100644 index 000000000..f3fd4b20d --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTaboo.kt @@ -0,0 +1,39 @@ +package com.android.mediproject.core.model.dur.duringr.combination + +import android.text.Spanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.duringr.ui.DurIngrItem + +data class DurIngrCombinationTaboo( + val className: String, + val ingrKorName: String, + val ingrEngName: String, + val mixtureClassName: String, + val mixtureIngrKorName: String, + val mixtureIngrEngName: String, + val remark: String, + override val prohibitContent: String = "", +) : DurIngrItem(DurType.COMBINATION_TABOO) { + override val content: Spanned + get() = TODO("Not yet implemented") +} + +class DurIngrCombinationTabooWrapper( + override val response: DurIngrCombinationTabooResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + val item = it.item + DurIngrCombinationTaboo( + className = item.className, + ingrKorName = item.ingrKorName, + ingrEngName = item.ingrEngName, + mixtureClassName = item.mixtureClass, + mixtureIngrKorName = item.mixtureIngrKorName, + mixtureIngrEngName = item.mixtureIngrEngName, + remark = item.remark, + prohibitContent = item.prohibitContent, + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTabooResponse.kt new file mode 100644 index 000000000..4af8610ee --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/combination/DurIngrCombinationTabooResponse.kt @@ -0,0 +1,61 @@ +package com.android.mediproject.core.model.dur.duringr.combination + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrCombinationTabooResponse : DataGoKrResponse() { + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + /** + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분명 + * @param ingrEngName DUR성분 영문명 + * @param className 약효분류 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + * @param mix 복합제 + * @param mixtureIngrEngName 병용금기 DUR성분 영문 + * @param mixtureIngrKorName 병용금기 DUR성분 한글 + * @param mixtureClass 병용금기 약효분류 + * @param mixtureIngrCode 병용금기 DUR성분코드 + * @param mixtureMix 병용금기 복합제 + * @param mixtureMixType 병용금기 복합제구분(단일/복합) + * @param mixtureOri 병용금기 관계성분 + * @param ori 관계성분 + */ + @Serializable + data class Item( + @SerialName("CLASS") val className: String = "", // [06290]기타의 화학요법제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000762 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Itraconazole + @SerialName("INGR_KOR_NAME") val ingrKorName: String = "", // 이트라코나졸 + @SerialName("MIX") val mix: String = "", + @SerialName("MIXTURE_CLASS") val mixtureClass: String = "", // [02180]동맥경화용제 + @SerialName("MIXTURE_INGR_CODE") val mixtureIngrCode: String = "", // D000027 + @SerialName("MIXTURE_INGR_ENG_NAME") val mixtureIngrEngName: String = "", // Simvastatin + @SerialName("MIXTURE_INGR_KOR_NAME") val mixtureIngrKorName: String = "", // 심바스타틴 + @SerialName("MIXTURE_MIX") val mixtureMix: String = "", + @SerialName("MIXTURE_MIX_TYPE") val mixtureMixType: String = "", // 단일 + @SerialName("MIXTURE_ORI") val mixtureOri: String = "", // [M089710]심바스타틴 + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20090303 + @SerialName("ORI") + val ori: String = "", // [M083733]이트라코나졸제피과립/[M083734]이트라코나졸/[M092870]이트라코나졸고체분산체/[M201487]이트라코나졸고체분산/[M201624]제피이트라코나졸과립 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 횡문근융해증 + @SerialName("REMARK") val remark: String = "", // 75세 이상 남성 + @SerialName("TYPE_NAME") val typeName: String = "", // 병용금기 + ) : LeafItem + } + + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/dosing/DurIngrDosingCautionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/dosing/DurIngrDosingCautionResponse.kt new file mode 100644 index 000000000..11fcd0f30 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/dosing/DurIngrDosingCautionResponse.kt @@ -0,0 +1,53 @@ +package com.android.mediproject.core.model.dur.duringr.dosing + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrDosingCautionResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분 명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param className 약효분류 + * @param formName 제형 + * @param maxDosageTerm 최대 투여 기간 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("CLASS_NAME") val className: String = "", // [01120]최면진정제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 459 + @SerialName("FORM_NAME") val formName: String = "", // 정제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000592 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Triazolam + @SerialName("INGR_NAME") val ingrKorName: String = "", // 트리아졸람 + @SerialName("MAX_DOSAGE_TERM") val maxDosageTerm: String = "", // 21일 + @SerialName("MIX_INGR") val mixIngr: String = "", + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20100511 + @SerialName("ORI_INGR") val oriIngr: String = "", // [I005603]트리아졸람/[M088380]트리아졸람 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // null + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 투여기간주의 + ) : LeafItem + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/efficacygroupduplication/DurIngrEfficacyGroupDuplicationResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/efficacygroupduplication/DurIngrEfficacyGroupDuplicationResponse.kt new file mode 100644 index 000000000..a443bf8ff --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/efficacygroupduplication/DurIngrEfficacyGroupDuplicationResponse.kt @@ -0,0 +1,50 @@ +package com.android.mediproject.core.model.dur.duringr.efficacygroupduplication + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrEfficacyGroupDuplicationResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분 명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param className 약효분류 + * @param effectCode 효능군 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("CLASS_NAME") val className: String = "", // [01140]해열.진통.소염제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 2463 + @SerialName("EFFECT_CODE") val effectCode: String = "", // 해열진통소염제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000739 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Aceclofenac + @SerialName("INGR_NAME") val ingrKorName: String = "", // 아세클로페낙 + @SerialName("MIX_INGR") val mixIngr: String = "", + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20120831 + @SerialName("ORI_INGR") val oriIngr: String = "", // [M040359]아세클로페낙 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // null + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 효능군중복 + ) : LeafItem + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/pregnancy/DurIngrPregnantWomanTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/pregnancy/DurIngrPregnantWomanTabooResponse.kt new file mode 100644 index 000000000..d01a00f31 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/pregnancy/DurIngrPregnantWomanTabooResponse.kt @@ -0,0 +1,52 @@ +package com.android.mediproject.core.model.dur.duringr.pregnancy + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrPregnantWomanTabooResponse : DataGoKrResponse() { + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분 명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param className 약효분류 + * @param formName 제형 + * @param grade 등급 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("CLASS_NAME") val className: String = "", // [02470]난포호르몬제 및 황체호르몬제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 1893 + @SerialName("FORM_NAME") + val formName: String = "", // 연질캡슐제, 현탁상/유화주사제/용액용분말주사제/서방성현탁액용분말주사제/용액용동결건조분말주사제/현탁액용동결건조분말주사제/서방성현탁액용동결건조분말주사제/리포좀화현탁액용동결건조분말주사제/현탁액주사제/서방성현탁액성주사제/용액주사제 + @SerialName("GRADE") val grade: String = "", // 1등급 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000100 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Progesterone + @SerialName("INGR_NAME") val ingrKorName: String = "", // 프로게스테론 + @SerialName("MIX_INGR") val mixIngr: String = "", + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20081211 + @SerialName("ORI_INGR") val oriIngr: String = "", // [M040719]프로게스테론/[M086429]미분화프로게스테론/[M252921]프로게스테론(미분화) + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 임부에 대한 안전성 미확립. + @SerialName("REMARK") val remark: String = "", // 경구 + @SerialName("TYPE_NAME") val typeName: String = "", // 임부금기 + ) : LeafItem + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/senior/DurIngrSeniorCautionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/senior/DurIngrSeniorCautionResponse.kt new file mode 100644 index 000000000..ee497fd52 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/senior/DurIngrSeniorCautionResponse.kt @@ -0,0 +1,48 @@ +package com.android.mediproject.core.model.dur.duringr.senior + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrSeniorCautionResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분 명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param formName 제형 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 1 + @SerialName("FORM_NAME") val formName: String = "", + @SerialName("INGR_CODE") val ingrCode: String = "", // D000056 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Chlordiazepoxide + @SerialName("INGR_NAME") val ingrKorName: String = "", // 클로르디아제폭시드 + @SerialName("MIX_INGR") val mixIngr: String = "", + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20150728 + @SerialName("ORI_INGR") val oriIngr: String = "", // [M088403]클로르디아제폭시드/[M223206]클로르디아제폭시드염산염 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 노인에서의 장기지속형 벤조다이아제핀 사용은 운동실조, 과진정 등이 나타나기 쉬움으로 소량부터 신중투여 + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 노인주의 + ) : LeafItem + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/specialtyagegroup/DurIngrSpecialtyAgeGroupTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/specialtyagegroup/DurIngrSpecialtyAgeGroupTabooResponse.kt new file mode 100644 index 000000000..46670bc44 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/specialtyagegroup/DurIngrSpecialtyAgeGroupTabooResponse.kt @@ -0,0 +1,54 @@ +package com.android.mediproject.core.model.dur.duringr.specialtyagegroup + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurIngrSpecialtyAgeGroupTabooResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item = Item(), + ) { + + /** + * @param durSeq DUR번호 + * @param typeName DUR유형 + * @param mixType 복합제구분(단일/복합) + * @param ingrCode DUR성분코드 + * @param ingrKorName DUR성분 명 + * @param ingrEngName DUR성분 영문명 + * @param mixIngr 복합제 + * @param oriIngr 관계성분 + * @param className 약효분류 + * @param ageBase 나이대 + * @param formName 제형 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param delYn 상태(정상/삭제) + */ + @Serializable + data class Item( + @SerialName("AGE_BASE") val ageBase: String = "", // 18세 이하 + @SerialName("CLASS_NAME") val className: String = "", // [03960]당뇨병용제 + @SerialName("DEL_YN") val delYn: String = "", // 정상 + @SerialName("DUR_SEQ") val durSeq: String = "", // 455 + @SerialName("FORM_NAME") val formName: String = "", // 정제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000149 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Acarbose + @SerialName("INGR_NAME") val ingrKorName: String = "", // 아카보즈 + @SerialName("MIX_INGR") val mixIngr: String = "", + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20140109 + @SerialName("ORI_INGR") val oriIngr: String = "", // [M085039]아카보즈 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 안전성 및 유효성 미확립 + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 특정연령대금기 + ) : LeafItem + } + + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/ui/DurIngrItem.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/ui/DurIngrItem.kt new file mode 100644 index 000000000..51e18f9e2 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/duringr/ui/DurIngrItem.kt @@ -0,0 +1,10 @@ +package com.android.mediproject.core.model.dur.duringr.ui + +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.core.model.dur.DurType + +abstract class DurIngrItem( + val durType: DurType, +) : DurItem { + open val prohibitContent: String = "" +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttention.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttention.kt new file mode 100644 index 000000000..0f48dacea --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttention.kt @@ -0,0 +1,53 @@ +package com.android.mediproject.core.model.dur.durproduct.capacity + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 용량주의 + * + * @param itemName 품목명 + * @param prohibitContent 1일 최대투여량 + */ +data class DurProductCapacityAttention( + val itemName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.CAPACITY_ATTENTION) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + + +fun DurProductCapacityAttentionResponse.Item.toDurProductCapacityAttention() = DurProductCapacityAttention( + itemName = itemName, + prohibitContent = prohibitContent, +) + +class DurProductCapacityAttentionWrapper( + override val response: DurProductCapacityAttentionResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductCapacityAttention( + itemName = it.itemName, + prohibitContent = it.prohibitContent, + ) + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttentionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttentionResponse.kt new file mode 100644 index 000000000..366a60fe5 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/capacity/DurProductCapacityAttentionResponse.kt @@ -0,0 +1,60 @@ +package com.android.mediproject.core.model.dur.durproduct.capacity + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductCapacityAttentionResponse : DataGoKrResponse() { + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrEngNameFull 성분영문명(전체) + * @param ingrName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param mixType 복합제구분(단일/복합) + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + * + */ + @Serializable + data class Item( + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20190826 + @SerialName("CHART") val chart: String = "", // 미황색의 원형 정제 + @SerialName("CLASS_CODE") val classCode: String = "", // 01410 + @SerialName("CLASS_NAME") val className: String = "", // 항히스타민제 + @SerialName("ENTP_NAME") val entpName: String = "", // (주)유한양행 + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 일반의약품 + @SerialName("FORM_NAME") val formName: String = "", // 나정 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000893 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Chlorpheniramine Maleate + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Chlorpheniramine Maleate(클로르페니라민말레산염) + @SerialName("INGR_NAME") val ingrName: String = "", // 클로르페니라민말레산염 + @SerialName("ITEM_NAME") val itemName: String = "", // 페니라민정(클로르페니라민말레산염) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19601010 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 196000011 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M223211]클로르페니라민말레산염 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20180831 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 클로르페니라민말레산염 24mg + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 용량주의 + ) : LeafItem + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTaboo.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTaboo.kt new file mode 100644 index 000000000..57e645cff --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTaboo.kt @@ -0,0 +1,55 @@ +package com.android.mediproject.core.model.dur.durproduct.combination + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +data class DurProductCombinationTaboo( + val itemName: String, + val ingrKorName: String, + val ingrEngName: String, + val className: String, + val mixtureClassName: String, + val mixtureIngrKorName: String, + val mixtureIngrEngName: String, + val remark: String, + override val prohibitContent: String, +) : DurProductItem(DurType.COMBINATION_TABOO) { + override val content: Spanned = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + +class DurProductCombinationTabooWrapper( + override val response: DurProductCombinationTabooResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductCombinationTaboo( + itemName = it.itemName, + ingrKorName = it.ingrKorName, + ingrEngName = it.ingrEngName, + className = it.className, + mixtureClassName = it.mixtureClassName, + mixtureIngrKorName = it.mixtureIngrKorName, + mixtureIngrEngName = it.mixtureIngrEngName, + remark = it.remark, + prohibitContent = it.prohibitContent, + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTabooResponse.kt new file mode 100644 index 000000000..78b6b3efb --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/combination/DurProductCombinationTabooResponse.kt @@ -0,0 +1,103 @@ +package com.android.mediproject.core.model.dur.durproduct.combination + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductCombinationTabooResponse : DataGoKrResponse() { + + /** + * @param bizrNo 사업자등록번호 + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param durSeq DUR 일련번호 + * @param entpName 업체명 + * @param etcOtcCode 전문일반 구분코드 + * @param etcOtcName 전문일반 구분명 + * @param formCode 제형코드 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrKorName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mix 복합제 구분(단일/복합) + * @param mixIngr 복합제 + * @param mixtureChangeDate 병용변경일자 + * @param mixtureChart 병용금기 성상 + * @param mixtureClassCode 병용금기 분류코드 + * @param mixtureClassName 병용금기 분류명 + * @param mixtureDurSeq 병용금기 DUR번호 + * @param mixtureEntpName 병용금기 업체명 + * @param mixtureEtcOtcCode 병용금기 전문일반구분코드 + * @param mixtureEtcOtcName 병용금기 전문일반구분명 + * @param mixtureFormCode 병용금기 제형코드 + * @param mixtureFormName 병용금기 제형명 + * @param mixtureIngrCode 병용금기 성분코드 + * @param mixtureIngrEngName 병용금기 성분영문명 + * @param mixtureIngrKorName 병용금기 성분명 + * @param mixtureItemName 병용금기 제품명 + * @param mixtureItemPermitDate 병용금기 허가일자 + * @param mixtureItemSeq 병용금기 품목기준코드 + * @param mixtureMainIngr 병용금기 주성분 + * @param mixtureMix 병용금기 복합제구분 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeCode 금기 유형코드 + * @param typeName 금기 유형명 + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrNo: String = "", // 1188100450 + @SerialName("CHANGE_DATE") val changeDate: String = "", // null + @SerialName("CHART") val chart: String = "", // 무색 맑은 용액이 충전된 무색의 앰플 주사제 + @SerialName("CLASS_CODE") val classCode: String = "", // 01120 + @SerialName("CLASS_NAME") val className: String = "", // 최면진정제 + @SerialName("DUR_SEQ") val durSeq: String = "", // 705 + @SerialName("ENTP_NAME") val entpName: String = "", // 부광약품(주) + @SerialName("ETC_OTC_CODE") val etcOtcCode: String = "", // 02 + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_CODE") val formCode: String = "", // 210101 + @SerialName("FORM_NAME") val formName: String = "", // 용액주사제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000007 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Midazolam + @SerialName("INGR_KOR_NAME") val ingrKorName: String = "", // 미다졸람 + @SerialName("ITEM_NAME") val itemName: String = "", // 부광미다졸람주사15밀리그램/3밀리리터(수출용) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 20200413 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 202002585 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M222760]미다졸람 + @SerialName("MIX") val mix: String = "", // 단일 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("MIXTURE_CHANGE_DATE") val mixtureChangeDate: String = "", // 20230530 + @SerialName("MIXTURE_CHART") val mixtureChart: String = "", // 흰색의 장방형 필름코팅정 + @SerialName("MIXTURE_CLASS_CODE") val mixtureClassCode: String = "", // 06290 + @SerialName("MIXTURE_CLASS_NAME") val mixtureClassName: String = "", // 기타의 화학요법제 + @SerialName("MIXTURE_DUR_SEQ") val mixtureDurSeq: String = "", // 705 + @SerialName("MIXTURE_ENTP_NAME") val mixtureEntpName: String = "", // 한국애브비(주) + @SerialName("MIXTURE_ETC_OTC_CODE") val mixtureEtcOtcCode: String = "", // 02 + @SerialName("MIXTURE_ETC_OTC_NAME") val mixtureEtcOtcName: String = "", // 전문의약품 + @SerialName("MIXTURE_FORM_CODE") val mixtureFormCode: String = "", // 010201 + @SerialName("MIXTURE_FORM_NAME") val mixtureFormName: String = "", // 필름코팅정 + @SerialName("MIXTURE_INGR_CODE") val mixtureIngrCode: String = "", // D000712 + @SerialName("MIXTURE_INGR_ENG_NAME") val mixtureIngrEngName: String = "", // Ritonavir + @SerialName("MIXTURE_INGR_KOR_NAME") val mixtureIngrKorName: String = "", // 리토나비르 + @SerialName("MIXTURE_ITEM_NAME") val mixtureItemName: String = "", // 노비르정(리토나비르) + @SerialName("MIXTURE_ITEM_PERMIT_DATE") val mixtureItemPermitDate: String = "", // 20110901 + @SerialName("MIXTURE_ITEM_SEQ") val mixtureItemSeq: String = "", // 201106064 + @SerialName("MIXTURE_MAIN_INGR") val mixtureMainIngr: String = "", // [M259362]리토나비르 + @SerialName("MIXTURE_MIX") val mixtureMix: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20091203 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 진정작용의 연장 또는 증가, 호흡저하 + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_CODE") val typeCode: String = "", // A + @SerialName("TYPE_NAME") val typeName: String = "", // 병용금기 + ) : LeafItem + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCaution.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCaution.kt new file mode 100644 index 000000000..b2af95fbb --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCaution.kt @@ -0,0 +1,48 @@ +package com.android.mediproject.core.model.dur.durproduct.dosing + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 투여기간 주의 + * + * @param itemName 품목명 + * @param prohibitContent 최대 투여기간 + */ +data class DurProductDosingCaution( + val itemName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.DOSING_CAUTION) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + + +class DurProductDosingCautionWrapper( + override val response: DurProductDosingCautionResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductDosingCaution( + itemName = it.itemName, + prohibitContent = it.prohibitContent, + ) + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCautionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCautionResponse.kt new file mode 100644 index 000000000..490202b85 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/dosing/DurProductDosingCautionResponse.kt @@ -0,0 +1,60 @@ +package com.android.mediproject.core.model.dur.durproduct.dosing + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductDosingCautionResponse : DataGoKrResponse() { + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrEngNameFull 성분영문명(전체) + * @param ingrName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param mixType 복합제구분(단일/복합) + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + */ + @Serializable + data class Item( + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20140103 + @SerialName("CHART") val chart: String = "", // 흰색의 원형 필름코팅정 + @SerialName("CLASS_CODE") val classCode: String = "", // 02390 + @SerialName("CLASS_NAME") val className: String = "", // 기타의 소화기관용약 + @SerialName("ENTP_NAME") val entpName: String = "", // 동화약품(주) + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_NAME") val formName: String = "", // 필름코팅정 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000425 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Metoclopramide + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Metoclopramide(메토클로프라미드) + @SerialName("INGR_NAME") val ingrName: String = "", // 메토클로프라미드 + @SerialName("ITEM_NAME") val itemName: String = "", // 맥페란정(메토클로프라미드) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19720210 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 197200484 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M050465]메토클로프라미드 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20150331 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // null + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 투여기간주의 + ) : LeafItem + + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplication.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplication.kt new file mode 100644 index 000000000..f9e987c95 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplication.kt @@ -0,0 +1,49 @@ +package com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +data class DurProductEfficacyGroupDuplication( + val itemName: String, + val effectName: String, + val className: String, + val ingrKorName: String, + val ingrEngName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.EFFICACY_GROUP_DUPLICATION) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(ingrEngName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(itemName) + + builder.toSpanned() + } +} + +class DurProductEfficacyGroupDuplicationWrapper( + override val response: DurProductEfficacyGroupDuplicationResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductEfficacyGroupDuplication( + itemName = it.itemName, + effectName = it.effectName, + className = it.className, + ingrKorName = it.ingrName, + ingrEngName = it.ingrEngName, + prohibitContent = it.prohibitContent, + ) + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplicationResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplicationResponse.kt new file mode 100644 index 000000000..c31d9d2a6 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/efficacygroupduplication/DurProductEfficacyGroupDuplicationResponse.kt @@ -0,0 +1,70 @@ +package com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductEfficacyGroupDuplicationResponse : DataGoKrResponse() { + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param bizrNo 사업자등록번호 + * @param className 약효분류 + * @param durSeq DUR 일련번호 + * @param etcOtcCode 전문일반 구분코드 + * @param formCode 제형코드 + * @param ingrEngNameFull 성분영문명(전체) + * @param effectName 효능 + * @param mix 복합제 구분(단일/복합) + * @param formCodeName 제형코드명 + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrNo: String = "", // 1138106691 + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20131231 + @SerialName("CHART") val chart: String = "", // 백색의 원형정제이다. + @SerialName("CLASS_CODE") val classCode: String = "", // 01190 + @SerialName("CLASS_NAME") val className: String = "", // 기타의 중추신경용약 + @SerialName("DUR_SEQ") val durSeq: String = "", // 2600 + @SerialName("EFFECT_NAME") val effectName: String = "", // 정신신경용제 + @SerialName("ENTP_NAME") val entpName: String = "", // 아주약품(주) + @SerialName("ETC_OTC_CODE") val etcOtcCode: String = "", // 02 + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_CODE") val formCode: String = "", // 010101 + @SerialName("FORM_CODE_NAME") val formCodeName: String = "", // 나정 + @SerialName("FORM_NAME") val formName: String = "", // 나정 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000468 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Orphenadrine Hydrochloride + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Orphenadrine(오르페나드린) + @SerialName("INGR_NAME") val ingrName: String = "", // 오르페나드린염산염 + @SerialName("ITEM_NAME") val itemName: String = "", // 닉신정(오르페나드린염산염)(수출용) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19841019 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 198400314 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M222877]오르페나드린염산염 + @SerialName("MIX") val mix: String = "", // 단일 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20131227 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // null + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 효능군중복 + ) : LeafItem +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttention.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttention.kt new file mode 100644 index 000000000..7074854c8 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttention.kt @@ -0,0 +1,48 @@ +package com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 서방정 분할 주의 + * + * @param itemName 품목명 + * @param prohibitContent 분할금기 내용 + */ +data class DurProductExReleaseTabletSplitAttention( + val itemName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.EX_RELEASE_TABLET_SPLIT_ATTENTION) { + + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + +class DurProductExReleaseTableSplitAttentionWrapper( + override val response: DurProductExReleaseTabletSplitAttentionResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductExReleaseTabletSplitAttention( + itemName = it.itemName, + prohibitContent = it.prohibitContent, + ) + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttentionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttentionResponse.kt new file mode 100644 index 000000000..93c3ccd7a --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/extendedreleasetablet/DurProductExReleaseTabletSplitAttentionResponse.kt @@ -0,0 +1,49 @@ +package com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductExReleaseTabletSplitAttentionResponse : DataGoKrResponse() { + + + /** + * @param bizrNo 사업자등록번호 + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formCodeName 제형코드명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mix 복합제 구분(단일/복합) + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrNo: String = "", // 2188100518 + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20210629 + @SerialName("CHART") val chart: String = "", // 내수용 : 연녹색의 원형 장용성 필름코팅정, 수출용 : 적색의 원형 장용성 필름코팅정 + @SerialName("CLASS_CODE") val classCode: String = "", // 03950 + @SerialName("CLASS_NAME") val className: String = "", // 효소제제 + @SerialName("ENTP_NAME") val entpName: String = "", // (주)에이프로젠바이오로직스 + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 일반의약품 + @SerialName("FORM_CODE_NAME") val formCodeName: String = "", // 장용성필름코팅정 + @SerialName("ITEM_NAME") val itemName: String = "", // 키모랄에스정 + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 1971May6th + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 197100081 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M051649]결정트립신/[M095415]브로멜라인/[M095415]브로멜라인/[M051649]결정트립신 + @SerialName("MIX") val mix: String = "", // 복합 + @SerialName("PROHBT_CONTENT") val prohibitContent: String = "", // 분할불가 + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 분할주의 + ) : LeafItem +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTaboo.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTaboo.kt new file mode 100644 index 000000000..2d6cc3b33 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTaboo.kt @@ -0,0 +1,57 @@ +package com.android.mediproject.core.model.dur.durproduct.pregnancy + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 임부 금기 + * + * @param itemName 품목명 + * @param ingrKorName 성분명(한글) + * @param ingrEngName 성분명(영문) + * @param prohibitContent 금기 내용 + */ +data class DurProductPregnantWomanTaboo( + val itemName: String, + val ingrKorName: String, + val ingrEngName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.PREGNANT_WOMAN_TABOO) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append(ingrEngName) + builder.setSpan(StyleSpan(Typeface.BOLD), builder.length - ingrEngName.length, builder.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + +class DurProductPregnantWomanTabooWrapper( + override val response: DurProductPregnantWomanTabooResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductPregnantWomanTaboo( + itemName = it.itemName, + ingrKorName = it.ingrName, + ingrEngName = it.ingrEngName, + prohibitContent = it.prohibitContent, + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTabooResponse.kt new file mode 100644 index 000000000..cbe9bb052 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/pregnancy/DurProductPregnantWomanTabooResponse.kt @@ -0,0 +1,59 @@ +package com.android.mediproject.core.model.dur.durproduct.pregnancy + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductPregnantWomanTabooResponse : DataGoKrResponse() { + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrEngNameFull 성분영문명(전체) + * @param ingrName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param mixType 복합제구분(단일/복합) + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + */ + @Serializable + data class Item( + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20200327 + @SerialName("CHART") val chart: String = "", // 흰색의 원형 정제 + @SerialName("CLASS_CODE") val classCode: String = "", // 02170 + @SerialName("CLASS_NAME") val className: String = "", // 혈관확장제 + @SerialName("ENTP_NAME") val entpName: String = "", // 에이치케이이노엔(주) + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_NAME") val formName: String = "", // 나정 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000818 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Diltiazem + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Diltiazem(딜티아젬) + @SerialName("INGR_NAME") val ingrName: String = "", // 딜티아젬 + @SerialName("ITEM_NAME") val itemName: String = "", // 헤르벤정(딜티아젬염산염) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19810720 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 198100012 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M222982]딜티아젬염산염 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20081211 + @SerialName("PROHBT_CONTENT") + val prohibitContent: String = "", // "(경구) 동물실험에서 골격, 심장, 망막 및 혀에 기형 보고.출생자의 체중감소 및 생존수 감소, 분만지연, 사산수 증가 보고.(주사)동물 실험에서 최기형성 및 태자치사 작용 보고." + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 임부금기 + ) : LeafItem +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/productlist/DurProductListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/productlist/DurProductListResponse.kt new file mode 100644 index 000000000..2951d07d6 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/productlist/DurProductListResponse.kt @@ -0,0 +1,52 @@ +package com.android.mediproject.core.model.dur.durproduct.productlist + + +import com.android.mediproject.core.model.DataGoKrResponse +import com.android.mediproject.core.model.dur.DurType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductListResponse : DataGoKrResponse() { + + + /** + * @param barCode 표준코드 + * @param bizrNo 사업자등록번호 + * @param cancelDate 취소일자 + * @param cancelName 취소사유 + * @param changeDate 변경일자 + * @param chart 성상 + * @param classNo 분류번호 + * @param ediCode 보험코드 + * @param entpName 업체명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param materialName 원료성분 + * @param packUnit 포장단위 + * @param storageMethod 저장방법 + * @param typeName DUR 유형 + */ + @Serializable + data class Item( + @SerialName("BAR_CODE") val barCode: String = "", // 8806421025729 + @SerialName("BIZRNO") val bizrNo: String = "", // 1188100601 + @SerialName("CANCEL_DATE") val cancelDate: String = "", // null + @SerialName("CANCEL_NAME") val cancelName: String = "", // 정상 + @SerialName("CHANGE_DATE") val changeDate: String = "", // 2019August26th + @SerialName("CHART") val chart: String = "", // 미황색의 원형 정제 + @SerialName("CLASS_NO") val classNo: String = "", // [141]항히스타민제 + @SerialName("EDI_CODE") val ediCode: String = "", // 642102570 + @SerialName("ENTP_NAME") val entpName: String = "", // (주)유한양행 + @SerialName("ITEM_NAME") val itemName: String = "", // 페니라민정(클로르페니라민말레산염) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 1960October10th + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 196000011 + @SerialName("MATERIAL_NAME") val materialName: String = "", // 클로르페니라민말레산염,,2.0,밀리그램,KP, + @SerialName("PACK_UNIT") val packUnit: String = "", // 1000정/병 + @SerialName("STORAGE_METHOD") val storageMethod: String = "", // 실온, 건소, 밀폐용기, + @SerialName("TYPE_NAME ") val typeName: String = "", // 용량주의,노인주의,첨가제주의 + ) : LeafItem { + val typeNames = typeName.split(",").filterNot { it == DurType.excludeType } + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCaution.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCaution.kt new file mode 100644 index 000000000..c39e6ee47 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCaution.kt @@ -0,0 +1,48 @@ +package com.android.mediproject.core.model.dur.durproduct.senior + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 노인 주의 + * + * @param itemName 품목명 + * @param prohibitContent 노인주의 내용 + */ +data class DurProductSeniorCaution( + val itemName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.SENIOR_CAUTION) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + +class DurProductSeniorCautionWrapper( + override val response: DurProductSeniorCautionResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductSeniorCaution( + itemName = it.itemName, + prohibitContent = it.prohibitContent, + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCautionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCautionResponse.kt new file mode 100644 index 000000000..e81d3165d --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/senior/DurProductSeniorCautionResponse.kt @@ -0,0 +1,62 @@ +package com.android.mediproject.core.model.dur.durproduct.senior + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductSeniorCautionResponse : DataGoKrResponse() { + + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param entpName 업체명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param typeName DUR 유형 + * @param className 약효분류 + * @param classCode 약효분류코드 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrName 성분명 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param mixType 복합제구분(단일/복합) + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param ingrEngNameFull 성분영문명(전체) + */ + @Serializable + data class Item( + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20221201 + @SerialName("CHART") val chart: String = "", // 청색의 원형 필름코팅정 + @SerialName("CLASS_CODE") val classCode: String = "", // 01170 + @SerialName("CLASS_NAME") val className: String = "", // 정신신경용제 + @SerialName("ENTP_NAME") val entpName: String = "", // 환인제약(주) + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_NAME") val formName: String = "", // 필름코팅정 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000809 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Amitriptyline + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Amitriptyline(아미트리프틸린) + @SerialName("INGR_NAME") val ingrName: String = "", // 아미트리프틸린 + @SerialName("ITEM_NAME") val itemName: String = "", // 에나폰정10밀리그램(아미트리프틸린염산염) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19700220 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 197000079 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M223101]아미트리프틸린염산염 + @SerialName("MIX_INGR") val mixIngr: String = "", // [M223101]아미트리프틸린염산염 + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20150728 + @SerialName("PROHBT_CONTENT") + val prohibitContent: String = "", // 노인에서의 삼환계 항우울제 사용은 기립성 저혈압, 비틀거림, 항콜린작용에 의한 구갈, 배뇨곤란, 변비, 안내압항진 등이 나타나기 쉬움으로 소량으로 신중투여 + @SerialName("REMARK") val remark: String = "", // null + @SerialName("TYPE_NAME") val typeName: String = "", // 노인주의 + ) : LeafItem + + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTaboo.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTaboo.kt new file mode 100644 index 000000000..35e026472 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTaboo.kt @@ -0,0 +1,48 @@ +package com.android.mediproject.core.model.dur.durproduct.specialtyagegroup + +import android.graphics.Typeface +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.RelativeSizeSpan +import android.text.style.StyleSpan +import androidx.core.text.toSpanned +import com.android.mediproject.core.model.dur.DurItemWrapper +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.ui.DurProductItem +import java.lang.ref.WeakReference + +/** + * 특정연령대 금기 + * + * @param itemName 품목명 + * @param prohibitContent 연령금기내용 + */ +data class DurProductSpecialtyAgeGroupTaboo( + val itemName: String, + override val prohibitContent: String, +) : DurProductItem(DurType.SPECIALTY_AGE_GROUP_TABOO) { + override val content: Spanned + get() = WeakReference(SpannableStringBuilder()).get()!!.let { builder -> + builder.append(itemName) + builder.setSpan(StyleSpan(Typeface.BOLD), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + builder.setSpan(RelativeSizeSpan(1.2f), 0, itemName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + + builder.append("\n") + builder.append(prohibitContent) + + builder.toSpanned() + } +} + +class DurProductSpecialtyAgeGroupTabooWrapper( + override val response: DurProductSpecialtyAgeGroupTabooResponse, +) : DurItemWrapper(response) { + override fun convert() = response.body.items.map { + DurProductSpecialtyAgeGroupTaboo( + itemName = it.itemName, + prohibitContent = it.prohibitContent, + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTabooResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTabooResponse.kt new file mode 100644 index 000000000..bfa21c49e --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/specialtyagegroup/DurProductSpecialtyAgeGroupTabooResponse.kt @@ -0,0 +1,60 @@ +package com.android.mediproject.core.model.dur.durproduct.specialtyagegroup + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class DurProductSpecialtyAgeGroupTabooResponse : DataGoKrResponse() { + + /** + * @param changeDate 변경일자 + * @param chart 성상 + * @param classCode 약효분류코드 + * @param className 약효분류 + * @param entpName 업체명 + * @param etcOtcName 전문일반 구분명 + * @param formName 제형명 + * @param ingrCode 성분코드 + * @param ingrEngName 성분영문명 + * @param ingrEngNameFull 성분영문명(전체) + * @param ingrName 성분명 + * @param itemName 제품명 + * @param itemPermitDate 품목허가일자 + * @param itemSeq 품목기준코드 + * @param mainIngr 주성분 + * @param mixIngr 복합제 + * @param mixType 복합제구분(단일/복합) + * @param notificationDate 고시일자 + * @param prohibitContent 금기내용 + * @param remark 비고 + * @param typeName DUR유형 + */ + @Serializable + data class Item( + @SerialName("CHANGE_DATE") val changeDate: String = "", // 20200313 + @SerialName("CHART") val chart: String = "", // 황색의 결정 또는 결정성 가루가 들어 있는 상부는 갈색, 하부는 담회색의 캅셀이다. + @SerialName("CLASS_CODE") val classCode: String = "", // 06150 + @SerialName("CLASS_NAME") val className: String = "", // 주로 그람양성, 음성균, 리케치아, 비루스에 작용하는 것 + @SerialName("ENTP_NAME") val entpName: String = "", // (주)종근당 + @SerialName("ETC_OTC_NAME") val etcOtcName: String = "", // 전문의약품 + @SerialName("FORM_NAME") val formName: String = "", // 경질캡슐제, 산제 + @SerialName("INGR_CODE") val ingrCode: String = "", // D000064 + @SerialName("INGR_ENG_NAME") val ingrEngName: String = "", // Tetracycline Hydrochloride + @SerialName("INGR_ENG_NAME_FULL") val ingrEngNameFull: String = "", // Tetracycline Hydrochloride(테트라사이클린염산염) + @SerialName("INGR_NAME") val ingrName: String = "", // 테트라사이클린염산염 + @SerialName("ITEM_NAME") val itemName: String = "", // 테라싸이클린캅셀250밀리그람(염산테트라싸이클린) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", // 19600614 + @SerialName("ITEM_SEQ") val itemSeq: String = "", // 196000001 + @SerialName("MAIN_INGR") val mainIngr: String = "", // [M223235]테트라사이클린염산염 + @SerialName("MIX_INGR") val mixIngr: String = "", // null + @SerialName("MIX_TYPE") val mixType: String = "", // 단일 + @SerialName("NOTIFICATION_DATE") val notificationDate: String = "", // 20140109 + @SerialName("PROHBT_CONTENT") + val prohibitContent: String = "", // 소아 등(특히 치아 형성기인 12세 미만의 소아)에 투여 시, 치아의 착색?법랑질 형성 부전, 또는 일과성 골발육 부전을 일으킬 수 있음 + @SerialName("REMARK") val remark: String = "", // 다만, 다른 약을 사용할 수 없거나 효과가 없는 경우에만 8세 이상 신중투여 + @SerialName("TYPE_NAME") val typeName: String = "", // 특정연령대금기 + ) : LeafItem + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/ui/DurProductItem.kt b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/ui/DurProductItem.kt new file mode 100644 index 000000000..0ee4bbe0b --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/dur/durproduct/ui/DurProductItem.kt @@ -0,0 +1,10 @@ +package com.android.mediproject.core.model.dur.durproduct.ui + +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.core.model.dur.DurType + +abstract class DurProductItem( + val durType: DurType, +) : DurItem { + open val prohibitContent: String = "" +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicine.kt b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicine.kt new file mode 100644 index 000000000..f00f093dd --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicine.kt @@ -0,0 +1,10 @@ +package com.android.mediproject.core.model.favoritemedicine + + +data class FavoriteMedicine( + val itemSeq: String, + val medicineName: String +) + +fun FavoriteMedicineListResponse.Medicine.toFavoriteMedicine() = + FavoriteMedicine(itemSeq = itemSeq, medicineName = itemName) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineDto.kt deleted file mode 100644 index eb7b7b24c..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineDto.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.android.mediproject.core.model.favoritemedicine - - -data class FavoriteMedicineDto( - val itemSeq: String, - val medicineName: String -) - -fun FavoriteMedicineListResponse.Medicine.toFavoriteMedicineDto() = - FavoriteMedicineDto(itemSeq = itemSeq, medicineName = itemName) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineListResponse.kt index 632bc2cea..096090026 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineListResponse.kt @@ -1,13 +1,13 @@ package com.android.mediproject.core.model.favoritemedicine -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class FavoriteMedicineListResponse( - val medicineList: List -) : BaseAwsQueryResponse() { + val medicineList: List, +) : ServerQueryResponse() { @Serializable data class Medicine( @SerialName("ENTP_NAME") @@ -23,6 +23,6 @@ data class FavoriteMedicineListResponse( @SerialName("PRDUCT_TYPE") val prductType: String, @SerialName("SPCLTY_PBLC") - val spcltyPblc: String + val spcltyPblc: String, ) -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreInfo.kt similarity index 70% rename from core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreInfo.kt index 77e87bf8f..5cea20365 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/favoritemedicine/FavoriteMedicineMoreInfo.kt @@ -1,18 +1,18 @@ package com.android.mediproject.core.model.favoritemedicine -data class FavoriteMedicineMoreDto( +data class FavoriteMedicineMoreInfo( val id: Int, val itemName: String, val entpName: String, val itemIngrName: String, - val spcltyPblc: String + val spcltyPblc: String, ) -fun FavoriteMedicineListResponse.Medicine.toFavoriteMedicineMoreDto() = - FavoriteMedicineMoreDto( +fun FavoriteMedicineListResponse.Medicine.toFavoriteMedicineMoreInfo() = + FavoriteMedicineMoreInfo( id = id, itemName = itemName, entpName = entpName, itemIngrName = itemIngrName, - spcltyPblc = spcltyPblc - ) \ No newline at end of file + spcltyPblc = spcltyPblc, + ) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt similarity index 93% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt index 47c440558..93502babc 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt @@ -1,6 +1,6 @@ -package com.android.mediproject.core.model.remote.granule +package com.android.mediproject.core.model.granule -import com.android.mediproject.core.toLocalDate +import com.android.mediproject.core.model.toLocalDate import java.time.LocalDate @@ -41,7 +41,7 @@ import java.time.LocalDate * @param thick 의약품 두께 * */ -data class GranuleIdentificationInfoDto( +data class GranuleIdentificationInfo( val bizrNo: String, // 3038117108 val changeDate: LocalDate?, // 20230419 val chart: String, // 무색 내지 연보라색의 내용물이 든 보라색의 투명한 타원형 연질캡슐 @@ -72,7 +72,7 @@ data class GranuleIdentificationInfoDto( val thick: String?, // 7.58 ) -fun GranuleIdentificationInfoResponse.Body.Item.toDto() = GranuleIdentificationInfoDto( +fun GranuleIdentificationInfoResponse.Item.toGranuleIdentificationInfo() = GranuleIdentificationInfo( bizrNo = bizrNo, changeDate = changeDate.toLocalDate("yyyyMMdd"), chart = chart, diff --git a/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfoResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfoResponse.kt new file mode 100644 index 000000000..80ae97879 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfoResponse.kt @@ -0,0 +1,83 @@ +package com.android.mediproject.core.model.granule + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class GranuleIdentificationInfoResponse : DataGoKrResponse() { + + /** + * 식별 정보 + * + * @param bizrNo 사업자등록번호 + * @param changeDate 변경일자 + * @param chart 모양 + * @param className 분류명 + * @param classNo 분류번호 + * @param colorClass1 색상1 + * @param colorClass2 색상2 + * @param drugShape 의약품 모양 + * @param ediCode EDI코드 + * @param entpName 업체명 + * @param entpSeq 업체일련번호 + * @param etcOtcName 구분 + * @param formCodeName 제형코드 + * @param imgRegistTs 이미지 등록 일시 + * @param itemEngName 제품영문명 + * @param itemName 제품명 + * @param itemSeq 품목일련번호 + * @param itemImage 이미지 + * @param itemPermitDate 허가일자 + * @param lengLong 의약품 길이 + * @param lengShort 의약품 폭 + * @param lineBack 선 + * @param lineFront 선 + * @param markCodeBackImg 마크코드(뒷면) + * @param markCodeBack 마크코드(뒷면) + * @param markCodeBackAnal 마크코드(앞면) + * @param markCodeFront 마크코드(앞면) + * @param markCodeFrontImg 마크코드(앞면) + * @param markCodeFrontAnal 마크코드(앞면) + * @param printBack 인쇄(뒷면) + * @param printFront 인쇄(앞면) + * @param thick 의약품 두께 + * + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrNo: String, // 3038117108 + @SerialName("CHANGE_DATE") val changeDate: String, // 20230419 + @SerialName("CHART") val chart: String, // 무색 내지 연보라색의 내용물이 든 보라색의 투명한 타원형 연질캡슐 + @SerialName("CLASS_NAME") val className: String, // 항히스타민제 + @SerialName("CLASS_NO") val classNo: String, // 01410 + @SerialName("COLOR_CLASS1") val colorClass1: String, // 보라, 투명 + @SerialName("COLOR_CLASS2") val colorClass2: String?, // null + @SerialName("DRUG_SHAPE") val drugShape: String, // 타원형 + @SerialName("EDI_CODE") val ediCode: String?, // null + @SerialName("ENTP_NAME") val entpName: String, // (주)녹십자 + @SerialName("ENTP_SEQ") val entpSeq: String, // 19910005 + @SerialName("ETC_OTC_NAME") val etcOtcName: String, // 일반의약품 + @SerialName("FORM_CODE_NAME") val formCodeName: String, // 연질캡슐제, 액상 + @SerialName("IMG_REGIST_TS") val imgRegistTs: String, // 20100305 + @SerialName("ITEM_ENG_NAME") val itemEngName: String, // Allershot Soft Cap. + @SerialName("ITEM_IMAGE") val itemImage: String, // https://nedrug.mfds.go.kr/pbp/cmn/itemImageDownload/154661648918800015 + @SerialName("ITEM_NAME") val itemName: String, // 알러샷연질캡슐(세티리진염산염) + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String, // 20090812 + @SerialName("ITEM_SEQ") val itemSeq: String, // 200906254 + @SerialName("LENG_LONG") val lengLong: String, // 12.50 + @SerialName("LENG_SHORT") val lengShort: String, // 7.58 + @SerialName("LINE_BACK") val lineBack: String?, // null + @SerialName("LINE_FRONT") val lineFront: String?, // null + @SerialName("MARK_CODE_BACK") val markCodeBack: String?, // null + @SerialName("MARK_CODE_BACK_ANAL") val markCodeBackAnal: String, + @SerialName("MARK_CODE_BACK_IMG") val markCodeBackImg: String, + @SerialName("MARK_CODE_FRONT") val markCodeFront: String?, // null + @SerialName("MARK_CODE_FRONT_ANAL") val markCodeFrontAnal: String, + @SerialName("MARK_CODE_FRONT_IMG") val markCodeFrontImg: String, + @SerialName("PRINT_BACK") val printBack: String?, // null + @SerialName("PRINT_FRONT") val printFront: String?, // A-S + @SerialName("THICK") val thick: String?, + ) +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt deleted file mode 100644 index 552245209..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/RecallDisposalArgs.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.android.mediproject.core.model.local.navargs - -data class RecallDisposalArgs( - val product: String, -) : BaseNavArgs(RecallDisposalArgs::class.java.name) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/MedicineIdResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/MedicineIdResponse.kt index 717d7e506..7570d055d 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/MedicineIdResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/MedicineIdResponse.kt @@ -1,10 +1,10 @@ package com.android.mediproject.core.model.medicine -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MedicineIdResponse( @SerialName("medicineId") val medicineId: Long, -) : BaseAwsQueryResponse() \ No newline at end of file +) : ServerQueryResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicineItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicine.kt similarity index 91% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicineItemDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicine.kt index 50ba5d1ab..576f122aa 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicineItemDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/ApprovedMedicine.kt @@ -25,8 +25,7 @@ package com.android.mediproject.core.model.medicine.medicineapproval * @property ediCode EDI코드 * @property bizrno 사업자등록번호 */ - -data class ApprovedMedicineItemDto( +data class ApprovedMedicine( val itemSeq: Long, val itemName: String, val itemEngName: String?, @@ -48,10 +47,11 @@ data class ApprovedMedicineItemDto( val cancelName: String? = null, val ediCode: String? = null, val bizrno: String? = null, - var onClick: ((ApprovedMedicineItemDto) -> Unit)? = null, + var onClick: ((ApprovedMedicine) -> Unit)? = null, ) -fun Item.toDto() = ApprovedMedicineItemDto(itemSeq = itemSeq.toLong(), +fun MedicineApprovalListResponse.Item.toApprovedMedicine() = ApprovedMedicine( + itemSeq = itemSeq.toLong(), itemName = itemName, itemEngName = itemEngName, entpName = entpName, @@ -71,4 +71,5 @@ fun Item.toDto() = ApprovedMedicineItemDto(itemSeq = itemSeq.toLong(), cancelDate = cancelDate, cancelName = cancelName, ediCode = ediCode, - bizrno = bizrno) \ No newline at end of file + bizrno = bizrno, +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/MedicineApprovalListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/MedicineApprovalListResponse.kt index 9a64f457f..5b1abeadd 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/MedicineApprovalListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicineapproval/MedicineApprovalListResponse.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.model.medicine.medicineapproval -import com.android.mediproject.core.model.DataGoKrBaseResponse +import com.android.mediproject.core.model.DataGoKrResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -12,63 +12,56 @@ import kotlinx.serialization.Serializable * */ @Serializable -data class MedicineApprovalListResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() +class MedicineApprovalListResponse : DataGoKrResponse() { -@Serializable -data class Body( - val items: List = emptyList(), @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int, // 245 -) + /** + * 의약품 별 데이터 클래스 + * @property itemSeq 일련번호 + * @property itemName 한글 의약품 명 + * @property itemEngName 영문 의약품 명 + * @property entpName 업체명 + * @property entpEngName 업체 영문명 + * @property entpSeq 업체 일련번호 + * @property entpNo 업체 번호 + * @property itemPermitDate 아이템 허가 일자 + * @property induty 업종 + * @property prdlstStdrCode 제품표준코드 + * @property medicineType 특수약품 구분 + * @property prductType 제품유형 + * @property prductPrmisnNo 제품허가번호 + * @property itemIngrName 성분명 + * @property itemIngrCnt 성분수 + * @property bigPrdtImgUrl 대표 제품 이미지 URL + * @property permitKindCode 허가종류코드 + * @property cancelDate 취소 일자 + * @property cancelName 취소 여부 + * @property ediCode EDI코드 + * @property bizrno 사업자등록번호 + * + */ + @Serializable + data class Item( + @SerialName("BIG_PRDT_IMG_URL") var bigPrdtImgUrl: String, + @SerialName("BIZRNO") val bizrno: String?, + @SerialName("CANCEL_DATE") val cancelDate: String?, + @SerialName("CANCEL_NAME") val cancelName: String?, + @SerialName("EDI_CODE") val ediCode: String?, + @SerialName("ENTP_ENG_NAME") val entpEngName: String?, + @SerialName("ENTP_NAME") val entpName: String, + @SerialName("ENTP_NO") val entpNo: String, + @SerialName("ENTP_SEQ") val entpSeq: String, + @SerialName("INDUTY") val induty: String?, + @SerialName("ITEM_ENG_NAME") val itemEngName: String?, + @SerialName("ITEM_INGR_CNT") val itemIngrCnt: String, + @SerialName("ITEM_INGR_NAME") val itemIngrName: String, + @SerialName("ITEM_NAME") val itemName: String, + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String, + @SerialName("ITEM_SEQ") val itemSeq: String, + @SerialName("PERMIT_KIND_CODE") val permitKindCode: String?, + @SerialName("PRDLST_STDR_CODE") val prdlstStdrCode: String?, + @SerialName("PRDUCT_PRMISN_NO") val prductPrmisnNo: String?, + @SerialName("PRDUCT_TYPE") val prductType: String, + @SerialName("SPCLTY_PBLC") val medicineType: String, + ) -/** - * 의약품 별 데이터 클래스 - * @property itemSeq 일련번호 - * @property itemName 한글 의약품 명 - * @property itemEngName 영문 의약품 명 - * @property entpName 업체명 - * @property entpEngName 업체 영문명 - * @property entpSeq 업체 일련번호 - * @property entpNo 업체 번호 - * @property itemPermitDate 아이템 허가 일자 - * @property induty 업종 - * @property prdlstStdrCode 제품표준코드 - * @property medicineType 특수약품 구분 - * @property prductType 제품유형 - * @property prductPrmisnNo 제품허가번호 - * @property itemIngrName 성분명 - * @property itemIngrCnt 성분수 - * @property bigPrdtImgUrl 대표 제품 이미지 URL - * @property permitKindCode 허가종류코드 - * @property cancelDate 취소 일자 - * @property cancelName 취소 여부 - * @property ediCode EDI코드 - * @property bizrno 사업자등록번호 - * - */ -@Serializable -data class Item( - @SerialName("BIG_PRDT_IMG_URL") var bigPrdtImgUrl: String, - @SerialName("BIZRNO") val bizrno: String?, - @SerialName("CANCEL_DATE") val cancelDate: String?, - @SerialName("CANCEL_NAME") val cancelName: String?, - @SerialName("EDI_CODE") val ediCode: String?, - @SerialName("ENTP_ENG_NAME") val entpEngName: String?, - @SerialName("ENTP_NAME") val entpName: String, - @SerialName("ENTP_NO") val entpNo: String, - @SerialName("ENTP_SEQ") val entpSeq: String, - @SerialName("INDUTY") val induty: String?, - @SerialName("ITEM_ENG_NAME") val itemEngName: String?, - @SerialName("ITEM_INGR_CNT") val itemIngrCnt: String, - @SerialName("ITEM_INGR_NAME") val itemIngrName: String, - @SerialName("ITEM_NAME") val itemName: String, - @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String, - @SerialName("ITEM_SEQ") val itemSeq: String, - @SerialName("PERMIT_KIND_CODE") val permitKindCode: String?, - @SerialName("PRDLST_STDR_CODE") val prdlstStdrCode: String?, - @SerialName("PRDUCT_PRMISN_NO") val prductPrmisnNo: String?, - @SerialName("PRDUCT_TYPE") val prductType: String, - @SerialName("SPCLTY_PBLC") val medicineType: String, -) +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfo.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt similarity index 94% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfo.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt index b5353c7e0..a1f8186a0 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfo.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt @@ -2,7 +2,7 @@ package com.android.mediproject.core.model.medicine.medicinedetailinfo import com.android.mediproject.core.model.util.XMLParsedResult import com.android.mediproject.core.model.util.parseXmlString -import com.android.mediproject.core.toLocalDate +import com.android.mediproject.core.model.toLocalDate import java.time.LocalDate /** @@ -19,7 +19,6 @@ import java.time.LocalDate * @param docText ? * @param ediCode EDI코드 * @param eeDocData 의약품 효능효과 - * @param eeDocId 의약품 효능효과 문서의 식별자(ID)입니다. * @param entpEnglishName 제조사의 영문 이름입니다. * @param entpName 제조사의 이름입니다. * @param entpNumber 제조사의 번호입니다. @@ -53,7 +52,7 @@ import java.time.LocalDate * @param medicineIdInServer AWS에 저장된 의약품 ID * @param existsMedicineIdInServer AWS에 저장된 의약품 ID가 있는지 여부 */ -data class MedicineDetailInfo( +data class MedicineDetail( val atcCode: String, val barCode: String, val businessRegistrationNumber: String, @@ -65,7 +64,6 @@ data class MedicineDetailInfo( val docText: String, val ediCode: String, val eeDocData: XMLParsedResult, - val eeDocId: String, val entpEnglishName: String, val entpName: String, val entpNumber: String, @@ -100,7 +98,7 @@ data class MedicineDetailInfo( val existsMedicineIdInServer: Boolean, ) -fun MedicineDetailInfoResponse.Body.Item.toMedicineDetailInfoDto(medicineIdInServer: Long = 0L) = MedicineDetailInfo( +fun MedicineDetailInfoResponse.Item.toMedicineDetail(medicineIdInServer: Long = 0L) = MedicineDetail( atcCode = atcCode, barCode = barCode, businessRegistrationNumber = businessRegistrationNumber, @@ -112,7 +110,6 @@ fun MedicineDetailInfoResponse.Body.Item.toMedicineDetailInfoDto(medicineIdInSer docText = docText, ediCode = ediCode, eeDocData = if (eeDocData.isNotEmpty()) eeDocData.parseXmlString() else XMLParsedResult("", emptyList()), - eeDocId = eeDocId, entpEnglishName = entpEnglishName, entpName = entpName, entpNumber = entpNumber, diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfoResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfoResponse.kt index 7945fdeb5..1b8a4f1c2 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfoResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetailInfoResponse.kt @@ -1,117 +1,104 @@ package com.android.mediproject.core.model.medicine.medicinedetailinfo -import com.android.mediproject.core.model.DataGoKrBaseResponse +import com.android.mediproject.core.model.DataGoKrResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** * 의약품 상세 허가 정보 응답 - * - * @param body */ @Serializable -data class MedicineDetailInfoResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { +class MedicineDetailInfoResponse : DataGoKrResponse() { + /** + * 의약품 상세 허가 정보 + * + * @param atcCode ATC 코드 + * @param barCode 바코드 + * @param businessRegistrationNumber 사업자등록번호 + * @param cancelDate 취소일자 + * @param cancelName 취소명 + * @param changeDate 변경일자 + * @param chart 성상 + * @param consignmentManufacturer 제조및수입사 + * @param docText 효능효과 + * @param ediCode EDI코드 + * @param eeDocData 의약품 효능효과 + * @param entpEnglishName 제조사의 영문 이름입니다. + * @param entpName 제조사의 이름입니다. + * @param entpNumber 제조사의 번호입니다. + * @param etcOtcCode 전문의약품 코드입니다. + * @param gbnName GBN(General Batch Number)의 이름입니다. + * @param industryType 산업 유형입니다. 이 경우에는 '의약품'이라고 명시되어 있습니다. + * @param ingredientName 성분 이름입니다. + * @param insertFileUrl 삽입 파일의 URL입니다. + * @param itemEnglishName 제품의 영문 이름입니다. + * @param itemName 제품 이름입니다. + * @param itemPermitDate 제품 허가 날짜입니다. + * @param itemSequence 제품 시퀀스 번호입니다. + * @param mainIngredientEnglish 주성분의 영문 이름입니다. + * @param mainItemIngredient 주성분입니다. + * @param makeMaterialFlag 제조재료 플래그입니다. 완제의약품을 나타냅니다. + * @param materialName 재료 이름입니다. + * @param narcoticKindCode 마약 종류 코드입니다. + * @param nbDocData NB 문서 데이터입니다. + * @param nbDocId NB 문서의 식별자(ID)입니다. + * @param newDrugClassName 새로운 약물 분류 이름입니다. + * @param packUnit 패키지 단위입니다. + * @param permitKindName 허가 종류 이름입니다. + * @param pnDocData PN 문서 데이터입니다. + * @param reexamDate 재심사 날짜입니다. + * @param reexamTarget 재심사 대상입니다. + * @param storageMethod 저장 방법입니다. + * @param totalContent 총 함량입니다. + * @param udDocData UD 문서 데이터입니다. + * @param uDDOCID UD 문서의 식별자(ID)입니다. + * @param validTerm 유효 기간입니다. 제조일로부터의 개월 수를 나타냅니다. + */ @Serializable - data class Body( - @SerialName("items") val items: List, @SerialName("numOfRows") val numOfRows: Int, // 100 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int, // 1 - ) { - /** - * 의약품 상세 허가 정보 - * - * @param atcCode ATC 코드 - * @param barCode 바코드 - * @param businessRegistrationNumber 사업자등록번호 - * @param cancelDate 취소일자 - * @param cancelName 취소명 - * @param changeDate 변경일자 - * @param chart 성상 - * @param consignmentManufacturer 제조및수입사 - * @param docText 효능효과 - * @param ediCode EDI코드 - * @param eeDocData 의약품 효능효과 - * @param eeDocId 의약품 효능효과 문서의 식별자(ID)입니다. - * @param entpEnglishName 제조사의 영문 이름입니다. - * @param entpName 제조사의 이름입니다. - * @param entpNumber 제조사의 번호입니다. - * @param etcOtcCode 전문의약품 코드입니다. - * @param gbnName GBN(General Batch Number)의 이름입니다. - * @param industryType 산업 유형입니다. 이 경우에는 '의약품'이라고 명시되어 있습니다. - * @param ingredientName 성분 이름입니다. - * @param insertFileUrl 삽입 파일의 URL입니다. - * @param itemEnglishName 제품의 영문 이름입니다. - * @param itemName 제품 이름입니다. - * @param itemPermitDate 제품 허가 날짜입니다. - * @param itemSequence 제품 시퀀스 번호입니다. - * @param mainIngredientEnglish 주성분의 영문 이름입니다. - * @param mainItemIngredient 주성분입니다. - * @param makeMaterialFlag 제조재료 플래그입니다. 완제의약품을 나타냅니다. - * @param materialName 재료 이름입니다. - * @param narcoticKindCode 마약 종류 코드입니다. - * @param nbDocData NB 문서 데이터입니다. - * @param nbDocId NB 문서의 식별자(ID)입니다. - * @param newDrugClassName 새로운 약물 분류 이름입니다. - * @param packUnit 패키지 단위입니다. - * @param permitKindName 허가 종류 이름입니다. - * @param pnDocData PN 문서 데이터입니다. - * @param reexamDate 재심사 날짜입니다. - * @param reexamTarget 재심사 대상입니다. - * @param storageMethod 저장 방법입니다. - * @param totalContent 총 함량입니다. - * @param udDocData UD 문서 데이터입니다. - * @param uDDOCID UD 문서의 식별자(ID)입니다. - * @param validTerm 유효 기간입니다. 제조일로부터의 개월 수를 나타냅니다. - */ - @Serializable - data class Item( - @SerialName("ATC_CODE") val atcCode: String = "", - @SerialName("BAR_CODE") val barCode: String = "", - @SerialName("BIZRNO") val businessRegistrationNumber: String = "", - @SerialName("CANCEL_DATE") val cancelDate: String = "", - @SerialName("CANCEL_NAME") val cancelName: String = "", - @SerialName("CHANGE_DATE") val changeDate: String = "", - @SerialName("CHART") val chart: String = "", - @SerialName("CNSGN_MANUF") val consignmentManufacturer: String = "", - @SerialName("DOC_TEXT") val docText: String = "", - @SerialName("EDI_CODE") val ediCode: String = "", - @SerialName("EE_DOC_DATA") val eeDocData: String = "", - @SerialName("EE_DOC_ID") val eeDocId: String = "", - @SerialName("ENTP_ENG_NAME") val entpEnglishName: String = "", - @SerialName("ENTP_NAME") val entpName: String = "", - @SerialName("ENTP_NO") val entpNumber: String = "", - @SerialName("ETC_OTC_CODE") val etcOtcCode: String = "", - @SerialName("GBN_NAME") val gbnName: String = "", - @SerialName("INDUTY_TYPE") val industryType: String = "", - @SerialName("INGR_NAME") val ingredientName: String = "", - @SerialName("INSERT_FILE") val insertFileUrl: String = "", - @SerialName("ITEM_ENG_NAME") val itemEnglishName: String = "", - @SerialName("ITEM_NAME") val itemName: String = "", - @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", - @SerialName("ITEM_SEQ") val itemSequence: String = "", - @SerialName("MAIN_INGR_ENG") val mainIngredientEnglish: String = "", - @SerialName("MAIN_ITEM_INGR") val mainItemIngredient: String = "", - @SerialName("MAKE_MATERIAL_FLAG") val makeMaterialFlag: String = "", - @SerialName("MATERIAL_NAME") val materialName: String = "", - @SerialName("NARCOTIC_KIND_CODE") val narcoticKindCode: String = "", - @SerialName("NB_DOC_DATA") val nbDocData: String = "", - @SerialName("NB_DOC_ID") val nbDocId: String = "", - @SerialName("NEWDRUG_CLASS_NAME") val newDrugClassName: String = "", - @SerialName("PACK_UNIT") val packUnit: String = "", - @SerialName("PERMIT_KIND_NAME") val permitKindName: String = "", - @SerialName("PN_DOC_DATA") val pnDocData: String = "", - @SerialName("REEXAM_DATE") val reexamDate: String = "", - @SerialName("REEXAM_TARGET") val reexamTarget: String = "", - @SerialName("STORAGE_METHOD") val storageMethod: String = "", - @SerialName("TOTAL_CONTENT") val totalContent: String = "", - @SerialName("UD_DOC_DATA") val udDocData: String = "", - @SerialName("UD_DOC_ID") val uDDOCID: String = "", - @SerialName("VALID_TERM") val validTerm: String = "", - ) - } + data class Item( + @SerialName("ATC_CODE") val atcCode: String = "", + @SerialName("BAR_CODE") val barCode: String = "", + @SerialName("BIZRNO") val businessRegistrationNumber: String = "", + @SerialName("CANCEL_DATE") val cancelDate: String = "", + @SerialName("CANCEL_NAME") val cancelName: String = "", + @SerialName("CHANGE_DATE") val changeDate: String = "", + @SerialName("CHART") val chart: String = "", + @SerialName("CNSGN_MANUF") val consignmentManufacturer: String = "", + @SerialName("DOC_TEXT") val docText: String = "", + @SerialName("EDI_CODE") val ediCode: String = "", + @SerialName("EE_DOC_DATA") val eeDocData: String = "", + @SerialName("ENTP_ENG_NAME") val entpEnglishName: String = "", + @SerialName("ENTP_NAME") val entpName: String = "", + @SerialName("ENTP_NO") val entpNumber: String = "", + @SerialName("ETC_OTC_CODE") val etcOtcCode: String = "", + @SerialName("GBN_NAME") val gbnName: String = "", + @SerialName("INDUTY_TYPE") val industryType: String = "", + @SerialName("INGR_NAME") val ingredientName: String = "", + @SerialName("INSERT_FILE") val insertFileUrl: String = "", + @SerialName("ITEM_ENG_NAME") val itemEnglishName: String = "", + @SerialName("ITEM_NAME") val itemName: String = "", + @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String = "", + @SerialName("ITEM_SEQ") val itemSequence: String = "", + @SerialName("MAIN_INGR_ENG") val mainIngredientEnglish: String = "", + @SerialName("MAIN_ITEM_INGR") val mainItemIngredient: String = "", + @SerialName("MAKE_MATERIAL_FLAG") val makeMaterialFlag: String = "", + @SerialName("MATERIAL_NAME") val materialName: String = "", + @SerialName("NARCOTIC_KIND_CODE") val narcoticKindCode: String = "", + @SerialName("NB_DOC_DATA") val nbDocData: String = "", + @SerialName("NB_DOC_ID") val nbDocId: String = "", + @SerialName("NEWDRUG_CLASS_NAME") val newDrugClassName: String = "", + @SerialName("PACK_UNIT") val packUnit: String = "", + @SerialName("PERMIT_KIND_NAME") val permitKindName: String = "", + @SerialName("PN_DOC_DATA") val pnDocData: String = "", + @SerialName("REEXAM_DATE") val reexamDate: String = "", + @SerialName("REEXAM_TARGET") val reexamTarget: String = "", + @SerialName("STORAGE_METHOD") val storageMethod: String = "", + @SerialName("TOTAL_CONTENT") val totalContent: String = "", + @SerialName("UD_DOC_DATA") val udDocData: String = "", + @SerialName("UD_DOC_ID") val uDDOCID: String = "", + @SerialName("VALID_TERM") val validTerm: String = "", + ) } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/BaseNavArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/navargs/BaseNavArgs.kt similarity index 98% rename from core/model/src/main/java/com/android/mediproject/core/model/local/navargs/BaseNavArgs.kt rename to core/model/src/main/java/com/android/mediproject/core/model/navargs/BaseNavArgs.kt index 53451f45c..b769a0f55 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/BaseNavArgs.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/navargs/BaseNavArgs.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.local.navargs +package com.android.mediproject.core.model.navargs import android.os.Bundle import androidx.core.os.bundleOf @@ -21,7 +21,6 @@ abstract class BaseNavArgs( } companion object { - @OptIn(ExperimentalStdlibApi::class) @Suppress("UNCHECKED_CAST") @JvmStatic fun fromBundle(bundle: Bundle): BaseNavArgs { diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/LoginFromMyPageArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/navargs/LoginFromMyPageArgs.kt similarity index 73% rename from core/model/src/main/java/com/android/mediproject/core/model/local/navargs/LoginFromMyPageArgs.kt rename to core/model/src/main/java/com/android/mediproject/core/model/navargs/LoginFromMyPageArgs.kt index 94e07e0fd..9db0d695b 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/LoginFromMyPageArgs.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/navargs/LoginFromMyPageArgs.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.local.navargs +package com.android.mediproject.core.model.navargs const val TOHOME = 201 const val TOMYPAGE = 202 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineBasicInfoArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineBasicInfoArgs.kt similarity index 66% rename from core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineBasicInfoArgs.kt rename to core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineBasicInfoArgs.kt index 1642c2a24..6f17fed9b 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineBasicInfoArgs.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineBasicInfoArgs.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.local.navargs +package com.android.mediproject.core.model.navargs /** * 댓글 화면으로 전달할 인자 @@ -6,4 +6,4 @@ package com.android.mediproject.core.model.local.navargs * @property itemSeq 약 품목기준코드 */ data class MedicineBasicInfoArgs( - val itemSeq: Long, val medicineIdInAws: Long) : BaseNavArgs(MedicineBasicInfoArgs::class.java.name) \ No newline at end of file + val itemSeq: Long, val medicineIdInAws: Long) : BaseNavArgs(MedicineBasicInfoArgs::class.java.name) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineInfoArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineInfoArgs.kt similarity index 95% rename from core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineInfoArgs.kt rename to core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineInfoArgs.kt index 9c1764514..a77938659 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/local/navargs/MedicineInfoArgs.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/navargs/MedicineInfoArgs.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.local.navargs +package com.android.mediproject.core.model.navargs import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/core/model/src/main/java/com/android/mediproject/core/model/navargs/RecallDisposalArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/navargs/RecallDisposalArgs.kt new file mode 100644 index 000000000..86c198d9a --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/navargs/RecallDisposalArgs.kt @@ -0,0 +1,5 @@ +package com.android.mediproject.core.model.navargs + +data class RecallDisposalArgs( + val product: String, +) : BaseNavArgs(RecallDisposalArgs::class.java.name) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspension.kt similarity index 78% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionItemDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspension.kt index bb1ccdd5f..b1a811318 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionItemDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspension.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.remote.recall +package com.android.mediproject.core.model.recall import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -7,7 +7,7 @@ import java.time.format.DateTimeFormatter /** * 상세 리콜 폐기 데이터 * - * @property bIZRNO 사업자등록번호 + * @property bizrNo 사업자등록번호 * @property enterprise 업체명 * @property enterpriseAddress 업체 주소 * @property enterpriseTel 업체 전화번호 @@ -23,8 +23,8 @@ import java.time.format.DateTimeFormatter * @property usagePeriod 유효기한 * */ -data class DetailRecallSuspensionItemDto( - val bIZRNO: String, // 1278641862 +data class DetailRecallSuspension( + val bizrNo: String, // 1278641862 val enterprise: String, // (주)자연세상 val enterpriseAddress: String, // 경기도 포천시 소흘읍 호국로481번길 21-16 val enterpriseTel: String, // 0315443091 @@ -40,15 +40,15 @@ data class DetailRecallSuspensionItemDto( val usagePeriod: String?, // 제조일로부터36개월 ) -fun DetailRecallSuspensionResponse.Body.Item.Item.toRecallSuspensionItemDto(): DetailRecallSuspensionItemDto = DetailRecallSuspensionItemDto( - bIZRNO = bIZRNO ?: "", - enterprise = eNTRPS ?: "", - enterpriseAddress = eNTRPSADRES ?: "", - enterpriseTel = eNTRPSTELNO ?: "", +fun DetailRecallSuspensionResponse.Item.Item.toRecallSuspension(): DetailRecallSuspension = DetailRecallSuspension( + bizrNo = bizrNo ?: "", + enterprise = enterprise ?: "", + enterpriseAddress = entpAddress ?: "", + enterpriseTel = entpTel ?: "", manufacturedDate = manufacturedDate?.run { LocalDate.parse(this, dateFormat) }, manufactureNo = manufactureId ?: "", openEndDate = LocalDate.parse(openEndDate, dateFormat), - packageUnit = pACKNGUNIT ?: "", + packageUnit = packageUnit ?: "", product = pRDUCT ?: "", recallCommandDate = recalLCommandDate.run { LocalDate.parse(this, dateFormat) }, rm = rM, diff --git a/core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspensionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspensionResponse.kt new file mode 100644 index 000000000..7b44f6e53 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/recall/DetailRecallSuspensionResponse.kt @@ -0,0 +1,62 @@ +package com.android.mediproject.core.model.recall + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + + +/** + * 상세 리콜 폐기 데이터 응답 클래스 + * + * @property body 상세 리콜 폐기 데이터 + * @property header 응답 헤더 + * + */ +@Serializable +class DetailRecallSuspensionResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item, + ) { + + /** + * 상세 리콜 폐기 데이터 + * + * @property bizrNo 사업자등록번호 + * @property enterprise 업체명 + * @property entpAddress 업체 주소 + * @property entpTel 업체 전화번호 + * @property manufacturedDate 제조일자 + * @property manufactureId 제조번호 + * @property openEndDate 폐기일자 + * @property packageUnit 포장단위 + * @property pRDUCT 제품명 + * @property recalLCommandDate 리콜명령일자 + * @property rM 비고 + * @property approvalDate 폐기명령일자 + * @property retrievalReason 폐기사유 + * @property usagePeriod 기간 + * + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrNo: String?, // 1278641862 + @SerialName("ENTRPS") val enterprise: String?, // (주)자연세상 + @SerialName("ENTRPS_ADRES") val entpAddress: String?, // 경기도 포천시 소흘읍 호국로481번길 21-16 + @SerialName("ENTRPS_TELNO") val entpTel: String?, // 0315443091 + @SerialName("MNFCTUR_DT") val manufacturedDate: String?, // 20211001 + @SerialName("MNFCTUR_NO") val manufactureId: String?, // 330-061-21 + @SerialName("OPEN_END_DATE") val openEndDate: String, // 20250922 + @SerialName("PACKNG_UNIT") val packageUnit: String?, // 자사포장단위 + @SerialName("PRDUCT") val pRDUCT: String?, // 자연세상갈근 + @SerialName("RECALL_COMMAND_DATE") val recalLCommandDate: String, // 20220923 + @SerialName("RM") val rM: String?, // null + @SerialName("RTRVL_CMMND_DT") val approvalDate: String?, // 20221004000000 + @SerialName("RTRVL_RESN") val retrievalReason: String?, // 정량법 부적합 + @SerialName("USGPD") val usagePeriod: String?, // 제조일로부터36개월 + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt similarity index 77% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListItemDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt index 4fec1629f..db5a2d142 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListItemDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt @@ -1,7 +1,7 @@ -package com.android.mediproject.core.model.remote.recall +package com.android.mediproject.core.model.recall -import com.android.mediproject.core.toLocalDate +import com.android.mediproject.core.model.toLocalDate import java.time.LocalDate @@ -17,7 +17,7 @@ import java.time.LocalDate * @property reason 폐기 사유 * */ -data class RecallSuspensionListItemDto( +data class RecallSuspension( val enfrcYn: String?, // N val entrps: String, // 동국제약(주) val itemSeq: String, // 201208461 @@ -25,10 +25,10 @@ data class RecallSuspensionListItemDto( val recallCommandDate: LocalDate?, // 20230504 val destructionOrderDate: LocalDate?, // 20230503000000 val reason: String, // 안정성 시험결과 NDMA 기준 초과에 따른 사전예방적 조치로 시중 유통품에 대해 영업자회수 - var onClick: ((RecallSuspensionListItemDto) -> Unit)? = null, + var onClick: ((RecallSuspension) -> Unit)? = null, ) -fun RecallSuspensionListResponse.Body.Item.Item.toRecallSuspensionItemDto() = RecallSuspensionListItemDto( +fun RecallSuspensionListResponse.Item.Item.toRecallSuspension() = RecallSuspension( enfrcYn = enfrcYn, entrps = entrps ?: "", itemSeq = itemSeq ?: "", diff --git a/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspensionListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspensionListResponse.kt new file mode 100644 index 000000000..aaa85fc5c --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspensionListResponse.kt @@ -0,0 +1,49 @@ +package com.android.mediproject.core.model.recall + + +import com.android.mediproject.core.model.DataGoKrResponse +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * 식약처 리콜 폐기 목록 응답을 받을 데이터 클래스 + * + * @property body + * @property header + * + */ +@Serializable +class RecallSuspensionListResponse : DataGoKrResponse() { + + @Serializable + data class Item( + @SerialName("item") val item: Item, + ) { + + /** + * 리콜 폐기 목록 별 데이터 클래스 + * + * @property bizrno 사업자등록번호 + * @property enfrcYn 강제여부 + * @property entrps 업체명 + * @property itemSeq 일련번호 + * @property product 제품명 + * @property recallCommandDate 리콜 명령 일자 + * @property rtrlCommandDt 폐기 명령 일자 + * @property rtrvlResn 폐기 사유 + * + */ + @Serializable + data class Item( + @SerialName("BIZRNO") val bizrno: String?, // 3018508241 + @SerialName("ENFRC_YN") val enfrcYn: String?, // N + @SerialName("ENTRPS") val entrps: String?, // 동국제약(주) + @SerialName("ITEM_SEQ") val itemSeq: String?, // 201208461 + @SerialName("PRDUCT") val product: String?, // 니자틴캡슐(니자티딘) + @SerialName("RECALL_COMMAND_DATE") val recallCommandDate: String?, // 20230504 + @SerialName("RTRVL_CMMND_DT") val rtrlCommandDt: String?, // 20230503000000 + @SerialName("RTRVL_RESN") val rtrvlResn: String?, // 안정성 시험결과 NDMA 기준 초과에 따른 사전예방적 조치로 시중 유통품에 대해 영업자회수 + ) + } + +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListResponse.kt deleted file mode 100644 index 159b39301..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/adminaction/AdminActionListResponse.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.android.mediproject.core.model.remote.adminaction - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -/** - * 행정처분 목록 조회 응답 - * - * @property body - * @property header - */ -@Serializable -data class AdminActionListResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - @Serializable - data class Body( - @SerialName("items") val items: List, - @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int // 392 - ) { - /** - * 행정처분 목록 별 데이터 클래스 - * - * @property aDDR 소재지 - * @property aDMDISPSNAME 처분사항 - * @property aDMDISPSSEQ 행정처분 일련번호 - * @property bEFAPPLYLAW 근거법령 - * @property bIZRNO 사업자등록번호 - * @property eNTPNAME 업체명 - * @property iTEMSEQ 품목 일련번호 - * @property iTEMNAME 품목명 - * @property eNTPNO 업체번호 - * @property lASTSETTLEDATE 처분 일자 - * @property rLSENDDATE 공개 종료 일자 - * @property eXPOSECONT 위반내용 - * - */ - @Serializable - data class Item( - @SerialName("ADDR") val aDDR: String, // 경기도 화성시 향남읍 제약공단3길27 - @SerialName("ADM_DISPS_NAME") - val aDMDISPSNAME: String, // ○ 의약품 ‘아빌리파이정2밀리그램(아리피프라졸)’<제28호>에 대하여 해당 품목 제조업무정지 1개월(2023. 5. 12.~2023. 6. 11.) - @SerialName("ADM_DISPS_SEQ") val aDMDISPSSEQ: String, // 2023003342 - @SerialName("BEF_APPLY_LAW") - val bEFAPPLYLAW: String, // ○「약사법」제38조제1항,「의약품 등의 안전에 관한 규칙」제48조제15호,「의약품 소량포장단위 공급에 관한 규정(식품의약품안전처 고시)」 ○「약사법」제76조제1항제3호 및 제3항,「의약품 등의 안전에 관한 규칙」제95조 관련 [별표 8] “행정처분의 기준” Ⅱ. 개별기준 제25호마목 - @SerialName("BIZRNO") val bIZRNO: String?, // 2208114465 - @SerialName("ENTP_NAME") val eNTPNAME: String, // 한국오츠카제약(주) - @SerialName("ENTP_NO") val eNTPNO: String, // 19830009 - @SerialName("EXPOSE_CONT") val eXPOSECONT: String, // ○ 2021년도 의약품 소량포장단위 공급기준 미준수 - @SerialName("ITEM_NAME") val iTEMNAME: String?, // 아빌리파이정2밀리그램(아리피프라졸) - @SerialName("ITEM_SEQ") val iTEMSEQ: String?, // 200808451 - @SerialName("LAST_SETTLE_DATE") val lASTSETTLEDATE: String, // 20230526 - @SerialName("RLS_END_DATE") val rLSENDDATE: String // 20230910 - ) - } - - -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurItemDto.kt deleted file mode 100644 index fe2cfe869..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurItemDto.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.android.mediproject.core.model.remote.dur - - -/** - * @param barCode 바코드 - * @param bizRno 사업자등록번호 - * @param cancelDate 취소일 - * @param cancelName 취소명 - * @param changeDate 변경일 - * @param chart 차트 - * @param classNo 클래스 번호 - * @param ediCode EDI 코드 - * @param eeDocId EE 문서 ID - * @param entpName 기업 이름 - * @param etcOtcCode 기타 OTC 코드 - * @param insertFile 삽입 파일 - * @param itemName 아이템 이름 - * @param itemPermitDate 아이템 허가 날짜 - * @param itemSeq 아이템 순서 - * @param materialName 재료 이름 - * @param nbDocId NB 문서 ID - * @param packUnit 패키지 단위 - * @param reexamDate 재검사 날짜 - * @param reexamTarget 재검사 대상 - * @param storageMethod 저장 방법 - * @param typeCode 유형 코드 - * @param typeName 유형 이름 - * @param udDocId UD 문서 ID - * @param validTerm 유효 기간 - */ -data class DurItemDto( - val barCode: String, // 8806421025729 - val bizRno: String, // 1188100601 - val cancelDate: String?, // null - val cancelName: String?, // 정상 - val changeDate: String?, // 2019August26th - val chart: String, // 미황색의 원형 정제 - val classNo: String, // [141]항히스타민제 - val ediCode: String?, // 642102570 - val eeDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/EE - val entpName: String, // (주)유한양행 - val etcOtcCode: String, // 일반의약품 - val insertFile: String?, // HTTP://WWW.HEALTH.KR/IMAGES/INSERT_PDF/In_A11A0450A0085_00.pdf - val itemName: String, // 페니라민정(클로르페니라민말레산염) - val itemPermitDate: String, // 1960October10th - val itemSeq: String, // 196000011 - val materialName: String, // 클로르페니라민말레산염,,2.0,밀리그램,KP, - val nbDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/NB - val packUnit: String?, // 1000정/병 - val reexamDate: String?, // null - val reexamTarget: String?, // null - val storageMethod: String?, // 실온, 건소, 밀폐용기, - val typeCode: String?, // D,F,I - val typeName: String?, // 용량주의,노인주의,첨가제주의 - val udDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/UD - val validTerm: String? // 제조일로부터 36 개월 -) - -fun DurResponse.Body.Item.toDto() = DurItemDto( - barCode = barCode ?: "", - bizRno = bizRno ?: "", - cancelDate = cancelDate, - cancelName = cancelName, - changeDate = changeDate, - chart = chart ?: "", - classNo = classNo ?: "", - ediCode = ediCode, - eeDocId = eeDocId, - entpName = entpName ?: "", - etcOtcCode = etcOtcCode ?: "", - insertFile = insertFile, - itemName = itemName ?: "", - itemPermitDate = itemPermitDate ?: "", - itemSeq = itemSeq ?: "", - materialName = materialName ?: "", - nbDocId = nbDocId, - packUnit = packUnit, - reexamDate = reexamDate, - reexamTarget = reexamTarget, - storageMethod = storageMethod, - typeCode = typeCode, - typeName = typeName, - udDocId = udDocId, - validTerm = validTerm -) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurResponse.kt deleted file mode 100644 index 2aaf0537a..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/dur/DurResponse.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.android.mediproject.core.model.remote.dur - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class DurResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - @Serializable - data class Body( - @SerialName("items") val items: List, @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int // 1 - ) { - /** - * @param barCode 바코드 - * @param bizRno 사업자등록번호 - * @param cancelDate 취소일 - * @param cancelName 취소명 - * @param changeDate 변경일 - * @param chart 차트 - * @param classNo 클래스 번호 - * @param ediCode EDI 코드 - * @param eeDocId EE 문서 ID - * @param entpName 기업 이름 - * @param etcOtcCode 기타 OTC 코드 - * @param insertFile 삽입 파일 - * @param itemName 아이템 이름 - * @param itemPermitDate 아이템 허가 날짜 - * @param itemSeq 아이템 순서 - * @param materialName 재료 이름 - * @param nbDocId NB 문서 ID - * @param packUnit 패키지 단위 - * @param reexamDate 재검사 날짜 - * @param reexamTarget 재검사 대상 - * @param storageMethod 저장 방법 - * @param typeCode 유형 코드 - * @param typeName 유형 이름 - * @param udDocId UD 문서 ID - * @param validTerm 유효 기간 - */ - @Serializable - data class Item( - @SerialName("BAR_CODE") val barCode: String?, // 8806421025729 - @SerialName("BIZRNO") val bizRno: String?, // 1188100601 - @SerialName("CANCEL_DATE") val cancelDate: String?, // null - @SerialName("CANCEL_NAME") val cancelName: String?, // 정상 - @SerialName("CHANGE_DATE") val changeDate: String?, // 2019August26th - @SerialName("CHART") val chart: String?, // 미황색의 원형 정제 - @SerialName("CLASS_NO") val classNo: String?, // [141]항히스타민제 - @SerialName("EDI_CODE") val ediCode: String?, // 642102570 - @SerialName("EE_DOC_ID") val eeDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/EE - @SerialName("ENTP_NAME") val entpName: String?, // (주)유한양행 - @SerialName("ETC_OTC_CODE") val etcOtcCode: String?, // 일반의약품 - @SerialName("INSERT_FILE") val insertFile: String?, // HTTP://WWW.HEALTH.KR/IMAGES/INSERT_PDF/In_A11A0450A0085_00.pdf - @SerialName("ITEM_NAME") val itemName: String?, // 페니라민정(클로르페니라민말레산염) - @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String?, // 1960October10th - @SerialName("ITEM_SEQ") val itemSeq: String?, // 196000011 - @SerialName("MATERIAL_NAME") val materialName: String?, // 클로르페니라민말레산염,,2.0,밀리그램,KP, - @SerialName("NB_DOC_ID") val nbDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/NB - @SerialName("PACK_UNIT") val packUnit: String?, // 1000정/병 - @SerialName("REEXAM_DATE") val reexamDate: String?, // null - @SerialName("REEXAM_TARGET") val reexamTarget: String?, // null - @SerialName("STORAGE_METHOD") val storageMethod: String?, // 실온, 건소, 밀폐용기, - @SerialName("TYPE_CODE") val typeCode: String?, // D,F,I - @SerialName("TYPE_NAME ") val typeName: String?, // 용량주의,노인주의,첨가제주의 - @SerialName("UD_DOC_ID") val udDocId: String?, // HTTPS://NEDRUG.MFDS.GO.KR/PBP/CMN/PDFVIEWER/196000011/UD - @SerialName("VALID_TERM") val validTerm: String? // 제조일로부터 36 개월 - ) - } - -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionDto.kt deleted file mode 100644 index 049b1ebef..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionDto.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.android.mediproject.core.model.remote.elderlycaution - -import com.android.mediproject.core.toLocalDate -import java.time.LocalDate - -/** - * 노인안전정보 - * - * @param changeDate 변경일자 - * @param chart 모양 - * @param classCode 분류코드 - * @param className 분류명 - * @param entpName 업체명 - * @param etcOtcName 구분 - * @param formName 제형 - * @param ingrCode 성분코드 - * @param ingrEngName 성분영문명 - * @param ingrEngNameFull 성분영문명(전체) - * @param ingrName 성분명 - * @param itemName 품목명 - * @param itemSeq 품목일련번호 - * @param itemPermitDate 허가일자 - * @param mainIngr 성분내용 - * @param minIngr 성분내용 - * @param mixType 성분유형 - * @param notificationDate 통지일자 - * @param prohibitionContent 금기내용 - * @param remark 비고 - * @param typeName 유형 - */ -data class ElderlyCautionDto( - val changeDate: LocalDate?, // 20221201 - val chart: String, // 청색의 원형 필름코팅정 - val classCode: String, // 01170 - val className: String, // 정신신경용제 - val entpName: String, // 환인제약(주) - val etcOtcName: String, // 전문의약품 - val formName: String, // 필름코팅정 - val ingrCode: String, // D000809 - val ingrEngName: String, // Amitriptyline - val ingrEngNameFull: String, // Amitriptyline(아미트리프틸린) - val ingrName: String, // 아미트리프틸린 - val itemName: String, // 에나폰정10밀리그램(아미트리프틸린염산염) - val itemPermitDate: LocalDate?, // 19700220 - val itemSeq: String, // 197000079 - val mainIngr: String, // [M223101]아미트리프틸린염산염 - val minIngr: String, // [M223101]아미트리프틸린염산염 - val mixType: String, // 단일 - val notificationDate: LocalDate?, // 20150728 - val prohibitionContent: String, // 노인에서의 삼환계 항우울제 사용은 기립성 저혈압, 비틀거림, 항콜린작용에 의한 구갈, 배뇨곤란, 변비, 안내압항진 등이 나타나기 쉬움으로 소량으로 신중투여 - val remark: String?, // null - val typeName: String, // 노인주의 -) - -fun ElderlyCautionResponse.Body.Item.toElderlyCautionDto() = ElderlyCautionDto( - changeDate = changeDate.toLocalDate("yyyyMMdd"), - chart = cHART, - classCode = cLASSCODE, - className = cLASSNAME, - entpName = entpName, - etcOtcName = etcOtcName, - formName = fORMNAME, - ingrCode = iNGRCODE, - ingrEngName = iNGRENGNAME, - ingrEngNameFull = iNGRENGNAMEFULL, - ingrName = iNGRNAME, - itemName = iTEMNAME, - itemPermitDate = iTEMPERMITDATE.toLocalDate("yyyyMMdd"), - itemSeq = iTEMSEQ, - mainIngr = mAININGR, - minIngr = mIXINGR, - mixType = mIXTYPE, - notificationDate = nOTIFICATIONDATE.toLocalDate("yyyyMMdd"), - prohibitionContent = pROHBTCONTENT, - remark = rEMARK, - typeName = tYPENAME, -) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionResponse.kt deleted file mode 100644 index 88ab515c1..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/elderlycaution/ElderlyCautionResponse.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.android.mediproject.core.model.remote.elderlycaution - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ElderlyCautionResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - @Serializable - data class Body( - @SerialName("items") val items: List, - @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int // 1 - ) { - /** - * 노인안전정보 - * - * @param changeDate 변경일자 - * @param cHART 모양 - * @param cLASSCODE 분류코드 - * @param cLASSNAME 분류명 - * @param entpName 업체명 - * @param etcOtcName 구분 - * @param fORMNAME 제형 - * @param iNGRCODE 성분코드 - * @param iNGRENGNAME 성분영문명 - * @param iNGRENGNAMEFULL 성분영문명(전체) - * @param iNGRNAME 성분명 - * @param iTEMNAME 품목명 - * @param iTEMSEQ 품목일련번호 - * @param iTEMPERMITDATE 허가일자 - * @param mAININGR 성분내용 - * @param mIXINGR 성분내용 - * @param mIXTYPE 성분유형 - * @param nOTIFICATIONDATE 통지일자 - * @param pROHBTCONTENT 금기내용 - * @param rEMARK 비고 - * @param tYPENAME 유형 - */ - @Serializable - data class Item( - @SerialName("CHANGE_DATE") val changeDate: String, // 20221201 - @SerialName("CHART") val cHART: String, // 청색의 원형 필름코팅정 - @SerialName("CLASS_CODE") val cLASSCODE: String, // 01170 - @SerialName("CLASS_NAME") val cLASSNAME: String, // 정신신경용제 - @SerialName("ENTP_NAME") val entpName: String, // 환인제약(주) - @SerialName("ETC_OTC_NAME") val etcOtcName: String, // 전문의약품 - @SerialName("FORM_NAME") val fORMNAME: String, // 필름코팅정 - @SerialName("INGR_CODE") val iNGRCODE: String, // D000809 - @SerialName("INGR_ENG_NAME") val iNGRENGNAME: String, // Amitriptyline - @SerialName("INGR_ENG_NAME_FULL") val iNGRENGNAMEFULL: String, // Amitriptyline(아미트리프틸린) - @SerialName("INGR_NAME") val iNGRNAME: String, // 아미트리프틸린 - @SerialName("ITEM_NAME") val iTEMNAME: String, // 에나폰정10밀리그램(아미트리프틸린염산염) - @SerialName("ITEM_PERMIT_DATE") val iTEMPERMITDATE: String, // 19700220 - @SerialName("ITEM_SEQ") val iTEMSEQ: String, // 197000079 - @SerialName("MAIN_INGR") val mAININGR: String, // [M223101]아미트리프틸린염산염 - @SerialName("MIX_INGR") val mIXINGR: String, // [M223101]아미트리프틸린염산염 - @SerialName("MIX_TYPE") val mIXTYPE: String, // 단일 - @SerialName("NOTIFICATION_DATE") val nOTIFICATIONDATE: String, // 20150728 - @SerialName("PROHBT_CONTENT") - val pROHBTCONTENT: String, // 노인에서의 삼환계 항우울제 사용은 기립성 저혈압, 비틀거림, 항콜린작용에 의한 구갈, 배뇨곤란, 변비, 안내압항진 등이 나타나기 쉬움으로 소량으로 신중투여 - @SerialName("REMARK") val rEMARK: String?, // null - @SerialName("TYPE_NAME") val tYPENAME: String // 노인주의 - ) - } - -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoResponse.kt deleted file mode 100644 index 0d8197a2e..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/granule/GranuleIdentificationInfoResponse.kt +++ /dev/null @@ -1,90 +0,0 @@ -package com.android.mediproject.core.model.remote.granule - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class GranuleIdentificationInfoResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - @Serializable - data class Body( - val items: List = emptyList(), @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int) { - /** - * 식별 정보 - * - * @param bizrNo 사업자등록번호 - * @param changeDate 변경일자 - * @param chart 모양 - * @param className 분류명 - * @param classNo 분류번호 - * @param colorClass1 색상1 - * @param colorClass2 색상2 - * @param drugShape 의약품 모양 - * @param ediCode EDI코드 - * @param entpName 업체명 - * @param entpSeq 업체일련번호 - * @param etcOtcName 구분 - * @param formCodeName 제형코드 - * @param imgRegistTs 이미지 등록 일시 - * @param itemEngName 제품영문명 - * @param itemName 제품명 - * @param itemSeq 품목일련번호 - * @param itemImage 이미지 - * @param itemPermitDate 허가일자 - * @param lengLong 의약품 길이 - * @param lengShort 의약품 폭 - * @param lineBack 선 - * @param lineFront 선 - * @param markCodeBackImg 마크코드(뒷면) - * @param markCodeBack 마크코드(뒷면) - * @param markCodeBackAnal 마크코드(앞면) - * @param markCodeFront 마크코드(앞면) - * @param markCodeFrontImg 마크코드(앞면) - * @param markCodeFrontAnal 마크코드(앞면) - * @param printBack 인쇄(뒷면) - * @param printFront 인쇄(앞면) - * @param thick 의약품 두께 - * - */ - @Serializable - data class Item( - @SerialName("BIZRNO") val bizrNo: String, // 3038117108 - @SerialName("CHANGE_DATE") val changeDate: String, // 20230419 - @SerialName("CHART") val chart: String, // 무색 내지 연보라색의 내용물이 든 보라색의 투명한 타원형 연질캡슐 - @SerialName("CLASS_NAME") val className: String, // 항히스타민제 - @SerialName("CLASS_NO") val classNo: String, // 01410 - @SerialName("COLOR_CLASS1") val colorClass1: String, // 보라, 투명 - @SerialName("COLOR_CLASS2") val colorClass2: String?, // null - @SerialName("DRUG_SHAPE") val drugShape: String, // 타원형 - @SerialName("EDI_CODE") val ediCode: String?, // null - @SerialName("ENTP_NAME") val entpName: String, // (주)녹십자 - @SerialName("ENTP_SEQ") val entpSeq: String, // 19910005 - @SerialName("ETC_OTC_NAME") val etcOtcName: String, // 일반의약품 - @SerialName("FORM_CODE_NAME") val formCodeName: String, // 연질캡슐제, 액상 - @SerialName("IMG_REGIST_TS") val imgRegistTs: String, // 20100305 - @SerialName("ITEM_ENG_NAME") val itemEngName: String, // Allershot Soft Cap. - @SerialName("ITEM_IMAGE") val itemImage: String, // https://nedrug.mfds.go.kr/pbp/cmn/itemImageDownload/154661648918800015 - @SerialName("ITEM_NAME") val itemName: String, // 알러샷연질캡슐(세티리진염산염) - @SerialName("ITEM_PERMIT_DATE") val itemPermitDate: String, // 20090812 - @SerialName("ITEM_SEQ") val itemSeq: String, // 200906254 - @SerialName("LENG_LONG") val lengLong: String, // 12.50 - @SerialName("LENG_SHORT") val lengShort: String, // 7.58 - @SerialName("LINE_BACK") val lineBack: String?, // null - @SerialName("LINE_FRONT") val lineFront: String?, // null - @SerialName("MARK_CODE_BACK") val markCodeBack: String?, // null - @SerialName("MARK_CODE_BACK_ANAL") val markCodeBackAnal: String, - @SerialName("MARK_CODE_BACK_IMG") val markCodeBackImg: String, - @SerialName("MARK_CODE_FRONT") val markCodeFront: String?, // null - @SerialName("MARK_CODE_FRONT_ANAL") val markCodeFrontAnal: String, - @SerialName("MARK_CODE_FRONT_IMG") val markCodeFrontImg: String, - @SerialName("PRINT_BACK") val printBack: String?, // null - @SerialName("PRINT_FRONT") val printFront: String?, // A-S - @SerialName("THICK") val thick: String?) - } - -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionResponse.kt deleted file mode 100644 index bb051e9c7..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/DetailRecallSuspensionResponse.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.android.mediproject.core.model.remote.recall - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - - -/** - * 상세 리콜 폐기 데이터 응답 클래스 - * - * @property body 상세 리콜 폐기 데이터 - * @property header 응답 헤더 - * - */ -@Serializable -data class DetailRecallSuspensionResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - - @Serializable - data class Body( - @SerialName("items") val items: List, - @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int // 1 - ) { - @Serializable - data class Item( - @SerialName("item") val item: Item - ) { - - /** - * 상세 리콜 폐기 데이터 - * - * @property bIZRNO 사업자등록번호 - * @property eNTRPS 업체명 - * @property eNTRPSADRES 업체 주소 - * @property eNTRPSTELNO 업체 전화번호 - * @property manufacturedDate 제조일자 - * @property manufactureId 제조번호 - * @property openEndDate 폐기일자 - * @property pACKNGUNIT 포장단위 - * @property pRDUCT 제품명 - * @property recalLCommandDate 리콜명령일자 - * @property rM 비고 - * @property approvalDate 폐기명령일자 - * @property retrievalReason 폐기사유 - * @property usagePeriod 기간 - * - */ - @Serializable - data class Item( - @SerialName("BIZRNO") val bIZRNO: String?, // 1278641862 - @SerialName("ENTRPS") val eNTRPS: String?, // (주)자연세상 - @SerialName("ENTRPS_ADRES") val eNTRPSADRES: String?, // 경기도 포천시 소흘읍 호국로481번길 21-16 - @SerialName("ENTRPS_TELNO") val eNTRPSTELNO: String?, // 0315443091 - @SerialName("MNFCTUR_DT") val manufacturedDate: String?, // 20211001 - @SerialName("MNFCTUR_NO") val manufactureId: String?, // 330-061-21 - @SerialName("OPEN_END_DATE") val openEndDate: String, // 20250922 - @SerialName("PACKNG_UNIT") val pACKNGUNIT: String?, // 자사포장단위 - @SerialName("PRDUCT") val pRDUCT: String?, // 자연세상갈근 - @SerialName("RECALL_COMMAND_DATE") val recalLCommandDate: String, // 20220923 - @SerialName("RM") val rM: String?, // null - @SerialName("RTRVL_CMMND_DT") val approvalDate: String?, // 20221004000000 - @SerialName("RTRVL_RESN") val retrievalReason: String?, // 정량법 부적합 - @SerialName("USGPD") val usagePeriod: String? // 제조일로부터36개월 - ) - } - - - } -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListResponse.kt deleted file mode 100644 index f065757e0..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/recall/RecallSuspensionListResponse.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.android.mediproject.core.model.remote.recall - - -import com.android.mediproject.core.model.DataGoKrBaseResponse -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -/** - * 식약처 리콜 폐기 목록 응답을 받을 데이터 클래스 - * - * @property body - * @property header - * - */ -@Serializable -data class RecallSuspensionListResponse( - @SerialName("body") val body: Body, -) : DataGoKrBaseResponse() { - - @Serializable - data class Body( - @SerialName("items") val items: List, - @SerialName("numOfRows") val numOfRows: Int, // 15 - @SerialName("pageNo") val pageNo: Int, // 1 - @SerialName("totalCount") val totalCount: Int // 1015 - ) { - - @Serializable - data class Item( - @SerialName("item") val item: Item - ) { - - /** - * 리콜 폐기 목록 별 데이터 클래스 - * - * @property bizrno 사업자등록번호 - * @property enfrcYn 강제여부 - * @property entrps 업체명 - * @property itemSeq 일련번호 - * @property product 제품명 - * @property recallCommandDate 리콜 명령 일자 - * @property rtrlCommandDt 폐기 명령 일자 - * @property rtrvlResn 폐기 사유 - * - */ - @Serializable - data class Item( - @SerialName("BIZRNO") val bizrno: String?, // 3018508241 - @SerialName("ENFRC_YN") val enfrcYn: String?, // N - @SerialName("ENTRPS") val entrps: String?, // 동국제약(주) - @SerialName("ITEM_SEQ") val itemSeq: String?, // 201208461 - @SerialName("PRDUCT") val product: String?, // 니자틴캡슐(니자티딘) - @SerialName("RECALL_COMMAND_DATE") val recallCommandDate: String?, // 20230504 - @SerialName("RTRVL_CMMND_DT") val rtrlCommandDt: String?, // 20230503000000 - @SerialName("RTRVL_RESN") val rtrvlResn: String? // 안정성 시험결과 NDMA 기준 초과에 따른 사전예방적 조치로 시중 유통품에 대해 영업자회수 - ) - } - } -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/ReissueTokenResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/remote/token/ReissueTokenResponse.kt deleted file mode 100644 index 135b3a1ba..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/ReissueTokenResponse.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.mediproject.core.model.remote.token - -import com.android.mediproject.core.model.awscommon.BaseAwsSignResponse -import kotlinx.serialization.Serializable - -@Serializable -class ReissueTokenResponse : BaseAwsSignResponse() \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/VertexAiPredictParameter.kt b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/VertexAiPredictParameter.kt deleted file mode 100644 index 79ebd1455..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/VertexAiPredictParameter.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.android.mediproject.core.model.requestparameters - - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class VertexAiPredictParameter( - @SerialName("instances") val instances: List, - @SerialName("parameters") val parameters: Parameters -) { - @Serializable - data class Instance( - @SerialName("content") val content: String - ) - - @Serializable - data class Parameters( - @SerialName("confidenceThreshold") val confidenceThreshold: Double = 0.4, - @SerialName("maxPredictions") val maxPredictions: Int = 1 - ) -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/search/SearchHistory.kt b/core/model/src/main/java/com/android/mediproject/core/model/search/SearchHistory.kt new file mode 100644 index 000000000..ea8b0cec9 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/search/SearchHistory.kt @@ -0,0 +1,9 @@ +package com.android.mediproject.core.model.search + +import java.time.LocalDateTime + +data class SearchHistory( + val id: Long, + val query: String, + val searchedAt: LocalDateTime, +) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/search/local/SearchHistoryItemDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/search/local/SearchHistoryItemDto.kt deleted file mode 100644 index 2caaee1ff..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/search/local/SearchHistoryItemDto.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.android.mediproject.core.model.search.local - -import java.time.LocalDateTime - -data class SearchHistoryItemDto( - val id: Long, - val query: String, - val searchedAt: LocalDateTime -) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/SearchQueryArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/SearchQueryArgs.kt new file mode 100644 index 000000000..2ccde2577 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/SearchQueryArgs.kt @@ -0,0 +1,12 @@ +package com.android.mediproject.core.model.searchmedicines + +import com.android.mediproject.core.model.navargs.BaseNavArgs + +/** + * 검색어를 전달할 인자 + * + * @property words 검색어 + */ +data class SearchQueryArgs( + val words: String = "", +) : BaseNavArgs(SearchQueryArgs::class.java.name) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/local/SearchQueryArgs.kt b/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/local/SearchQueryArgs.kt deleted file mode 100644 index 643c8568f..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/searchmedicines/local/SearchQueryArgs.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.android.mediproject.core.model.searchmedicines.local - -import com.android.mediproject.core.model.local.navargs.BaseNavArgs - -/** - * 검색어를 전달할 인자 - * - * @property query 검색어 - */ -data class SearchQueryArgs( - val query: String = "" -) : BaseNavArgs(SearchQueryArgs::class.java.name) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsQueryResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerQueryResponse.kt similarity index 62% rename from core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsQueryResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerQueryResponse.kt index 332ccd0bc..1f59f39ec 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsQueryResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerQueryResponse.kt @@ -1,10 +1,10 @@ -package com.android.mediproject.core.model.awscommon +package com.android.mediproject.core.model.servercommon import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -open class BaseAwsQueryResponse { +open class ServerQueryResponse { @SerialName("message") val message: String = "" -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsSignResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerSignResponse.kt similarity index 80% rename from core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsSignResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerSignResponse.kt index 6f3e9cec4..42eb78b62 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/awscommon/BaseAwsSignResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/servercommon/ServerSignResponse.kt @@ -1,14 +1,14 @@ -package com.android.mediproject.core.model.awscommon +package com.android.mediproject.core.model.servercommon import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -open class BaseAwsSignResponse { +open class ServerSignResponse { @SerialName("access_token") val accessToken: String? = null @SerialName("refresh_token") val refreshToken: String? = null @SerialName("message") val message: String = "" fun isSuccess(): Boolean = !accessToken.isNullOrEmpty() && !refreshToken.isNullOrEmpty() -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignInResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/sign/SignInResponse.kt similarity index 63% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignInResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/sign/SignInResponse.kt index df93bdeb8..1816345e3 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignInResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/sign/SignInResponse.kt @@ -1,7 +1,7 @@ -package com.android.mediproject.core.model.remote.sign +package com.android.mediproject.core.model.sign -import com.android.mediproject.core.model.awscommon.BaseAwsSignResponse +import com.android.mediproject.core.model.servercommon.ServerSignResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -10,4 +10,4 @@ data class SignInResponse( @SerialName("userId") val _userId: Long?, @SerialName("nickname") val _nickName: String?, @SerialName("email") val _email: String?, -) : BaseAwsSignResponse() \ No newline at end of file +) : ServerSignResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignUpResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/sign/SignUpResponse.kt similarity index 63% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignUpResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/sign/SignUpResponse.kt index 6d34a85bd..5dba4b651 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/sign/SignUpResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/sign/SignUpResponse.kt @@ -1,7 +1,7 @@ -package com.android.mediproject.core.model.remote.sign +package com.android.mediproject.core.model.sign -import com.android.mediproject.core.model.awscommon.BaseAwsSignResponse +import com.android.mediproject.core.model.servercommon.ServerSignResponse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -10,4 +10,4 @@ data class SignUpResponse( @SerialName("userId") val _userId: Long?, @SerialName("nickname") val _nickName: String?, @SerialName("email") val _email: String?, -) : BaseAwsSignResponse() \ No newline at end of file +) : ServerSignResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/CurrentTokens.kt b/core/model/src/main/java/com/android/mediproject/core/model/token/CurrentTokens.kt similarity index 92% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/token/CurrentTokens.kt rename to core/model/src/main/java/com/android/mediproject/core/model/token/CurrentTokens.kt index 7fdddabbd..d27740f2f 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/CurrentTokens.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/token/CurrentTokens.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.remote.token +package com.android.mediproject.core.model.token /** diff --git a/core/model/src/main/java/com/android/mediproject/core/model/token/ReissueTokenResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/token/ReissueTokenResponse.kt new file mode 100644 index 000000000..71e0568a5 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/token/ReissueTokenResponse.kt @@ -0,0 +1,7 @@ +package com.android.mediproject.core.model.token + +import com.android.mediproject.core.model.servercommon.ServerSignResponse +import kotlinx.serialization.Serializable + +@Serializable +class ReissueTokenResponse : ServerSignResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/RequestBehavior.kt b/core/model/src/main/java/com/android/mediproject/core/model/token/RequestBehavior.kt similarity index 86% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/token/RequestBehavior.kt rename to core/model/src/main/java/com/android/mediproject/core/model/token/RequestBehavior.kt index 82fc664ae..76df426fa 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/RequestBehavior.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/token/RequestBehavior.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.remote.token +package com.android.mediproject.core.model.token /** * 토큰 요청 이유 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/TokenState.kt b/core/model/src/main/java/com/android/mediproject/core/model/token/TokenState.kt similarity index 92% rename from core/model/src/main/java/com/android/mediproject/core/model/remote/token/TokenState.kt rename to core/model/src/main/java/com/android/mediproject/core/model/token/TokenState.kt index 93e65c449..aa64caf0f 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/remote/token/TokenState.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/token/TokenState.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.remote.token +package com.android.mediproject.core.model.token /** * 토큰 상태를 나타내는 클래스 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/UserDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt similarity index 68% rename from core/model/src/main/java/com/android/mediproject/core/model/user/UserDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/user/User.kt index 4d008b6f6..b14747245 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/UserDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/User.kt @@ -1,8 +1,8 @@ package com.android.mediproject.core.model.user -data class UserDto( - val nickName: String +data class User( + val nickName: String, ) { var id: Long = 0 var email: String = "" -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/local/UserDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/local/UserDto.kt deleted file mode 100644 index ed65dc482..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/local/UserDto.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.android.mediproject.core.model.user.local - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -/** - * 유저 정보 데이터 - * - * @property nickName 유저 이름 - * @property userId 유저 아이디 - * @property email 유저 이메일 - * @property createdAt 회원가입 날짜 - */ -@Serializable -data class LocalUserDto( - @SerialName("nickname") - val nickName: String, - @SerialName("user_id") - val userId: Int, - @SerialName("email") - val email: String, - @SerialName("created_at") - val createdAt: String -) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangeNicknameResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangeNicknameResponse.kt index 21e85ac7c..16f00323d 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangeNicknameResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangeNicknameResponse.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.model.user.remote -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.Serializable @Serializable -class ChangeNicknameResponse : BaseAwsQueryResponse() +class ChangeNicknameResponse : ServerQueryResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangePasswordResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangePasswordResponse.kt index f15da562c..8918c5f50 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangePasswordResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/ChangePasswordResponse.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.model.user.remote -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.Serializable @Serializable -class ChangePasswordResponse : BaseAwsQueryResponse() \ No newline at end of file +class ChangePasswordResponse : ServerQueryResponse() diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt index 0f64d8183..0cd490db4 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/UserResponse.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.model.user.remote -import com.android.mediproject.core.model.user.UserDto +import com.android.mediproject.core.model.user.User import kotlinx.serialization.Serializable /** @@ -13,10 +13,10 @@ import kotlinx.serialization.Serializable */ @Serializable data class UserResponse( - val nickname: String, val userId: Long, val email: String, val message: String + val nickname: String, val userId: Long, val email: String, val message: String, ) -fun UserResponse.toUserDto() = UserDto(nickName = nickname).apply { +fun UserResponse.toUserDto() = User(nickName = nickname).apply { id = userId email = this@toUserDto.email -} \ No newline at end of file +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/WithdrawalResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/WithdrawalResponse.kt index d70040fff..b3a8e72cc 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/user/remote/WithdrawalResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/user/remote/WithdrawalResponse.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.model.user.remote -import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import com.android.mediproject.core.model.servercommon.ServerQueryResponse import kotlinx.serialization.Serializable @Serializable -class WithdrawalResponse : BaseAwsQueryResponse() \ No newline at end of file +class WithdrawalResponse : ServerQueryResponse() diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 7225d702e..c362799e6 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -1,17 +1,20 @@ plugins { id("mediproject.android.feature") id("kotlinx-serialization") + alias(libs.plugins.kapt) } android { namespace = "com.android.mediproject.core.network" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } + } + dependencies { implementation(project(":core:common")) implementation(project(":core:model")) diff --git a/core/network/src/androidTest/java/com/android/mediproject/core/network/ExampleInstrumentedTest.kt b/core/network/src/androidTest/java/com/android/mediproject/core/network/ExampleInstrumentedTest.kt index ab4ecdb4e..ebf8deb02 100644 --- a/core/network/src/androidTest/java/com/android/mediproject/core/network/ExampleInstrumentedTest.kt +++ b/core/network/src/androidTest/java/com/android/mediproject/core/network/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package com.android.mediproject.core.network -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -21,4 +19,9 @@ class ExampleInstrumentedTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext assertEquals("com.android.mediproject.core.network.test", appContext.packageName) } -} \ No newline at end of file + + @Test + fun `공공데이터 포털 XML값 파싱 테스트`() { + println(1) + } +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/InternetNetworkListener.kt b/core/network/src/main/java/com/android/mediproject/core/network/NetworkStatusManager.kt similarity index 76% rename from core/network/src/main/java/com/android/mediproject/core/network/InternetNetworkListener.kt rename to core/network/src/main/java/com/android/mediproject/core/network/NetworkStatusManager.kt index f9d4de076..826357736 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/InternetNetworkListener.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/NetworkStatusManager.kt @@ -4,9 +4,6 @@ import android.content.Context import android.content.Context.CONNECTIVITY_SERVICE import android.net.ConnectivityManager import android.net.Network -import android.net.NetworkCapabilities -import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET -import android.net.NetworkRequest import android.os.Handler import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver @@ -17,11 +14,11 @@ import javax.inject.Singleton @Singleton -class InternetNetworkListener @Inject constructor(@ApplicationContext private val context: Context) : LifecycleEventObserver { +class NetworkStatusManager @Inject constructor(@ApplicationContext private val context: Context) : LifecycleEventObserver { - private val connectivityManager by lazy { + private val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager - } + private val networkCallback: ConnectivityManager.NetworkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { @@ -43,10 +40,6 @@ class InternetNetworkListener @Inject constructor(@ApplicationContext private va var networkStateCallback: NetworkStateCallback? = null set(value) { field = value - val request = NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) - .addCapability(NET_CAPABILITY_INTERNET) - .build() connectivityManager.registerDefaultNetworkCallback(networkCallback, Handler.createAsync(context.mainLooper)) } @@ -69,4 +62,4 @@ class InternetNetworkListener @Inject constructor(@ApplicationContext private va else -> {} } } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/ResponseWrapper.kt b/core/network/src/main/java/com/android/mediproject/core/network/ResponseWrapper.kt index ab9290f74..25efcf60a 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/ResponseWrapper.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/ResponseWrapper.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.network -import com.android.mediproject.core.model.DataGoKrBaseResponse +import com.android.mediproject.core.model.DataGoKrResponse import com.android.mediproject.core.model.toResult import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -23,7 +23,10 @@ internal inline fun Response.onResponse(): Result { } } -private val json = Json { coerceInputValues = true } +private val json = Json { + coerceInputValues = true + ignoreUnknownKeys = true +} private inline fun String.parse(): Result = try { Result.success(json.decodeFromString(this)) @@ -31,19 +34,10 @@ private inline fun String.parse(): Result = try { Result.failure(e) } -internal inline fun Response.onStringResponse(): Result> { +internal inline fun > Response.onStringResponse(): Result> { return if (isSuccessful) { - body()?.parse()?.fold( - onSuccess = { final -> - final.toResult().fold( - onSuccess = { - Result.success(PairResponse(it, body()!!)) - }, - onFailure = { - Result.failure(it) - }, - ) - }, + body()?.parse()?.getOrNull()?.toResult()?.fold( + onSuccess = { Result.success(PairResponse(it, body()!!)) }, onFailure = { Result.failure(it) }, ) ?: Result.failure(Throwable("Response Body is Null")) } else { @@ -51,6 +45,11 @@ internal inline fun Response.onString } } +internal inline fun > Response.onDataGokrResponse(): Result = + if (isSuccessful) body()?.toResult() ?: Result.failure(Throwable("Response Body is Null")) + else Result.failure(errorBody()?.string()?.let { Throwable(it) } ?: Throwable("Response Error")) + + internal data class PairResponse( val first: T, val second: E, diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSource.kt deleted file mode 100644 index 01be0f656..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSource.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.android.mediproject.core.network.datasource.dur - -import com.android.mediproject.core.model.remote.dur.DurResponse -import kotlinx.coroutines.flow.Flow -import retrofit2.http.Query - -interface DurDataSource { - fun getDur( - @Query("item_name") itemName: String?, - @Query("item_seq") itemSeq: String?, - ): Flow> -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSourceImpl.kt deleted file mode 100644 index 4ecc2bced..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurDataSourceImpl.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.android.mediproject.core.network.datasource.dur - -import com.android.mediproject.core.model.toResult -import com.android.mediproject.core.network.module.DataGoKrNetworkApi -import com.android.mediproject.core.network.onResponse -import kotlinx.coroutines.flow.channelFlow -import javax.inject.Inject - -class DurDataSourceImpl @Inject constructor( - private val dataGoKrNetworkApi: DataGoKrNetworkApi, -) : DurDataSource { - - override fun getDur(itemName: String?, itemSeq: String?) = channelFlow { - dataGoKrNetworkApi.getDur(itemName = itemName, itemSeq = itemSeq).onResponse().fold( - onSuccess = { response -> - response.toResult() - }, - onFailure = { - Result.failure(it) - }, - ).also { - send(it) - } - } -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSource.kt new file mode 100644 index 000000000..2b2b82cde --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSource.kt @@ -0,0 +1,47 @@ +package com.android.mediproject.core.network.datasource.dur + +import com.android.mediproject.core.model.dur.duringr.capacity.DurIngrCapacityAttentionResponse +import com.android.mediproject.core.model.dur.duringr.combination.DurIngrCombinationTabooResponse +import com.android.mediproject.core.model.dur.duringr.dosing.DurIngrDosingCautionResponse +import com.android.mediproject.core.model.dur.duringr.pregnancy.DurIngrPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.duringr.senior.DurIngrSeniorCautionResponse +import com.android.mediproject.core.model.dur.duringr.specialtyagegroup.DurIngrSpecialtyAgeGroupTabooResponse + +interface DurIngrDataSource { + suspend fun getCombinationTabooInfo( + ingrKorName: String?, + ingrCode: String?, + ): Result + + + suspend fun getSpecialtyAgeGroupTabooInfo( + ingrName: String?, + ingrCode: String?, + ): Result + + suspend fun getPregnantWomanTabooInfo( + ingrName: String?, + ingrCode: String?, + ): Result + + suspend fun getCapacityAttentionInfo( + ingrName: String?, + ingrCode: String?, + ): Result + + suspend fun getDosingCautionInfo( + ingrName: String?, + ingrCode: String?, + ): Result + + + suspend fun getSeniorCaution( + ingrName: String?, + ingrCode: String?, + ): Result + + suspend fun getEfficacyGroupDuplicationInfo( + ingrName: String?, + ingrCode: String?, + ): Result +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSourceImpl.kt new file mode 100644 index 000000000..a18be6975 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurIngrDataSourceImpl.kt @@ -0,0 +1,37 @@ +package com.android.mediproject.core.network.datasource.dur + +import com.android.mediproject.core.model.dur.duringr.capacity.DurIngrCapacityAttentionResponse +import com.android.mediproject.core.model.dur.duringr.combination.DurIngrCombinationTabooResponse +import com.android.mediproject.core.model.dur.duringr.dosing.DurIngrDosingCautionResponse +import com.android.mediproject.core.model.dur.duringr.pregnancy.DurIngrPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.duringr.senior.DurIngrSeniorCautionResponse +import com.android.mediproject.core.model.dur.duringr.specialtyagegroup.DurIngrSpecialtyAgeGroupTabooResponse +import com.android.mediproject.core.network.module.datagokr.DurIngrInfoNetworkApi +import com.android.mediproject.core.network.onDataGokrResponse +import javax.inject.Inject + +class DurIngrDataSourceImpl @Inject constructor( + private val durIngrInfoNetworkApi: DurIngrInfoNetworkApi, +) : DurIngrDataSource { + override suspend fun getCombinationTabooInfo(ingrKorName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getCombinationTabooInfo(ingrKorName = ingrKorName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getSpecialtyAgeGroupTabooInfo(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getSpecialtyAgeGroupTabooInfo(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getPregnantWomanTabooInfo(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getPregnantWomanTabooInfo(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getCapacityAttentionInfo(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getCapacityAttentionInfo(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getDosingCautionInfo(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getDosingCautionInfo(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getSeniorCaution(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getSeniorCaution(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + + override suspend fun getEfficacyGroupDuplicationInfo(ingrName: String?, ingrCode: String?): Result = + durIngrInfoNetworkApi.getEfficacyGroupDuplicationInfo(ingrName = ingrName, ingrCode = ingrCode).onDataGokrResponse() + +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSource.kt new file mode 100644 index 000000000..163498bd3 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSource.kt @@ -0,0 +1,79 @@ +package com.android.mediproject.core.network.datasource.dur + +import com.android.mediproject.core.model.DataGoKrResponse +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.combination.DurProductCombinationTabooResponse +import com.android.mediproject.core.model.dur.durproduct.dosing.DurProductDosingCautionResponse +import com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication.DurProductEfficacyGroupDuplicationResponse +import com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet.DurProductExReleaseTabletSplitAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.pregnancy.DurProductPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.durproduct.productlist.DurProductListResponse +import com.android.mediproject.core.model.dur.durproduct.senior.DurProductSeniorCautionResponse +import com.android.mediproject.core.model.dur.durproduct.specialtyagegroup.DurProductSpecialtyAgeGroupTabooResponse +import kotlinx.coroutines.flow.Flow + +interface DurProductDataSource { + + fun getDurList(itemSeq: String, durTypes: List): Flow>>> + + suspend fun getDurProductList( + itemName: String?, + itemSeq: String?, + ): Result + + suspend fun getSeniorCaution( + itemName: String?, + ingrCode: String?, + itemSeq: String?, + ): Result + + suspend fun getExReleaseTableSplitAttentionInfo( + itemName: String?, + entpName: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getEfficacyGroupDuplicationInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getDosingCautionInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getCapacityAttentionInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getPregnantWomanTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getSpecialtyAgeGroupTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result + + suspend fun getCombinationTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSourceImpl.kt new file mode 100644 index 000000000..efc7d8e41 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/dur/DurProductDataSourceImpl.kt @@ -0,0 +1,118 @@ +package com.android.mediproject.core.network.datasource.dur + +import com.android.mediproject.core.model.DataGoKrResponse +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.combination.DurProductCombinationTabooResponse +import com.android.mediproject.core.model.dur.durproduct.dosing.DurProductDosingCautionResponse +import com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication.DurProductEfficacyGroupDuplicationResponse +import com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet.DurProductExReleaseTabletSplitAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.pregnancy.DurProductPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.durproduct.productlist.DurProductListResponse +import com.android.mediproject.core.model.dur.durproduct.senior.DurProductSeniorCautionResponse +import com.android.mediproject.core.model.dur.durproduct.specialtyagegroup.DurProductSpecialtyAgeGroupTabooResponse +import com.android.mediproject.core.network.module.datagokr.DurProductInfoNetworkApi +import com.android.mediproject.core.network.onDataGokrResponse +import kotlinx.coroutines.async +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.channelFlow +import javax.inject.Inject + +class DurProductDataSourceImpl @Inject constructor( + private val durProductInfoNetworkApi: DurProductInfoNetworkApi, +) : DurProductDataSource { + + override fun getDurList(itemSeq: String, durTypes: List): Flow>>> = channelFlow { + val map: Map>> = durTypes.map { type -> + type to async { call(type, itemSeq) } + }.associate { it.first to it.second.await() } + send(map) + } + + + private suspend inline fun call(durType: DurType, itemSeq: String): Result> = when (durType) { + DurType.EX_RELEASE_TABLET_SPLIT_ATTENTION -> getExReleaseTableSplitAttentionInfo( + itemName = null, entpName = null, + typeName = null, itemSeq = itemSeq, + ) + + DurType.EFFICACY_GROUP_DUPLICATION -> getEfficacyGroupDuplicationInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.DOSING_CAUTION -> getDosingCautionInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.CAPACITY_ATTENTION -> getCapacityAttentionInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.PREGNANT_WOMAN_TABOO -> getPregnantWomanTabooInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.SPECIALTY_AGE_GROUP_TABOO -> getSpecialtyAgeGroupTabooInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.COMBINATION_TABOO -> getCombinationTabooInfo(itemName = null, ingrCode = null, typeName = null, itemSeq = itemSeq) + DurType.SENIOR_CAUTION -> getSeniorCaution(itemName = null, ingrCode = null, itemSeq = itemSeq) + } + + override suspend fun getDurProductList(itemName: String?, itemSeq: String?): Result = + durProductInfoNetworkApi.getDurProductList(itemName = itemName, itemSeq = itemSeq).onDataGokrResponse() + + + override suspend fun getSeniorCaution(itemName: String?, ingrCode: String?, itemSeq: String?): Result = + durProductInfoNetworkApi.getSeniorCaution(itemName = itemName, ingrCode = ingrCode, itemSeq = itemSeq).onDataGokrResponse() + + override suspend fun getExReleaseTableSplitAttentionInfo( + itemName: String?, + entpName: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getExReleaseTableSplitAttentionInfo(itemName = itemName, entpName = entpName, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getEfficacyGroupDuplicationInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getEfficacyGroupDuplicationInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getDosingCautionInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getDosingCautionInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getCapacityAttentionInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getCapacityAttentionInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getPregnantWomanTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getPregnantWomanTabooInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getSpecialtyAgeGroupTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getSpecialtyAgeGroupTabooInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + + override suspend fun getCombinationTabooInfo( + itemName: String?, + ingrCode: String?, + typeName: String?, + itemSeq: String?, + ): Result = + durProductInfoNetworkApi.getCombinationTabooInfo(itemName = itemName, ingrCode = ingrCode, typeName = typeName, itemSeq = itemSeq) + .onDataGokrResponse() + +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSource.kt deleted file mode 100644 index 8927fe100..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSource.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.android.mediproject.core.network.datasource.elderlycaution - -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionResponse -import retrofit2.http.Query - -interface ElderlyCautionDataSource { - - /** - * 의약품 노인주의 정보 조회 - * - * @param itemName 의약품명 - * @param itemSeq 의약품 고유번호 - */ - suspend fun getElderlyCaution( - @Query("itemName") itemName: String?, - @Query("itemSeq") itemSeq: String?, - ): Result -} \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSourceImpl.kt deleted file mode 100644 index 01be711f4..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/elderlycaution/ElderlyCautionDataSourceImpl.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.android.mediproject.core.network.datasource.elderlycaution - -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionResponse -import com.android.mediproject.core.model.toResult -import com.android.mediproject.core.network.module.DataGoKrNetworkApi -import com.android.mediproject.core.network.onResponse -import javax.inject.Inject - -class ElderlyCautionDataSourceImpl @Inject constructor(private val dataGoKrNetworkApi: DataGoKrNetworkApi) : ElderlyCautionDataSource { - - - override suspend fun getElderlyCaution(itemName: String?, itemSeq: String?): Result = - dataGoKrNetworkApi.getElderlyCaution(itemName = itemName, itemSeq = itemSeq).onResponse().fold( - onSuccess = { response -> - response.toResult() - }, - onFailure = { - Result.failure(it) - }, - ) - -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSource.kt index 852dc47f2..4023e3290 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSource.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.network.datasource.granule -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoResponse +import com.android.mediproject.core.model.granule.GranuleIdentificationInfoResponse import kotlinx.coroutines.flow.Flow import retrofit2.http.Query @@ -11,4 +11,4 @@ interface GranuleIdentificationDataSource { @Query("entp_name") entpName: String?, @Query("item_seq") itemSeq: String?, ): Flow> -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSourceImpl.kt index da0c04617..3a7dd7617 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/granule/GranuleIdentificationDataSourceImpl.kt @@ -1,8 +1,8 @@ package com.android.mediproject.core.network.datasource.granule -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoResponse +import com.android.mediproject.core.model.granule.GranuleIdentificationInfoResponse import com.android.mediproject.core.model.toResult -import com.android.mediproject.core.network.module.DataGoKrNetworkApi +import com.android.mediproject.core.network.module.datagokr.DataGoKrNetworkApi import com.android.mediproject.core.network.onResponse import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/image/GoogleSearchDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/image/GoogleSearchDataSourceImpl.kt index caf8d068f..0ceca7a7b 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/image/GoogleSearchDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/image/GoogleSearchDataSourceImpl.kt @@ -2,6 +2,7 @@ package com.android.mediproject.core.network.datasource.image import android.util.LruCache import com.android.mediproject.core.network.module.GoogleSearchNetworkApi +import com.android.mediproject.core.network.module.safetyEncode import com.android.mediproject.core.network.onResponse import com.android.mediproject.core.network.parser.HtmlParser import javax.inject.Inject @@ -16,12 +17,12 @@ class GoogleSearchDataSourceImpl @Inject constructor( private val urlCache = LruCache(60) override suspend fun getImageUrl(medicineName: String): Result { - val query = additionalQuery + medicineName + val query = (additionalQuery + medicineName).safetyEncode() return synchronized(urlCache) { urlCache.get(query) - }?.let { - Result.success(it) + }?.run { + Result.success(this) } ?: run { googleSearchNetworkApi.getImageUrl(query).onResponse().fold( onSuccess = { diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalDataSourceImpl.kt index 83ec7ae65..2160f4c2e 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalDataSourceImpl.kt @@ -6,7 +6,7 @@ import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDe import com.android.mediproject.core.model.medicine.medicinedetailinfo.cache.MedicineCacheEntity import com.android.mediproject.core.model.toResult import com.android.mediproject.core.network.datasource.image.GoogleSearchDataSource -import com.android.mediproject.core.network.module.DataGoKrNetworkApi +import com.android.mediproject.core.network.module.datagokr.DataGoKrNetworkApi import com.android.mediproject.core.network.module.safetyEncode import com.android.mediproject.core.network.onResponse import com.android.mediproject.core.network.onStringResponse @@ -32,21 +32,21 @@ class MedicineApprovalDataSourceImpl @Inject constructor( itemName = itemName?.safetyEncode(), entpName = entpName?.safetyEncode(), pageNo = pageNo, medicationType = medicationType, ).onResponse().fold( - onSuccess = { response -> - response.toResult().fold( - onSuccess = { - loadMedicineImageUrl(it) - Result.success(response) - }, - onFailure = { - Result.failure(it) - }, - ) - }, - onFailure = { - Result.failure(it) - }, - ) + onSuccess = { response -> + response.toResult().fold( + onSuccess = { + loadMedicineImageUrl(it) + Result.success(response) + }, + onFailure = { + Result.failure(it) + }, + ) + }, + onFailure = { + Result.failure(it) + }, + ) override fun getMedicineDetailInfo(itemName: String): Flow> = channelFlow { dataGoKrNetworkApiWithString.getMedicineDetailInfo(itemName = itemName.safetyEncode()).let { response -> diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalListDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalListDataSourceImpl.kt index 218a63eb1..7f93a5e69 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalListDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/medicineapproval/MedicineApprovalListDataSourceImpl.kt @@ -3,7 +3,7 @@ package com.android.mediproject.core.network.datasource.medicineapproval import androidx.paging.PagingSource import androidx.paging.PagingState import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE -import com.android.mediproject.core.model.medicine.medicineapproval.Item +import com.android.mediproject.core.model.medicine.medicineapproval.MedicineApprovalListResponse.Item class MedicineApprovalListDataSourceImpl( private val medicineApprovalDataSource: MedicineApprovalDataSource, @@ -28,21 +28,24 @@ class MedicineApprovalListDataSourceImpl( entpName = entpName, medicationType = medicationType, pageNo = currentPage, - ).fold(onSuccess = { - val nextKey = it.body.let { body -> - if (body.items.size < DATA_GO_KR_PAGE_SIZE) null - else currentPage + 1 - } + ).fold( + onSuccess = { + val nextKey = it.body.let { body -> + if (body.items.size < DATA_GO_KR_PAGE_SIZE) null + else currentPage + 1 + } - LoadResult.Page( - data = it.body.items, - prevKey = null, - nextKey = nextKey, - ) - }, onFailure = { LoadResult.Error(it) }) + LoadResult.Page( + data = it.body.items, + prevKey = null, + nextKey = nextKey, + ) + }, + onFailure = { LoadResult.Error(it) }, + ) } catch (e: Exception) { LoadResult.Error(e) } } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSource.kt index 410330b2b..6343ee6de 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSource.kt @@ -1,10 +1,10 @@ package com.android.mediproject.core.network.datasource.penalties.adminaction -import com.android.mediproject.core.model.remote.adminaction.AdminActionListResponse +import com.android.mediproject.core.model.adminaction.AdminActionListResponse interface AdminActionDataSource { suspend fun getAdminActionList( pageNo: Int, ): Result -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSourceImpl.kt index 2766904ad..366f2a2d1 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionDataSourceImpl.kt @@ -3,7 +3,7 @@ package com.android.mediproject.core.network.datasource.penalties.adminaction import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.model.toResult -import com.android.mediproject.core.network.module.DataGoKrNetworkApi +import com.android.mediproject.core.network.module.datagokr.DataGoKrNetworkApi import com.android.mediproject.core.network.onResponse import kotlinx.coroutines.CoroutineDispatcher import javax.inject.Inject diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionListDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionListDataSourceImpl.kt index 790856c96..3ad355a70 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionListDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/adminaction/AdminActionListDataSourceImpl.kt @@ -3,41 +3,44 @@ package com.android.mediproject.core.network.datasource.penalties.adminaction import androidx.paging.PagingSource import androidx.paging.PagingState import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE -import com.android.mediproject.core.model.remote.adminaction.AdminActionListResponse +import com.android.mediproject.core.model.adminaction.AdminActionListResponse import javax.inject.Inject class AdminActionListDataSourceImpl @Inject constructor( private val adminActionDataSource: AdminActionDataSource, -) : PagingSource() { +) : PagingSource() { - override fun getRefreshKey(state: PagingState): Int? { + override fun getRefreshKey(state: PagingState): Int? { return state.anchorPosition?.let { anchorPosition -> val anchorPage = state.closestPageToPosition(anchorPosition) anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1) } } - override suspend fun load(params: LoadParams): LoadResult { + override suspend fun load(params: LoadParams): LoadResult { val currentPage = params.key ?: 1 return try { - adminActionDataSource.getAdminActionList(currentPage).fold(onSuccess = { response -> - val nextKey = response.body.let { body -> - if (body.items.count() < DATA_GO_KR_PAGE_SIZE) null - else currentPage + 1 - } - LoadResult.Page( - data = response.body.items, - prevKey = null, - nextKey = nextKey, - ) - }, onFailure = { - LoadResult.Error(it) - }) + adminActionDataSource.getAdminActionList(currentPage).fold( + onSuccess = { response -> + val nextKey = response.body.let { body -> + if (body.items.size < DATA_GO_KR_PAGE_SIZE) null + else currentPage + 1 + } + LoadResult.Page( + data = response.body.items, + prevKey = null, + nextKey = nextKey, + ) + }, + onFailure = { + LoadResult.Error(it) + }, + ) } catch (e: Exception) { LoadResult.Error(e) } } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSource.kt index e09ad3ce1..13ce75ca1 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSource.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.network.datasource.penalties.recallsuspension -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionResponse -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListResponse +import com.android.mediproject.core.model.recall.DetailRecallSuspensionResponse +import com.android.mediproject.core.model.recall.RecallSuspensionListResponse import kotlinx.coroutines.flow.Flow interface RecallSuspensionDataSource { @@ -23,4 +23,4 @@ interface RecallSuspensionDataSource { company: String?, product: String?, ): Flow> -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSourceImpl.kt index 590e5edfb..a576aabf9 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionDataSourceImpl.kt @@ -1,47 +1,25 @@ package com.android.mediproject.core.network.datasource.penalties.recallsuspension -import com.android.mediproject.core.common.network.Dispatcher -import com.android.mediproject.core.common.network.MediDispatchers -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionResponse -import com.android.mediproject.core.model.toResult -import com.android.mediproject.core.network.module.DataGoKrNetworkApi -import com.android.mediproject.core.network.onResponse +import com.android.mediproject.core.model.recall.DetailRecallSuspensionResponse +import com.android.mediproject.core.network.module.datagokr.DataGoKrNetworkApi +import com.android.mediproject.core.network.onDataGokrResponse import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.channelFlow import javax.inject.Inject class RecallSuspensionDataSourceImpl @Inject constructor( - @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, + private val ioDispatcher: CoroutineDispatcher, private val dataGoKrNetworkApi: DataGoKrNetworkApi, ) : RecallSuspensionDataSource { override fun getDetailRecallSuspensionInfo( company: String?, product: String?, - ): Flow> = flow { - dataGoKrNetworkApi.getDetailRecallSuspensionInfo(company = company, product = product) - .onResponse().fold( - onSuccess = { response -> - response.toResult() - }, - onFailure = { - Result.failure(it) - }, - ).also { - emit(it) - } + ): Flow> = channelFlow { + send(dataGoKrNetworkApi.getDetailRecallSuspensionInfo(company = company, product = product).onDataGokrResponse()) } override suspend fun getRecallSuspensionList(pageNo: Int, numOfRows: Int) = - dataGoKrNetworkApi.getRecallSuspensionList(pageNo = pageNo, numOfRows = numOfRows) - .onResponse().fold( - onSuccess = { response -> - response.toResult() - }, - onFailure = { - Result.failure(it) - }, - ) - + dataGoKrNetworkApi.getRecallSuspensionList(pageNo = pageNo, numOfRows = numOfRows).onDataGokrResponse() } diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionListDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionListDataSourceImpl.kt index c994d409e..f968bd49d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionListDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/penalties/recallsuspension/RecallSuspensionListDataSourceImpl.kt @@ -3,42 +3,45 @@ package com.android.mediproject.core.network.datasource.penalties.recallsuspensi import androidx.paging.PagingSource import androidx.paging.PagingState import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListResponse.Body.Item.Item +import com.android.mediproject.core.model.recall.RecallSuspensionListResponse.Item import javax.inject.Inject class RecallSuspensionListDataSourceImpl @Inject constructor( private val recallSuspensionDataSource: RecallSuspensionDataSource, -) : PagingSource() { +) : PagingSource() { - override fun getRefreshKey(state: PagingState): Int? { + override fun getRefreshKey(state: PagingState): Int? { return state.anchorPosition?.let { anchorPosition -> val anchorPage = state.closestPageToPosition(anchorPosition) anchorPage?.prevKey?.plus(1) ?: anchorPage?.nextKey?.minus(1) } } - override suspend fun load(params: LoadParams): LoadResult { + override suspend fun load(params: LoadParams): LoadResult { val currentPage = params.key ?: 1 return try { - recallSuspensionDataSource.getRecallSuspensionList(currentPage).fold(onSuccess = { response -> - val nextKey = response.body.let { body -> - if (body.items.count() < DATA_GO_KR_PAGE_SIZE) null - else currentPage + 1 - } + recallSuspensionDataSource.getRecallSuspensionList(currentPage).fold( + onSuccess = { response -> + val nextKey = response.body.let { body -> + if (body.items.size < DATA_GO_KR_PAGE_SIZE) null + else currentPage + 1 + } - LoadResult.Page( - data = response.body.items.map { item -> - item.item - }.toList(), - prevKey = null, - nextKey = nextKey, - ) - }, onFailure = { - LoadResult.Error(it) - }) + LoadResult.Page( + data = response.body.items.map { item -> + item.item + }.toList(), + prevKey = null, + nextKey = nextKey, + ) + }, + onFailure = { + LoadResult.Error(it) + }, + ) } catch (e: Exception) { LoadResult.Error(e) } } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt index c40a56e36..b4cc5d10e 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.network.datasource.sign -import com.android.mediproject.core.model.remote.sign.SignInResponse -import com.android.mediproject.core.model.remote.sign.SignUpResponse +import com.android.mediproject.core.model.sign.SignInResponse +import com.android.mediproject.core.model.sign.SignUpResponse import com.android.mediproject.core.model.requestparameters.LoginParameter import com.android.mediproject.core.model.requestparameters.SignUpParameter import kotlinx.coroutines.flow.Flow diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt index 4f92e1ea1..e7e0c411f 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt @@ -1,9 +1,9 @@ package com.android.mediproject.core.network.datasource.sign import com.android.mediproject.core.common.util.AesCoder -import com.android.mediproject.core.model.remote.sign.SignInResponse -import com.android.mediproject.core.model.remote.sign.SignUpResponse -import com.android.mediproject.core.model.remote.token.RequestBehavior +import com.android.mediproject.core.model.sign.SignInResponse +import com.android.mediproject.core.model.sign.SignUpResponse +import com.android.mediproject.core.model.token.RequestBehavior import com.android.mediproject.core.model.requestparameters.LoginParameter import com.android.mediproject.core.model.requestparameters.SignUpParameter diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/NewTokens.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/NewTokens.kt index 91b03785e..a0c7d8354 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/NewTokens.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/NewTokens.kt @@ -1,6 +1,6 @@ package com.android.mediproject.core.network.datasource.tokens -import com.android.mediproject.core.model.remote.token.RequestBehavior +import com.android.mediproject.core.model.token.RequestBehavior import java.time.Duration import java.time.LocalDateTime diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSource.kt index 9e9e77940..5bee842fe 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSource.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.network.datasource.tokens -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import kotlinx.coroutines.flow.Flow interface TokenDataSource { diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSourceImpl.kt index e49ccd7ef..30532aecd 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenDataSourceImpl.kt @@ -1,10 +1,10 @@ package com.android.mediproject.core.network.datasource.tokens import android.util.Log -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.ReissueTokenResponse -import com.android.mediproject.core.model.remote.token.RequestBehavior -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.ReissueTokenResponse +import com.android.mediproject.core.model.token.RequestBehavior +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.network.module.AwsNetworkApi import com.android.mediproject.core.network.tokens.TokenServer import kotlinx.coroutines.channels.BufferOverflow @@ -40,7 +40,7 @@ class TokenDataSourceImpl @Inject constructor( /** * 토큰 갱신 */ - private fun reissueTokens(refreshToken: CharArray): Flow> = channelFlow { + private fun reissueTokens(): Flow> = channelFlow { awsNetworkApi.reissueTokens().onResponseWithTokens(RequestBehavior.ReissueTokens, tokenServer).fold( onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }, @@ -69,7 +69,7 @@ class TokenDataSourceImpl @Inject constructor( } mutex.withLock { processingTokenReissuance = true } - reissueTokens(currentToken.data.refreshToken).collectLatest { reissueTokenResponseResult -> + reissueTokens().collectLatest { reissueTokenResponseResult -> val result = reissueTokenResponseResult.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) }) Log.d("wap", "reissueToken, result : $result") diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenResponseInterceptor.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenResponseInterceptor.kt index 214413ec8..957c95fe9 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenResponseInterceptor.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/tokens/TokenResponseInterceptor.kt @@ -1,8 +1,8 @@ package com.android.mediproject.core.network.datasource.tokens import android.util.Log -import com.android.mediproject.core.model.awscommon.BaseAwsSignResponse -import com.android.mediproject.core.model.remote.token.RequestBehavior +import com.android.mediproject.core.model.servercommon.ServerSignResponse +import com.android.mediproject.core.model.token.RequestBehavior import com.android.mediproject.core.network.tokens.TokenServer import retrofit2.Response @@ -11,7 +11,7 @@ import retrofit2.Response * * @return Result */ -internal suspend inline fun Response.onResponseWithTokens( +internal suspend inline fun Response.onResponseWithTokens( requestBehavior: RequestBehavior, tokenServer: TokenServer, ): Result = run { diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt index b644823c0..2288a3235 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt @@ -17,7 +17,7 @@ import javax.inject.Inject class UserDataSourceImpl @Inject constructor( private val awsNetworkApi: AwsNetworkApi, - private val aesCoder: AesCoder + private val aesCoder: AesCoder, ) : UserDataSource { @@ -48,13 +48,16 @@ class UserDataSourceImpl @Inject constructor( override suspend fun withdrawal(): Flow> = channelFlow { Log.d("wap", "UserDataSource : withdrawal()") awsNetworkApi.withdrawal().onResponse() - .fold(onSuccess = { - Log.d("wap", "dataSource : 성공") - Result.success(it) - }, onFailure = { - Log.d("wap", "dataSource : 실패 에러내용 : " + it.toString()) - Result.failure(it) - }) + .fold( + onSuccess = { + Log.d("wap", "dataSource : 성공") + Result.success(it) + }, + onFailure = { + Log.d("wap", "dataSource : 실패 에러내용 : $it") + Result.failure(it) + }, + ) .also { trySend(it) } } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/DataGoKrNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/DataGoKrNetwork.kt index bb452abeb..95b809fbd 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/DataGoKrNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/DataGoKrNetwork.kt @@ -1,21 +1,12 @@ package com.android.mediproject.core.network.module -import com.android.mediproject.core.common.BuildConfig -import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.database.cache.manager.MedicineDataCacheManager -import com.android.mediproject.core.model.medicine.medicineapproval.MedicineApprovalListResponse -import com.android.mediproject.core.model.remote.adminaction.AdminActionListResponse -import com.android.mediproject.core.model.remote.dur.DurResponse -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionResponse -import com.android.mediproject.core.model.remote.granule.GranuleIdentificationInfoResponse -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionResponse -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListResponse -import com.android.mediproject.core.network.datasource.dur.DurDataSource -import com.android.mediproject.core.network.datasource.dur.DurDataSourceImpl -import com.android.mediproject.core.network.datasource.elderlycaution.ElderlyCautionDataSource -import com.android.mediproject.core.network.datasource.elderlycaution.ElderlyCautionDataSourceImpl +import com.android.mediproject.core.network.datasource.dur.DurIngrDataSource +import com.android.mediproject.core.network.datasource.dur.DurIngrDataSourceImpl +import com.android.mediproject.core.network.datasource.dur.DurProductDataSource +import com.android.mediproject.core.network.datasource.dur.DurProductDataSourceImpl import com.android.mediproject.core.network.datasource.granule.GranuleIdentificationDataSource import com.android.mediproject.core.network.datasource.granule.GranuleIdentificationDataSourceImpl import com.android.mediproject.core.network.datasource.image.GoogleSearchDataSource @@ -25,6 +16,9 @@ import com.android.mediproject.core.network.datasource.penalties.adminaction.Adm import com.android.mediproject.core.network.datasource.penalties.adminaction.AdminActionDataSourceImpl import com.android.mediproject.core.network.datasource.penalties.recallsuspension.RecallSuspensionDataSource import com.android.mediproject.core.network.datasource.penalties.recallsuspension.RecallSuspensionDataSourceImpl +import com.android.mediproject.core.network.module.datagokr.DataGoKrNetworkApi +import com.android.mediproject.core.network.module.datagokr.DurIngrInfoNetworkApi +import com.android.mediproject.core.network.module.datagokr.DurProductInfoNetworkApi import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import dagger.Module import dagger.Provides @@ -34,25 +28,27 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient -import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.scalars.ScalarsConverterFactory -import retrofit2.http.GET -import retrofit2.http.Query import javax.inject.Named import javax.inject.Singleton -const val DATA_GO_KR_BASEURL = "https://apis.data.go.kr/1471000/" +private const val DATA_GO_KR_BASEURL = "https://apis.data.go.kr/1471000/" @InstallIn(SingletonComponent::class) @Module object DataGoKrNetwork { + private val json = Json { + ignoreUnknownKeys = true + coerceInputValues = true + } + // Retrofit2 인스턴스 --------------------------------------------------------------------------------------------------- @Provides @Singleton @Named("dataGoKrNetworkApiWithJsonResponse") fun providesDataGoKrNetworkApiWithJson(okHttpClient: OkHttpClient): DataGoKrNetworkApi = - Retrofit.Builder().client(okHttpClient).addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + Retrofit.Builder().client(okHttpClient).addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .baseUrl(DATA_GO_KR_BASEURL).build().create(DataGoKrNetworkApi::class.java) @Provides @@ -62,6 +58,18 @@ object DataGoKrNetwork { Retrofit.Builder().client(okHttpClient).addConverterFactory(ScalarsConverterFactory.create()).baseUrl(DATA_GO_KR_BASEURL).build() .create(DataGoKrNetworkApi::class.java) + @Provides + @Singleton + fun providesDurProductInfoNetworkApi( + @Named("dataGoKrNetworkApiWithJsonResponse") dataGoKrNetworkApi: DataGoKrNetworkApi, + ): DurProductInfoNetworkApi = dataGoKrNetworkApi + + @Provides + @Singleton + fun providesDurIngrInfoNetworkApi(@Named("dataGoKrNetworkApiWithJsonResponse") dataGoKrNetworkApi: DataGoKrNetworkApi): DurIngrInfoNetworkApi = + dataGoKrNetworkApi + + // DataSource 인스턴스 --------------------------------------------------------------------------------------------------- @Provides @Singleton @@ -86,8 +94,7 @@ object DataGoKrNetwork { medicineDataCacheManager: MedicineDataCacheManager, googleSearchDataSource: GoogleSearchDataSource, @Dispatcher(MediDispatchers.Default) defaultDispatcher: CoroutineDispatcher, - - ): MedicineApprovalDataSource = MedicineApprovalDataSourceImpl( + ): MedicineApprovalDataSource = MedicineApprovalDataSourceImpl( dataGoKrNetworkApiWithString, dataGoKrNetworkApiWithJson, medicineDataCacheManager, googleSearchDataSource, defaultDispatcher, ) @@ -97,153 +104,12 @@ object DataGoKrNetwork { @Named("dataGoKrNetworkApiWithJsonResponse") dataGoKrNetworkApi: DataGoKrNetworkApi, ): GranuleIdentificationDataSource = GranuleIdentificationDataSourceImpl(dataGoKrNetworkApi) + // DUR 품목 정보 --------------------------------------------------------------------------------------------------- @Provides @Singleton - fun providesElderlyCautionDataSource( - @Named("dataGoKrNetworkApiWithJsonResponse") dataGoKrNetworkApi: DataGoKrNetworkApi, - ): ElderlyCautionDataSource = ElderlyCautionDataSourceImpl(dataGoKrNetworkApi) + fun providesDurProductDataSource(api: DurProductInfoNetworkApi): DurProductDataSource = DurProductDataSourceImpl(api) @Provides @Singleton - fun providesDurDataSource(@Named("dataGoKrNetworkApiWithJsonResponse") dataGoKrNetworkApi: DataGoKrNetworkApi): DurDataSource = - DurDataSourceImpl(dataGoKrNetworkApi) -} - -interface DataGoKrNetworkApi { - - @GET(value = "DrugPrdtPrmsnInfoService04/getDrugPrdtPrmsnInq04") - suspend fun getApprovalList( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("item_name", encoded = false) itemName: String?, - @Query("entp_name", encoded = false) entpName: String?, - @Query("spclty_pblc", encoded = true) medicationType: String?, - @Query("pageNo") pageNo: Int, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - - @GET(value = "DrugPrdtPrmsnInfoService04/getDrugPrdtPrmsnDtlInq03") - suspend fun getMedicineDetailInfo( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("item_name", encoded = false) itemName: String = "", - @Query("item_seq", encoded = true) itemSeq: String = "", - @Query("pageNo") pageNo: Int = 1, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = 1, - ): Response - - /** - * 의약품 회수·판매중지 목록 조회 - */ - @GET(value = "MdcinRtrvlSleStpgeInfoService03/getMdcinRtrvlSleStpgelList02") - suspend fun getRecallSuspensionList( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: Int, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - /** - * 의약품 회수·판매중지 정보 상세 조회 - * - * @param company 제조사 - * @param product 제품명 - */ - @GET(value = "MdcinRtrvlSleStpgeInfoService03/getMdcinRtrvlSleStpgeItem02") - suspend fun getDetailRecallSuspensionInfo( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: Int = 1, - @Query("type") type: String = JSON, - @Query("Entrps", encoded = true) company: String?, - @Query("Prduct", encoded = true) product: String?, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - /** - * 행정 처분 목록조회 - */ - @GET(value = "MdcinExaathrService04/getMdcinExaathrList04") - suspend fun getAdminActionList( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: Int, - @Query("type") type: String = JSON, - @Query("order", encoded = true) order: String = "Y", - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - /** - * 의약품 낱알 식별 정보 조회 - * - * @param itemName 의약품명 - * @param entpName 업체명 - * @param itemSeq 품목기준코드 - */ - @GET(value = "MdcinGrnIdntfcInfoService01/getMdcinGrnIdntfcInfoList01") - suspend fun getGranuleIdentificationInfo( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: String = "1", - @Query("item_name") itemName: String?, - @Query("entp_name") entpName: String?, - @Query("item_seq") itemSeq: String?, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - - /** - * DUR 병용금기 목록 조회 - * - * @param itemName 의약품명 - * @param itemSeq 품목기준코드 - * - */ - @GET(value = "DURIrdntInfoService02/getUsjntTabooInfoList01") - suspend fun getCombinationContraindications( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: String = "1", - @Query("typeName") typeName: String = "병용금기", - @Query("itemName") itemName: String?, - @Query("itemSeq") itemSeq: String?, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - - /** - * DUR 노인 주의 정보 조회 - * - * @param itemName 의약품명 - * @param itemSeq 품목기준코드 - * - */ - @GET(value = "DURPrdlstInfoService02/getOdsnAtentInfoList2") - suspend fun getElderlyCaution( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: String = "1", - @Query("typeName") typeName: String = "노인주의", - @Query("itemName") itemName: String?, - @Query("itemSeq") itemSeq: String?, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, - ): Response - - /** - * DUR 정보 조회 - * - * @param itemName 의약품명 - * @param itemSeq 품목기준코드 - * - */ - @GET(value = "DURPrdlstInfoService02/getDurPrdlstInfoList2") - suspend fun getDur( - @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, - @Query("pageNo") pageNo: String = "1", - @Query("itemName") itemName: String?, - @Query("itemSeq") itemSeq: String?, - @Query("type") type: String = JSON, - @Query("numOfRows") numOfRows: Int = 1, - ): Response + fun providesDurIngrDataSource(api: DurIngrInfoNetworkApi): DurIngrDataSource = DurIngrDataSourceImpl(api) } - -private const val JSON = "json" diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/GoogleSearchNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/GoogleSearchNetwork.kt index db30819c2..f216c318c 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/GoogleSearchNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/GoogleSearchNetwork.kt @@ -36,16 +36,15 @@ object GoogleSearchNetwork { } -private const val encoding = "utf8" -private const val isch = "isch" - interface GoogleSearchNetworkApi { - @GET(value = "search") suspend fun getImageUrl( @Query("q", encoded = true) query: String, - @Query("tbm", encoded = true) tbm: String = isch, - @Query("ie", encoded = true) ie: String = encoding, - @Query("oe", encoded = true) oe: String = encoding, + @Query("tbm", encoded = true) tbm: String = ISCH, + @Query("ie", encoded = true) ie: String = ENCODING, + @Query("oe", encoded = true) oe: String = ENCODING, ): Response } + +private const val ENCODING: String = "utf8" +private const val ISCH: String = "isch" diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/NetworkModule.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/NetworkModule.kt index 06a4ea60e..669bd3ba5 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/NetworkModule.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/NetworkModule.kt @@ -10,7 +10,6 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.DelicateCoroutinesApi import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import java.security.KeyStore @@ -26,7 +25,6 @@ import javax.net.ssl.TrustManagerFactory import javax.net.ssl.X509TrustManager import kotlin.properties.Delegates -@OptIn(DelicateCoroutinesApi::class) @Module @InstallIn(SingletonComponent::class) class CertificateHelper @Inject constructor(@ApplicationContext context: Context) { @@ -64,7 +62,7 @@ class CertificateHelper @Inject constructor(@ApplicationContext context: Context } } -@Module(includes = [DataGoKrNetwork::class, AwsNetwork::class]) +@Module(includes = [DataGoKrNetwork::class, ServerNetwork::class]) @InstallIn(SingletonComponent::class) object NetworkModule { @@ -132,7 +130,7 @@ object NetworkModule { addInterceptor( HttpLoggingInterceptor().apply { if (BuildConfig.DEBUG) { - level = HttpLoggingInterceptor.Level.BODY + level = HttpLoggingInterceptor.Level.BASIC } }, ) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt similarity index 89% rename from core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt rename to core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt index 1afbe0fe2..50085997c 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt @@ -10,9 +10,6 @@ import com.android.mediproject.core.model.favoritemedicine.DeleteFavoriteMedicin import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineListResponse import com.android.mediproject.core.model.favoritemedicine.NewFavoriteMedicineResponse import com.android.mediproject.core.model.medicine.MedicineIdResponse -import com.android.mediproject.core.model.remote.sign.SignInResponse -import com.android.mediproject.core.model.remote.sign.SignUpResponse -import com.android.mediproject.core.model.remote.token.ReissueTokenResponse import com.android.mediproject.core.model.requestparameters.AddFavoriteMedicineParameter import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordRequestParameter @@ -20,6 +17,9 @@ import com.android.mediproject.core.model.requestparameters.DeleteCommentParamet import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.GetMedicineIdParameter import com.android.mediproject.core.model.requestparameters.NewCommentParameter +import com.android.mediproject.core.model.sign.SignInResponse +import com.android.mediproject.core.model.sign.SignUpResponse +import com.android.mediproject.core.model.token.ReissueTokenResponse import com.android.mediproject.core.model.user.remote.ChangeNicknameResponse import com.android.mediproject.core.model.user.remote.ChangePasswordResponse import com.android.mediproject.core.model.user.remote.UserResponse @@ -64,16 +64,21 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module -object AwsNetwork { +object ServerNetwork { + + private val json = Json { + ignoreUnknownKeys = true + coerceInputValues = true + } + @Provides @Named("awsNetworkApiWithoutTokens") @Singleton fun providesWithoutTokensAwsNetworkApi( @Named("okHttpClientWithoutAny") okHttpClient: OkHttpClient, - ): AwsNetworkApi = - Retrofit.Builder().client(okHttpClient).addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) + ): AwsNetworkApi = Retrofit.Builder().client(okHttpClient).addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) @Provides @@ -87,17 +92,18 @@ object AwsNetwork { @Singleton fun providesAwsNetworkApi( @Named("okHttpClientWithAccessTokens") okHttpClient: OkHttpClient, - ): AwsNetworkApi = - Retrofit.Builder().client(okHttpClient).addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) + ): AwsNetworkApi = Retrofit.Builder().client(okHttpClient).addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) @Provides @Named("awsNetworkApiWithRefreshTokens") fun providesReissueTokenAwsNetworkApi( @Named("okHttpClientWithReissueTokens") okHttpClient: OkHttpClient, - ): AwsNetworkApi = - Retrofit.Builder().client(okHttpClient).addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) + ): AwsNetworkApi = Retrofit.Builder().client(okHttpClient).addConverterFactory( + json.asConverterFactory( + "application/json".toMediaType(), + ), + ).baseUrl(BuildConfig.AWS_BASE_URL).build().create(AwsNetworkApi::class.java) @Provides @Singleton @@ -106,8 +112,8 @@ object AwsNetwork { @Provides fun providesSignDataSource( - @Named("awsNetworkApiWithoutTokens") awsNetworkApi: AwsNetworkApi, TokenServer: TokenServer, aesCoder: AesCoder, - ): SignDataSource = SignDataSourceImpl(awsNetworkApi, TokenServer, aesCoder) + @Named("awsNetworkApiWithoutTokens") awsNetworkApi: AwsNetworkApi, tokenServer: TokenServer, aesCoder: AesCoder, + ): SignDataSource = SignDataSourceImpl(awsNetworkApi, tokenServer, aesCoder) @Provides @Singleton diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DataGoKrNetworkApi.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DataGoKrNetworkApi.kt new file mode 100644 index 000000000..14c7c1119 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DataGoKrNetworkApi.kt @@ -0,0 +1,109 @@ +package com.android.mediproject.core.network.module.datagokr + +import com.android.mediproject.core.common.BuildConfig +import com.android.mediproject.core.common.DATA_GO_KR_PAGE_NO +import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE +import com.android.mediproject.core.common.JSON +import com.android.mediproject.core.model.medicine.medicineapproval.MedicineApprovalListResponse +import com.android.mediproject.core.model.adminaction.AdminActionListResponse +import com.android.mediproject.core.model.granule.GranuleIdentificationInfoResponse +import com.android.mediproject.core.model.recall.DetailRecallSuspensionResponse +import com.android.mediproject.core.model.recall.RecallSuspensionListResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + + +interface DataGoKrNetworkApi : DurProductInfoNetworkApi, DurIngrInfoNetworkApi { + /** + * 의약품 허가 목록 조회 + * + * @param itemName 의약품명 + * @param entpName 업체명 + * @param medicationType 의약품 분류(전문의약품, 일반의약품) + */ + @GET(value = "DrugPrdtPrmsnInfoService04/getDrugPrdtPrmsnInq04") + suspend fun getApprovalList( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("item_name", encoded = false) itemName: String?, + @Query("entp_name", encoded = false) entpName: String?, + @Query("spclty_pblc", encoded = true) medicationType: String?, + @Query("pageNo") pageNo: Int, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + + /** + * 의약품 허가 정보 상세 조회 + * + * @param itemName 의약품명 + * @param itemSeq 품목기준코드 + */ + @GET(value = "DrugPrdtPrmsnInfoService04/getDrugPrdtPrmsnDtlInq03") + suspend fun getMedicineDetailInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("item_name", encoded = false) itemName: String = "", + @Query("item_seq", encoded = true) itemSeq: String = "", + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = 1, + ): Response + + /** + * 의약품 회수·판매중지 목록 조회 + */ + @GET(value = "MdcinRtrvlSleStpgeInfoService03/getMdcinRtrvlSleStpgelList02") + suspend fun getRecallSuspensionList( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 의약품 회수·판매중지 정보 상세 조회 + * + * @param company 제조사 + * @param product 제품명 + */ + @GET(value = "MdcinRtrvlSleStpgeInfoService03/getMdcinRtrvlSleStpgeItem02") + suspend fun getDetailRecallSuspensionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("type") type: String = JSON, + @Query("Entrps", encoded = true) company: String?, + @Query("Prduct", encoded = true) product: String?, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 행정 처분 목록조회 + */ + @GET(value = "MdcinExaathrService04/getMdcinExaathrList04") + suspend fun getAdminActionList( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int, + @Query("type") type: String = JSON, + @Query("order", encoded = true) order: String = "Y", + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 의약품 낱알 식별 정보 조회 + * + * @param itemName 의약품명 + * @param entpName 업체명 + * @param itemSeq 품목기준코드 + */ + @GET(value = "MdcinGrnIdntfcInfoService01/getMdcinGrnIdntfcInfoList01") + suspend fun getGranuleIdentificationInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("item_name") itemName: String?, + @Query("entp_name") entpName: String?, + @Query("item_seq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurIngrInfoNetworkApi.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurIngrInfoNetworkApi.kt new file mode 100644 index 000000000..aff3c2f16 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurIngrInfoNetworkApi.kt @@ -0,0 +1,144 @@ +package com.android.mediproject.core.network.module.datagokr + +import com.android.mediproject.core.common.BuildConfig +import com.android.mediproject.core.common.DATA_GO_KR_PAGE_NO +import com.android.mediproject.core.common.DATA_GO_KR_PAGE_SIZE +import com.android.mediproject.core.common.JSON +import com.android.mediproject.core.model.dur.duringr.capacity.DurIngrCapacityAttentionResponse +import com.android.mediproject.core.model.dur.duringr.combination.DurIngrCombinationTabooResponse +import com.android.mediproject.core.model.dur.duringr.dosing.DurIngrDosingCautionResponse +import com.android.mediproject.core.model.dur.duringr.pregnancy.DurIngrPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.duringr.senior.DurIngrSeniorCautionResponse +import com.android.mediproject.core.model.dur.duringr.specialtyagegroup.DurIngrSpecialtyAgeGroupTabooResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * 식품의약품안전처_의약품안전사용서비스(DUR)성분정보 + * + * - 식품의약품안전처에서 관리하는 의약품(허가,행정,성분 등)의 관련 정보 조회 + */ +interface DurIngrInfoNetworkApi { + + /** + * DUR 병용금기 목록 조회 + * + * @param ingrKorName DUR성분명(ex : 이트라코나졸) + * @param ingrCode DUR성분(ex : D000762) + */ + @GET(value = "DURIrdntInfoService02/getUsjntTabooInfoList01") + suspend fun getCombinationTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "병용금기", + @Query("ingrKorName") ingrKorName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + + /** + * 특정연령대금기 목록 조회 + * + * @param ingrName DUR성분명(ex : 아카보즈) + * @param ingrCode DUR성분(ex : D000149) + */ + @GET(value = "DURIrdntInfoService02/getSpcifyAgrdeTabooInfoList01") + suspend fun getSpecialtyAgeGroupTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "특정연령대금기", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 임부금기 목록 조회 + * + * @param ingrName DUR성분명(ex : 아카보즈) + * @param ingrCode DUR성분(ex : D000149) + */ + @GET(value = "DURIrdntInfoService02/getPwnmTabooInfoList01") + suspend fun getPregnantWomanTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "임부금기", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 용량주의 정보 조회 + * + * @param ingrName DUR성분명(ex : 트리아졸람) + * @param ingrCode DUR성분(ex : D000592) + */ + @GET(value = "DURIrdntInfoService02/getCpctyAtentInfoList01") + suspend fun getCapacityAttentionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "용량주의", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 투여기간 정보 조회 + * + * @param ingrName DUR성분명(ex : 트리아졸람) + * @param ingrCode DUR성분(ex : D000592) + */ + @GET(value = "DURIrdntInfoService02/getMdctnPdAtentInfoList01") + suspend fun getDosingCautionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "투여기간주의", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + + /** + * 노인주의 정보 조회 + * + * @param ingrName DUR성분명(ex : 클로르디아제폭시드) + * @param ingrCode DUR성분(ex : D000056) + */ + @GET(value = "DURIrdntInfoService02/getOdsnAtentInfoList01") + suspend fun getSeniorCaution( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "노인주의", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response + + /** + * 효능군중복주의 정보 조회 + * + * @param ingrName DUR성분명(ex : 아세클로페낙) + * @param ingrCode DUR성분(ex : D000739) + */ + @GET(value = "DURIrdntInfoService02/getEfcyDplctInfoList01") + suspend fun getEfficacyGroupDuplicationInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "효능군중복", + @Query("ingrName") ingrName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_PAGE_SIZE, + ): Response +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurProductInfoNetworkApi.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurProductInfoNetworkApi.kt new file mode 100644 index 000000000..93fb469fc --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/datagokr/DurProductInfoNetworkApi.kt @@ -0,0 +1,210 @@ +package com.android.mediproject.core.network.module.datagokr + +import com.android.mediproject.core.common.BuildConfig +import com.android.mediproject.core.common.DATA_GO_KR_PAGE_NO +import com.android.mediproject.core.common.DATA_GO_KR_ROW_SIZE +import com.android.mediproject.core.common.JSON +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.combination.DurProductCombinationTabooResponse +import com.android.mediproject.core.model.dur.durproduct.dosing.DurProductDosingCautionResponse +import com.android.mediproject.core.model.dur.durproduct.efficacygroupduplication.DurProductEfficacyGroupDuplicationResponse +import com.android.mediproject.core.model.dur.durproduct.extendedreleasetablet.DurProductExReleaseTabletSplitAttentionResponse +import com.android.mediproject.core.model.dur.durproduct.pregnancy.DurProductPregnantWomanTabooResponse +import com.android.mediproject.core.model.dur.durproduct.productlist.DurProductListResponse +import com.android.mediproject.core.model.dur.durproduct.senior.DurProductSeniorCautionResponse +import com.android.mediproject.core.model.dur.durproduct.specialtyagegroup.DurProductSpecialtyAgeGroupTabooResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * 의약품 안전 사용 서비스(DUR) 품목정보 + * + * 식품의약품안전처에서 관리하는 의약품 안전사용정보 관련 조회 + * - 병용금기, 특정연령대금기, 임부금기, 용량주의, 투여기간주의, 노인주의, 효능군중복주의, 서방정분할주의, DUR품목정보 등 + */ +interface DurProductInfoNetworkApi { + + /** + * DUR 품목 정보 조회 + * + * @param itemName 의약품명 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getDurPrdlstInfoList2") + suspend fun getDurProductList( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 노인 주의 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getOdsnAtentInfoList2") + suspend fun getSeniorCaution( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("typeName") typeName: String = "노인주의", + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 서방정 분할 주의 정보 조회 + * + * @param itemName 의약품명 + * @param entpName 업체명 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + */ + @GET(value = "DURPrdlstInfoService02/getSeobangjeongPartitnAtentInfoList2") + suspend fun getExReleaseTableSplitAttentionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("entpName") entpName: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 효능군 중복 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + */ + @GET(value = "DURPrdlstInfoService02/getEfcyDplctInfoList2") + suspend fun getEfficacyGroupDuplicationInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 투여기간 주의 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getMdctnPdAtentInfoList2") + suspend fun getDosingCautionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 용량주의 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getCpctyAtentInfoList2") + suspend fun getCapacityAttentionInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 임산부 금기 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getPwnmTabooInfoList2") + suspend fun getPregnantWomanTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 특정연령대금기 정보조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getSpcifyAgrdeTabooInfoList2") + suspend fun getSpecialtyAgeGroupTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response + + /** + * 병용금기 정보 조회 + * + * @param itemName 의약품명 + * @param ingrCode DUR성분코드 + * @param typeName DUR유형 + * @param itemSeq 품목기준코드 + * + */ + @GET(value = "DURPrdlstInfoService02/getUsjntTabooInfoList02") + suspend fun getCombinationTabooInfo( + @Query("serviceKey", encoded = true) serviceKey: String = BuildConfig.DATA_GO_KR_SERVICE_KEY, + @Query("pageNo") pageNo: Int = DATA_GO_KR_PAGE_NO, + @Query("itemName") itemName: String?, + @Query("ingrCode") ingrCode: String?, + @Query("typeName") typeName: String?, + @Query("itemSeq") itemSeq: String?, + @Query("type") type: String = JSON, + @Query("numOfRows") numOfRows: Int = DATA_GO_KR_ROW_SIZE, + ): Response +} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenRequestInterceptor.kt b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenRequestInterceptor.kt index c41b6afbb..57a715daf 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenRequestInterceptor.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenRequestInterceptor.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.network.tokens import android.util.Log -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.TokenState import okhttp3.Interceptor import okhttp3.Response import javax.inject.Inject diff --git a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServer.kt b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServer.kt index bfdaed1fd..416a3dc0d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServer.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServer.kt @@ -1,7 +1,7 @@ package com.android.mediproject.core.network.tokens -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.network.datasource.tokens.NewTokens import java.time.LocalDateTime diff --git a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServerImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServerImpl.kt index 0b7d1ba5e..aed2b3479 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServerImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/tokens/TokenServerImpl.kt @@ -4,9 +4,9 @@ import android.util.Log import androidx.datastore.core.DataStore import com.android.mediproject.core.common.util.AesCoder import com.android.mediproject.core.datastore.SavedToken -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.RequestBehavior -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.RequestBehavior +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.network.datasource.tokens.NewTokens import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -154,7 +154,7 @@ internal class TokenServerImpl @Inject constructor( _tokenState = TokenState.Empty _refreshTokenExpiresIn = null _accessTokenExpiresIn = null - + tokenDataStore.updateData { it.toBuilder().clear().build() } diff --git a/core/network/src/test/java/com/android/mediproject/core/network/DurDataSourceTest.kt b/core/network/src/test/java/com/android/mediproject/core/network/DurDataSourceTest.kt new file mode 100644 index 000000000..0437df7b2 --- /dev/null +++ b/core/network/src/test/java/com/android/mediproject/core/network/DurDataSourceTest.kt @@ -0,0 +1,54 @@ +package com.android.mediproject.core.network + +import com.android.mediproject.core.model.dur.DurItemWrapperFactory +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.model.dur.durproduct.capacity.DurProductCapacityAttentionResponse +import com.android.mediproject.core.network.datasource.dur.DurProductDataSourceImpl +import com.android.mediproject.core.network.module.datagokr.DurProductInfoNetworkApi +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.mockito.Mock +import org.mockito.MockitoAnnotations +import kotlin.reflect.KClass +import kotlin.reflect.jvm.javaType + + +class DurDataSourceTest { + + @Mock private lateinit var durProductInfoNetworkApi: DurProductInfoNetworkApi + + + private lateinit var durProductDataSourceImpl: DurProductDataSourceImpl + + private val durProductCapacityAttentionResponse: DurProductCapacityAttentionResponse = DurProductCapacityAttentionResponse() + + @Before + fun setUp() { + MockitoAnnotations.openMocks(this) + durProductDataSourceImpl = DurProductDataSourceImpl(durProductInfoNetworkApi) + } + + @Test + fun testMethods() = runBlocking { + val ktype = DurProductDataSourceImpl::getCapacityAttentionInfo.returnType + val kclass = ktype.classifier as KClass + val type = ktype.javaType + val args = ktype.arguments + val kfunction = durProductDataSourceImpl::getCapacityAttentionInfo + } + + @Test + fun testGetDurList() = runBlocking { + // 임의의 itemSeq 정의 + val itemSeq = "testItemSeq" + + } + + @Test + fun convertDurProductToDurItem() = runBlocking { + val durType = DurType.CAPACITY_ATTENTION + val result = DurItemWrapperFactory.createForDurProduct(durType, durProductCapacityAttentionResponse).convert() + } + +} diff --git a/core/network/src/test/java/com/android/mediproject/core/network/ExampleUnitTest.kt b/core/network/src/test/java/com/android/mediproject/core/network/ExampleUnitTest.kt index 289ab1f9c..559ad7509 100644 --- a/core/network/src/test/java/com/android/mediproject/core/network/ExampleUnitTest.kt +++ b/core/network/src/test/java/com/android/mediproject/core/network/ExampleUnitTest.kt @@ -1,9 +1,8 @@ package com.android.mediproject.core.network +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * @@ -11,7 +10,7 @@ import org.junit.Assert.* */ class ExampleUnitTest { @Test - fun addition_isCorrect() { + fun `하이_하인`() { assertEquals(4, 2 + 2) } -} \ No newline at end of file +} diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index ed31618f6..70620fca5 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -4,10 +4,11 @@ plugins { android { namespace = "com.android.mediproject.core.ui" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } + } dependencies { @@ -23,4 +24,4 @@ dependencies { kapt(libs.bundles.glides.kapt) -} \ No newline at end of file +} diff --git a/core/ui/src/main/java/com/android/mediproject/core/ui/base/BaseViewModel.kt b/core/ui/src/main/java/com/android/mediproject/core/ui/base/BaseViewModel.kt index b65df2711..0082b46c8 100644 --- a/core/ui/src/main/java/com/android/mediproject/core/ui/base/BaseViewModel.kt +++ b/core/ui/src/main/java/com/android/mediproject/core/ui/base/BaseViewModel.kt @@ -1,11 +1,9 @@ package com.android.mediproject.core.ui.base import android.util.Log -import android.widget.Toast -import androidx.core.content.ContentProviderCompat.requireContext import androidx.lifecycle.ViewModel open class BaseViewModel : ViewModel() { fun log(str: String) = Log.d("wap", str) //for test -} \ No newline at end of file +} diff --git a/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/LoadStateView.kt b/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/LoadStateView.kt index 3c89a0585..9bfd7aad7 100644 --- a/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/LoadStateView.kt +++ b/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/LoadStateView.kt @@ -5,7 +5,7 @@ import android.widget.Button import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.common.uiutil.dpToPx +import com.android.mediproject.core.common.util.dpToPx import com.android.mediproject.core.ui.R import com.google.android.material.progressindicator.CircularProgressIndicator @@ -13,8 +13,8 @@ class LoadStateView(context: Context, onRetry: () -> Unit) : ConstraintLayout(co init { - val horizontalPadding = 24.dpToPx(context) - val verticalPadding = 12.dpToPx(context) + val horizontalPadding = 24.dpToPx() + val verticalPadding = 12.dpToPx() setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding) @@ -34,7 +34,7 @@ class LoadStateView(context: Context, onRetry: () -> Unit) : ConstraintLayout(co it.topToBottom = android.R.id.progress it.startToStart = LayoutParams.PARENT_ID it.endToEnd = LayoutParams.PARENT_ID - it.setMargins(0, 16.dpToPx(context), 0, 0) + it.setMargins(0, 16.dpToPx(), 0, 0) } addView(textView) @@ -46,7 +46,7 @@ class LoadStateView(context: Context, onRetry: () -> Unit) : ConstraintLayout(co it.topToBottom = android.R.id.text1 it.startToStart = LayoutParams.PARENT_ID it.endToEnd = LayoutParams.PARENT_ID - it.setMargins(0, 8.dpToPx(context), 0, 0) + it.setMargins(0, 8.dpToPx(), 0, 0) } btn.text = context.getString(R.string.retryText) setOnClickListener { @@ -96,4 +96,4 @@ class LoadStateViewHolder(context: Context, onRetry: () -> Unit) : RecyclerView. interface LoadStateListener { fun setLoadingState(state: LoadingState) -} \ No newline at end of file +} diff --git a/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/Subtitle.kt b/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/Subtitle.kt index 0fcf3a19f..16a68b16c 100644 --- a/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/Subtitle.kt +++ b/core/ui/src/main/java/com/android/mediproject/core/ui/base/view/Subtitle.kt @@ -2,6 +2,7 @@ package com.android.mediproject.core.ui.base.view import android.content.Context import android.graphics.Typeface +import android.text.Editable import android.text.InputType import android.util.AttributeSet import android.view.LayoutInflater @@ -15,7 +16,7 @@ import com.android.mediproject.core.ui.R class Subtitle @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - @AttrRes defStyleAttr: Int = 0 + @AttrRes defStyleAttr: Int = 0, ) : ConstraintLayout(context, attrs, defStyleAttr) { companion object { @@ -81,5 +82,5 @@ class Subtitle @JvmOverloads constructor( //EditText에 적은 값을 불러오는 함수 fun getValue(): String = inputData.text.toString() - fun getEditable() = inputData.text -} \ No newline at end of file + fun getEditable(): Editable = inputData.text +} diff --git a/core/ui/src/main/res/layout/subtitle.xml b/core/ui/src/main/res/layout/subtitle.xml index 57ee354de..e49099978 100644 --- a/core/ui/src/main/res/layout/subtitle.xml +++ b/core/ui/src/main/res/layout/subtitle.xml @@ -45,7 +45,8 @@ android:textSize="14sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/subtitleLL" /> + app:layout_constraintTop_toBottomOf="@id/subtitleLL" + android:inputType="text" /> - \ No newline at end of file + diff --git a/core/ui/src/main/res/layout/viewgroup_paging_list.xml b/core/ui/src/main/res/layout/viewgroup_paging_list.xml index 7d15b07fa..b75fdccf1 100644 --- a/core/ui/src/main/res/layout/viewgroup_paging_list.xml +++ b/core/ui/src/main/res/layout/viewgroup_paging_list.xml @@ -8,8 +8,8 @@ android:id="@+id/pagingList" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" android:clipChildren="false" + android:orientation="vertical" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + + + - \ No newline at end of file + diff --git a/feature/camera/build.gradle.kts b/feature/camera/build.gradle.kts index 8ad4a9a6b..7a28bc266 100644 --- a/feature/camera/build.gradle.kts +++ b/feature/camera/build.gradle.kts @@ -7,6 +7,11 @@ plugins { android { namespace = "com.android.mediproject.feature.camera" + hilt { + enableAggregatingTask = true + } + + androidResources { noCompress += listOf("tflite") } @@ -36,9 +41,7 @@ android { } -hilt { - enableAggregatingTask = true -} + dependencies { implementation(project(":core:ui")) diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt index a7fa97d85..bf661b082 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt @@ -11,8 +11,8 @@ import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import com.android.mediproject.core.common.dialog.LoadingDialog -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.camera.databinding.FragmentMedicinesDetectorBinding import com.android.mediproject.feature.camera.tflite.CameraHelper @@ -20,7 +20,7 @@ import com.android.mediproject.feature.search.result.ai.AiSearchResultViewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import org.tensorflow.lite.task.gms.vision.detector.Detection -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/confirmdialog/ConfirmDialogFragment.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/confirmdialog/ConfirmDialogFragment.kt index b127fe8e3..c04acbfad 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/confirmdialog/ConfirmDialogFragment.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/confirmdialog/ConfirmDialogFragment.kt @@ -17,7 +17,7 @@ import com.android.mediproject.feature.camera.databinding.FragmentConfirmDialogB import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class ConfirmDialogFragment : DialogFragment() { diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/imagedialog/DetectedImageFragment.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/imagedialog/DetectedImageFragment.kt index 977077bee..925e8c289 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/imagedialog/DetectedImageFragment.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/imagedialog/DetectedImageFragment.kt @@ -9,15 +9,15 @@ import android.view.ViewGroup import androidx.core.view.WindowCompat import androidx.fragment.app.DialogFragment import androidx.navigation.navGraphViewModels -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.feature.camera.InferenceState import com.android.mediproject.feature.camera.MedicinesDetectorViewModel import com.android.mediproject.feature.camera.R import com.android.mediproject.feature.camera.databinding.FragmentDetectedImageDialogBinding import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject diff --git a/feature/camera/src/main/res/values/strings.xml b/feature/camera/src/main/res/values/strings.xml index 10ab0110d..074415610 100644 --- a/feature/camera/src/main/res/values/strings.xml +++ b/feature/camera/src/main/res/values/strings.xml @@ -13,7 +13,7 @@ 검출된 의약품이 없습니다 AI를 초기화하는 중입니다. - Processing... + Processing… 캡처된 이미지 축소 확대 diff --git a/feature/comments/build.gradle.kts b/feature/comments/build.gradle.kts index 517da6dc5..6cdfcef32 100644 --- a/feature/comments/build.gradle.kts +++ b/feature/comments/build.gradle.kts @@ -4,12 +4,14 @@ plugins { android { namespace = "com.android.mediproject.feature.comments" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } + } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) @@ -22,4 +24,4 @@ dependencies { implementation(libs.bundles.uiAndroidx) implementation(libs.androidx.paging.runtime) -} \ No newline at end of file +} diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt index faa576adf..382201749 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt @@ -7,7 +7,7 @@ import androidx.core.view.isVisible import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.comments.CommentDto +import com.android.mediproject.core.model.comments.Comment import com.android.mediproject.core.ui.base.view.listfilter.MediPopupMenu import com.android.mediproject.feature.comments.R import com.android.mediproject.feature.comments.databinding.ItemViewCommentBinding @@ -15,12 +15,16 @@ import com.android.mediproject.feature.comments.databinding.ItemViewCommentEditB import com.android.mediproject.feature.comments.databinding.ItemViewReplyBinding -class CommentsAdapter : PagingDataAdapter(Diff) { +class CommentsAdapter : PagingDataAdapter(Diff) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = viewType.let { when (it) { - ViewType.COMMENT.ordinal -> CommentViewHolder(ItemViewCommentBinding.inflate(LayoutInflater.from(parent.context), - parent, - false)) + ViewType.COMMENT.ordinal -> CommentViewHolder( + ItemViewCommentBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false, + ), + ) ViewType.REPLY.ordinal -> ReplyViewHolder(ItemViewReplyBinding.inflate(LayoutInflater.from(parent.context), parent, false)) @@ -86,11 +90,11 @@ class CommentsAdapter : PagingDataAdapter() { - override fun areItemsTheSame(oldItem: CommentDto, newItem: CommentDto): Boolean = oldItem.commentId == newItem.commentId + object Diff : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Comment, newItem: Comment): Boolean = oldItem.commentId == newItem.commentId - override fun areContentsTheSame(oldItem: CommentDto, newItem: CommentDto): Boolean = oldItem == newItem + override fun areContentsTheSame(oldItem: Comment, newItem: Comment): Boolean = oldItem == newItem } /** @@ -204,4 +208,4 @@ class CommentsAdapter : PagingDataAdapter { - showDialog(R.string.requestToDeleteComment, onPositive = { - fragmentViewModel.deleteComment(action.commentId) - }, onNegative = { - - }) + showDialog( + R.string.requestToDeleteComment, + onPositive = { + fragmentViewModel.deleteComment(action.commentId) + }, + onNegative = { + + }, + ) } is CommentActionState.COMPLETED_LIKE -> { - action.result.fold(onSuccess = { - toast(getString(R.string.completedLike)) - adapter.refresh() - }, onFailure = { - toast(it.message.toString()) - }) + action.result.fold( + onSuccess = { + toast(getString(R.string.completedLike)) + adapter.refresh() + }, + onFailure = { + toast(it.message.toString()) + }, + ) } is CommentActionState.COMPLETED_APPLY_COMMENT_REPLY -> { replayInfoHeader.isVisible = false - action.result.fold(onSuccess = { - replyHeader.isVisible = false - toast(getString(R.string.appliedComment)) - adapter.refresh() - }, onFailure = { - toast(it.message.toString()) - }) + action.result.fold( + onSuccess = { + replyHeader.isVisible = false + toast(getString(R.string.appliedComment)) + adapter.refresh() + }, + onFailure = { + toast(it.message.toString()) + }, + ) } is CommentActionState.COMPLETED_APPLY_EDITED_COMMENT -> { - action.result.fold(onSuccess = { - toast(getString(R.string.appliedEditComment)) - adapter.refresh() - - }, onFailure = { - toast(it.message.toString()) - }) + action.result.fold( + onSuccess = { + toast(getString(R.string.appliedEditComment)) + adapter.refresh() + + }, + onFailure = { + toast(it.message.toString()) + }, + ) } is CommentActionState.COMPLETED_DELETE_COMMENT -> { - action.result.fold(onSuccess = { - toast(getString(R.string.deletedComment)) - adapter.refresh() - - }, onFailure = { - toast(it.message.toString()) - }) + action.result.fold( + onSuccess = { + toast(getString(R.string.deletedComment)) + adapter.refresh() + + }, + onFailure = { + toast(it.message.toString()) + }, + ) } is CommentActionState.NONE -> { @@ -174,4 +194,4 @@ class MedicineCommentsFragment : } }.create().show() } -} \ No newline at end of file +} diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt index b8bfd25f9..436015363 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt @@ -9,8 +9,8 @@ import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.domain.CommentsUseCase import com.android.mediproject.core.domain.sign.GetAccountStateUseCase -import com.android.mediproject.core.model.comments.CommentDto -import com.android.mediproject.core.model.local.navargs.MedicineBasicInfoArgs +import com.android.mediproject.core.model.comments.Comment +import com.android.mediproject.core.model.navargs.MedicineBasicInfoArgs import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -79,7 +79,7 @@ class MedicineCommentsViewModel @Inject constructor( } - val comments: StateFlow> = medicineBasicInfo.flatMapLatest { info -> + val comments: StateFlow> = medicineBasicInfo.flatMapLatest { info -> commentsUseCase.getCommentsForAMedicine(info.medicineIdInAws, myUserId.value).cachedIn(viewModelScope).mapLatest { pagingData -> val signedIn = accountState.value is AccountState.SignedIn pagingData.map { comment -> @@ -108,10 +108,14 @@ class MedicineCommentsViewModel @Inject constructor( */ private fun applyReplyComment(comment: String) { viewModelScope.launch { - commentsUseCase.applyNewComment(NewCommentParameter(medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), - userId = myUserId.value.toString(), - content = comment, - subOrdinationId = replyId.value.toString())).collectLatest { result -> + commentsUseCase.applyNewComment( + NewCommentParameter( + medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), + userId = myUserId.value.toString(), + content = comment, + subOrdinationId = replyId.value.toString(), + ), + ).collectLatest { result -> result.onSuccess { // 댓글 등록 성공 commentsUseCase.scrollChannel.send(Unit) @@ -128,10 +132,14 @@ class MedicineCommentsViewModel @Inject constructor( */ private fun applyNewComment(content: String) { viewModelScope.launch { - commentsUseCase.applyNewComment(NewCommentParameter(medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), - userId = myUserId.value.toString(), - content = content, - subOrdinationId = "0")).collectLatest { result -> + commentsUseCase.applyNewComment( + NewCommentParameter( + medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), + userId = myUserId.value.toString(), + content = content, + subOrdinationId = "0", + ), + ).collectLatest { result -> result.onSuccess { // 댓글 등록 성공 commentsUseCase.scrollChannel.send(Unit) @@ -146,13 +154,17 @@ class MedicineCommentsViewModel @Inject constructor( /** * 수정한 댓글(답글) 등록 * - * @param commentDto 수정한 댓글(답글) 정보 + * @param comment 수정한 댓글(답글) 정보 */ - private fun applyEditedComment(commentDto: CommentDto) { + private fun applyEditedComment(comment: Comment) { viewModelScope.launch { - commentsUseCase.applyEditedComment(EditCommentParameter(commentId = commentDto.commentId, - content = commentDto.content, - medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws)).collectLatest { result -> + commentsUseCase.applyEditedComment( + EditCommentParameter( + commentId = comment.commentId, + content = comment.content, + medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws, + ), + ).collectLatest { result -> result.onSuccess { // 댓글 수정 성공 _action.emit(COMPLETED_APPLY_EDITED_COMMENT(Result.success(Unit))) @@ -235,7 +247,7 @@ class MedicineCommentsViewModel @Inject constructor( * @param item 수정할 댓글의 정보 * @param position 수정할 댓글의 리스트 내 절대 위치 */ - private fun onClickedEdit(item: CommentDto, position: Int) { + private fun onClickedEdit(item: Comment, position: Int) { viewModelScope.launch { // 수정 상태 변경 item.isEditing = !item.isEditing diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListAdapter.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListAdapter.kt index b394d1933..ccdc67f1a 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListAdapter.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListAdapter.kt @@ -5,7 +5,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.comments.MyCommentDto +import com.android.mediproject.core.model.comments.MyComment import com.android.mediproject.feature.comments.databinding.ItemMyCommentBinding class MyCommentsViewHolder( @@ -22,21 +22,21 @@ class MyCommentsViewHolder( } } - fun bind(myComment: MyCommentDto) { + fun bind(myComment: MyComment) { binding.myComment = myComment } } -class MyCommentsListAdapter : ListAdapter(diffUtil) { +class MyCommentsListAdapter : ListAdapter(diffUtil) { companion object { - val diffUtil = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: MyCommentDto, newItem: MyCommentDto): Boolean { + val diffUtil = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: MyComment, newItem: MyComment): Boolean { return oldItem === newItem } - override fun areContentsTheSame(oldItem: MyCommentDto, newItem: MyCommentDto): Boolean { + override fun areContentsTheSame(oldItem: MyComment, newItem: MyComment): Boolean { return oldItem == newItem } } @@ -52,7 +52,7 @@ class MyCommentsListAdapter : ListAdapter(di holder.bind(getItem(position)) } - override fun submitList(list: MutableList?) { + override fun submitList(list: MutableList?) { super.submitList(list) } -} \ No newline at end of file +} diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListDecoration.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListDecoration.kt index c21ba7671..a69bce519 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListDecoration.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListDecoration.kt @@ -4,19 +4,19 @@ import android.content.Context import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.common.uiutil.dpToPx +import com.android.mediproject.core.common.util.dpToPx -class MyCommentsListDecoration(private val context: Context) : RecyclerView.ItemDecoration(){ +class MyCommentsListDecoration(private val context: Context) : RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, view: View, parent: RecyclerView, - state: RecyclerView.State + state: RecyclerView.State, ) { super.getItemOffsets(outRect, view, parent, state) //좌,상,우,하 - outRect.set(0,dpToPx(context,15),0,dpToPx(context,15)) + outRect.set(0, 15.dpToPx(), 0, 15.dpToPx()) } -} \ No newline at end of file +} diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListFragment.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListFragment.kt index 23bffe004..02efd63e3 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListFragment.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListFragment.kt @@ -1,17 +1,16 @@ package com.android.mediproject.feature.comments.mycommentslist -import android.content.Context import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import com.android.mediproject.core.common.uiutil.SystemBarStyler -import com.android.mediproject.core.model.comments.MyCommentDto +import com.android.mediproject.core.common.util.SystemBarStyler +import com.android.mediproject.core.common.viewmodel.repeatOnStarted +import com.android.mediproject.core.model.comments.MyComment import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.comments.databinding.FragmentMyCommentsListBinding import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -63,7 +62,7 @@ class MyCommentsListFragment : BaseFragment log(comment.medicineName + "을 누르셨습니다.") }, - MyCommentDto( + MyComment( 12346, "코메키나", "저 같은 비염환자들한테 딱 입니다. 시험칠 때 필수...!!", diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListViewModel.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListViewModel.kt index 541117d68..b176c2c42 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListViewModel.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/mycommentslist/MyCommentsListViewModel.kt @@ -1,8 +1,8 @@ package com.android.mediproject.feature.comments.mycommentslist -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -16,4 +16,4 @@ class MyCommentsListViewModel @Inject constructor() : BaseViewModel() { fun event(event: MyCommentsListEvent) = viewModelScope.launch { _eventFlow.emit(event) } sealed class MyCommentsListEvent -} \ No newline at end of file +} diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt index 0e3ea7a8a..52d11c5ff 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt @@ -4,15 +4,15 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.comments.CommentDto +import com.android.mediproject.core.model.comments.Comment import com.android.mediproject.core.ui.base.view.SimpleListItemView -class RecentCommentsAdapter : ListAdapter(AsyncDiffer) { +class RecentCommentsAdapter : ListAdapter(AsyncDiffer) { - class RecentCommentListViewHolder(private val view: SimpleListItemView) : RecyclerView.ViewHolder(view) { + class RecentCommentListViewHolder(private val view: SimpleListItemView) : RecyclerView.ViewHolder(view) { - private var item: CommentDto? = null + private var item: Comment? = null init { view.setOnItemClickListener { @@ -24,7 +24,7 @@ class RecentCommentsAdapter : ListAdapter() { - override fun areItemsTheSame(oldItem: CommentDto, newItem: CommentDto): Boolean { +object AsyncDiffer : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Comment, newItem: Comment): Boolean { return oldItem.commentId == newItem.commentId } - override fun areContentsTheSame(oldItem: CommentDto, newItem: CommentDto): Boolean { + override fun areContentsTheSame(oldItem: Comment, newItem: Comment): Boolean { return oldItem == newItem } -} \ No newline at end of file +} diff --git a/feature/comments/src/main/res/layout/item_my_comment.xml b/feature/comments/src/main/res/layout/item_my_comment.xml index 33ee43c18..6d4f1ddf1 100644 --- a/feature/comments/src/main/res/layout/item_my_comment.xml +++ b/feature/comments/src/main/res/layout/item_my_comment.xml @@ -5,7 +5,7 @@ + type="com.android.mediproject.core.model.comments.MyComment" /> - \ No newline at end of file + diff --git a/feature/comments/src/main/res/layout/item_view_comment.xml b/feature/comments/src/main/res/layout/item_view_comment.xml index 567a45eb0..11810e0c7 100644 --- a/feature/comments/src/main/res/layout/item_view_comment.xml +++ b/feature/comments/src/main/res/layout/item_view_comment.xml @@ -5,7 +5,7 @@ + type="com.android.mediproject.core.model.comments.Comment" /> - \ No newline at end of file + diff --git a/feature/comments/src/main/res/layout/item_view_comment_edit.xml b/feature/comments/src/main/res/layout/item_view_comment_edit.xml index 8b0a78aba..37cd3f4bc 100644 --- a/feature/comments/src/main/res/layout/item_view_comment_edit.xml +++ b/feature/comments/src/main/res/layout/item_view_comment_edit.xml @@ -6,7 +6,7 @@ + type="com.android.mediproject.core.model.comments.Comment" /> @@ -104,4 +104,4 @@ - \ No newline at end of file + diff --git a/feature/etc/build.gradle.kts b/feature/etc/build.gradle.kts index 3b2fb1240..e83aa3d6d 100644 --- a/feature/etc/build.gradle.kts +++ b/feature/etc/build.gradle.kts @@ -4,12 +4,13 @@ plugins { android { namespace = "com.android.mediproject.feature.etc" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) @@ -19,4 +20,4 @@ dependencies { implementation(libs.bundles.materials) implementation(libs.bundles.uiAndroidx) -} \ No newline at end of file +} diff --git a/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcFragment.kt b/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcFragment.kt index 314da1da5..a6609bd1e 100644 --- a/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcFragment.kt +++ b/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcFragment.kt @@ -1,17 +1,16 @@ package com.android.mediproject.feature.etc -import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.View import androidx.core.net.toUri import androidx.fragment.app.viewModels -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.etc.databinding.FragmentEtcBinding import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -50,7 +49,7 @@ class EtcFragment : private fun openWebWithUri(uri: Uri) { val intent = Intent(Intent.ACTION_VIEW) - intent.setData(uri) + intent.data = uri startActivity(intent) } } diff --git a/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcViewModel.kt b/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcViewModel.kt index 97b11e430..7f7bd27f1 100644 --- a/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcViewModel.kt +++ b/feature/etc/src/main/java/com/android/mediproject/feature/etc/EtcViewModel.kt @@ -1,8 +1,8 @@ package com.android.mediproject.feature.etc -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.ui.base.BaseViewModel import kotlinx.coroutines.launch @@ -25,4 +25,4 @@ class EtcViewModel : BaseViewModel() { object Privacy : EtcEvent() object Communicate : EtcEvent() } -} \ No newline at end of file +} diff --git a/feature/favoritemedicine/build.gradle.kts b/feature/favoritemedicine/build.gradle.kts index c02856788..fd4a48952 100644 --- a/feature/favoritemedicine/build.gradle.kts +++ b/feature/favoritemedicine/build.gradle.kts @@ -5,12 +5,13 @@ plugins { android { namespace = "com.android.mediproject.feature.favoritemedicine" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) @@ -23,4 +24,4 @@ dependencies { implementation(libs.bundles.materials) implementation(libs.bundles.uiAndroidx) implementation(libs.android.flexbox) -} \ No newline at end of file +} diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineFragment.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineFragment.kt index 59fae8e6d..ba532ab74 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineFragment.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineFragment.kt @@ -9,16 +9,16 @@ import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels -import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.common.viewmodel.repeatOnStarted +import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicine +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.ui.R import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.ButtonChip import com.android.mediproject.feature.favoritemedicine.databinding.FragmentFavoriteMedicineBinding import com.google.android.flexbox.FlexboxLayout import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted @AndroidEntryPoint class FavoriteMedicineFragment : @@ -64,7 +64,7 @@ class FavoriteMedicineFragment : } } - private fun setFavoriteMedicineList(medicineList: List) { + private fun setFavoriteMedicineList(medicineList: List) { clearFavoriteMedicineListView() if (checkMedicineListSize(medicineList)) { showFavorteMedicine(medicineList) @@ -75,11 +75,11 @@ class FavoriteMedicineFragment : private fun clearFavoriteMedicineListView() = binding.favoriteMedicineList.removeAllViews() - private fun checkMedicineListSize(medicineList: List): Boolean { - return (medicineList.size != 0) + private fun checkMedicineListSize(medicineList: List): Boolean { + return (medicineList.isNotEmpty()) } - private fun showFavorteMedicine(medicineList: List) { + private fun showFavorteMedicine(medicineList: List) { val horizontalSpace = resources.getDimension(R.dimen.dp_4).toInt() medicineList.forEach { medicine -> binding.favoriteMedicineList.addView( diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt index 1d1949689..565197bb0 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt @@ -1,13 +1,13 @@ package com.android.mediproject.feature.favoritemedicine -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetFavoriteMedicineUseCase import com.android.mediproject.core.domain.GetTokenUseCase -import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicine +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -34,7 +34,7 @@ class FavoriteMedicineViewModel @Inject constructor( object NavigateToFavoriteMedicineMore : FavoriteMedicineEvent() } - private val _favoriteMedicineList = MutableStateFlow>(listOf()) + private val _favoriteMedicineList = MutableStateFlow>(listOf()) val favoriteMedicineList get() = _favoriteMedicineList private val _token = MutableStateFlow>(TokenState.Empty) @@ -43,7 +43,7 @@ class FavoriteMedicineViewModel @Inject constructor( fun loadFavoriteMedicines() = viewModelScope.launch { getFavoriteMedicineUseCase.getFavoriteMedicineList() - .collect { + .collect { it -> it.fold( onSuccess = { _favoriteMedicineList.value = it }, onFailure = { }, diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreFragment.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreFragment.kt index f52626b52..135f95ff1 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreFragment.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreFragment.kt @@ -1,20 +1,19 @@ package com.android.mediproject.feature.favoritemedicine.favoritemedicinemore -import android.content.Context import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import com.android.mediproject.core.common.uiutil.SystemBarStyler -import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.common.util.SystemBarStyler +import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreInfo +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.favoritemedicine.databinding.FragmentFavoriteMedicineMoreBinding import com.android.mediproject.feature.favoritemedicine.favoritemedicinemore.recyclerview.FavoriteMedcineMoreDecoration import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -28,10 +27,6 @@ class FavoriteMedicineMoreFragment : @Inject lateinit var systemBarStyler: SystemBarStyler - override fun onAttach(context: Context) { - super.onAttach(context) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setBinding() @@ -68,7 +63,7 @@ class FavoriteMedicineMoreFragment : addItemDecoration(DividerItemDecoration(requireContext(), 1)) } - private fun setFavoriteMedicineMoreList(medicineList: List) { + private fun setFavoriteMedicineMoreList(medicineList: List) { favoriteMedicineMoreAdapter.submitList(medicineList) } diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt index 3fe20b421..5b5613ba2 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt @@ -3,9 +3,9 @@ package com.android.mediproject.feature.favoritemedicine.favoritemedicinemore import androidx.lifecycle.viewModelScope import com.android.mediproject.core.domain.GetFavoriteMedicineUseCase import com.android.mediproject.core.domain.GetTokenUseCase -import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreInfo +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -19,7 +19,7 @@ class FavoriteMedicineMoreViewModel @Inject constructor( private val getFavoriteMedicineUseCase: GetFavoriteMedicineUseCase, ) : BaseViewModel() { - private val _favoriteMedicineList = MutableStateFlow>(listOf()) + private val _favoriteMedicineList = MutableStateFlow>(listOf()) val favoriteMedicineList get() = _favoriteMedicineList private val _token = MutableStateFlow>(TokenState.Empty) @@ -29,8 +29,8 @@ class FavoriteMedicineMoreViewModel @Inject constructor( fun loadFavoriteMedicines() = viewModelScope.launch { getFavoriteMedicineUseCase.getFavoriteMedicineMoreList() - .collect { - it.fold( + .collect { result -> + result.fold( onSuccess = { _favoriteMedicineList.value = it }, onFailure = { }, ) diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMeidicneMoreAdapter.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMeidicneMoreAdapter.kt similarity index 79% rename from feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMeidicneMoreAdapter.kt rename to feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMeidicneMoreAdapter.kt index f5a3ea494..d67b7014c 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMeidicneMoreAdapter.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMeidicneMoreAdapter.kt @@ -5,32 +5,32 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreDto +import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreInfo import com.android.mediproject.feature.favoritemedicine.databinding.ItemFavoriteMedicineBinding class FavoriteMedicineMoreViewHolder(private val binding: ItemFavoriteMedicineBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(moreInterestedMedicine: FavoriteMedicineMoreDto) { + fun bind(moreInterestedMedicine: FavoriteMedicineMoreInfo) { binding.item = moreInterestedMedicine } } class FavoriteMeidicneMoreAdapter : - ListAdapter(diffUtil) { + ListAdapter(diffUtil) { companion object { - val diffUtil = object : DiffUtil.ItemCallback() { + val diffUtil = object : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: FavoriteMedicineMoreDto, - newItem: FavoriteMedicineMoreDto, + oldItem: FavoriteMedicineMoreInfo, + newItem: FavoriteMedicineMoreInfo, ): Boolean { return oldItem === newItem } override fun areContentsTheSame( - oldItem: FavoriteMedicineMoreDto, - newItem: FavoriteMedicineMoreDto, + oldItem: FavoriteMedicineMoreInfo, + newItem: FavoriteMedicineMoreInfo, ): Boolean { return oldItem == newItem } diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMedcineMoreDecoration.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMedcineMoreDecoration.kt index f6a006621..0c41d7666 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMedcineMoreDecoration.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/recyclerview/FavoriteMedcineMoreDecoration.kt @@ -4,18 +4,16 @@ import android.content.Context import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.common.uiutil.dpToPx +import com.android.mediproject.core.common.util.dpToPx -class FavoriteMedcineMoreDecoration(private val context : Context) : RecyclerView.ItemDecoration() { +class FavoriteMedcineMoreDecoration(private val context: Context) : RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, view: View, parent: RecyclerView, - state: RecyclerView.State + state: RecyclerView.State, ) { super.getItemOffsets(outRect, view, parent, state) - - outRect.set(0, dpToPx(context,10),0, dpToPx(context,10)) - + outRect.set(0, 10.dpToPx(), 0, 10.dpToPx()) } } diff --git a/feature/favoritemedicine/src/main/res/layout/item_favorite_medicine.xml b/feature/favoritemedicine/src/main/res/layout/item_favorite_medicine.xml index 3e5bc3e02..8b763da1a 100644 --- a/feature/favoritemedicine/src/main/res/layout/item_favorite_medicine.xml +++ b/feature/favoritemedicine/src/main/res/layout/item_favorite_medicine.xml @@ -6,7 +6,7 @@ + type="com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreInfo" /> - \ No newline at end of file + diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts index 7578ed432..437722b59 100644 --- a/feature/home/build.gradle.kts +++ b/feature/home/build.gradle.kts @@ -4,12 +4,13 @@ plugins { android { namespace = "com.android.mediproject.feature.home" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) diff --git a/feature/home/src/main/java/com/android/mediproject/feature/home/HomeFragment.kt b/feature/home/src/main/java/com/android/mediproject/feature/home/HomeFragment.kt index 2c990e20c..a3b898df0 100644 --- a/feature/home/src/main/java/com/android/mediproject/feature/home/HomeFragment.kt +++ b/feature/home/src/main/java/com/android/mediproject/feature/home/HomeFragment.kt @@ -7,14 +7,14 @@ import androidx.core.os.bundleOf import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.android.mediproject.core.common.mapper.MedicineInfoMapper -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarStyler +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.comments.recentcommentlist.RecentCommentListFragment import com.android.mediproject.feature.home.databinding.FragmentHomeBinding import com.android.mediproject.feature.news.penalties.recentpenaltylist.RecentPenaltyListFragment import com.android.mediproject.feature.search.recentsearchlist.RecentSearchListFragment import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -124,7 +124,7 @@ class HomeFragment : BaseFragment(FragmentHo childFragmentManager.setFragmentResultListener(RecentSearchListFragment.ResultKey.RESULT_KEY.name, viewLifecycleOwner) { _, bundle -> findNavController().navigate( R.id.action_homeFragment_to_searchMedicinesFragment, - bundleOf("query" to bundle.getString(RecentSearchListFragment.ResultKey.WORD.name)), + bundleOf("words" to bundle.getString(RecentSearchListFragment.ResultKey.WORD.name)), ) } } diff --git a/feature/home/src/main/java/com/android/mediproject/feature/home/HomeViewModel.kt b/feature/home/src/main/java/com/android/mediproject/feature/home/HomeViewModel.kt index 9121b9810..7c8f66bdb 100644 --- a/feature/home/src/main/java/com/android/mediproject/feature/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/android/mediproject/feature/home/HomeViewModel.kt @@ -1,8 +1,8 @@ package com.android.mediproject.feature.home -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch diff --git a/feature/home/src/main/res/navigation/home_nav.xml b/feature/home/src/main/res/navigation/home_nav.xml index 3838c67df..222cd67eb 100644 --- a/feature/home/src/main/res/navigation/home_nav.xml +++ b/feature/home/src/main/res/navigation/home_nav.xml @@ -24,7 +24,7 @@ tools:layout="@layout/fragment_search_medicines"> diff --git a/feature/intro/build.gradle.kts b/feature/intro/build.gradle.kts index 44f147c29..fc360ea15 100644 --- a/feature/intro/build.gradle.kts +++ b/feature/intro/build.gradle.kts @@ -4,12 +4,13 @@ plugins { android { namespace = "com.android.mediproject.feature.intro" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) @@ -20,4 +21,4 @@ dependencies { implementation(libs.bundles.kotlins) implementation(libs.bundles.materials) implementation(libs.bundles.uiAndroidx) -} \ No newline at end of file +} diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroFragment.kt index 998c66d47..61c2f5776 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroFragment.kt @@ -7,7 +7,7 @@ import androidx.navigation.NavOptions import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.intro.databinding.FragmentIntroBinding import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class IntroFragment : BaseFragment(FragmentIntroBinding::inflate) { diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroViewModel.kt index 8985dbdc5..2ed8e0213 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/IntroViewModel.kt @@ -1,8 +1,8 @@ package com.android.mediproject.feature.intro -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.domain.GetSkippableIntroUseCase diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt index f86dab8dd..dc785a678 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt @@ -8,11 +8,11 @@ import androidx.navigation.NavOptions import com.android.mediproject.core.common.dialog.LoadingDialog import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.common.util.delayTextChangedCallback -import com.android.mediproject.core.model.local.navargs.TOHOME -import com.android.mediproject.core.model.local.navargs.TOMYPAGE +import com.android.mediproject.core.model.navargs.TOHOME +import com.android.mediproject.core.model.navargs.TOMYPAGE import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.intro.databinding.FragmentLoginBinding import dagger.hilt.android.AndroidEntryPoint @@ -28,7 +28,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.plus -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt index 70d9fe008..a78186519 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt @@ -1,15 +1,15 @@ package com.android.mediproject.feature.intro -import MutableEventFlow import android.text.Editable import androidx.lifecycle.viewModelScope -import asEventFlow import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.util.isEmailValid import com.android.mediproject.core.common.util.isPasswordValid +import com.android.mediproject.core.common.viewmodel.MutableEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.sign.SignUseCase -import com.android.mediproject.core.model.local.navargs.TOHOME +import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.model.requestparameters.LoginParameter import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -139,14 +139,14 @@ class LoginViewModel @Inject constructor( } private fun loginFailed() { - setLoginState(LoginViewModel.LoginState.LoginFailed("로그인 실패")) + setLoginState(LoginState.LoginFailed("로그인 실패")) } private fun loginSuccess() { - setLoginState(LoginViewModel.LoginState.LoginSuccess) + setLoginState(LoginState.LoginSuccess) } private fun loginFailedWithRegexError() { - setLoginState(LoginViewModel.LoginState.RegexError) + setLoginState(LoginState.RegexError) } } diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt index b1d3ca1a2..c22eadfc0 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt @@ -8,10 +8,10 @@ import androidx.navigation.NavOptions import com.android.mediproject.core.common.dialog.LoadingDialog import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.common.util.delayTextChangedCallback -import com.android.mediproject.core.model.local.navargs.TOHOME -import com.android.mediproject.core.model.local.navargs.TOMYPAGE +import com.android.mediproject.core.model.navargs.TOHOME +import com.android.mediproject.core.model.navargs.TOMYPAGE import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.intro.databinding.FragmentSignUpBinding import dagger.hilt.android.AndroidEntryPoint @@ -24,7 +24,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt index 031161fd1..cda265c27 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt @@ -1,14 +1,14 @@ package com.android.mediproject.feature.intro -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.util.isEmailValid import com.android.mediproject.core.common.util.isPasswordValid import com.android.mediproject.core.domain.sign.SignUseCase -import com.android.mediproject.core.model.local.navargs.TOHOME +import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.model.requestparameters.SignUpParameter import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/medicine/build.gradle.kts b/feature/medicine/build.gradle.kts index 24160429e..155c07424 100644 --- a/feature/medicine/build.gradle.kts +++ b/feature/medicine/build.gradle.kts @@ -5,10 +5,10 @@ plugins { android { namespace = "com.android.mediproject.feature.medicine" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } dependencies { @@ -26,4 +26,7 @@ dependencies { implementation(libs.bundles.materials) implementation(libs.bundles.uiAndroidx) implementation(libs.androidx.asynclayoutinflater) + + testImplementation(libs.bundles.testLocal) + androidTestImplementation(libs.bundles.testAndroid) } diff --git a/feature/medicine/src/androidTest/java/com/android/mediproject/feature/medicine/ExampleUnitTest.kt b/feature/medicine/src/androidTest/java/com/android/mediproject/feature/medicine/ExampleUnitTest.kt new file mode 100644 index 000000000..be2b145c9 --- /dev/null +++ b/feature/medicine/src/androidTest/java/com/android/mediproject/feature/medicine/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.android.mediproject.feature.medicine + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/host/MedicineBasicInfoViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/host/MedicineBasicInfoViewModel.kt index 2ab286274..502a15df7 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/host/MedicineBasicInfoViewModel.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/host/MedicineBasicInfoViewModel.kt @@ -7,7 +7,7 @@ import com.android.mediproject.core.common.mapper.MedicineInfoMapper import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfo +import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -30,11 +30,11 @@ class MedicineBasicInfoViewModel @Inject constructor( ) : BaseViewModel() { - private val _medicineDetails = MutableStateFlow>(UiState.Loading) + private val _medicineDetails = MutableStateFlow>(UiState.Loading) private val medicineDetails get() = _medicineDetails.asStateFlow() - fun setMedicineDetails(uiState: UiState) { + fun setMedicineDetails(uiState: UiState) { viewModelScope.launch { _medicineDetails.value = uiState } diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/BaseMedicineInfoItemFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/BaseMedicineInfoItemFragment.kt index 2f1639510..937257bc4 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/BaseMedicineInfoItemFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/BaseMedicineInfoItemFragment.kt @@ -10,7 +10,7 @@ import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.medicine.basicinfo.host.MedicineBasicInfoViewModel import com.android.mediproject.feature.medicine.main.MedicineInfoViewModel import kotlinx.coroutines.flow.collectLatest -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import kotlin.reflect.KClass import kotlin.reflect.full.createInstance @@ -25,18 +25,20 @@ abstract class BaseMedicineInfoItemFragment(inflate: Inflat override val fragmentViewModel: MedicineBasicInfoViewModel by viewModels(ownerProducer = { requireParentFragment() }) - private val _medicineInfoViewModel by viewModels(ownerProducer = { - requireParentFragment().requireParentFragment() - }) + private val _medicineInfoViewModel by viewModels( + ownerProducer = { + requireParentFragment().requireParentFragment() + }, + ) - protected val medicineInfoViewModel get() = _medicineInfoViewModel + private val medicineInfoViewModel get() = _medicineInfoViewModel companion object : MedicineInfoItemFragmentFactory { @JvmStatic override fun > newInstance( - fragmentClass: KClass + fragmentClass: KClass, ): T { return fragmentClass.createInstance() } @@ -53,4 +55,4 @@ abstract class BaseMedicineInfoItemFragment(inflate: Inflat } } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/DosageInfoItemFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/DosageInfoItemFragment.kt index f28b71f06..30f5c7add 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/DosageInfoItemFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/basicinfo/item/DosageInfoItemFragment.kt @@ -4,11 +4,11 @@ import android.os.Bundle import android.view.View import com.android.mediproject.feature.medicine.databinding.FragmentDosageInfoItemBinding import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class DosageInfoItemFragment : BaseMedicineInfoItemFragment( - FragmentDosageInfoItemBinding::inflate + FragmentDosageInfoItemBinding::inflate, ) { companion object : MedicineInfoItemFragmentFactory by BaseMedicineInfoItemFragment.Companion @@ -24,4 +24,4 @@ class DosageInfoItemFragment : BaseMedicineInfoItemFragment( - FragmentEfficacyInfoItemBinding::inflate + FragmentEfficacyInfoItemBinding::inflate, ) { companion object : MedicineInfoItemFragmentFactory by BaseMedicineInfoItemFragment.Companion @@ -30,4 +30,4 @@ class EfficacyEffectItemFragment : BaseMedicineInfoItemFragment( - FragmentMedicineInfoItemBinding::inflate + FragmentMedicineInfoItemBinding::inflate, ) { companion object : MedicineInfoItemFragmentFactory by BaseMedicineInfoItemFragment.Companion @@ -24,4 +24,4 @@ class MedicineInfoItemFragment : BaseMedicineInfoItemFragment({ - requireParentFragment() - }) + private val medicineInfoViewModel by viewModels( + { + requireParentFragment() + }, + ) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -37,7 +39,7 @@ class GranuleInfoFragment : BaseFragment { fragmentViewModel.getGranuleIdentificationInfo( - itemName = null, entpName = null, itemSeq = it.data.itemSequence, requireContext() + itemName = null, entpName = null, itemSeq = it.data.itemSequence, requireContext(), ) } @@ -49,4 +51,4 @@ class GranuleInfoFragment : BaseFragment>(UiState.Loading) + private val granuleIdentification = MutableStateFlow>(UiState.Loading) private val _granuleTextTags = MutableStateFlow(null) val granuleTextTags get() = _granuleTextTags.asStateFlow() fun getGranuleIdentificationInfo( - itemName: String?, entpName: String?, itemSeq: String?, context: Context) = viewModelScope.launch(defaultDispatcher) { + itemName: String?, entpName: String?, itemSeq: String?, context: Context, + ) = viewModelScope.launch(defaultDispatcher) { granuleIdentification.value = UiState.Loading getGranuleIdentificationUseCase(itemName, entpName, itemSeq).collectLatest { result -> result.onSuccess { @@ -41,4 +43,4 @@ class GranuleInfoViewModel @Inject constructor( } } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt index 674d7233f..31a7268a5 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt @@ -6,12 +6,12 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import com.android.mediproject.core.common.dialog.LoadingDialog -import com.android.mediproject.core.common.uiutil.SystemBarColorAnalyzer -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarColorAnalyzer +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.common.util.navArgs import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.navargs.MedicineInfoArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.medicine.R import com.android.mediproject.feature.medicine.databinding.FragmentMedicineInfoBinding @@ -19,7 +19,7 @@ import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject /** diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt index 89dfa6fb9..4c0ddada3 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt @@ -1,16 +1,16 @@ package com.android.mediproject.feature.medicine.main -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.domain.CommentsUseCase import com.android.mediproject.core.domain.GetFavoriteMedicineUseCase import com.android.mediproject.core.domain.GetMedicineDetailsUseCase -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs -import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetailInfo +import com.android.mediproject.core.model.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -54,7 +54,7 @@ class MedicineInfoViewModel @Inject constructor( private val checkFavoriteMedicine = MutableStateFlow(EventState.Favorite(isFavorite = false, lockChecked = true)) - val medicineDetails: StateFlow> = medicinePrimaryInfo.flatMapLatest { primaryInfo -> + val medicineDetails: StateFlow> = medicinePrimaryInfo.flatMapLatest { primaryInfo -> getMedicineDetailsUseCase(primaryInfo).mapLatest { result -> result.fold( onSuccess = { diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoFragment.kt new file mode 100644 index 000000000..7dbc63cba --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoFragment.kt @@ -0,0 +1,69 @@ +package com.android.mediproject.feature.medicine.precautions.dur + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import com.android.mediproject.core.common.viewmodel.repeatOnStarted +import com.android.mediproject.core.ui.base.BaseFragment +import com.android.mediproject.feature.medicine.databinding.FragmentDurInfoBinding +import com.android.mediproject.feature.medicine.main.MedicineInfoViewModel +import com.android.mediproject.feature.medicine.precautions.dur.adapter.DurListAdapter +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * 의약품 적정 사용정보(DUR,Drug Utilization Review) + * - 의약품의 효능, 용법, 용량, 주의사항 등을 알려주는 정보 + */ +@AndroidEntryPoint +class DurInfoFragment : BaseFragment(FragmentDurInfoBinding::inflate) { + + override val fragmentViewModel: DurInfoViewModel by viewModels() + + private val medicineInfoViewModel by viewModels( + { + requireParentFragment().requireParentFragment() + }, + ) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.viewModel = fragmentViewModel + + binding.apply { + val adapter = DurListAdapter().apply { + setOnStateChangedListener( + pagingListViewGroup.messageTextView, + pagingListViewGroup.loadTextView, + pagingListViewGroup.pagingList, + pagingListViewGroup.progressIndicator, + getString(com.android.mediproject.feature.medicine.R.string.dur_list_empty_message), + getString(com.android.mediproject.feature.medicine.R.string.dur_list_load_message), + ) + } + pagingListViewGroup.pagingList.adapter = adapter + + viewLifecycleOwner.repeatOnStarted { + fragmentViewModel.durList.collect { state -> + state.isInitializing { + + }.isLoadingDurTypes { + + }.isLoadingDurList { + + }.isSuccess { + log("isSuccess") + adapter.submitList(it) + }.isError { + log("isError") + adapter.submitList(emptyList()) + } + } + } + + adapter.submitList(emptyList()) + fragmentViewModel.getDur(medicineInfoViewModel.medicinePrimaryInfo.replayCache.last().itemSeq.toString()) + } + } + +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoViewModel.kt new file mode 100644 index 000000000..4f8b2bdab --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurInfoViewModel.kt @@ -0,0 +1,119 @@ +package com.android.mediproject.feature.medicine.precautions.dur + +import androidx.lifecycle.viewModelScope +import com.android.mediproject.core.common.network.Dispatcher +import com.android.mediproject.core.common.network.MediDispatchers +import com.android.mediproject.core.domain.GetDurUseCase +import com.android.mediproject.core.model.dur.DurListItem +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.core.ui.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.async +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import javax.inject.Inject +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract + +@HiltViewModel +class DurInfoViewModel @Inject constructor( + private val getDurUseCase: GetDurUseCase, + private val durTextMapper: DurTextMapper, + @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher, +) : BaseViewModel() { + + private val _durList = MutableStateFlow(State.Initial) + val durList = _durList.asStateFlow() + + fun getDur(itemSeq: String) { + viewModelScope.launch(defaultDispatcher) { + val durTitleAndDescriptions = async { + durTextMapper.durTitleAndDescriptions.filterNotNull().first() + } + + val durTypes = getDurUseCase.hasDur(itemName = null, itemSeq = itemSeq) + durTypes.onSuccess { + _durList.value = State.LoadingDurTypes + + val durTitleAndDescriptionMap = durTitleAndDescriptions.await() + val durTypePos = mutableMapOf() + + val durItemList = it.mapIndexed { i, durType -> + durTypePos[durType] = i + DurListItem( + durType, title = durTitleAndDescriptionMap.getValue(durType).title, + description = durTitleAndDescriptionMap.getValue(durType).description, + ) + } + + val durListResult = getDurUseCase.getDur(itemSeq, it) + + durListResult.forEach { (durType, result) -> + durItemList[durTypePos.getValue(durType)].durItems = result + } + + _durList.value = State.Success(durItemList) + }.onFailure { + _durList.value = State.Error(it.message ?: "의약품 안전 사용 정보를 불러오는 중 오류가 발생했습니다.") + } + } + } +} + + +sealed interface State { + object Initial : State + object LoadingDurTypes : State + object LoadingDurList : State + data class Success(val durItemList: List) : State + data class Error(val message: String) : State +} + +@OptIn(ExperimentalContracts::class) +fun State.isInitializing(block: () -> Unit): State { + contract { + callsInPlace(block, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + if (this is State.Initial) block() + return this +} + +@OptIn(ExperimentalContracts::class) +fun State.isLoadingDurTypes(block: () -> Unit): State { + contract { + callsInPlace(block, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + if (this is State.LoadingDurTypes) block() + return this +} + +@OptIn(ExperimentalContracts::class) +fun State.isLoadingDurList(block: () -> Unit): State { + contract { + callsInPlace(block, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + if (this is State.LoadingDurList) block() + return this +} + +@OptIn(ExperimentalContracts::class) +fun State.isSuccess(block: (List) -> Unit): State { + contract { + callsInPlace(block, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + if (this is State.Success) block(durItemList) + return this +} + +@OptIn(ExperimentalContracts::class) +fun State.isError(block: (String) -> Unit): State { + contract { + callsInPlace(block, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + if (this is State.Error) block(message) + return this +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurTextMapper.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurTextMapper.kt new file mode 100644 index 000000000..134500074 --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/DurTextMapper.kt @@ -0,0 +1,101 @@ +package com.android.mediproject.feature.medicine.precautions.dur + +import android.content.Context +import android.text.Html +import android.text.Spanned +import com.android.mediproject.core.model.dur.DurType +import com.android.mediproject.feature.medicine.R +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Singleton + +@OptIn(DelicateCoroutinesApi::class) +@Singleton +class DurTextMapper @Inject constructor( + @ApplicationContext private val context: Context, +) { + + private val _durTitleAndDescriptions = MutableStateFlow?>(null) + val durTitleAndDescriptions get() = _durTitleAndDescriptions.asStateFlow() + + init { + GlobalScope.launch(Dispatchers.IO) { + val durTitleAndDescriptionMap = mutableMapOf() + + context.run { + durTitleAndDescriptionMap[DurType.DOSING_CAUTION] = DurTitleAndDescription( + createTitle(getString(R.string.dosingCaution)), + createDefinition( + getString(R.string.dosingCautionDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.EX_RELEASE_TABLET_SPLIT_ATTENTION] = DurTitleAndDescription( + createTitle(getString(R.string.exReleaseTabletSplitAttention)), + createDefinition( + getString(R.string.exReleaseTabletSplitAttentionDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.PREGNANT_WOMAN_TABOO] = DurTitleAndDescription( + createTitle(getString(R.string.pregnancyTaboo)), + createDefinition( + getString(R.string.pregnancyTabooDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.COMBINATION_TABOO] = DurTitleAndDescription( + createTitle(getString(R.string.combinationTaboo)), + createDefinition( + getString(R.string.combinationTabooDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.SENIOR_CAUTION] = DurTitleAndDescription( + createTitle(getString(R.string.seniorCaution)), + createDefinition( + getString(R.string.seniorCautionDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.CAPACITY_ATTENTION] = DurTitleAndDescription( + createTitle(getString(R.string.capacityAttention)), + createDefinition( + getString(R.string.capacityAttentionDescription), + ), + ) + + durTitleAndDescriptionMap[DurType.SPECIALTY_AGE_GROUP_TABOO] = DurTitleAndDescription( + createTitle(getString(R.string.specialtyAgeGroupTaboo)), + createDefinition( + getString(R.string.specialtyAgeGroupTaboo), + ), + ) + + durTitleAndDescriptionMap[DurType.EFFICACY_GROUP_DUPLICATION] = DurTitleAndDescription( + createTitle(getString(R.string.efficacyGroupDuplication)), + createDefinition( + getString(R.string.efficacyGroupDuplicationDescription), + ), + ) + } + + _durTitleAndDescriptions.value = durTitleAndDescriptionMap + } + } + + private fun createTitle(value: String): Spanned = Html.fromHtml("• $value", Html.FROM_HTML_MODE_COMPACT) + + private fun createDefinition(value: String): Spanned = Html.fromHtml(value, Html.FROM_HTML_MODE_COMPACT) + + data class DurTitleAndDescription( + val title: Spanned, + val description: Spanned, + ) +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/AdapterContainer.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/AdapterContainer.kt new file mode 100644 index 000000000..0f6102b2a --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/AdapterContainer.kt @@ -0,0 +1,31 @@ +package com.android.mediproject.feature.medicine.precautions.dur.adapter + +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.core.model.dur.DurListItem +import com.android.mediproject.feature.medicine.databinding.ItemViewDurListItemBinding + + +class ItemInListItemCallback : DiffUtil.ItemCallback() { + override fun areContentsTheSame(oldItem: DurItem, newItem: DurItem): Boolean = oldItem.content.contentEquals(newItem.content) + + override fun areItemsTheSame(oldItem: DurItem, newItem: DurItem): Boolean = oldItem == newItem +} + + +class ListItemCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: DurListItem, newItem: DurListItem): Boolean = oldItem == newItem + + override fun areContentsTheSame(oldItem: DurListItem, newItem: DurListItem): Boolean = oldItem.durType == newItem.durType +} + + +class ItemInDurListItemViewHolder( + private val binding: ItemViewDurListItemBinding, +) : RecyclerView.ViewHolder(binding.root) { + + fun onBind(durItem: DurItem) { + binding.contentTextView.text = durItem.content + } +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListAdapter.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListAdapter.kt new file mode 100644 index 000000000..8eb43fbbe --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListAdapter.kt @@ -0,0 +1,59 @@ +package com.android.mediproject.feature.medicine.precautions.dur.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.android.mediproject.core.common.recyclerview.MListAdapter +import com.android.mediproject.core.model.dur.DurListItem +import com.android.mediproject.feature.medicine.databinding.ItemViewDurListBinding + +class DurListAdapter : MListAdapter(ListItemCallback()) { + + private val itemViewPool = RecyclerView.RecycledViewPool() + private var _itemViewWrapper: DurListItemViewWrapper? = null + private val itemViewWrapper: DurListItemViewWrapper + get() = _itemViewWrapper!! + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + if (_itemViewWrapper == null) _itemViewWrapper = DurListItemViewWrapper(itemCount, parent.context) + return ViewHolder(ItemViewDurListBinding.inflate(LayoutInflater.from(parent.context), parent, false), itemViewPool, itemViewWrapper) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.onBind(getItem(position)) + } + + override fun getItemId(position: Int): Long = position.toLong() + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + _itemViewWrapper?.release() + _itemViewWrapper = null + itemViewPool.clear() + } + + class ViewHolder( + private val binding: ItemViewDurListBinding, + viewPool: RecyclerView.RecycledViewPool, + itemViewWrapper: DurListItemViewWrapper, + ) : RecyclerView.ViewHolder(binding.root) { + + private val contentsAdapter = DurListItemAdapter(itemViewWrapper) + + init { + binding.contentsRecyclerView.apply { + setRecycledViewPool(viewPool) + setHasFixedSize(true) + adapter = contentsAdapter + } + } + + fun onBind(item: DurListItem) { + binding.model = item + binding.executePendingBindings() + item.durItems?.onSuccess { contentsAdapter.submitList(it) }?.onFailure { } + } + } + + +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemAdapter.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemAdapter.kt new file mode 100644 index 000000000..5394e74e3 --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemAdapter.kt @@ -0,0 +1,21 @@ +package com.android.mediproject.feature.medicine.precautions.dur.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import com.android.mediproject.core.model.dur.DurItem +import com.android.mediproject.feature.medicine.databinding.ItemViewDurListItemBinding + +class DurListItemAdapter( + private val wrapper: DurListItemViewWrapper, +) : ListAdapter(ItemInListItemCallback()) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemInDurListItemViewHolder = ItemInDurListItemViewHolder( + wrapper.getCacheView() ?: ItemViewDurListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false), + ) + + override fun onBindViewHolder(holder: ItemInDurListItemViewHolder, position: Int) { + holder.onBind(getItem(position)) + } + + override fun getItemId(position: Int): Long = position.toLong() +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemViewWrapper.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemViewWrapper.kt new file mode 100644 index 000000000..a2f8e26a1 --- /dev/null +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/dur/adapter/DurListItemViewWrapper.kt @@ -0,0 +1,34 @@ +package com.android.mediproject.feature.medicine.precautions.dur.adapter + +import android.content.Context +import androidx.asynclayoutinflater.view.AsyncLayoutInflater +import com.android.mediproject.feature.medicine.R +import com.android.mediproject.feature.medicine.databinding.ItemViewDurListItemBinding +import java.util.Stack + +class DurListItemViewWrapper(durCount: Int, context: Context) { + private val viewCache = Stack() + + init { + AsyncLayoutInflater(context).run { + repeat(durCount + durCount / 2) { + inflate(R.layout.item_view_dur_list_item, null) { view, _, _ -> + synchronized(viewCache) { + viewCache.push( + ItemViewDurListItemBinding.bind(view), + ) + } + } + } + } + } + + fun getCacheView(): ItemViewDurListItemBinding? = synchronized(viewCache) { + if (viewCache.isEmpty()) null + else viewCache.pop() + } + + fun release() { + viewCache.clear() + } +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsFragment.kt index a9295f652..6c219c4e4 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsFragment.kt @@ -19,7 +19,7 @@ class MedicinePrecautionsFragment : binding.apply { precautionsViewpager.adapter = MedicinePrecautionsItemPageAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) - + chipGroup.setOnCheckedStateChangeListener { group, checkedIds -> precautionsViewpager.setCurrentItem(group.indexOfChild(group.findViewById(checkedIds.first())), true) } @@ -33,4 +33,4 @@ class MedicinePrecautionsFragment : chipGroup.takeIf { it.checkedChipId == View.NO_ID }?.check(R.id.precautionsChip) } } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsItemPageAdapter.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsItemPageAdapter.kt index e93390c95..6e08734d4 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsItemPageAdapter.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsItemPageAdapter.kt @@ -3,19 +3,19 @@ package com.android.mediproject.feature.medicine.precautions.host import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle import androidx.viewpager2.adapter.FragmentStateAdapter -import com.android.mediproject.feature.medicine.precautions.item.MedicinePrecautionsItemFragment -import com.android.mediproject.feature.medicine.precautions.item.MedicineSafeUsageItemFragment +import com.android.mediproject.feature.medicine.precautions.dur.DurInfoFragment +import com.android.mediproject.feature.medicine.precautions.precautions.MedicinePrecautionsItemFragment class MedicinePrecautionsItemPageAdapter( - fragmentManager: FragmentManager, lifecycle: Lifecycle + fragmentManager: FragmentManager, lifecycle: Lifecycle, ) : FragmentStateAdapter(fragmentManager, lifecycle) { private val fragments = listOf( - MedicinePrecautionsItemFragment(), MedicineSafeUsageItemFragment() + MedicinePrecautionsItemFragment(), DurInfoFragment(), ) override fun getItemCount(): Int = fragments.size override fun createFragment(position: Int) = fragments[position] -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsViewModel.kt index 1ec5b6029..16a0cb7f2 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsViewModel.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/host/MedicinePrecautionsViewModel.kt @@ -18,7 +18,7 @@ import javax.inject.Inject @HiltViewModel class MedicinePrecautionsViewModel @Inject constructor( - @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher + @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher, ) : BaseViewModel() { private val _precautions = MutableStateFlow>(emptyList()) @@ -30,9 +30,7 @@ class MedicinePrecautionsViewModel @Inject constructor( */ fun createPrecautionsTexts(xmlParsedResult: XMLParsedResult) { viewModelScope.launch(defaultDispatcher) { - val stringBuilder = WeakReference(StringBuilder()) - - stringBuilder.get()?.also { builder -> + WeakReference(StringBuilder()).get()?.also { builder -> val list = mutableListOf() xmlParsedResult.articleList.forEach { article -> @@ -52,9 +50,8 @@ class MedicinePrecautionsViewModel @Inject constructor( list.toList() } } - stringBuilder.clear() } } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageItemFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageItemFragment.kt deleted file mode 100644 index dc4f67742..000000000 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageItemFragment.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.android.mediproject.feature.medicine.precautions.item - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.viewModels -import com.android.mediproject.core.common.dialog.LoadingDialog -import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.ui.base.BaseFragment -import com.android.mediproject.feature.medicine.R -import com.android.mediproject.feature.medicine.databinding.FragmentMedicineSafeUseItemBinding -import com.android.mediproject.feature.medicine.main.MedicineInfoViewModel -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch -import repeatOnStarted - -/** - * - * 의약품 적정 사용정보(DUR,Drug Utilization Review) - * - * 의약품 적정사용 정보는 부적절한 의약품 사용을 사전에 예방하고 국민건강을 보호하기 위하여, - * 의·약 전문가가 처방·조제 시 활용할 수 있도록 의약품의 안전하고 적절한 사용 기준을 항목별로 분류하여 체계적으로 개발한 정보입니다. - * - * 품목기준코드 또는 품목명으로 조회 가능 - * - * 병용금기 ◎ 두 가지 이상의 의약품을 함께 사용할 때 치료효과의 변화 또는 심각한 부작용 발생 등의 우려가 있어 동시에 사용하지 않아야 하는 의약품의 조합 - * - * 특정연령대금기 ◎ 소아, 노인 등 특정한 연령대의 환자가 사용함에 있어 안전성이 확보되지 않았거나 심각한 부작용 발생 등의 우려가 있어 사용하지 않아야 하는 의약품 - * - * 임부금기 ◎ 태아에게 매우 심각한 위해성(태아기형 또는 태아독성 등)을 유발하거나 유발할 가능성이 높아 임부에게 사용하는 것이 권장되지 않는 의약품 - * - * 1등급 : 태아에 대한 위험성이 명확하여 의학적으로 불가피한 경우 이외에는 반드시 임부에게 투여를 피해야하는 의약품 - * - * 2등급 : 태아에 대한 위해성이 나타날 수 있으므로 원칙적으로 사용금지. 다만, 임부에 대한 치료적 유익성이 위험성보다 더 높을 경우 신중하게 투여 가능한 의약품 - * - * 용량주의 ◎ 성인에서 특정용량을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 용량 의존적 부작용 발생 가능성이 높아져 1일 최대용량에 대한 주의가 필요한 의약품 - * - * 투여기간주의 ◎ 특정 투여기간을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 1회 최대 투여기간에 대한 주의가 필요한 의약품 - * - * 노인주의 ◎ 노인에서 부작용 발생 빈도 증가 등의 우려가 있어 사용 시 주의가 필요한 의약품 - * - * 효능군중복 ◎ 약리기전이 동일하거나 유사한 효능군 내에서 중복 투여될 때 추가적인 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 주의가 필요한 의약품 - * - * 분할주의 ◎ 분할하여 복용할 경우 허가된 약효를 기대하기 어려운 의약품 - * - * 첨가제주의 ◎ 특정 첨가제 성분(유당, 대두유, 카제인)의 주의가 필요한 의약품 - * - */ -@AndroidEntryPoint -class MedicineSafeUsageItemFragment : - BaseFragment(FragmentMedicineSafeUseItemBinding::inflate) { - - override val fragmentViewModel: MedicineSafeUsageViewModel by viewModels() - - private val medicineInfoViewModel by viewModels({ - requireParentFragment().requireParentFragment() - }) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - binding.viewModel = fragmentViewModel - - viewLifecycleOwner.repeatOnStarted { - - launch { - fragmentViewModel.dur.collect { - when (it) { - is UiState.Success -> { - LoadingDialog.dismiss() - } - - else -> { - LoadingDialog.dismiss() - } - } - } - } - - launch { - medicineInfoViewModel.medicineDetails.collect { - when (it) { - is UiState.Success -> { - it.data.also { medicineInfo -> - LoadingDialog.showLoadingDialog(requireActivity(), getString(R.string.loadingSafeUsage)) - fragmentViewModel.loadDur(itemName = null, itemSeq = medicineInfo.itemSequence) - } - } - - else -> {} - } - } - } - } - - } - -} \ No newline at end of file diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageViewModel.kt deleted file mode 100644 index 8a4272512..000000000 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicineSafeUsageViewModel.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.android.mediproject.feature.medicine.precautions.item - -import androidx.lifecycle.viewModelScope -import com.android.mediproject.core.common.network.Dispatcher -import com.android.mediproject.core.common.network.MediDispatchers -import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.domain.GetDurUseCase -import com.android.mediproject.core.domain.GetElderlyCautionUseCase -import com.android.mediproject.core.model.remote.dur.DurItemDto -import com.android.mediproject.core.model.remote.elderlycaution.ElderlyCautionDto -import com.android.mediproject.core.ui.base.BaseViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -class MedicineSafeUsageViewModel @Inject constructor( - private val getElderlyCautionUseCase: GetElderlyCautionUseCase, - private val getDurUseCase: GetDurUseCase, - @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher -) : BaseViewModel() { - - private val _elderlyCaution = MutableStateFlow(null) - val elderlyCaution get() = _elderlyCaution.asStateFlow() - - - private val _dur = MutableStateFlow>(UiState.Loading) - - val dur get() = _dur.asStateFlow() - - - fun loadDur( - itemName: String?, itemSeq: String? - ) = viewModelScope.launch { - getDurUseCase.invoke(itemName, itemSeq).map { result -> - result.fold(onSuccess = { - _dur.value = UiState.Success(it) - }, onFailure = { - _dur.value = UiState.Error(it.message ?: "failed") - }) - } - } - - -} \ No newline at end of file diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicinePrecautionsItemFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/MedicinePrecautionsItemFragment.kt similarity index 90% rename from feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicinePrecautionsItemFragment.kt rename to feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/MedicinePrecautionsItemFragment.kt index 23cbf9c5a..b02a06a94 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/MedicinePrecautionsItemFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/MedicinePrecautionsItemFragment.kt @@ -1,17 +1,16 @@ -package com.android.mediproject.feature.medicine.precautions.item +package com.android.mediproject.feature.medicine.precautions.precautions import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import com.android.mediproject.core.common.viewmodel.UiState +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.medicine.databinding.FragmentMedicinePrecautionsItemBinding import com.android.mediproject.feature.medicine.main.MedicineInfoViewModel import com.android.mediproject.feature.medicine.precautions.host.MedicinePrecautionsViewModel -import com.android.mediproject.feature.medicine.precautions.item.precautions.PrecautionsListAdapter import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch -import repeatOnStarted /** * 의약품 사용 상 주의사항 Fragment @@ -45,4 +44,4 @@ class MedicinePrecautionsItemFragment : } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/precautions/PrecautionsListAdapter.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/PrecautionsListAdapter.kt similarity index 94% rename from feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/precautions/PrecautionsListAdapter.kt rename to feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/PrecautionsListAdapter.kt index e20fbe90d..592725724 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/item/precautions/PrecautionsListAdapter.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/precautions/precautions/PrecautionsListAdapter.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.feature.medicine.precautions.item.precautions +package com.android.mediproject.feature.medicine.precautions.precautions import android.text.Spanned import android.view.LayoutInflater @@ -36,4 +36,4 @@ object Diff : DiffUtil.ItemCallback() { override fun areContentsTheSame(oldItem: Spanned, newItem: Spanned): Boolean { return oldItem.contentEquals(newItem) } -} \ No newline at end of file +} diff --git a/feature/medicine/src/main/res/drawable/kids_ci.png b/feature/medicine/src/main/res/drawable/kids_ci.png new file mode 100644 index 000000000..7e7357e4c Binary files /dev/null and b/feature/medicine/src/main/res/drawable/kids_ci.png differ diff --git a/feature/medicine/src/main/res/layout/fragment_dur_info.xml b/feature/medicine/src/main/res/layout/fragment_dur_info.xml new file mode 100644 index 000000000..0c897ab58 --- /dev/null +++ b/feature/medicine/src/main/res/layout/fragment_dur_info.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/feature/medicine/src/main/res/layout/fragment_medicine_info.xml b/feature/medicine/src/main/res/layout/fragment_medicine_info.xml index bdabed3b0..3bcf9edd9 100644 --- a/feature/medicine/src/main/res/layout/fragment_medicine_info.xml +++ b/feature/medicine/src/main/res/layout/fragment_medicine_info.xml @@ -6,7 +6,7 @@ + type="com.android.mediproject.core.model.navargs.MedicineInfoArgs" /> + android:layout_height="match_parent"> + app:singleSelection="true"> + android:text="@string/precautions" /> + android:text="@string/safeUseOfMedicine" /> @@ -43,9 +38,8 @@ android:layout_height="0dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintTop_toBottomOf="@id/chipGroup" - /> + app:layout_constraintTop_toBottomOf="@id/chipGroup" /> - \ No newline at end of file + diff --git a/feature/medicine/src/main/res/layout/fragment_medicine_safe_use_item.xml b/feature/medicine/src/main/res/layout/fragment_medicine_safe_use_item.xml deleted file mode 100644 index b82341e7a..000000000 --- a/feature/medicine/src/main/res/layout/fragment_medicine_safe_use_item.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/feature/medicine/src/main/res/layout/item_view_combination_prohibition.xml b/feature/medicine/src/main/res/layout/item_view_combination_prohibition.xml deleted file mode 100644 index 5acf96530..000000000 --- a/feature/medicine/src/main/res/layout/item_view_combination_prohibition.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/feature/medicine/src/main/res/layout/item_view_dur_list.xml b/feature/medicine/src/main/res/layout/item_view_dur_list.xml new file mode 100644 index 000000000..0271941db --- /dev/null +++ b/feature/medicine/src/main/res/layout/item_view_dur_list.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/medicine/src/main/res/layout/item_view_dur_list_item.xml b/feature/medicine/src/main/res/layout/item_view_dur_list_item.xml new file mode 100644 index 000000000..ade8f2cad --- /dev/null +++ b/feature/medicine/src/main/res/layout/item_view_dur_list_item.xml @@ -0,0 +1,8 @@ + + diff --git a/feature/medicine/src/main/res/layout/item_view_safe_use_with_list.xml b/feature/medicine/src/main/res/layout/item_view_safe_use_with_list.xml deleted file mode 100644 index eda7bea22..000000000 --- a/feature/medicine/src/main/res/layout/item_view_safe_use_with_list.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/feature/medicine/src/main/res/layout/item_view_safe_use_without_list.xml b/feature/medicine/src/main/res/layout/item_view_safe_use_without_list.xml deleted file mode 100644 index bb6f2759c..000000000 --- a/feature/medicine/src/main/res/layout/item_view_safe_use_without_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/feature/medicine/src/main/res/values/strings.xml b/feature/medicine/src/main/res/values/strings.xml index 6c6428f77..8e465224e 100644 --- a/feature/medicine/src/main/res/values/strings.xml +++ b/feature/medicine/src/main/res/values/strings.xml @@ -9,16 +9,41 @@ 의약품 정보 식별 정보 + 의약품 적정 사용정보(DUR, Drug Utilization Review) + 부적절한 의약품 사용을 사전에 예방하고 국민건강을 보호하기 위하여, 의·약 전문가가 처방·조제 시 활용할 수 있도록 의약품의 안전하고 적절한 사용 + 기준을 항목별로 분류하여 체계적으로 개발한 정보입니다. + + 병용금기 + 두 가지 이상의 의약품을 함께 사용할 때 치료효과의 변화 또는 심각한 부작용 발생 등의 우려가 있어 동시에 사용하지 않아야 하는 의약품의 조합 + + 특정연령대금기 + 소아, 노인 등 특정한 연령대의 환자가 사용함에 있어 안전성이 확보되지 않았거나 심각한 부작용 발생 등의 우려가 있어 사용하지 않아야 하는 의약품 + + 임부금기 + 태아에게 매우 심각한 위해성(태아기형 또는 태아독성 등)을 유발하거나 유발할 가능성이 높아 임부에게 사용하는 것이 권장되지 않는 의약품 + 1등급 + 태아에 대한 위험성이 명확하여 의학적으로 불가피한 경우 이외에는 반드시 임부에게 투여를 피해야하는 의약품 + 2등급 + 태아에 대한 위해성이 나타날 수 있으므로 원칙적으로 사용금지. 다만, 임부에 대한 치료적 유익성이 위험성보다 더 높을 경우 신중하게 투여 가능한 의약품 + + 용량주의 + 성인에서 특정용량을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 용량 의존적 부작용 발생 가능성이 높아져 1일 최대용량에 대한 주의가 필요한 의약품 + + 투여기간주의 + 특정 투여기간을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 1회 최대 투여기간에 대한 주의가 필요한 의약품 + + 노인주의 + 노인에서 부작용 발생 빈도 증가 등의 우려가 있어 사용 시 주의가 필요한 의약품 + + 효능군중복 + 약리기전이 동일하거나 유사한 효능군 내에서 중복 투여될 때 추가적인 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 주의가 필요한 의약품 + + 분할주의 + 분할하여 복용할 경우 허가된 약효를 기대하기 어려운 의약품 + + 첨가제주의 + 특정 첨가제 성분(유당, 대두유, 카제인)의 주의가 필요한 의약품 - 두 가지 이상의 의약품을 함께 사용할 때 치료효과의 변화 또는 심각한 부작용 발생 등의 우려가 있어 동시에 사용하지 않아야 하는 의약품의 조합 - 소아, 노인 등 특정한 연령대의 환자가 사용함에 있어 안전성이 확보되지 않았거나 심각한 부작용 발생 등의 우려가 있어 사용하지 않아야 하는 의약품 - 태아에게 매우 심각한 위해성(태아기형 또는 태아독성 등)을 유발하거나 유발할 가능성이 높아 임부에게 사용하는 것이 권장되지 않는 의약품 - 성인에서 특정용량을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 용량 의존적 부작용 발생 가능성이 높아져 1일 최대용량에 대한 주의가 필요한 의약품 - 특정 투여기간을 초과하여 투여 시 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 1회 최대 투여기간에 대한 주의가 필요한 의약품 - 노인에서 부작용 발생 빈도 증가 등의 우려가 있어 사용 시 주의가 필요한 의약품 - 약리기전이 동일하거나 유사한 효능군 내에서 중복 투여될 때 추가적인 효과의 증가는 기대하기 어렵고 부작용 발생 가능성이 높아져 주의가 필요한 의약품 - 분할하여 복용할 경우 허가된 약효를 기대하기 어려운 의약품 - 특정 첨가제 성분(유당, 대두유, 카제인)의 주의가 필요한 의약품 이 약을 복용(사용)하는 동안 다음의 행위를 하지 말 것 @@ -31,6 +56,9 @@ 즐겨찾기 버튼 안전 사용 정보를 불러오는 중입니다 제공된 의약품 사진 없음 + • 건트라셋세미서방정\nTramadol+Acetaminophen\n\n12세 미만소아에서 생명에 치명적인 호흡 억제 및 사망 발생 + DUR 정보가 없어요 + DUR 정보를 불러오고 있어요 - \ No newline at end of file + diff --git a/feature/medicine/src/main/res/values/styles.xml b/feature/medicine/src/main/res/values/styles.xml index b80a2410c..2a8ce1eb6 100644 --- a/feature/medicine/src/main/res/values/styles.xml +++ b/feature/medicine/src/main/res/values/styles.xml @@ -6,4 +6,12 @@ 0dp 0dp - \ No newline at end of file + + + + diff --git a/feature/medicine/src/test/java/com/android/mediproject/feature/medicine/MListAdapterTest.kt b/feature/medicine/src/test/java/com/android/mediproject/feature/medicine/MListAdapterTest.kt new file mode 100644 index 000000000..98bfb0319 --- /dev/null +++ b/feature/medicine/src/test/java/com/android/mediproject/feature/medicine/MListAdapterTest.kt @@ -0,0 +1,21 @@ +package com.android.mediproject.feature.medicine + +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class MListAdapter { + + + @Before + fun setUp() { + + } + + @Test + fun mlistAdapter() { + + } +} diff --git a/feature/mypage/build.gradle.kts b/feature/mypage/build.gradle.kts index 74849ca9e..7b1678f10 100644 --- a/feature/mypage/build.gradle.kts +++ b/feature/mypage/build.gradle.kts @@ -7,12 +7,13 @@ plugins { android { namespace = "com.android.mediproject.feature.mypage" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) @@ -26,4 +27,4 @@ dependencies { implementation(libs.bundles.kotlins) implementation(libs.bundles.materials) implementation(libs.bundles.uiAndroidx) -} \ No newline at end of file +} diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt index 2ec7cad75..a4fc72359 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageFragment.kt @@ -9,17 +9,17 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager -import com.android.mediproject.core.common.uiutil.SystemBarStyler -import com.android.mediproject.core.model.comments.MyCommentDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState +import com.android.mediproject.core.common.util.SystemBarStyler +import com.android.mediproject.core.model.comments.MyComment +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState import com.android.mediproject.core.ui.R import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.mypage.databinding.FragmentMyPageBinding import com.android.mediproject.feature.mypage.mypagemore.MyPageMoreBottomSheetFragment import com.android.mediproject.feature.mypage.mypagemore.MyPageMoreDialogFragment import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -103,8 +103,8 @@ class MyPageFragment : addItemDecoration(MyPageMyCommentDecoraion(requireContext())) } - private fun isCommentListNotEmpty(commentList: List): Boolean { - return (commentList.size != 0) + private fun isCommentListNotEmpty(commentList: List): Boolean { + return (commentList.isNotEmpty()) } private fun handleToken(tokenState: TokenState) { @@ -273,7 +273,7 @@ class MyPageFragment : myCommentsListHeaderView.setExpandVisiblity(false) } - private fun showCommentList(myCommentList: List) = binding.apply { + private fun showCommentList(myCommentList: List) = binding.apply { setShowCommentListVisible() myCommentListAdapter.submitList(myCommentList) } diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentAdapter.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentAdapter.kt index f61663c63..b72680581 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentAdapter.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentAdapter.kt @@ -5,24 +5,24 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.comments.MyCommentDto +import com.android.mediproject.core.model.comments.MyComment import com.android.mediproject.feature.mypage.databinding.ItemMypageMycommentBinding class MyCommentListViewHolder(private val binding: ItemMypageMycommentBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(myCommentDto: MyCommentDto) { - binding.myCommentDto = myCommentDto + fun bind(myComment: MyComment) { + binding.myCommentDto = myComment } } -class MyPageMyCommentAdapter : ListAdapter(object : - DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: MyCommentDto, newItem: MyCommentDto): Boolean { +class MyPageMyCommentAdapter : ListAdapter(object : + DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: MyComment, newItem: MyComment): Boolean { return oldItem.commentId == newItem.commentId } - override fun areContentsTheSame(oldItem: MyCommentDto, newItem: MyCommentDto): Boolean { + override fun areContentsTheSame(oldItem: MyComment, newItem: MyComment): Boolean { return oldItem == newItem } }) { diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentDecoraion.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentDecoraion.kt index c48ecc71f..5b6ab8e4b 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentDecoraion.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageMyCommentDecoraion.kt @@ -4,19 +4,19 @@ import android.content.Context import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.common.uiutil.dpToPx +import com.android.mediproject.core.common.util.dpToPx -class MyPageMyCommentDecoraion(private val context : Context) : RecyclerView.ItemDecoration() { +class MyPageMyCommentDecoraion(private val context: Context) : RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, view: View, parent: RecyclerView, - state: RecyclerView.State + state: RecyclerView.State, ) { super.getItemOffsets(outRect, view, parent, state) //좌,상,우,하 - outRect.set(0, 0,0, dpToPx(context,10)) + outRect.set(0, 0, 0, 10.dpToPx()) } -} \ No newline at end of file +} diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt index c182d55ce..7ca6bc45d 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt @@ -1,15 +1,15 @@ package com.android.mediproject.feature.mypage -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetTokenUseCase import com.android.mediproject.core.domain.sign.SignUseCase import com.android.mediproject.core.domain.user.UserUseCase -import com.android.mediproject.core.model.comments.MyCommentDto -import com.android.mediproject.core.model.remote.token.CurrentTokens -import com.android.mediproject.core.model.remote.token.TokenState -import com.android.mediproject.core.model.user.UserDto +import com.android.mediproject.core.model.comments.MyComment +import com.android.mediproject.core.model.token.CurrentTokens +import com.android.mediproject.core.model.token.TokenState +import com.android.mediproject.core.model.user.User import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.channels.BufferOverflow @@ -52,12 +52,12 @@ class MyPageViewModel @Inject constructor( fun loadTokens() = viewModelScope.launch { getTokenUseCase().collect { _token.value = it } } - private val _user = MutableStateFlow(UserDto("기본값")) + private val _user = MutableStateFlow(User("기본값")) val user get() = _user.asStateFlow() fun loadUser() = viewModelScope.launch { userUseCase().collect { _user.value = it } } - private val _myCommentsList = MutableSharedFlow>( + private val _myCommentsList = MutableSharedFlow>( replay = 1, extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST, @@ -80,28 +80,28 @@ class MyPageViewModel @Inject constructor( fun signOut() = viewModelScope.launch { signUseCase.signOut() } val dummy = listOf( - MyCommentDto(20230528, "타이레놀", "아따 좋습니다 좋아요", System.currentTimeMillis().toString(), 3), - MyCommentDto( + MyComment(20230528, "타이레놀", "아따 좋습니다 좋아요", System.currentTimeMillis().toString(), 3), + MyComment( 20230529, "가나다라마바사", "이건 실제로 있는 약일까요?", System.currentTimeMillis().toString(), 0, ), - MyCommentDto( + MyComment( 20230530, "코메키나", "이건 가까운 약국에서 구할 수 있어요. 하여튼 구할 수 있어요.", System.currentTimeMillis().toString(), 2, ), - MyCommentDto( + MyComment( 20230528, "가나다라마바사", "이건 실제로 있는 약일까요?", System.currentTimeMillis().toString(), 0, ), - MyCommentDto(20230531, "아자차카", "이건 확실히 없을 것 같네요.", System.currentTimeMillis().toString(), 2), + MyComment(20230531, "아자차카", "이건 확실히 없을 것 같네요.", System.currentTimeMillis().toString(), 2), ) } diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetFragment.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetFragment.kt index 61423917b..e0d1e5e03 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetFragment.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetFragment.kt @@ -17,7 +17,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class MyPageMoreBottomSheetFragment(private val backCallback: () -> Unit) : diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetViewModel.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetViewModel.kt index b57586283..cf6d8dec2 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetViewModel.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreBottomSheetViewModel.kt @@ -1,8 +1,8 @@ package com.android.mediproject.feature.mypage.mypagemore -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogFragment.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogFragment.kt index 60bb1af7b..9ef39c26a 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogFragment.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogFragment.kt @@ -17,13 +17,12 @@ import androidx.core.os.bundleOf import androidx.fragment.app.DialogFragment import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels -import com.android.mediproject.core.ui.base.view.Subtitle import com.android.mediproject.core.ui.base.view.Subtitle.Companion.PASSWORD import com.android.mediproject.feature.mypage.R import com.android.mediproject.feature.mypage.databinding.FragmentMyPageMoreDialogBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class MyPageMoreDialogFragment(private val flag: DialogFlag) : DialogFragment() { diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogViewModel.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogViewModel.kt index 3dfd778a2..acc8da22a 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogViewModel.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/mypagemore/MyPageMoreDialogViewModel.kt @@ -1,9 +1,9 @@ package com.android.mediproject.feature.mypage.mypagemore -import MutableEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import android.text.Editable import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.util.isPasswordValid diff --git a/feature/mypage/src/main/res/layout/fragment_my_page.xml b/feature/mypage/src/main/res/layout/fragment_my_page.xml index 1c93dc033..8f4797024 100644 --- a/feature/mypage/src/main/res/layout/fragment_my_page.xml +++ b/feature/mypage/src/main/res/layout/fragment_my_page.xml @@ -11,7 +11,7 @@ + type="com.android.mediproject.core.model.user.User" /> + type="com.android.mediproject.core.model.comments.MyComment" /> - \ No newline at end of file + diff --git a/feature/news/build.gradle.kts b/feature/news/build.gradle.kts index 7471b9dfa..6d4a639e5 100644 --- a/feature/news/build.gradle.kts +++ b/feature/news/build.gradle.kts @@ -5,12 +5,13 @@ plugins { android { namespace = "com.android.mediproject.feature.news" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt index dbc7728b7..1a3d95b1a 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsFragment.kt @@ -1,12 +1,11 @@ package com.android.mediproject.feature.news -import android.content.Context import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels -import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.common.util.navArgs -import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs +import com.android.mediproject.core.model.navargs.RecallDisposalArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.news.databinding.FragmentNewsBinding import dagger.hilt.android.AndroidEntryPoint diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt index f6ba7084f..dc36fb3a3 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/NewsScreen.kt @@ -32,7 +32,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs +import com.android.mediproject.core.model.navargs.RecallDisposalArgs import com.android.mediproject.feature.news.adminaction.AdminActionScreen import com.android.mediproject.feature.news.adminaction.DetailAdminActionScreen import com.android.mediproject.feature.news.recallsuspension.DetailRecallDisposalScreen @@ -155,4 +155,4 @@ fun CustomFilterChip( disabledLabelColor = Color.Blue ), ) -} \ No newline at end of file +} diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionScreen.kt index 7fbe84f0e..c0bddf9eb 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionScreen.kt @@ -9,12 +9,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -28,7 +26,7 @@ import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemContentType import androidx.paging.compose.itemKey -import com.android.mediproject.core.model.remote.adminaction.AdminActionListItemDto +import com.android.mediproject.core.model.adminaction.AdminAction import com.android.mediproject.core.ui.compose.CenterProgressIndicator import java.time.format.DateTimeFormatter @@ -38,14 +36,15 @@ import java.time.format.DateTimeFormatter */ @Composable fun AdminActionScreen( - viewModel: AdminActionViewModel = hiltViewModel(), navController: NavController + viewModel: AdminActionViewModel = hiltViewModel(), navController: NavController, ) { val list = viewModel.adminActionList.collectAsLazyPagingItems() LazyColumn(modifier = Modifier.fillMaxWidth()) { items( - count = list.itemCount, key = list.itemKey(), contentType = list.itemContentType( - ) + count = list.itemCount, key = list.itemKey(), + contentType = list.itemContentType( + ), ) { index -> list[index]?.let { it.onClick = { @@ -75,27 +74,26 @@ fun AdminActionScreen( /** * 행정 처분 목록 아이템 */ -@OptIn(ExperimentalMaterial3Api::class) @Composable -fun ListItem(adminActionListItemDto: AdminActionListItemDto) { +fun ListItem(adminAction: AdminAction) { Surface( modifier = Modifier .fillMaxWidth() .padding(horizontal = 24.dp, vertical = 20.dp), shape = RectangleShape, onClick = { - adminActionListItemDto.onClick?.invoke() + adminAction.onClick?.invoke() }, ) { Column( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { Row( horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = CenterVertically, ) { Text( - text = adminActionListItemDto.entpName, + text = adminAction.entpName, style = MaterialTheme.typography.titleMedium, fontSize = 14.sp, color = Color.Black, @@ -103,10 +101,10 @@ fun ListItem(adminActionListItemDto: AdminActionListItemDto) { .align(CenterVertically) .weight(1f), overflow = TextOverflow.Ellipsis, - maxLines = 1 + maxLines = 1, ) Text( - text = adminActionListItemDto.lastSettleDate.format(dateFormat), + text = adminAction.lastSettleDate.format(dateFormat), fontSize = 12.sp, modifier = Modifier.align(CenterVertically), color = Color.Gray, @@ -115,14 +113,14 @@ fun ListItem(adminActionListItemDto: AdminActionListItemDto) { } Spacer(modifier = Modifier.height(8.dp)) Text( - text = adminActionListItemDto.violation, fontSize = 12.sp, color = Color.Gray, maxLines = 1 + text = adminAction.violation, fontSize = 12.sp, color = Color.Gray, maxLines = 1, ) Spacer(modifier = Modifier.height(4.dp)) Text( - text = adminActionListItemDto.disposition, fontSize = 12.sp, color = Color.Gray, maxLines = 1 + text = adminAction.disposition, fontSize = 12.sp, color = Color.Gray, maxLines = 1, ) } } } -private val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") \ No newline at end of file +private val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionViewModel.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionViewModel.kt index 8a90fa630..897e9e58a 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionViewModel.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/AdminActionViewModel.kt @@ -9,7 +9,7 @@ import androidx.paging.cachedIn import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.domain.GetAdminActionInfoUseCase -import com.android.mediproject.core.model.remote.adminaction.AdminActionListItemDto +import com.android.mediproject.core.model.adminaction.AdminAction import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -29,7 +29,7 @@ class AdminActionViewModel @Inject constructor( @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher, ) : BaseViewModel() { - private lateinit var _adminActionList: Flow> + private lateinit var _adminActionList: Flow> val adminActionList by lazy { _adminActionList } private val clickedItemPosition = MutableStateFlow(-1) @@ -47,38 +47,40 @@ class AdminActionViewModel @Inject constructor( clickedItemPosition.value = position } - private val _clickedItem = MutableStateFlow(null) + private val _clickedItem = MutableStateFlow(null) val clickedItem get() = _clickedItem.asStateFlow() fun getClickedItem() { viewModelScope.launch(defaultDispatcher) { adminActionList.collectLatest { - WeakReference(object : PagingDataDiffer( - differCallback = object : DifferCallback { - override fun onChanged(position: Int, count: Int) { + WeakReference( + object : PagingDataDiffer( + differCallback = object : DifferCallback { + override fun onChanged(position: Int, count: Int) { - } + } - override fun onInserted(position: Int, count: Int) { - } + override fun onInserted(position: Int, count: Int) { + } - override fun onRemoved(position: Int, count: Int) { - } + override fun onRemoved(position: Int, count: Int) { + } + }, + mainContext = defaultDispatcher, + cachedPagingData = it, + ) { + override suspend fun presentNewList( + previousList: NullPaddedList, + newList: NullPaddedList, + lastAccessedIndex: Int, + onListPresentable: () -> Unit, + ) = null }, - mainContext = defaultDispatcher, - cachedPagingData = it - ) { - override suspend fun presentNewList( - previousList: NullPaddedList, - newList: NullPaddedList, - lastAccessedIndex: Int, - onListPresentable: () -> Unit - ) = null - }).get()?.apply { + ).get()?.apply { _clickedItem.value = this[clickedItemPosition.value] } } } } -} \ No newline at end of file +} diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt index a57bfb7fe..dd10bb10b 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/adminaction/DetailAdminActionScreen.kt @@ -21,13 +21,14 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import com.android.mediproject.core.model.remote.adminaction.AdminActionListItemDto +import com.android.mediproject.core.model.adminaction.AdminAction import java.time.format.DateTimeFormatter @Preview @Composable fun DetailAdminActionScreen( - viewModel: AdminActionViewModel = hiltViewModel()) { + viewModel: AdminActionViewModel = hiltViewModel(), +) { viewModel.getClickedItem() val item = viewModel.clickedItem.collectAsState() @@ -37,7 +38,7 @@ fun DetailAdminActionScreen( } @Composable -fun Item(item: AdminActionListItemDto) { +fun Item(item: AdminAction) { Surface( modifier = Modifier .fillMaxWidth() @@ -53,39 +54,49 @@ fun Item(item: AdminActionListItemDto) { ) Spacer(Modifier.height(20.dp)) - Text(text = item.itemName, + Text( + text = item.itemName, fontSize = TextUnit(20f, type = TextUnitType.Sp), style = TextStyle(color = "#32649F".color), modifier = Modifier.align(Alignment.End), - textAlign = TextAlign.Right) + textAlign = TextAlign.Right, + ) Spacer(Modifier.height(20.dp)) - Text(text = item.lastSettleDate.format(DateTimeFormatter.ISO_LOCAL_DATE), + Text( + text = item.lastSettleDate.format(DateTimeFormatter.ISO_LOCAL_DATE), fontSize = TextUnit(14f, type = TextUnitType.Sp), style = TextStyle(color = "#595959".color), modifier = Modifier.align(Alignment.End), - textAlign = TextAlign.Right) + textAlign = TextAlign.Right, + ) Divider(Modifier.padding(top = 20.dp, bottom = 40.dp)) - Text(text = item.violation, + Text( + text = item.violation, fontSize = TextUnit(14f, type = TextUnitType.Sp), modifier = Modifier.padding(bottom = 8.dp), - color = "#3E3C3C".color) + color = "#3E3C3C".color, + ) - Text(text = item.disposition, + Text( + text = item.disposition, fontSize = TextUnit(14f, type = TextUnitType.Sp), modifier = Modifier.padding(bottom = 8.dp), - color = "#3E3C3C".color) + color = "#3E3C3C".color, + ) - Text(text = item.applyLaw, + Text( + text = item.applyLaw, fontSize = TextUnit(14f, type = TextUnitType.Sp), modifier = Modifier.padding(bottom = 8.dp), - color = "#3E3C3C".color) + color = "#3E3C3C".color, + ) } } } val String.color - get() = Color(android.graphics.Color.parseColor(this)) \ No newline at end of file + get() = Color(android.graphics.Color.parseColor(this)) diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/PenaltyListAdapter.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/PenaltyListAdapter.kt index 13b3f3120..9ae66daa0 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/PenaltyListAdapter.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/PenaltyListAdapter.kt @@ -4,25 +4,25 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto +import com.android.mediproject.core.model.recall.RecallSuspension import com.android.mediproject.core.ui.base.view.SimpleListItemView import com.android.mediproject.feature.news.R class PenaltyListAdapter : - ListAdapter( + ListAdapter( object : - DiffUtil.ItemCallback() { + DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: RecallSuspensionListItemDto, newItem: RecallSuspensionListItemDto, + oldItem: RecallSuspension, newItem: RecallSuspension, ): Boolean = oldItem == newItem override fun areContentsTheSame( - oldItem: RecallSuspensionListItemDto, newItem: RecallSuspensionListItemDto, + oldItem: RecallSuspension, newItem: RecallSuspension, ): Boolean = oldItem == newItem }, ) { - class PenaltyViewHolder(private val view: SimpleListItemView) : + class PenaltyViewHolder(private val view: SimpleListItemView) : RecyclerView.ViewHolder(view) { init { view.apply { @@ -37,7 +37,7 @@ class PenaltyListAdapter : } } - fun bind(data: RecallSuspensionListItemDto) { + fun bind(data: RecallSuspension) { view.apply { this.data = data setTitle(data.product) diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListFragment.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListFragment.kt index dc49b41bd..644b5576d 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListFragment.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListFragment.kt @@ -8,13 +8,13 @@ import com.android.mediproject.core.common.mapper.MedicineInfoMapper import com.android.mediproject.core.common.util.deepNavigate import com.android.mediproject.core.common.util.navigateByDeepLink import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.model.local.navargs.RecallDisposalArgs -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto +import com.android.mediproject.core.model.navargs.RecallDisposalArgs +import com.android.mediproject.core.model.recall.RecallSuspension import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.stateAsCollect import com.android.mediproject.feature.news.databinding.FragmentRecentPenaltyListBinding import dagger.hilt.android.AndroidEntryPoint -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -59,7 +59,7 @@ class RecentPenaltyListFragment : } } - private fun handleUiState(uiState: UiState>) { + private fun handleUiState(uiState: UiState>) { when (uiState) { is UiState.Error -> {} is UiState.Initial -> {} diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt index 944308dad..b26c06c20 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/penalties/recentpenaltylist/RecentPenaltyListViewModel.kt @@ -1,11 +1,11 @@ package com.android.mediproject.feature.news.penalties.recentpenaltylist -import MutableEventFlow import androidx.lifecycle.viewModelScope -import asEventFlow +import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.UiState +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetRecallSuspensionInfoUseCase -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto +import com.android.mediproject.core.model.recall.RecallSuspension import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -15,15 +15,19 @@ import javax.inject.Inject @HiltViewModel class RecentPenaltyListViewModel @Inject constructor( - private val getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase) : BaseViewModel() { + private val getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase, +) : BaseViewModel() { init { viewModelScope.launch { - getRecallSuspensionInfoUseCase.getRecentRecallDisposalList(numOfRows = 5).fold(onSuccess = { - _recallDisposalList.value = UiState.Success(it) - }, onFailure = { - _recallDisposalList.value = UiState.Error(it.message ?: "failed") - }) + getRecallSuspensionInfoUseCase.getRecentRecallDisposalList(numOfRows = 5).fold( + onSuccess = { + _recallDisposalList.value = UiState.Success(it) + }, + onFailure = { + _recallDisposalList.value = UiState.Error(it.message ?: "failed") + }, + ) } } @@ -38,6 +42,6 @@ class RecentPenaltyListViewModel @Inject constructor( object NavigateToNews : PenaltyListEvent() } - private val _recallDisposalList = MutableStateFlow>>(UiState.Initial) + private val _recallDisposalList = MutableStateFlow>>(UiState.Initial) val recallDisposalList get() = _recallDisposalList.asStateFlow() } diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionScreen.kt index 9a4124ed6..b9bd1026c 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionScreen.kt @@ -23,7 +23,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.android.mediproject.core.common.viewmodel.UiState -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionItemDto +import com.android.mediproject.core.model.recall.DetailRecallSuspension import com.android.mediproject.core.ui.compose.CenterProgressIndicator import com.android.mediproject.feature.news.adminaction.color import java.time.format.DateTimeFormatter @@ -31,7 +31,8 @@ import java.time.format.DateTimeFormatter @Preview @Composable fun DetailRecallDisposalScreen( - viewModel: DetailRecallSuspensionViewModel = hiltViewModel(), navController: NavController = rememberNavController()) { + viewModel: DetailRecallSuspensionViewModel = hiltViewModel(), navController: NavController = rememberNavController(), +) { val uiState = viewModel.detailRecallSuspension.collectAsState() @@ -55,7 +56,7 @@ fun DetailRecallDisposalScreen( // 회수 폐기 @Composable -fun Item(item: DetailRecallSuspensionItemDto) { +fun Item(item: DetailRecallSuspension) { Surface( modifier = Modifier .fillMaxWidth() @@ -72,27 +73,33 @@ fun Item(item: DetailRecallSuspensionItemDto) { ) Spacer(Modifier.height(20.dp)) - Text(text = item.enterprise, + Text( + text = item.enterprise, modifier = Modifier.align(Alignment.End), fontSize = TextUnit(16f, type = TextUnitType.Sp), style = TextStyle(color = "#32649F".color), - textAlign = TextAlign.Right) + textAlign = TextAlign.Right, + ) Spacer(Modifier.height(20.dp)) - Text(text = item.recallCommandDate.format(DateTimeFormatter.ISO_DATE), + Text( + text = item.recallCommandDate.format(DateTimeFormatter.ISO_DATE), fontSize = TextUnit(14f, type = TextUnitType.Sp), style = TextStyle(color = "#595959".color), modifier = Modifier.align(Alignment.End), - textAlign = TextAlign.Right) + textAlign = TextAlign.Right, + ) Divider(Modifier.padding(top = 20.dp, bottom = 40.dp)) - Text(text = item.reasonForRecall, + Text( + text = item.reasonForRecall, fontSize = TextUnit(14f, type = TextUnitType.Sp), modifier = Modifier.padding(bottom = 8.dp), - color = "#3E3C3C".color) + color = "#3E3C3C".color, + ) } } } -} \ No newline at end of file +} diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionViewModel.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionViewModel.kt index 07e9e7a54..d92c8a9f8 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionViewModel.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/DetailRecallSuspensionViewModel.kt @@ -6,7 +6,7 @@ import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.domain.GetRecallSuspensionInfoUseCase -import com.android.mediproject.core.model.remote.recall.DetailRecallSuspensionItemDto +import com.android.mediproject.core.model.recall.DetailRecallSuspension import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -20,10 +20,10 @@ import javax.inject.Inject class DetailRecallSuspensionViewModel @Inject constructor( private val getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase, private val savedStateHandle: SavedStateHandle, - @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher + @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : BaseViewModel() { - private val _detailRecallSuspension = MutableStateFlow>(UiState.Loading) + private val _detailRecallSuspension = MutableStateFlow>(UiState.Loading) val detailRecallSuspension get() = _detailRecallSuspension.asStateFlow() /** @@ -33,14 +33,17 @@ class DetailRecallSuspensionViewModel @Inject constructor( viewModelScope.launch(ioDispatcher) { val productName: String = checkNotNull(savedStateHandle["product"]) getRecallSuspensionInfoUseCase.getDetailRecallSuspension(product = productName, company = null).collectLatest { - _detailRecallSuspension.value = it.fold(onSuccess = { item -> - UiState.Success(item) - }, onFailure = { throwable -> - UiState.Error(throwable.message ?: "Failed to get detail recall suspension info") - }) + _detailRecallSuspension.value = it.fold( + onSuccess = { item -> + UiState.Success(item) + }, + onFailure = { throwable -> + UiState.Error(throwable.message ?: "Failed to get detail recall suspension info") + }, + ) } } } -} \ No newline at end of file +} diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionScreen.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionScreen.kt index d53de61de..9efe41aaa 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionScreen.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionScreen.kt @@ -10,12 +10,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable - import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -29,7 +27,7 @@ import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemContentType import androidx.paging.compose.itemKey -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto +import com.android.mediproject.core.model.recall.RecallSuspension import com.android.mediproject.core.ui.compose.CenterProgressIndicator import java.time.format.DateTimeFormatter @@ -45,7 +43,9 @@ fun RecallDisposalScreen( val list = viewModel.recallDisposalList.collectAsLazyPagingItems() LazyColumn( - modifier = Modifier.fillMaxWidth().fillMaxHeight(), + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), ) { items( count = list.itemCount, key = list.itemKey(), @@ -80,16 +80,17 @@ fun RecallDisposalScreen( /** * 회수 폐기 목록 아이템 * - * @param recallSuspensionListItemDto 회수 폐기 목록 아이템 + * @param recallSuspension 회수 폐기 목록 아이템 */ -@OptIn(ExperimentalMaterial3Api::class) @Composable -fun ListItem(recallSuspensionListItemDto: RecallSuspensionListItemDto) { +fun ListItem(recallSuspension: RecallSuspension) { Surface( - modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp, vertical = 20.dp), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 20.dp), shape = RectangleShape, onClick = { - recallSuspensionListItemDto.onClick?.invoke(recallSuspensionListItemDto) + recallSuspension.onClick?.invoke(recallSuspension) }, ) { Column( @@ -100,16 +101,18 @@ fun ListItem(recallSuspensionListItemDto: RecallSuspensionListItemDto) { verticalAlignment = CenterVertically, ) { Text( - text = recallSuspensionListItemDto.product, + text = recallSuspension.product, style = MaterialTheme.typography.titleMedium, fontSize = 14.sp, color = Color.Black, - modifier = Modifier.align(CenterVertically).weight(1f), + modifier = Modifier + .align(CenterVertically) + .weight(1f), overflow = TextOverflow.Ellipsis, maxLines = 1, ) Text( - text = recallSuspensionListItemDto.run { + text = recallSuspension.run { if (recallCommandDate != null) recallCommandDate else destructionOrderDate }!!.format(dateFormat), @@ -121,7 +124,7 @@ fun ListItem(recallSuspensionListItemDto: RecallSuspensionListItemDto) { } Spacer(modifier = Modifier.height(8.dp)) Text( - text = recallSuspensionListItemDto.reason, fontSize = 12.sp, color = Color.Gray, maxLines = 1, + text = recallSuspension.reason, fontSize = 12.sp, color = Color.Gray, maxLines = 1, ) } } diff --git a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionViewModel.kt b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionViewModel.kt index 3dfbcf208..a9f20fddd 100644 --- a/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionViewModel.kt +++ b/feature/news/src/main/java/com/android/mediproject/feature/news/recallsuspension/RecallSuspensionViewModel.kt @@ -6,7 +6,7 @@ import androidx.paging.cachedIn import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.domain.GetRecallSuspensionInfoUseCase -import com.android.mediproject.core.model.remote.recall.RecallSuspensionListItemDto +import com.android.mediproject.core.model.recall.RecallSuspension import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -18,10 +18,10 @@ import javax.inject.Inject @HiltViewModel class RecallSuspensionViewModel @Inject constructor( private val getRecallSuspensionInfoUseCase: GetRecallSuspensionInfoUseCase, - @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher + @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : BaseViewModel() { - private lateinit var _recallDisposalList: Flow> + private lateinit var _recallDisposalList: Flow> val recallDisposalList by lazy { _recallDisposalList } /** @@ -34,4 +34,4 @@ class RecallSuspensionViewModel @Inject constructor( } -} \ No newline at end of file +} diff --git a/feature/search/build.gradle.kts b/feature/search/build.gradle.kts index 5d44fb5df..80292557e 100644 --- a/feature/search/build.gradle.kts +++ b/feature/search/build.gradle.kts @@ -4,12 +4,13 @@ plugins { android { namespace = "com.android.mediproject.feature.search" -} -hilt { - enableAggregatingTask = true + hilt { + enableAggregatingTask = true + } } + dependencies { implementation(project(":core:ui")) implementation(project(":core:common")) diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt index 716e8abaa..070de643b 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt @@ -8,10 +8,11 @@ import androidx.navigation.NavOptions import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController -import com.android.mediproject.core.common.uiutil.SystemBarColorAnalyzer -import com.android.mediproject.core.common.uiutil.SystemBarController -import com.android.mediproject.core.common.uiutil.SystemBarStyler -import com.android.mediproject.core.common.uiutil.hideKeyboard +import com.android.mediproject.core.common.util.SystemBarColorAnalyzer +import com.android.mediproject.core.common.util.SystemBarController +import com.android.mediproject.core.common.util.SystemBarStyler +import com.android.mediproject.core.common.util.hideKeyboard +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.MediSearchbar import com.android.mediproject.feature.search.databinding.FragmentSearchMedicinesBinding @@ -19,7 +20,6 @@ import com.android.mediproject.feature.search.recentsearchlist.RecentSearchListF import com.android.mediproject.feature.search.recentsearchlist.RecentSearchListFragmentDirections import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest -import repeatOnStarted import javax.inject.Inject @AndroidEntryPoint @@ -43,7 +43,7 @@ class SearchMedicinesFragment : BaseFragment(requireContext()).apply { - layoutParams = FlexboxLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { - setMargins(horizontalSpace, 0, horizontalSpace, 0) - } - data = searchHistoryItemDto.query - setChipText(data.toString()) - setOnChipClickListener { - onClicked(searchHistoryItemDto.query) - } - }) + this.searchHistoryList.addView( + ButtonChip(requireContext()).apply { + layoutParams = FlexboxLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { + setMargins(horizontalSpace, 0, horizontalSpace, 0) + } + data = searchHistory.query + setChipText(data.toString()) + setOnChipClickListener { + onClicked(searchHistory.query) + } + }, + ) } } @@ -96,4 +98,4 @@ class RecentSearchListFragment : binding.headerView.setOnMoreClickListener {} } -} \ No newline at end of file +} diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/OpenMedicineInfo.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/OpenMedicineInfo.kt index 2918d9047..1a74b115b 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/OpenMedicineInfo.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/OpenMedicineInfo.kt @@ -1,7 +1,7 @@ package com.android.mediproject.feature.search.result -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.navargs.MedicineInfoArgs sealed class EventState { data class OpenMedicineInfo(val medicineInfoArgs: MedicineInfoArgs) : EventState() -} \ No newline at end of file +} diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiResultAdapter.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiResultAdapter.kt index 8111bd329..d052e9991 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiResultAdapter.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiResultAdapter.kt @@ -15,7 +15,7 @@ class AiResultAdapter : ListAdapter { +) : BaseViewModel(), ISendEvent { - val _classificationResult = MutableStateFlow>(emptyList()) + private val _classificationResult = MutableStateFlow>(emptyList()) val classificationResult = _classificationResult.asStateFlow() @@ -49,7 +49,7 @@ class AiSearchResultViewModel @Inject constructor( response.fold( onSuccess = { medicineDetailInfoList -> medicineDetailInfoList.mapIndexed { index, medicineDetailInfo -> - classificationList[index].medicineDetailInfo = medicineDetailInfo + classificationList[index].medicineDetail = medicineDetailInfo classificationList[index].onClick = ::send }.let { flowOf(UiState.Success(classificationList)) @@ -68,20 +68,20 @@ class AiSearchResultViewModel @Inject constructor( } } - override fun send(e: MedicineDetailInfo) { + override fun send(e: MedicineDetail) { viewModelScope.launch(defaultDispatcher) { _eventState.emit( EventState.OpenMedicineInfo( MedicineInfoArgs( entpKorName = e.entpName, - entpEngName = e.entpEnglishName ?: "", + entpEngName = e.entpEnglishName, itemIngrName = e.mainItemIngredient, itemKorName = e.itemName, itemEngName = e.itemEnglishName, itemSeq = e.itemSequence.toLong(), - productType = e.industryType ?: "", + productType = e.industryType, medicineType = e.etcOtcCode, - imgUrl = e.insertFileUrl ?: "", + imgUrl = e.insertFileUrl, ), ), ) diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ApprovedMedicinesAdapter.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ApprovedMedicinesAdapter.kt index cbd17349b..83959d79e 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ApprovedMedicinesAdapter.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ApprovedMedicinesAdapter.kt @@ -6,10 +6,10 @@ import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.android.mediproject.core.common.bindingadapter.GlideApp -import com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicineItemDto +import com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicine import com.android.mediproject.feature.search.databinding.ManualMedicineItemBinding -class ApprovedMedicinesAdapter : PagingDataAdapter(MedicineComparator) { +class ApprovedMedicinesAdapter : PagingDataAdapter(MedicineComparator) { class ViewHolder(val binding: ManualMedicineItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -21,7 +21,7 @@ class ApprovedMedicinesAdapter : PagingDataAdapter() { +object MedicineComparator : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: ApprovedMedicineItemDto, newItem: ApprovedMedicineItemDto + oldItem: ApprovedMedicine, newItem: ApprovedMedicine, ): Boolean { return oldItem.itemSeq == newItem.itemSeq } override fun areContentsTheSame( - oldItem: ApprovedMedicineItemDto, newItem: ApprovedMedicineItemDto + oldItem: ApprovedMedicine, newItem: ApprovedMedicine, ): Boolean { return oldItem == newItem } -} \ No newline at end of file +} diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt index 218740265..4a4f33784 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt @@ -10,7 +10,7 @@ import androidx.recyclerview.widget.DividerItemDecoration import com.android.mediproject.core.common.paging.setOnStateChangedListener import com.android.mediproject.core.common.util.deepNavigate import com.android.mediproject.core.model.constants.MedicationType -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.navargs.MedicineInfoArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.listfilter.MediPopupMenu import com.android.mediproject.feature.search.R @@ -20,7 +20,7 @@ import com.android.mediproject.feature.search.result.EventState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import repeatOnStarted +import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class ManualSearchResultFragment : @@ -61,7 +61,7 @@ class ManualSearchResultFragment : adapter = searchResultListAdapter } - filterBtn.setOnClickListener { it -> + filterBtn.setOnClickListener { MediPopupMenu.showMenu(it, R.menu.search_result_list_filter_menu) { menuItem -> when (menuItem.itemId) { diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt index 9c216bb83..7acedb371 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt @@ -1,17 +1,17 @@ package com.android.mediproject.feature.search.result.manual -import MutableEventFlow import androidx.lifecycle.viewModelScope import androidx.paging.cachedIn import androidx.paging.map -import asEventFlow import com.android.mediproject.core.common.bindingadapter.ISendEvent import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers +import com.android.mediproject.core.common.viewmodel.MutableEventFlow +import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetMedicineApprovalListUseCase import com.android.mediproject.core.model.constants.MedicationType -import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs -import com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicineItemDto +import com.android.mediproject.core.model.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicine import com.android.mediproject.core.model.requestparameters.ApprovalListSearchParameter import com.android.mediproject.core.ui.base.BaseViewModel import com.android.mediproject.feature.search.result.EventState @@ -20,6 +20,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -35,16 +36,15 @@ import javax.inject.Inject @HiltViewModel class ManualSearchResultViewModel @Inject constructor( private val getMedicineApprovalListUseCase: GetMedicineApprovalListUseCase, - @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher, -) : BaseViewModel(), ISendEvent { +) : BaseViewModel(), ISendEvent { private val _searchParameter = MutableStateFlow(ApprovalListSearchParameter(itemName = null, entpName = null, medicationType = MedicationType.ALL)) val searchParameter = _searchParameter.asStateFlow() val searchResultFlow = searchParameter.flatMapLatest { - getMedicineApprovalListUseCase(it).cachedIn(viewModelScope).mapLatest { pagingData -> + getMedicineApprovalListUseCase(it).cachedIn(viewModelScope).flowOn(defaultDispatcher).mapLatest { pagingData -> pagingData.map { item -> item.onClick = ::send item @@ -91,7 +91,7 @@ class ManualSearchResultViewModel @Inject constructor( } } - override fun send(e: ApprovedMedicineItemDto) { + override fun send(e: ApprovedMedicine) { viewModelScope.launch(defaultDispatcher) { _eventState.emit( EventState.OpenMedicineInfo( diff --git a/feature/search/src/main/res/layout/ai_medicine_item.xml b/feature/search/src/main/res/layout/ai_medicine_item.xml index e3e80d770..dc69b808f 100644 --- a/feature/search/src/main/res/layout/ai_medicine_item.xml +++ b/feature/search/src/main/res/layout/ai_medicine_item.xml @@ -24,7 +24,7 @@ android:clickable="true" android:contentDescription="@string/medicineImage" android:scaleType="fitCenter" - app:img="@{item.medicineDetailInfo.insertFileUrl}" + app:img="@{item.medicineDetail.insertFileUrl}" app:layout_constraintBottom_toTopOf="@id/inferedImageView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -75,7 +75,7 @@ android:layout_marginEnd="4dp" android:layout_marginBottom="4dp" android:ellipsize="end" - android:text="@{item.medicineDetailInfo.mainItemIngredient}" + android:text="@{item.medicineDetail.mainItemIngredient}" android:textColor="@android:color/darker_gray" android:textSize="12sp" android:textStyle="bold" @@ -89,7 +89,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="4dp" - android:text="@{item.medicineDetailInfo.itemEnglishName}" + android:text="@{item.medicineDetail.itemEnglishName}" android:textColor="@android:color/darker_gray" android:textSize="12sp" app:layout_constraintBottom_toTopOf="@+id/manufacturerTextView" @@ -100,7 +100,7 @@ android:id="@+id/manufacturerTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{item.medicineDetailInfo.entpName}" + android:text="@{item.medicineDetail.entpName}" android:textColor="@android:color/darker_gray" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" @@ -113,7 +113,7 @@ android:layout_height="wrap_content" android:background="@drawable/medicine_type_background" android:maxLines="1" - android:text="@{item.medicineDetailInfo.etcOtcCode}" + android:text="@{item.medicineDetail.etcOtcCode}" android:textColor="@color/medicineType" android:textSize="11sp" app:layout_constraintLeft_toRightOf="@id/medicineNameTextView" diff --git a/feature/search/src/main/res/layout/fragment_ai_search_result.xml b/feature/search/src/main/res/layout/fragment_ai_search_result.xml index 210d2c4d0..da660c014 100644 --- a/feature/search/src/main/res/layout/fragment_ai_search_result.xml +++ b/feature/search/src/main/res/layout/fragment_ai_search_result.xml @@ -19,7 +19,7 @@ android:layout_width="wrap_content" android:layout_height="24dp" android:layout_marginTop="24dp" - android:contentDescription="@string/appLogo" + android:contentDescription="@string/app_name" android:src="@drawable/medilenz_original_logo" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -58,4 +58,4 @@ app:layout_constraintTop_toBottomOf="@id/detectionedCountsTextView" /> - \ No newline at end of file + diff --git a/feature/search/src/main/res/layout/manual_medicine_item.xml b/feature/search/src/main/res/layout/manual_medicine_item.xml index 894b9d8a8..ebc45f99a 100644 --- a/feature/search/src/main/res/layout/manual_medicine_item.xml +++ b/feature/search/src/main/res/layout/manual_medicine_item.xml @@ -6,7 +6,7 @@ + type="com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicine" /> - \ No newline at end of file + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3eeb65ebd..634a053bd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ # kotlin kotlin = "1.8.22" kotlinCompilerExtension = "1.4.8" -kotlinxCoroutines = "1.7.2" +kotlinxCoroutines = "1.7.3" kotlinxSerializationJson = "1.5.0" kotlinxDateTime = "0.4.0" ksp = "1.8.22-1.0.11" @@ -337,7 +337,7 @@ workManagers = ["androidx-work-ktx"] testLocal = ["junit", "mockito-core", "mockito-kotlin", "kotlinx-coroutines-testImplementation", "robolectric"] testAndroid = ["androidx-test-espresso-core", "androidx-test-runner", "androidx-test-rules", "androidx-test-core", "androidx-test-ext-truth", - "androidx-test-core-ktx", "androidx-test-ext-junit", "androidx-test-ext-junit-ktx", "kotlinx-coroutines-testImplementation"] + "androidx-test-core-ktx", "androidx-test-ext-junit", "androidx-test-ext-junit-ktx"] tflite = ["tensorflow-lite-lite", "tensorflow-lite-playServicesTfliteGpu", "tensorflow-lite-taskVisionPlayServices", "tensorflow-lite-playServicesTfliteJava", "tensorflow-lite-gpuDelegate", "tensorflow-lite-metadata",