Skip to content

Commit 5f0d688

Browse files
committed
[feat]: GroupRepository 인터페이스 삭제 (#58)
1 parent 1f0aa1f commit 5f0d688

3 files changed

Lines changed: 327 additions & 40 deletions

File tree

Lines changed: 324 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,324 @@
1+
package com.texthip.thip.data.group.repository
2+
3+
import com.texthip.thip.R
4+
import com.texthip.thip.ui.group.myroom.mock.GroupBookData
5+
import com.texthip.thip.ui.group.myroom.mock.GroupCardData
6+
import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData
7+
import com.texthip.thip.ui.group.myroom.mock.GroupRoomData
8+
import com.texthip.thip.ui.group.myroom.mock.GroupRoomSectionData
9+
import kotlinx.coroutines.delay
10+
11+
// 그룹 데이터를 제공하는 Repository
12+
// 실제로는 서버의 API와 통신할 거라서 다 삭제하고 함수 구조만 유지한 채 수정하면 될 듯 합니다.
13+
14+
class GroupRepository {
15+
16+
private val genres = listOf("문학", "과학·IT", "사회과학", "인문학", "예술")
17+
private val roomDetailsCache = mutableMapOf<Int, GroupRoomData>()
18+
19+
suspend fun getUserName(): Result<String> {
20+
return try {
21+
Result.success("규빈") // 임시 이름
22+
} catch (e: Exception) {
23+
Result.failure(e)
24+
}
25+
}
26+
27+
suspend fun getMyGroups(): Result<List<GroupCardData>> {
28+
return try {
29+
delay(200)
30+
val myGroups = listOf(
31+
GroupCardData(23, "호르몬 체인지 완독하는 방", 22, R.drawable.bookcover_sample, 40, "uibowl1"),
32+
GroupCardData(24, "명작 읽기방", 10, R.drawable.bookcover_sample, 70, "joyce"),
33+
GroupCardData(25, "또 다른 방", 13, R.drawable.bookcover_sample, 10, "other")
34+
)
35+
Result.success(myGroups)
36+
} catch (e: Exception) {
37+
Result.failure(e)
38+
}
39+
}
40+
41+
suspend fun getRoomSections(): Result<List<GroupRoomSectionData>> {
42+
return try {
43+
44+
// 마감 임박한 독서 모임방
45+
val deadlineRooms = listOf(
46+
GroupCardItemRoomData(1, "시집만 읽는 사람들 3월", 22, 30, true, 3, R.drawable.bookcover_sample, 0),
47+
GroupCardItemRoomData(2, "일본 소설 좋아하는 사람들", 15, 20, true, 2, R.drawable.bookcover_sample, 0),
48+
GroupCardItemRoomData(3, "명작 같이 읽기방", 22, 30, true, 3, R.drawable.bookcover_sample, 0),
49+
GroupCardItemRoomData(4, "물리책 읽는 방", 13, 20, true, 1, R.drawable.bookcover_sample, 1),
50+
GroupCardItemRoomData(5, "코딩 과학 동아리", 12, 15, true, 5, R.drawable.bookcover_sample, 1),
51+
GroupCardItemRoomData(6, "사회과학 인문 탐구", 8, 12, true, 4, R.drawable.bookcover_sample, 2)
52+
)
53+
54+
// 인기 있는 독서 모임방
55+
val popularRooms = listOf(
56+
GroupCardItemRoomData(7, "베스트셀러 토론방", 28, 30, true, 7, R.drawable.bookcover_sample, 0),
57+
GroupCardItemRoomData(8, "인기 소설 완독방", 25, 25, false, 5, R.drawable.bookcover_sample, 0),
58+
GroupCardItemRoomData(9, "트렌드 과학서 읽기", 20, 25, true, 10, R.drawable.bookcover_sample, 1),
59+
GroupCardItemRoomData(10, "화제의 경영서", 18, 20, true, 8, R.drawable.bookcover_sample, 2),
60+
GroupCardItemRoomData(11, "인기 철학서 모임", 15, 18, true, 12, R.drawable.bookcover_sample, 3),
61+
GroupCardItemRoomData(12, "예술서 베스트", 12, 15, true, 6, R.drawable.bookcover_sample, 4)
62+
)
63+
64+
// 인플루언서, 작가 독서 모임방
65+
val influencerRooms = listOf(
66+
GroupCardItemRoomData(13, "작가와 함께하는 독서방", 30, 30, false, 14, R.drawable.bookcover_sample, 0),
67+
GroupCardItemRoomData(14, "유명 북튜버와 읽기", 18, 20, true, 8, R.drawable.bookcover_sample, 2),
68+
GroupCardItemRoomData(15, "작가 초청 인문학방", 15, 20, true, 12, R.drawable.bookcover_sample, 3),
69+
GroupCardItemRoomData(16, "인플루언서 과학책", 22, 25, true, 9, R.drawable.bookcover_sample, 1),
70+
GroupCardItemRoomData(17, "유명작가 예술론", 16, 18, true, 11, R.drawable.bookcover_sample, 4)
71+
)
72+
73+
val sections = listOf(
74+
GroupRoomSectionData(
75+
title = "마감 임박한 독서 모임방",
76+
rooms = deadlineRooms,
77+
genres = genres
78+
),
79+
GroupRoomSectionData(
80+
title = "인기 있는 독서 모임방",
81+
rooms = popularRooms,
82+
genres = genres
83+
),
84+
GroupRoomSectionData(
85+
title = "인플루언서·작가 독서 모임방",
86+
rooms = influencerRooms,
87+
genres = genres
88+
)
89+
)
90+
91+
// 상세 데이터 캐시에 저장
92+
(deadlineRooms + popularRooms + influencerRooms).forEach { room ->
93+
initializeRoomDetail(room)
94+
}
95+
96+
Result.success(sections)
97+
} catch (e: Exception) {
98+
Result.failure(e)
99+
}
100+
}
101+
102+
suspend fun getDoneGroups(): Result<List<GroupCardItemRoomData>> {
103+
return try {
104+
val doneGroups = listOf(
105+
GroupCardItemRoomData(18, "완료된 독서 모임방 1", 15, 20, false, null, R.drawable.bookcover_sample, 0),
106+
GroupCardItemRoomData(19, "완료된 독서 모임방 2", 25, 30, false, null, R.drawable.bookcover_sample, 1),
107+
GroupCardItemRoomData(20, "완료된 독서 모임방 3", 12, 15, false, null, R.drawable.bookcover_sample, 2),
108+
GroupCardItemRoomData(21, "호르몬 체인지 완독한 방", 22, 22, false, null, R.drawable.bookcover_sample, 0),
109+
GroupCardItemRoomData(22, "명작 읽기방 완료", 10, 10, false, null, R.drawable.bookcover_sample, 0)
110+
)
111+
112+
// 상세 데이터 캐시에 저장
113+
doneGroups.forEach { room ->
114+
initializeRoomDetail(room)
115+
}
116+
117+
Result.success(doneGroups)
118+
} catch (e: Exception) {
119+
Result.failure(e)
120+
}
121+
}
122+
123+
suspend fun getMyRoomGroups(): Result<List<GroupCardItemRoomData>> {
124+
return try {
125+
val myRoomGroups = listOf(
126+
GroupCardItemRoomData(23, "호르몬 체인지 완독하는 방", 22, 30, true, 5, R.drawable.bookcover_sample, 0),
127+
GroupCardItemRoomData(24, "명작 읽기방", 10, 20, true, 3, R.drawable.bookcover_sample, 0),
128+
GroupCardItemRoomData(25, "또 다른 방", 13, 25, false, 10, R.drawable.bookcover_sample, 1),
129+
GroupCardItemRoomData(26, "내가 참여한 과학책방", 18, 25, true, 7, R.drawable.bookcover_sample, 1),
130+
GroupCardItemRoomData(27, "인문학 토론방", 12, 20, true, 2, R.drawable.bookcover_sample, 3)
131+
)
132+
133+
// 상세 데이터 캐시에 저장
134+
myRoomGroups.forEach { room ->
135+
initializeRoomDetail(room)
136+
}
137+
138+
Result.success(myRoomGroups)
139+
} catch (e: Exception) {
140+
Result.failure(e)
141+
}
142+
}
143+
144+
suspend fun getSearchGroups(): Result<List<GroupCardItemRoomData>> {
145+
return try {
146+
// 기존에 로드된 섹션 데이터들을 합쳐서 반환
147+
val sectionsResult = getRoomSections()
148+
if (sectionsResult.isSuccess) {
149+
val allRooms = sectionsResult.getOrThrow().flatMap { it.rooms }
150+
Result.success(allRooms)
151+
} else {
152+
Result.failure(sectionsResult.exceptionOrNull() ?: Exception("Failed to load search groups"))
153+
}
154+
} catch (e: Exception) {
155+
Result.failure(e)
156+
}
157+
}
158+
159+
suspend fun getRoomDetail(roomId: Int): Result<GroupRoomData> {
160+
return try {
161+
delay(150)
162+
val roomDetail = roomDetailsCache[roomId]
163+
if (roomDetail != null) {
164+
Result.success(roomDetail)
165+
} else {
166+
Result.failure(Exception("Room not found: $roomId"))
167+
}
168+
} catch (e: Exception) {
169+
Result.failure(e)
170+
}
171+
}
172+
173+
suspend fun searchRooms(query: String): Result<List<GroupCardItemRoomData>> {
174+
return try {
175+
val searchResult = getSearchGroups()
176+
if (searchResult.isSuccess) {
177+
val filteredRooms = searchResult.getOrThrow().filter { room ->
178+
room.title.contains(query, ignoreCase = true)
179+
}
180+
Result.success(filteredRooms)
181+
} else {
182+
searchResult
183+
}
184+
} catch (e: Exception) {
185+
Result.failure(e)
186+
}
187+
}
188+
189+
suspend fun getGenres(): Result<List<String>> {
190+
return try {
191+
delay(50)
192+
Result.success(genres)
193+
} catch (e: Exception) {
194+
Result.failure(e)
195+
}
196+
}
197+
198+
199+
private fun initializeRoomDetail(room: GroupCardItemRoomData) {
200+
val bookData = GroupBookData(
201+
title = "심장보다 단단한 토마토 한 알",
202+
author = "고선지",
203+
publisher = "푸른출판사",
204+
description = "${room.title}에서 읽는 책입니다. 감동적인 이야기로 가득한 작품입니다.",
205+
imageRes = room.imageRes ?: R.drawable.bookcover_sample
206+
)
207+
208+
val recommendations = getRecommendations(room.id)
209+
210+
val roomDetail = GroupRoomData(
211+
id = room.id,
212+
title = room.title,
213+
isSecret = room.isSecret,
214+
description = "${room.title} 모임입니다. 함께 책을 읽고 토론해요.",
215+
startDate = "2025.01.12",
216+
endDate = "2025.02.12",
217+
members = room.participants,
218+
maxMembers = room.maxParticipants,
219+
daysLeft = room.endDate ?: 0,
220+
genre = genres[room.genreIndex],
221+
bookData = bookData,
222+
recommendations = recommendations
223+
)
224+
225+
roomDetailsCache[room.id] = roomDetail
226+
227+
// 추천 모임방들의 상세 정보도 캐시에 추가
228+
recommendations.forEach { recommendedRoom ->
229+
if (!roomDetailsCache.containsKey(recommendedRoom.id)) {
230+
initializeRecommendedRoomDetail(recommendedRoom)
231+
}
232+
}
233+
}
234+
235+
// 추천 모임방 예시 by gpt
236+
private fun initializeRecommendedRoomDetail(room: GroupCardItemRoomData) {
237+
val bookTitles = listOf(
238+
"데미안", "1984", "노인과 바다", "위대한 개츠비", "햄릿",
239+
"코스모스", "이기적 유전자", "블랙홀과 시간여행", "총균쇠",
240+
"국부론", "자본론", "사피엔스", "총균쇠", "정의란 무엇인가",
241+
"예술의 역사", "음악의 역사", "미학 오디세이"
242+
)
243+
244+
val authors = listOf(
245+
"헤르만 헤세", "조지 오웰", "어니스트 헤밍웨이", "스콧 피츠제럴드",
246+
"칼 세이건", "리처드 도킨스", "킵 손", "재레드 다이아몬드",
247+
"아담 스미스", "칼 마르크스", "유발 하라리", "마이클 샌델"
248+
)
249+
250+
val publishers = listOf("푸른출판사", "문학동네", "민음사", "창비", "열린책들", "김영사")
251+
252+
val bookData = GroupBookData(
253+
title = bookTitles.random(),
254+
author = authors.random(),
255+
publisher = publishers.random(),
256+
description = "${room.title}에서 읽는 흥미로운 책입니다. 함께 읽으며 깊이 있는 토론을 나눠보세요.",
257+
imageRes = room.imageRes ?: R.drawable.bookcover_sample
258+
)
259+
260+
val roomDetail = GroupRoomData(
261+
id = room.id,
262+
title = room.title,
263+
isSecret = room.isSecret,
264+
description = "${room.title} 모임입니다. 다양한 관점으로 책을 읽고 의견을 나눠보세요.",
265+
startDate = "2025.01.15",
266+
endDate = "2025.02.15",
267+
members = room.participants,
268+
maxMembers = room.maxParticipants,
269+
daysLeft = room.endDate ?: 0,
270+
genre = genres.getOrElse(room.genreIndex) { genres[0] },
271+
bookData = bookData,
272+
recommendations = getRecommendations(room.id) // 추천 모임방에도 추천 제공
273+
)
274+
275+
roomDetailsCache[room.id] = roomDetail
276+
}
277+
278+
private fun getRecommendations(roomId: Int): List<GroupCardItemRoomData> {
279+
// 추천 모임방 더미데이터 풀
280+
val recommendationPool = listOf(
281+
// 문학 관련 추천
282+
GroupCardItemRoomData(1001, "한국 근현대 소설 읽기", 18, 25, true, 3, R.drawable.bookcover_sample, 0),
283+
GroupCardItemRoomData(1002, "일본 문학 애호가들", 22, 30, true, 1, R.drawable.bookcover_sample, 0),
284+
GroupCardItemRoomData(1003, "시 읽기 모임", 16, 25, true, 2, R.drawable.bookcover_sample, 0),
285+
GroupCardItemRoomData(1004, "해외문학 번역서 읽기", 15, 22, true, 3, R.drawable.bookcover_sample, 0, true),
286+
GroupCardItemRoomData(1005, "고전 문학 탐구", 20, 25, true, 5, R.drawable.bookcover_sample, 0),
287+
288+
// 과학·IT 관련 추천
289+
GroupCardItemRoomData(1006, "SF 소설 탐험대", 12, 20, true, 7, R.drawable.bookcover_sample, 1),
290+
GroupCardItemRoomData(1007, "과학도서 함께 읽기", 7, 15, true, 9, R.drawable.bookcover_sample, 1),
291+
GroupCardItemRoomData(1008, "컴퓨터 과학 스터디", 14, 18, true, 4, R.drawable.bookcover_sample, 1),
292+
GroupCardItemRoomData(1009, "물리학 입문서 모임", 10, 16, true, 6, R.drawable.bookcover_sample, 1),
293+
294+
// 사회과학 관련 추천
295+
GroupCardItemRoomData(1010, "경제경영서 스터디", 9, 12, true, 6, R.drawable.bookcover_sample, 2),
296+
GroupCardItemRoomData(1011, "사회학 도서 토론", 13, 18, true, 4, R.drawable.bookcover_sample, 2),
297+
GroupCardItemRoomData(1012, "정치학 입문 모임", 11, 15, true, 8, R.drawable.bookcover_sample, 2),
298+
299+
// 인문학 관련 추천
300+
GroupCardItemRoomData(1013, "철학 에세이 읽기 모임", 8, 15, true, 5, R.drawable.bookcover_sample, 3),
301+
GroupCardItemRoomData(1014, "인문학 고전 읽기", 20, 25, true, 5, R.drawable.bookcover_sample, 3, true),
302+
GroupCardItemRoomData(1015, "심리학 도서 스터디", 10, 16, true, 7, R.drawable.bookcover_sample, 3),
303+
GroupCardItemRoomData(1016, "역사서 탐구 모임", 11, 16, true, 8, R.drawable.bookcover_sample, 3),
304+
305+
// 예술 관련 추천
306+
GroupCardItemRoomData(1017, "미술사 도서 읽기", 14, 20, true, 3, R.drawable.bookcover_sample, 4),
307+
GroupCardItemRoomData(1018, "음악 관련 서적 모임", 12, 18, true, 5, R.drawable.bookcover_sample, 4),
308+
309+
// 기타 장르
310+
GroupCardItemRoomData(1019, "로맨스 소설 감상회", 14, 20, true, 4, R.drawable.bookcover_sample, 0),
311+
GroupCardItemRoomData(1020, "미스터리 소설 동호회", 15, 18, true, 2, R.drawable.bookcover_sample, 0, true),
312+
GroupCardItemRoomData(1021, "자기계발서 함께 읽기", 25, 30, true, 3, R.drawable.bookcover_sample, 2, true),
313+
GroupCardItemRoomData(1022, "판타지 소설 동호회", 24, 30, true, 1, R.drawable.bookcover_sample, 0),
314+
GroupCardItemRoomData(1023, "여행 에세이 모임", 13, 18, true, 4, R.drawable.bookcover_sample, 3),
315+
GroupCardItemRoomData(1024, "추리소설 마니아", 19, 24, true, 6, R.drawable.bookcover_sample, 0)
316+
)
317+
318+
// 현재 방과 관련 없는 추천을 제공하기 위해 현재 roomId와 다른 것들만 필터링
319+
val filteredRecommendations = recommendationPool.filter { it.id != roomId }
320+
321+
// 랜덤하게 3-5개의 추천 반환
322+
return filteredRecommendations.shuffled().take(5)
323+
}
324+
}

app/src/main/java/com/texthip/thip/ui/group/data/repository/GroupRepository.kt

Lines changed: 0 additions & 36 deletions
This file was deleted.

app/src/main/java/com/texthip/thip/ui/group/data/viewmodel/GroupViewModel.kt renamed to app/src/main/java/com/texthip/thip/ui/group/viewmodel/GroupViewModel.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package com.texthip.thip.ui.group.data.viewmodel
1+
package com.texthip.thip.ui.group.viewmodel
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5-
import com.texthip.thip.ui.group.data.repository.GroupRepository
6-
import com.texthip.thip.ui.group.data.repository.GroupRepositoryImpl
5+
import com.texthip.thip.data.group.repository.GroupRepository
76
import com.texthip.thip.ui.group.myroom.mock.GroupCardData
87
import com.texthip.thip.ui.group.myroom.mock.GroupCardItemRoomData
98
import com.texthip.thip.ui.group.myroom.mock.GroupRoomSectionData
@@ -14,7 +13,7 @@ import kotlinx.coroutines.flow.asStateFlow
1413
import kotlinx.coroutines.launch
1514

1615
class GroupViewModel(
17-
private val repository: GroupRepository = GroupRepositoryImpl()
16+
private val repository: GroupRepository = GroupRepository()
1817
) : ViewModel() {
1918

2019
private val _myGroups = MutableStateFlow<List<GroupCardData>>(emptyList())

0 commit comments

Comments
 (0)