Skip to content

๐Ÿ”€ :: (#46) Mission Domain Network Setting #56

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e279711
:sparkles: :: checkout์ „ ์ž‘์—…๋ฌผ ์ปค๋ฐ‹
Chaejongin12 Jun 26, 2024
0255f53
:sparkles: :: add mission Repository
yeongun130 Jun 26, 2024
3169b3a
:sparkles: :: add mission UseCase
yeongun130 Jun 26, 2024
4f49e55
:sparkles: :: Mission Request ์ž‘์„ฑ
yeongun130 Jun 26, 2024
b634995
:sparkles: :: Mission Response ์ž‘์„ฑ
yeongun130 Jun 26, 2024
0b29e24
:sparkles: :: add enum class MissionStatus
yeongun130 Jun 26, 2024
a463492
:sparkles: :: Mission API ์ž‘์„ฑ
yeongun130 Jun 26, 2024
cba0c97
:sparkles: :: Mission DataSource ์ž‘์„ฑ
yeongun130 Jun 26, 2024
36c80a9
:sparkles: :: Mission NetworkModule์— ์ถ”๊ฐ€
yeongun130 Jun 26, 2024
190c8a6
:sparkles: :: Mission ViewModel ์ž‘์„ฑ
yeongun130 Jun 26, 2024
e0a9e2c
:sparkles: :: Event ์ž‘์„ฑ
yeongun130 Jun 26, 2024
e964979
:fire: :: delete .gitkeep
yeongun130 Jun 26, 2024
21b50d0
Merge branch 'develop' of https://github.com/Stack-Knowledge/Stack-Knโ€ฆ
yeongun130 Jun 26, 2024
6af450e
Merge branch 'develop' of https://github.com/Stack-Knowledge/Stack-Knโ€ฆ
yeongun130 Jun 26, 2024
ed06f71
Merge remote-tracking branch 'origin/feature/#46_mission_domain_netwoโ€ฆ
yeongun130 Jun 26, 2024
58804bd
Merge branch 'develop' of https://github.com/Stack-Knowledge/Stack-Knโ€ฆ
yeongun130 Jun 26, 2024
3a9619d
Merge branch 'develop' of https://github.com/Stack-Knowledge/Stack-Knโ€ฆ
yeongun130 Jun 26, 2024
7c47875
:memo: :: @Singleton ์ถ”๊ฐ€
yeongun130 Jun 26, 2024
5e33307
:sparkles: :: modify NetWorkModule
yeongun130 Jun 26, 2024
b2c11f9
:memo: :: modify import
yeongun130 Jun 26, 2024
967cd0c
:sparkles: :: Event, errorHandling ๊ฒฝ๋กœ ์ด๋™
yeongun130 Jun 26, 2024
bf30343
:fire: :: delete suspend
yeongun130 Jun 26, 2024
edb68e4
:sparkles: :: Success response data type
yeongun130 Jun 26, 2024
6e69f83
:fire: :: delete suspend
yeongun130 Jun 26, 2024
014e5e0
:fire: :: ๊ณต๋ฐฑ ์ œ๊ฑฐ
yeongun130 Jun 26, 2024
c911549
:memo: :: ์ปจ๋ฒค์…˜ ์ˆ˜์ •
yeongun130 Jun 26, 2024
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
59 changes: 59 additions & 0 deletions core/common/src/main/java/com/example/common/util/Event.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.example.common.util

sealed class Event<out T>(
val data: T? = null
) {

object Loading : Event<Nothing>()

/**
* ์„ฑ๊ณต
*/
class Success<T>(data: T? = null) : Event<T>(data = data)

/**
* 400๋ฒˆ ์š”์ฒญ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒฝ์šฐ
*/
object BadRequest : Event<Nothing>()

/**
* 401๋ฒˆ ๋น„์ธ์ฆ ์š”์ฒญ
*/
object Unauthorized : Event<Nothing>()

/**
* 403๋ฒˆ ๊ถŒํ•œ์ด ์—†์Œ
*/
object ForBidden : Event<Nothing>()

/**
* 404 ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
*/
object NotFound : Event<Nothing>()

/**
* 406 ๋งž๋Š” ๊ทœ๊ฒฉ์ด ์—†๋Š” ๊ฒฝ์šฐ
*/
object NotAcceptable : Event<Nothing>()

/**
* 408 ์š”์ฒญ์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ
*/
object TimeOut : Event<Nothing>()

/**
* 409 ๊ถŒํ•œ์ด ์—†์„ ๋•Œ
*/
object Conflict : Event<Nothing>()

/**
* 50X ์„œ๋ฒ„์—๋Ÿฌ
*/
object Server : Event<Nothing>()

/**
* ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ
*/
object UnKnown : Event<Nothing>()

}
67 changes: 67 additions & 0 deletions core/common/src/main/java/com/example/common/util/errorHandling.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.example.common.util

import android.util.Log
import com.example.common.exception.*

suspend fun <T> Throwable.errorHandling(
badRequestAction: suspend () -> Unit = {},
unauthorizedAction: suspend () -> Unit = {},
forBiddenAction: suspend () -> Unit = {},
notFoundAction: suspend () -> Unit = {},
notAcceptableAction: suspend () -> Unit = {},
timeOutAction: suspend () -> Unit = {},
conflictAction: suspend () -> Unit = {},
serverAction: suspend () -> Unit = {},
unknownAction: suspend () -> Unit = {},
): Event<T> =
when (this) {
is BadRequestException -> {
errorLog("BadRequestException", message)
badRequestAction()
Event.BadRequest
}
is UnauthorizedException, is NeedLoginException -> {
errorLog("UnauthorizedException", message)
unauthorizedAction()
Event.Unauthorized
}
is ForBiddenException -> {
errorLog("ForBiddenException", message)
forBiddenAction()
Event.ForBidden
}
is NotFoundException -> {
errorLog("NotFoundException", message)
notFoundAction()
Event.NotFound
}
is NotAcceptableException -> {
errorLog("NotAcceptableException", message)
notAcceptableAction()
Event.NotAcceptable
}
is TimeOutException -> {
errorLog("TimeOutException", message)
timeOutAction()
Event.TimeOut
}
is ConflictException -> {
errorLog("ConflictException", message)
conflictAction()
Event.Conflict
}
is ServerException -> {
errorLog("ServerException", message)
serverAction()
Event.Server
}
else -> {
errorLog("UnKnownException", message)
unknownAction()
Event.UnKnown
}
}

private fun errorLog(tag: String, msg: String?) {
Log.d("ErrorHandling-$tag", msg ?: "์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜")
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.stackknowledge.di

import com.stackknowledge.repository.mission.MissionRepository
import com.stackknowledge.repository.mission.MissionRepositoryImpl
import com.stackknowledge.repository.student.StudentRepository
import com.stackknowledge.repository.student.StudentRepositoryImpl
import dagger.Binds
Expand All @@ -10,6 +12,11 @@ import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
abstract fun bindMissionRepository(
missionRepositoryImpl: MissionRepositoryImpl
): MissionRepository

@Binds
abstract fun bindStudentRepository(
studentRepositoryImpl: StudentRepositoryImpl
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.stackknowledge.repository.mission

import kotlinx.coroutines.flow.Flow
import remote.request.mission.CreateMissionRequestModel
import remote.request.mission.DetailMissionRequestModel
import remote.response.mission.DetailMissionResponseModel
import remote.response.mission.MissionResponseModel

interface MissionRepository {
fun getMission(): Flow<MissionResponseModel>

fun detailMission(missionId: DetailMissionRequestModel): Flow<DetailMissionResponseModel>

fun createMission(body: CreateMissionRequestModel): Flow<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.stackknowledge.repository.mission

import com.stackknowledge.datasource.mission.MissionDataSource
import kotlinx.coroutines.flow.Flow
import remote.request.mission.CreateMissionRequestModel
import remote.request.mission.DetailMissionRequestModel
import remote.response.mission.DetailMissionResponseModel
import remote.response.mission.MissionResponseModel
import javax.inject.Inject

class MissionRepositoryImpl @Inject constructor(
private val missionDataSource: MissionDataSource
): MissionRepository {
override fun getMission(): Flow<MissionResponseModel> {
return missionDataSource.getMission()
}

override fun detailMission(missionId: DetailMissionRequestModel): Flow<DetailMissionResponseModel> {
return missionDataSource.detailMission(missionId = missionId)
}

override fun createMission(body: CreateMissionRequestModel): Flow<Unit> {
return missionDataSource.createMission(body = body)
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
package com.stackknowledge.repository.user

import com.stackknowledge.datasource.user.UserDataSource
import com.stackknowledge.dto.request.user.ApproveRequest
import com.stackknowledge.dto.request.user.ScoreRequest
import com.stackknowledge.dto.response.user.DetailSolveMissionResponse
import com.stackknowledge.dto.response.user.GetRequestSignUpTeacherResponse
import com.stackknowledge.dto.response.user.GetSolveMissionResponse
import com.stackknowledge.mapper.request.user.toDto
import com.stackknowledge.mapper.response.toModel
import com.stackknowledge.mapper.response.user.toModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import remote.request.user.ApproveRequestModel
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.stackknowledge.usecase.misson

import com.stackknowledge.repository.mission.MissionRepository
import remote.request.mission.CreateMissionRequestModel
import javax.inject.Inject

class CreateMissionUseCase @Inject constructor(
private val missionRepository: MissionRepository
) {
suspend operator fun invoke(body: CreateMissionRequestModel) = runCatching {
missionRepository.createMission(body = body)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.stackknowledge.usecase.misson

import com.stackknowledge.repository.mission.MissionRepository
import remote.request.mission.DetailMissionRequestModel
import javax.inject.Inject

class DetailMissionUseCase @Inject constructor(
private val missionRepository: MissionRepository
) {
suspend operator fun invoke(missionId: DetailMissionRequestModel) = runCatching {
missionRepository.detailMission(missionId = missionId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.stackknowledge.usecase.misson

import com.stackknowledge.repository.mission.MissionRepository
import javax.inject.Inject

class GetMissionUseCase @Inject constructor(
private val missionRepository: MissionRepository
) {
suspend operator fun invoke() = runCatching {
missionRepository.getMission()
}
}
1 change: 1 addition & 0 deletions core/model/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ plugins {
dependencies {
implementation(libs.kotlinx.datetime)
implementation(libs.retrofit.core)
implementation(libs.moshi)
}
7 changes: 7 additions & 0 deletions core/model/src/main/kotlin/enumdata/MissionStatus.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package enumdata

enum class MissionStatus {
CLOSED, // Mission์„ ํ’€ ์ˆ˜ ์—†๋Š” ์ƒํƒœ
OPENED, // Mission์„ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
AVAILABLE_OPEN, // Mission์„ ๋‚ด์ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
}
7 changes: 7 additions & 0 deletions core/model/src/main/kotlin/enumdatatype/MissionStatus.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package enumdatatype

enum class MissionStatus {
CLOSED,
OPENED,
AVAILABLE_OPEN,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package remote.request.mission

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class CreateMissionRequestModel(
@Json(name = "title") val title: String,
@Json(name = "content") val content: String,
@Json(name = "timeLimit") val timeLimit: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package remote.request.mission

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import java.util.UUID

@JsonClass(generateAdapter = true)
data class DetailMissionRequestModel(
@Json(name = "mission_id") val missionId: UUID,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ import okhttp3.MultipartBody

data class UploadProfileImageRequest(
val image: MultipartBody.Part
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package remote.response.mission

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class DetailMissionResponseModel(
@Json(name = "title") val title: String,
@Json(name = "content") val content: String,
@Json(name = "timeLimit") val timeLimit: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package remote.response.mission

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import enumdatatype.MissionStatus
import remote.user.UserModel
import java.util.UUID

@JsonClass(generateAdapter = true)
data class MissionResponseModel(
@Json(name = "body") val missions: MissionsModel,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package remote.response.mission

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import enumdatatype.MissionStatus
import remote.user.UserModel
import java.util.UUID

@JsonClass(generateAdapter = true)
data class MissionsModel(
@Json(name = "id") val id: UUID,
@Json(name = "title") val title: String,
@Json(name = "point") val point: Int,
@Json(name = "missionStatus") val missionStatus: MissionStatus,
@Json(name = "user") val user: UserModel,
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ package remote.response.student

data class UploadProfileImageResponse(
val fileName: String,
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ data class DetailSolveMissionResponseModel(
val solveId: UUID,
val title: String,
val solution: String,
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ data class GetRequestSignUpTeacherResponseModel(
val userId: UUID,
val name: String,
val createdAt: LocalDateTime,
)
)
Loading
Loading