Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@ package com.ssafy.tiggle.data.datasource.remote

import com.ssafy.tiggle.data.model.BaseResponse
import com.ssafy.tiggle.data.model.EmptyResponse
import com.ssafy.tiggle.data.model.piggybank.request.CreatePiggyBankRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.PrimaryAccountRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.SendSMSRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerificationCheckRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerificationRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerifySMSRequestDto
import com.ssafy.tiggle.data.model.piggybank.response.AccountHolderResponseDto
import com.ssafy.tiggle.data.model.piggybank.response.CreatePiggyBankResponseDto
import com.ssafy.tiggle.data.model.piggybank.response.VerificationCheckResponseDto
import com.ssafy.tiggle.data.model.piggybank.response.VerifySMSResponseDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
Expand All @@ -33,5 +38,19 @@ interface PiggyBankApiService {
suspend fun registerPrimaryAccount(
@Body body: PrimaryAccountRequestDto
): BaseResponse<EmptyResponse>

@POST("piggybank")
suspend fun createPiggyBank(
@Body body: CreatePiggyBankRequestDto
): BaseResponse<CreatePiggyBankResponseDto>

@POST("auth/sms/send")
suspend fun sendSMS(
@Body body: SendSMSRequestDto
): BaseResponse<Unit>

@POST("auth/sms/verify")
suspend fun verifySMS(
@Body body: VerifySMSRequestDto
): BaseResponse<VerifySMSResponseDto>
}
//0888315782686732
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ssafy.tiggle.data.model.piggybank.request

data class CreatePiggyBankRequestDto(
val name: String = "",
val targetAmount: Long = 0L,
val esgCategoryId: Int = 1
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.ssafy.tiggle.data.model.piggybank.request

data class SendSMSRequestDto(
val phone: String = "",
val purpose: String = "",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ssafy.tiggle.data.model.piggybank.request

data class VerifySMSRequestDto(
val phone: String = "",
val code: String = "",
val purpose: String = ""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ssafy.tiggle.data.model.piggybank.response

data class CreatePiggyBankResponseDto(
val name: String = "",
val currentAmount: Long = 0L,
val lastWeekSavedAmount: Int = 0
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.ssafy.tiggle.data.model.piggybank.response

data class VerifySMSResponseDto(
val match: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package com.ssafy.tiggle.data.repository

import com.ssafy.tiggle.data.datasource.remote.PiggyBankApiService
import com.ssafy.tiggle.data.model.piggybank.request.CreatePiggyBankRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.PrimaryAccountRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.SendSMSRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerificationCheckRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerificationRequestDto
import com.ssafy.tiggle.data.model.piggybank.request.VerifySMSRequestDto
import com.ssafy.tiggle.data.model.piggybank.response.VerifySMSResponseDto
import com.ssafy.tiggle.data.model.piggybank.response.toDomain
import com.ssafy.tiggle.domain.entity.piggybank.AccountHolder
import com.ssafy.tiggle.domain.repository.PiggyBankRepository
Expand Down Expand Up @@ -87,4 +91,60 @@ class PiggyBankRepositoryImpl @Inject constructor(
}
}

override suspend fun createPiggyBank(
name: String,
targetAmount: Long,
esgCategoryId: Int
): Result<Unit> {
return try {
val res = piggyBankApiService.createPiggyBank(
CreatePiggyBankRequestDto(name, targetAmount, esgCategoryId)
)
if (res.result && res.data != null) {
Result.success(Unit)
} else {
Result.failure(Exception(res.message ?: "계좌 정보 보내기에 실패했습니다."))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun sendSMS(
phone: String,
purpose: String
): Result<Unit> {
return try {
val res = piggyBankApiService.sendSMS(
SendSMSRequestDto(phone, purpose)
)
if (res.result && res.data != null) {
Result.success(Unit)
} else {
Result.failure(Exception(res.message ?: "인증번호 발송 요청을 보내기에 실패했습니다."))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun verifySMS(
phone: String,
code: String,
purpose: String
): Result<VerifySMSResponseDto> {
return try {
val res = piggyBankApiService.verifySMS(
VerifySMSRequestDto(phone, code, purpose)
)
if (res.result && res.data != null) {
Result.success(res.data)
} else {
Result.failure(Exception(res.message ?: "인증 코드 검증에 실패했습니다."))
}
} catch (e: Exception) {
Result.failure(e)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ package com.ssafy.tiggle.domain.entity.piggybank


data class OpenAccount(
val targetDonationAmount: Int = 0,
val targetDonationAmount: Long = 0L,
val piggyBankName: String = "",
val certificateCode: Int = 0,
val certificateCode: String = "",
val phoneNum: String = "",
val attemptsLeft: Int = 3,

val amountError: String? = null,
val piggyBankNameError: String? = null,
val codeError: String? = null,
val phoneNumError: String? = null
) {
/**
* 목표 금액 유효성 검사
Expand Down Expand Up @@ -45,14 +48,24 @@ data class OpenAccount(
}
}

fun validatePhoneNum(input: String): String? {
return when {
input.isBlank() -> "휴대폰 번호를 입력해주세요."
!input.matches(Regex("^[0-9]+$")) -> "숫자만 입력할 수 있습니다."
input.length != 11 -> "휴대폰 번호는 11자리여야 합니다."
else -> null
}
}

/**
* 전체 유효성 검사를 수행하고 에러가 포함된 새로운 인스턴스 반환
*/
fun withValidation(): OpenAccount {
return this.copy(
amountError = validateTargetDonationAmount(targetDonationAmount.toString()),
piggyBankNameError = validatePiggyBankName(),
codeError = validateCode(certificateCode.toString())
codeError = validateCode(certificateCode.toString()),
phoneNumError = validatePhoneNum(phoneNum)
)
}

Expand All @@ -69,7 +82,10 @@ data class OpenAccount(

ValidationField.ACCOUNTNAME -> copy(piggyBankNameError = validatePiggyBankName())
ValidationField.CODE ->
copy(codeError = validateCode(certificateCode.toString()))
copy(codeError = validateCode(certificateCode))

ValidationField.PHONE ->
copy(phoneNumError = validatePhoneNum(phoneNum))
}
}

Expand All @@ -78,5 +94,6 @@ data class OpenAccount(
enum class ValidationField {
AMOUNT,
ACCOUNTNAME,
CODE
CODE,
PHONE
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.ssafy.tiggle.domain.repository

import com.ssafy.tiggle.data.model.piggybank.response.VerifySMSResponseDto
import com.ssafy.tiggle.domain.entity.piggybank.AccountHolder

interface PiggyBankRepository {
Expand All @@ -10,4 +11,8 @@ interface PiggyBankRepository {
accountNo: String,
verificationToken: String
): Result<Unit>

suspend fun createPiggyBank(name: String, targetAmount: Long, esgCategoryId: Int): Result<Unit>
suspend fun sendSMS(phone: String, purpose: String): Result<Unit>
suspend fun verifySMS(phone: String, code: String, purpose: String): Result<VerifySMSResponseDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ssafy.tiggle.domain.usecase.piggybank

import com.ssafy.tiggle.domain.repository.PiggyBankRepository
import javax.inject.Inject

class CreatePiggyBankUseCase @Inject constructor(
private val repository: PiggyBankRepository
) {
suspend operator fun invoke(
name: String,
targetAmount: Long,
esgCategoryId: Int
): Result<Unit> {
return repository.createPiggyBank(name, targetAmount, esgCategoryId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,8 @@ data class PiggyBankUseCases @Inject constructor(
val getAccountHolderUseCase: GetAccountHolderUseCase,
val requestOneWonVerificationUseCase: RequestOneWonVerificationUseCase,
val requestOneWonCheckVerificationUseCase: RequestOneWonCheckVerificationUseCase,
val registerPrimaryAccountUseCase: RegisterPrimaryAccountUseCase
val registerPrimaryAccountUseCase: RegisterPrimaryAccountUseCase,
val createPiggyBankUseCase: CreatePiggyBankUseCase,
val sendSMSUseCase: SendSMSUseCase,
val verifySMSUseCase: VerifySMSUseCase
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ssafy.tiggle.domain.usecase.piggybank

import com.ssafy.tiggle.domain.repository.PiggyBankRepository
import javax.inject.Inject

class SendSMSUseCase @Inject constructor(
private val repository: PiggyBankRepository
) {
suspend operator fun invoke(
phone: String,
purpose: String
): Result<Unit> {
return repository.sendSMS(phone, purpose)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ssafy.tiggle.domain.usecase.piggybank

import com.ssafy.tiggle.data.model.piggybank.response.VerifySMSResponseDto
import com.ssafy.tiggle.domain.repository.PiggyBankRepository
import javax.inject.Inject

class VerifySMSUseCase @Inject constructor(
val repository: PiggyBankRepository
) {
suspend operator fun invoke(phone: String, code: String, purpose: String): Result<VerifySMSResponseDto> {
return repository.verifySMS(phone, code, purpose)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ fun NavigationGraph() {
}

is Screen.OpenAccount -> NavEntry(key) {
OpenAccountScreen()
OpenAccountScreen(
onBackClick = { navBackStack.removeLastOrNull() },
onFinish = {
navBackStack.removeLastOrNull()
}
)
}

is Screen.RegisterAccount -> NavEntry(key) {
Expand Down
Loading