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+ }
0 commit comments