Skip to content

Commit 474d4a1

Browse files
authored
Merge pull request #341 from Runnect/feature/feat-my-draw-course-share-edit
[FEAT] 보관함 / 내가 그린 코스 수정, 삭제, 공유 기능 구현
2 parents d8dd161 + 22787ff commit 474d4a1

40 files changed

+1306
-836
lines changed

app/src/debug/AndroidManifest.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
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.READ_PRIVILEGED_PHONE_STATE"
5+
<uses-permission
6+
android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
67
tools:ignore="ProtectedPermissions" />
78

89
<application
910
android:name=".application.ApplicationClass"
10-
android:allowBackup="true"
11+
android:allowBackup="false"
1112
android:dataExtractionRules="@xml/data_extraction_rules"
1213
android:enableOnBackInvokedCallback="true"
13-
android:fullBackupContent="@xml/backup_rules"
14+
android:fullBackupContent="false"
1415
android:icon="@mipmap/ic_runnect_launcher"
1516
android:label="@string/app_name"
1617
android:roundIcon="@mipmap/ic_runnect_launcher_round"

app/src/main/AndroidManifest.xml

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
<application
1919
android:name=".application.ApplicationClass"
20-
android:allowBackup="true"
20+
android:allowBackup="false"
2121
android:dataExtractionRules="@xml/data_extraction_rules"
2222
android:enableOnBackInvokedCallback="true"
23-
android:fullBackupContent="@xml/backup_rules"
23+
android:fullBackupContent="false"
2424
android:icon="@mipmap/ic_runnect_launcher"
2525
android:label="@string/app_name"
2626
android:roundIcon="@mipmap/ic_runnect_launcher_round"
@@ -58,21 +58,43 @@
5858
android:scheme="@string/kakao_redirection_scheme" />
5959
</intent-filter>
6060
</activity>
61+
6162
<activity
6263
android:name=".presentation.login.LoginActivity"
6364
android:exported="false" />
65+
6466
<activity
65-
android:name=".presentation.mydrawdetail.MyDrawDetailActivity"
67+
android:name=".presentation.storage.mydrawdetail.MyDrawDetailActivity"
6668
android:exported="false" />
69+
70+
<activity
71+
android:name=".presentation.scheme.SchemeActivity"
72+
android:exported="true">
73+
74+
<intent-filter>
75+
<action android:name="android.intent.action.VIEW" />
76+
77+
<category android:name="android.intent.category.DEFAULT" />
78+
<category android:name="android.intent.category.BROWSABLE" />
79+
80+
<data
81+
android:host="rnnt.page.link"
82+
android:scheme="https" />
83+
</intent-filter>
84+
85+
</activity>
86+
6787
<activity
6888
android:name=".presentation.splash.SplashActivity"
6989
android:exported="true"
7090
android:theme="@style/SplashTheme">
91+
7192
<intent-filter>
7293
<action android:name="android.intent.action.MAIN" />
7394

7495
<category android:name="android.intent.category.LAUNCHER" />
7596
</intent-filter>
97+
7698
</activity>
7799
<activity
78100
android:name=".presentation.endrun.EndRunActivity"
@@ -111,19 +133,7 @@
111133
android:windowSoftInputMode="adjustResize" />
112134
<activity
113135
android:name=".presentation.detail.CourseDetailActivity"
114-
android:exported="true">
115-
<intent-filter>
116-
<action android:name="android.intent.action.VIEW" />
117-
118-
<category android:name="android.intent.category.DEFAULT" />
119-
<category android:name="android.intent.category.BROWSABLE" />
120-
121-
<data
122-
android:host="rnnt.page.link"
123-
android:scheme="https" />
124-
</intent-filter>
125-
</activity>
126-
136+
android:exported="false" />
127137
<activity
128138
android:name=".presentation.mypage.reward.MyRewardActivity"
129139
android:exported="false" />

app/src/main/java/com/runnect/runnect/application/ApplicationClass.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class ApplicationClass : Application() {
4545
!::appContext.isInitialized -> BuildConfig.RUNNECT_PROD_URL
4646
else -> {
4747
val mode = ApiMode.getCurrentApiMode(appContext)
48+
Timber.d("현재 서버: ${mode}")
4849
when (mode) {
4950
ApiMode.JAVA -> BuildConfig.RUNNECT_PROD_URL
5051
ApiMode.TEST -> BuildConfig.RUNNECT_DEV_URL
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.runnect.runnect.data.dto.request
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class RequestPatchMyDrawCourseTitle(
8+
@SerialName("title")
9+
val title: String
10+
)
Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,61 @@
11
package com.runnect.runnect.data.dto.response
22

3-
3+
import com.runnect.runnect.domain.entity.MyDrawCourseDetail
44
import kotlinx.serialization.SerialName
55
import kotlinx.serialization.Serializable
66

77
@Serializable
88
data class ResponseGetMyDrawDetail(
9-
@SerialName("data")
10-
val data: Data,
11-
@SerialName("message")
12-
val message: String,
13-
@SerialName("status")
14-
val status: Int,
15-
@SerialName("success")
16-
val success: Boolean,
9+
@SerialName("user")
10+
val user: User,
11+
@SerialName("course")
12+
val course: Course
1713
) {
1814
@Serializable
19-
data class Data(
20-
@SerialName("course")
21-
val course: Course,
22-
@SerialName("user")
23-
val user: User,
24-
) {
15+
data class User(
16+
@SerialName("userId")
17+
val id: Int,
18+
)
2519

20+
@Serializable
21+
data class Course(
22+
@SerialName("id")
23+
val id: Int,
24+
@SerialName("isNowUser")
25+
val isNowUser: Boolean,
26+
@SerialName("createdAt")
27+
val createdAt: String,
28+
@SerialName("path")
29+
val path: List<List<Double>>,
30+
@SerialName("distance")
31+
val distance: Float,
32+
@SerialName("image")
33+
val image: String,
34+
@SerialName("title")
35+
val title: String,
36+
@SerialName("departure")
37+
val departure: Departure,
38+
) {
2639
@Serializable
27-
data class User(
28-
@SerialName("userId")
29-
val id: Int,
40+
data class Departure(
41+
@SerialName("region")
42+
val region: String,
43+
@SerialName("city")
44+
val city: String,
45+
@SerialName("town")
46+
val town: String,
47+
@SerialName("name")
48+
val name: String?,
3049
)
31-
@Serializable
32-
data class Course(
33-
@SerialName("id")
34-
val id: Int,
35-
@SerialName("createdAt")
36-
val createdAt: String,
37-
@SerialName("path")
38-
val path: List<List<Double>>,
39-
@SerialName("distance")
40-
val distance: Float,
41-
@SerialName("image")
42-
val image: String,
43-
@SerialName("title")
44-
val title: String,
45-
@SerialName("departure")
46-
val departure: Departure,
47-
) {
48-
@Serializable
49-
data class Departure(
50-
@SerialName("region")
51-
val region: String,
52-
@SerialName("city")
53-
val city: String,
54-
@SerialName("town")
55-
val town: String,
56-
@SerialName("name")
57-
val name: String,
58-
)
59-
}
6050
}
51+
52+
fun toMyDrawCourseDetail() = MyDrawCourseDetail(
53+
title = course.title,
54+
imgUrl = course.image,
55+
isNowUser = course.isNowUser,
56+
distance = course.distance,
57+
courseId = course.id,
58+
path = course.path,
59+
departureName = course.departure.name
60+
)
6161
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.runnect.runnect.data.dto.response
2+
3+
import com.runnect.runnect.domain.entity.EditableMyDrawCourseDetail
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
data class ResponsePatchMyDrawCourseTitle(
9+
@SerialName("course")
10+
val course: Course
11+
) {
12+
@Serializable
13+
data class Course(
14+
@SerialName("id")
15+
val id: Int,
16+
@SerialName("title")
17+
val title: String
18+
)
19+
20+
fun toEditableMyDrawCourseDetail() = EditableMyDrawCourseDetail(
21+
title = course.title
22+
)
23+
}

app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.runnect.runnect.data.repository
22

3+
import com.runnect.runnect.data.dto.request.RequestPatchMyDrawCourseTitle
34
import com.runnect.runnect.domain.entity.CourseDetail
45
import com.runnect.runnect.data.dto.request.RequestPostCourseScrap
56
import com.runnect.runnect.data.dto.request.RequestPostRunningHistory
@@ -67,8 +68,15 @@ class CourseRepositoryImpl @Inject constructor(private val remoteCourseDataSourc
6768
return remoteCourseDataSource.deleteMyDrawCourse(deleteCourseList = deleteCourseList)
6869
}
6970

70-
override suspend fun getMyDrawDetail(courseId: Int): Response<ResponseGetMyDrawDetail> {
71-
return remoteCourseDataSource.getMyDrawDetail(courseId = courseId)
71+
override suspend fun getMyDrawDetail(courseId: Int) = runCatching {
72+
remoteCourseDataSource.getMyDrawDetail(courseId).data?.toMyDrawCourseDetail()
73+
}
74+
75+
override suspend fun patchMyDrawCourseTitle(
76+
courseId: Int,
77+
requestPatchMyDrawCourseTitle: RequestPatchMyDrawCourseTitle
78+
) = runCatching {
79+
remoteCourseDataSource.patchMyDrawCourseTitle(courseId, requestPatchMyDrawCourseTitle).data?.toEditableMyDrawCourseDetail()
7280
}
7381

7482
override suspend fun postRecord(request: RequestPostRunningHistory): Response<ResponsePostMyHistory> {

app/src/main/java/com/runnect/runnect/data/service/CourseService.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.runnect.runnect.data.service
22

3+
import com.runnect.runnect.data.dto.request.RequestPatchMyDrawCourseTitle
34
import com.runnect.runnect.data.dto.request.RequestPatchPublicCourse
45
import com.runnect.runnect.data.dto.request.RequestPostCourseScrap
56
import com.runnect.runnect.data.dto.request.RequestPostPublicCourse
@@ -12,6 +13,7 @@ import com.runnect.runnect.data.dto.response.ResponseGetDiscoverUploadCourse
1213
import com.runnect.runnect.data.dto.response.ResponseGetMyDrawCourse
1314
import com.runnect.runnect.data.dto.response.ResponseGetMyDrawDetail
1415
import com.runnect.runnect.data.dto.response.ResponseGetMyScrapCourse
16+
import com.runnect.runnect.data.dto.response.ResponsePatchMyDrawCourseTitle
1517
import com.runnect.runnect.data.dto.response.ResponsePatchPublicCourse
1618
import com.runnect.runnect.data.dto.response.ResponsePostDiscoverUpload
1719
import com.runnect.runnect.data.dto.response.ResponsePostMyDrawCourse
@@ -61,34 +63,39 @@ interface CourseService {
6163
@Body requestPatchPublicCourse: RequestPatchPublicCourse
6264
): BaseResponse<ResponsePatchPublicCourse>
6365

64-
// {id}와 같이 동적인 경로 변수가 없다면 @Path 생략 가능
65-
//내가 그린 코스 수정
6666
@PUT("/api/course")
6767
suspend fun deleteMyDrawCourse(
6868
@Body deleteCourseList: RequestPutMyDrawCourse
6969
): Response<ResponsePutMyDrawCourse>
7070

71-
//보관함 내가 그린 코스 가져오기
71+
// 보관함 내가 그린 코스 가져오기
7272
@GET("/api/course/user")
7373
suspend fun getDrawCourseList(): BaseResponse<ResponseGetMyDrawCourse>
7474

75-
//보관함 스크랩 코스 가져오기
75+
// 보관함 스크랩 코스 가져오기
7676
@GET("/api/scrap/user")
7777
suspend fun getScrapCourseList(): BaseResponse<ResponseGetMyScrapCourse>
7878

79-
//내가 그린 코스 Detail 가져오기
79+
// 내가 그린 코스 Detail 가져오기
8080
@GET("/api/course/detail/{courseId}")
8181
suspend fun getMyDrawDetail(
8282
@Path("courseId") courseId: Int,
83-
): Response<ResponseGetMyDrawDetail>
83+
): BaseResponse<ResponseGetMyDrawDetail>
8484

85-
//기록 업로드
85+
// 내가 그린 코스 제목 수정
86+
@PATCH("/api/course/{courseId}")
87+
suspend fun patchMyDrawCourseTitle(
88+
@Path("courseId") courseId: Int,
89+
@Body requestPatchMyDrawCourseTitle: RequestPatchMyDrawCourseTitle
90+
): BaseResponse<ResponsePatchMyDrawCourseTitle>
91+
92+
// 기록 업로드
8693
@POST("/api/record")
8794
suspend fun postRecord(
8895
@Body request: RequestPostRunningHistory
8996
): Response<ResponsePostMyHistory>
9097

91-
//코스 업로드
98+
// 코스 업로드
9299
@Multipart
93100
@POST("/api/course")
94101
suspend fun uploadCourse(

app/src/main/java/com/runnect/runnect/data/source/remote/RemoteCourseDataSource.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.runnect.runnect.data.source.remote
22

3+
import com.runnect.runnect.data.dto.request.RequestPatchMyDrawCourseTitle
34
import com.runnect.runnect.data.dto.request.RequestPatchPublicCourse
45
import com.runnect.runnect.data.dto.request.RequestPostCourseScrap
56
import com.runnect.runnect.data.dto.request.RequestPostPublicCourse
@@ -54,6 +55,11 @@ class RemoteCourseDataSource @Inject constructor(
5455

5556
suspend fun getMyDrawDetail(courseId: Int) = courseService.getMyDrawDetail(courseId)
5657

58+
suspend fun patchMyDrawCourseTitle(
59+
courseId: Int,
60+
requestPatchMyDrawCourseTitle: RequestPatchMyDrawCourseTitle
61+
) = courseService.patchMyDrawCourseTitle(courseId, requestPatchMyDrawCourseTitle)
62+
5763
suspend fun postRecord(request: RequestPostRunningHistory) = courseService.postRecord(request)
5864

5965
suspend fun uploadCourse(image: MultipartBody.Part, data: RequestBody) =

app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ sealed class DiscoverMultiViewItem(
66
data class MarathonCourse(
77
override val id: Int,
88
val courseId: Int,
9-
var title: String,
9+
val title: String,
1010
val image: String,
11-
var scrap: Boolean,
11+
val scrap: Boolean,
1212
val departure: String,
1313
) : DiscoverMultiViewItem(id)
1414

1515
data class RecommendCourse(
1616
override val id: Int,
1717
val courseId: Int,
18-
var title: String,
18+
val title: String,
1919
val image: String,
20-
var scrap: Boolean,
20+
val scrap: Boolean,
2121
val departure: String,
2222
) : DiscoverMultiViewItem(id)
2323
}

0 commit comments

Comments
 (0)