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
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Tiggle">
android:theme="@style/Theme.Tiggle"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
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.donation.DonationAccountDto
import com.ssafy.tiggle.data.model.donation.DonationHistoryDto
import com.ssafy.tiggle.data.model.donation.DonationRequestDto
import com.ssafy.tiggle.data.model.donation.DonationStatusDto
import com.ssafy.tiggle.data.model.donation.DonationSummaryDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

interface DonationApiService {
@GET("/api/donation/history")
suspend fun getDonationHistory(): Response<BaseResponse<List<DonationHistoryDto>>>

@GET("/api/donation/status/summary")
suspend fun getDonationSummary(): Response<BaseResponse<DonationSummaryDto>>

@GET("/api/donation/status")
suspend fun getMyDonationStatus(): Response<BaseResponse<DonationStatusDto>>

@GET("/api/donation/status/university")
suspend fun getUniversityDonationStatus(): Response<BaseResponse<DonationStatusDto>>

@GET("/api/donation/status/university/all")
suspend fun getAllUniversityDonationStatus(): Response<BaseResponse<DonationStatusDto>>

@GET("/api/donation")
suspend fun getDonationAccount(): Response<BaseResponse<DonationAccountDto>>

@POST("/api/donation")
suspend fun createDonation(@Body request: DonationRequestDto): Response<BaseResponse<EmptyResponse>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.ssafy.tiggle.data.model.donation

import kotlinx.serialization.Serializable

@Serializable
data class DonationAccountDto(
val accountName: String,
val accountNo: String,
val balance: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.ssafy.tiggle.data.model.donation

import kotlinx.serialization.Serializable

@Serializable
data class DonationHistoryDto(
val category: String,
val donatedAt: String,
val amount: Int,
val title: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ssafy.tiggle.data.model.donation

import kotlinx.serialization.Serializable

@Serializable
data class DonationRequestDto(
val category: String,
val amount: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ssafy.tiggle.data.model.donation

data class DonationStatusDto(
val planetAmount: Int,
val peopleAmount: Int,
val prosperityAmount: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.ssafy.tiggle.data.model.donation

data class DonationSummaryDto(
val totalAmount: Int,
val monthlyAmount: Int,
val categoryCnt: Int,
val universityRank: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package com.ssafy.tiggle.data.repository

import com.ssafy.tiggle.data.datasource.remote.DonationApiService
import com.ssafy.tiggle.data.model.donation.DonationRequestDto
import com.ssafy.tiggle.domain.entity.donation.DonationAccount
import com.ssafy.tiggle.domain.entity.donation.DonationCategory
import com.ssafy.tiggle.domain.entity.donation.DonationHistory
import com.ssafy.tiggle.domain.entity.donation.DonationRequest
import com.ssafy.tiggle.domain.entity.donation.DonationStatus
import com.ssafy.tiggle.domain.entity.donation.DonationStatusType
import com.ssafy.tiggle.domain.entity.donation.DonationSummary
import com.ssafy.tiggle.domain.repository.DonationRepository
import javax.inject.Inject

class DonationRepositoryImpl @Inject constructor(
private val donationApiService: DonationApiService
) : DonationRepository {

override suspend fun getDonationHistory(): Result<List<DonationHistory>> {
return try {
val response = donationApiService.getDonationHistory()
if (response.isSuccessful && response.body()?.result == true) {
val donationHistoryList = response.body()?.data?.map { dto ->
// 디버깅을 위한 로그 추가
println("DEBUG: API category = '${dto.category}'")
val category = DonationCategory.fromValue(dto.category)
println("DEBUG: Mapped category = ${category.name}")

DonationHistory(
category = category,
donatedAt = dto.donatedAt,
amount = dto.amount,
title = dto.title
)
} ?: emptyList()
Result.success(donationHistoryList)
} else {
Result.failure(Exception("Failed to fetch donation history"))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun getDonationSummary(): Result<DonationSummary> {
return try {
val response = donationApiService.getDonationSummary()
if (response.isSuccessful && response.body()?.result == true) {
val dto = response.body()?.data
dto?.let {
val summary = DonationSummary(
totalAmount = it.totalAmount,
monthlyAmount = it.monthlyAmount,
categoryCnt = it.categoryCnt,
universityRank = it.universityRank
)
Result.success(summary)
} ?: Result.failure(Exception("Failed to fetch donation summary"))
} else {
Result.failure(Exception("Failed to fetch donation summary"))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun getDonationStatus(type: DonationStatusType): Result<DonationStatus> {
return try {
val response = when (type) {
DonationStatusType.MY_DONATION -> donationApiService.getMyDonationStatus()
DonationStatusType.UNIVERSITY -> donationApiService.getUniversityDonationStatus()
DonationStatusType.ALL_UNIVERSITY -> donationApiService.getAllUniversityDonationStatus()
}

if (response.isSuccessful && response.body()?.result == true) {
val dto = response.body()?.data
dto?.let {
val status = DonationStatus(
planetAmount = it.planetAmount,
peopleAmount = it.peopleAmount,
prosperityAmount = it.prosperityAmount
)
Result.success(status)
} ?: Result.failure(Exception("Failed to fetch donation status"))
} else {
Result.failure(Exception("Failed to fetch donation status"))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun getDonationAccount(): Result<DonationAccount> {
return try {
val response = donationApiService.getDonationAccount()

if (response.isSuccessful && response.body()?.result == true) {
val dto = response.body()?.data
if (dto != null) {
Result.success(
DonationAccount(
accountName = dto.accountName,
accountNo = dto.accountNo,
balance = dto.balance
)
)
} else {
Result.failure(Exception("계좌 정보가 없습니다."))
}
} else {
Result.failure(Exception(response.body()?.message ?: "알 수 없는 오류가 발생했습니다."))
}
} catch (e: Exception) {
Result.failure(e)
}
}

override suspend fun createDonation(request: DonationRequest): Result<Unit> {
return try {
val dto = DonationRequestDto(
category = request.category.name,
amount = request.amount
)

val response = donationApiService.createDonation(dto)

if (response.isSuccessful && response.body()?.result == true) {
Result.success(Unit)
} else {
Result.failure(Exception(response.body()?.message ?: "기부 처리 중 오류가 발생했습니다."))
}
} catch (e: Exception) {
Result.failure(e)
}
}
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/ssafy/tiggle/di/NetworkModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.ssafy.tiggle.core.network.LoggingCookieJar
import com.ssafy.tiggle.core.network.PrettyHttpLoggingInterceptor
import com.ssafy.tiggle.data.datasource.local.AuthDataSource
import com.ssafy.tiggle.data.datasource.remote.AuthApiService
import com.ssafy.tiggle.data.datasource.remote.DonationApiService
import com.ssafy.tiggle.data.datasource.remote.DutchPayApiService
import com.ssafy.tiggle.data.datasource.remote.FcmApiService
import com.ssafy.tiggle.data.datasource.remote.PiggyBankApiService
Expand Down Expand Up @@ -142,4 +143,9 @@ object NetworkModule {
@Singleton
fun provideDutchPayApiService(retrofit: Retrofit): DutchPayApiService =
retrofit.create(DutchPayApiService::class.java)

@Provides
@Singleton
fun provideDonationApiService(retrofit: Retrofit): DonationApiService =
retrofit.create(DonationApiService::class.java)
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/ssafy/tiggle/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.ssafy.tiggle.di

import com.ssafy.tiggle.data.repository.AuthRepositoryImpl
import com.ssafy.tiggle.data.repository.DonationRepositoryImpl
import com.ssafy.tiggle.data.repository.DutchPayRepositoryImpl
import com.ssafy.tiggle.data.repository.FcmRepositoryImpl
import com.ssafy.tiggle.data.repository.PiggyBankRepositoryImpl
import com.ssafy.tiggle.data.repository.UniversityRepositoryImpl
import com.ssafy.tiggle.data.repository.UserRepositoryImpl
import com.ssafy.tiggle.domain.repository.AuthRepository
import com.ssafy.tiggle.domain.repository.DonationRepository
import com.ssafy.tiggle.domain.repository.DutchPayRepository
import com.ssafy.tiggle.domain.repository.FcmRepository
import com.ssafy.tiggle.domain.repository.PiggyBankRepository
Expand Down Expand Up @@ -61,4 +63,10 @@ abstract class RepositoryModule {
abstract fun bindDutchPayRepository(
dutchPayRepositoryImpl: DutchPayRepositoryImpl
): DutchPayRepository

@Binds
@Singleton
abstract fun bindDonationRepository(
donationRepositoryImpl: DonationRepositoryImpl
): DonationRepository
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ssafy.tiggle.domain.entity.donation

data class DonationAccount(
val accountName: String,
val accountNo: String,
val balance: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.ssafy.tiggle.domain.entity.donation

data class DonationHistory(
val category: DonationCategory,
val donatedAt: String,
val amount: Int,
val title: String
)

enum class DonationCategory(val value: String, val iconResName: String) {
PLANET("Planet", "planet"),
PEOPLE("People", "people"),
PROSPERITY("Prosperity", "prosperity");

companion object {
fun fromValue(value: String): DonationCategory {
return values().find { it.value == value } ?: PLANET
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.ssafy.tiggle.domain.entity.donation

data class DonationRequest(
val category: DonationCategory,
val amount: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ssafy.tiggle.domain.entity.donation

data class DonationStatus(
val planetAmount: Int,
val peopleAmount: Int,
val prosperityAmount: Int
)

enum class DonationStatusType {
MY_DONATION,
UNIVERSITY,
ALL_UNIVERSITY
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.ssafy.tiggle.domain.entity.donation

data class DonationSummary(
val totalAmount: Int,
val monthlyAmount: Int,
val categoryCnt: Int,
val universityRank: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ssafy.tiggle.domain.repository

import com.ssafy.tiggle.domain.entity.donation.DonationAccount
import com.ssafy.tiggle.domain.entity.donation.DonationHistory
import com.ssafy.tiggle.domain.entity.donation.DonationRequest
import com.ssafy.tiggle.domain.entity.donation.DonationStatus
import com.ssafy.tiggle.domain.entity.donation.DonationStatusType
import com.ssafy.tiggle.domain.entity.donation.DonationSummary

interface DonationRepository {
suspend fun getDonationHistory(): Result<List<DonationHistory>>
suspend fun getDonationSummary(): Result<DonationSummary>
suspend fun getDonationStatus(type: DonationStatusType): Result<DonationStatus>
suspend fun getDonationAccount(): Result<DonationAccount>
suspend fun createDonation(request: DonationRequest): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ssafy.tiggle.domain.usecase.donation

import com.ssafy.tiggle.domain.entity.donation.DonationRequest
import com.ssafy.tiggle.domain.repository.DonationRepository
import javax.inject.Inject

class CreateDonationUseCase @Inject constructor(
private val donationRepository: DonationRepository
) {
suspend operator fun invoke(request: DonationRequest): Result<Unit> {
return donationRepository.createDonation(request)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ssafy.tiggle.domain.usecase.donation

import com.ssafy.tiggle.domain.entity.donation.DonationAccount
import com.ssafy.tiggle.domain.repository.DonationRepository
import javax.inject.Inject

class GetDonationAccountUseCase @Inject constructor(
private val donationRepository: DonationRepository
) {
suspend operator fun invoke(): Result<DonationAccount> {
return donationRepository.getDonationAccount()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ssafy.tiggle.domain.usecase.donation

import com.ssafy.tiggle.domain.entity.donation.DonationHistory
import com.ssafy.tiggle.domain.repository.DonationRepository
import javax.inject.Inject

class GetDonationHistoryUseCase @Inject constructor(
private val donationRepository: DonationRepository
) {
suspend operator fun invoke(): Result<List<DonationHistory>> {
return donationRepository.getDonationHistory()
}
}
Loading