Skip to content

Commit e86fb0d

Browse files
authored
🔀 :: (#1) login to dev
로그인 UI & API
2 parents 5581e56 + 06e8838 commit e86fb0d

30 files changed

Lines changed: 539 additions & 14 deletions

app/build.gradle.kts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
plugins {
22
alias(libs.plugins.android.application)
33
alias(libs.plugins.kotlin.android)
4+
id("kotlin-kapt")
5+
alias(libs.plugins.hilt.android)
6+
id("org.jlleitschuh.gradle.ktlint") version "11.6.1"
47
}
58

69
android {
710
namespace = "kr.ac.anu.mumu"
8-
compileSdk = 35
11+
compileSdk = 36
912

1013
defaultConfig {
1114
applicationId = "kr.ac.anu.mumu"
12-
minSdk = 24
15+
minSdk = 26
1316
targetSdk = 35
1417
versionCode = 1
1518
versionName = "1.0"
@@ -33,6 +36,9 @@ android {
3336
kotlinOptions {
3437
jvmTarget = "11"
3538
}
39+
buildFeatures {
40+
viewBinding = true
41+
}
3642
}
3743

3844
dependencies {
@@ -45,4 +51,23 @@ dependencies {
4551
testImplementation(libs.junit)
4652
androidTestImplementation(libs.androidx.junit)
4753
androidTestImplementation(libs.androidx.espresso.core)
48-
}
54+
55+
// Retrofit & GSON
56+
implementation(libs.retrofit2)
57+
implementation(libs.converter.gson)
58+
59+
// Hilt
60+
implementation(libs.hilt.android)
61+
kapt(libs.hilt.android.compiler)
62+
63+
// Coroutines
64+
implementation(libs.kotlinx.coroutines.android)
65+
66+
// ViewModel & LifeCycle
67+
implementation(libs.androidx.lifecycle.viewmodel.ktx)
68+
implementation(libs.androidx.lifecycle.runtime.ktx)
69+
70+
// UI 확장
71+
implementation(libs.androidx.activity.ktx)
72+
implementation(libs.androidx.fragment.ktx)
73+
}

app/src/androidTest/java/kr/ac/anu/mumu/ExampleInstrumentedTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package kr.ac.anu.mumu
22

3-
import androidx.test.platform.app.InstrumentationRegistry
43
import androidx.test.ext.junit.runners.AndroidJUnit4
5-
4+
import androidx.test.platform.app.InstrumentationRegistry
5+
import org.junit.Assert.assertEquals
66
import org.junit.Test
77
import org.junit.runner.RunWith
88

9-
import org.junit.Assert.*
10-
119
/**
1210
* Instrumented test, which will execute on an Android device.
1311
*
@@ -21,4 +19,4 @@ class ExampleInstrumentedTest {
2119
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
2220
assertEquals("kr.ac.anu.mumu", appContext.packageName)
2321
}
24-
}
22+
}

app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5+
<uses-permission android:name="android.permission.INTERNET" />
6+
57
<application
8+
android:name=".MumuApplication"
9+
android:usesCleartextTraffic="true"
610
android:allowBackup="true"
711
android:dataExtractionRules="@xml/data_extraction_rules"
812
android:fullBackupContent="@xml/backup_rules"
@@ -13,14 +17,18 @@
1317
android:theme="@style/Theme.Mumu"
1418
tools:targetApi="31">
1519
<activity
16-
android:name=".presentation.main.MainActivity"
20+
android:name=".presentation.login.LoginActivity"
1721
android:exported="true">
1822
<intent-filter>
1923
<action android:name="android.intent.action.MAIN" />
2024

2125
<category android:name="android.intent.category.LAUNCHER" />
2226
</intent-filter>
2327
</activity>
28+
<activity
29+
android:name=".presentation.main.MainActivity"
30+
android:exported="false" />
2431
</application>
2532

33+
2634
</manifest>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package kr.ac.anu.mumu
2+
3+
import android.app.Application
4+
import dagger.hilt.android.HiltAndroidApp
5+
6+
@HiltAndroidApp
7+
class MumuApplication : Application()

app/src/main/java/kr/ac/anu/mumu/data/datasource/.gitkeep

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package kr.ac.anu.mumu.data.datasource
2+
3+
import kr.ac.anu.mumu.data.model.LoginRequest
4+
import kr.ac.anu.mumu.data.model.LoginResponse
5+
import retrofit2.Response
6+
import retrofit2.http.Body
7+
import retrofit2.http.POST
8+
9+
interface AuthService {
10+
@POST("/api/users/login")
11+
suspend fun login(@Body request: LoginRequest): Response<LoginResponse>
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package kr.ac.anu.mumu.data.model
2+
3+
import com.google.gson.annotations.SerializedName
4+
5+
data class LoginRequest(
6+
@SerializedName("id")
7+
val id: String,
8+
@SerializedName("password")
9+
val pw: String
10+
)
11+
12+
data class LoginResponse(
13+
val success: Boolean,
14+
val message: String,
15+
val token: String,
16+
val user: UserDto
17+
)
18+
19+
data class UserDto(
20+
@SerializedName("user_id")
21+
val userId: Int,
22+
val id: String,
23+
val name: String,
24+
val phone: String?,
25+
@SerializedName("profile_image")
26+
val profileImage: String?,
27+
val role: String
28+
)

app/src/main/java/kr/ac/anu/mumu/data/repository/.gitkeep

Whitespace-only changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package kr.ac.anu.mumu.data.repository
2+
3+
import kr.ac.anu.mumu.data.datasource.AuthService
4+
import kr.ac.anu.mumu.data.model.LoginRequest
5+
import kr.ac.anu.mumu.domain.model.User
6+
import kr.ac.anu.mumu.domain.repository.LoginRepository
7+
import javax.inject.Inject
8+
9+
class LoginRepositoryImpl @Inject constructor(
10+
private val authService: AuthService
11+
) : LoginRepository {
12+
13+
override suspend fun login(id: String, pw: String): Result<User> {
14+
return try {
15+
val response = authService.login(LoginRequest(id, pw))
16+
17+
if (response.isSuccessful && response.body() != null) {
18+
val result = response.body()!!
19+
20+
if (result.success) {
21+
val domainUser = User(
22+
name = result.user.name,
23+
token = result.token,
24+
profileImage = result.user.profileImage,
25+
role = result.user.role
26+
)
27+
Result.success(domainUser)
28+
} else {
29+
Result.failure(Exception(result.message))
30+
}
31+
} else {
32+
Result.failure(Exception("통신 오류 : ${response.code()}"))
33+
}
34+
} catch (e: Exception) {
35+
Result.failure(e)
36+
}
37+
}
38+
}

app/src/main/java/kr/ac/anu/mumu/di/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)