1- # src/fortune/repository.py
21from datetime import date
32from typing import List , Optional , Tuple
3+
44from fastapi import Depends
55from sqlalchemy import select , desc , and_
66from sqlalchemy .ext .asyncio import AsyncSession
7+
78from src .common .dependencies import get_db_session
8- from src .fortune .entities .models import UserDailyFortuneSummary as UserDailyFortuneSummaryModel , DailyFortuneResource as DailyFortuneResourceModel
99from src .fortune .entities .enums import FortuneType
10+ from src .fortune .entities .models import (
11+ UserDailyFortuneSummary as UserDailyFortuneSummaryModel ,
12+ DailyFortuneResource as DailyFortuneResourceModel ,
13+ UserDailyFortuneDetail as UserDailyFortuneDetailModel ,
14+ )
1015from src .fortune .entities .schemas import UserDailyFortuneSummary
1116
1217
@@ -19,7 +24,7 @@ async def create_fortune(
1924 publish_date : date ,
2025 fortune_type : FortuneType ,
2126 image_url : str ,
22- description : str
27+ description : str ,
2328 ) -> DailyFortuneResourceModel :
2429 model = DailyFortuneResourceModel (
2530 publish_date = publish_date ,
@@ -28,7 +33,7 @@ async def create_fortune(
2833 description = description ,
2934 )
3035 self .session .add (model )
31- await self .session .commit ()
36+ await self .session .flush ()
3237 await self .session .refresh (model )
3338 return model # DB 모델 반환
3439
@@ -38,7 +43,7 @@ async def update_fortune(
3843 publish_date : Optional [date ],
3944 fortune_type : Optional [FortuneType ],
4045 image_url : Optional [str ],
41- description : Optional [str ]
46+ description : Optional [str ],
4247 ) -> DailyFortuneResourceModel :
4348 model = await self .get_fortune_by_id (resource_id )
4449 if not model :
@@ -53,7 +58,7 @@ async def update_fortune(
5358 if description is not None :
5459 model .description = description
5560
56- await self .session .commit ()
61+ await self .session .flush ()
5762 await self .session .refresh (model )
5863 return model
5964
@@ -62,7 +67,7 @@ async def delete_fortune(self, resource_id: int) -> None:
6267 if not model :
6368 raise ValueError ("리소스를 찾을 수 없습니다." )
6469 await self .session .delete (model )
65- await self .session .commit ()
70+ await self .session .flush ()
6671
6772 async def get_fortunes (
6873 self ,
@@ -71,7 +76,9 @@ async def get_fortunes(
7176 publish_date : Optional [date ] = None ,
7277 fortune_type : Optional [FortuneType ] = None ,
7378 ) -> Tuple [List [DailyFortuneResourceModel ], Optional [int ]]:
74- query = select (DailyFortuneResourceModel ).order_by (desc (DailyFortuneResourceModel .id ))
79+ query = select (DailyFortuneResourceModel ).order_by (
80+ desc (DailyFortuneResourceModel .id )
81+ )
7582
7683 conditions = []
7784 if cursor :
@@ -91,25 +98,32 @@ async def get_fortunes(
9198 next_cursor = items [- 1 ].id if len (items ) == limit else None
9299 return items , next_cursor
93100
94- async def get_fortune_by_id (self , resource_id : int ) -> Optional [DailyFortuneResourceModel ]:
101+ async def get_fortune_by_id (
102+ self , resource_id : int
103+ ) -> Optional [DailyFortuneResourceModel ]:
95104 return await self .session .get (DailyFortuneResourceModel , resource_id )
96105
97106 async def get_user_daily_fortune_summaries (
98- self , user_id : str , fortune_date : date
107+ self , user_id : str , fortune_date : date
99108 ) -> List [UserDailyFortuneSummary ]:
100- query = select (
101- UserDailyFortuneSummaryModel .id ,
102- UserDailyFortuneSummaryModel .user_id ,
103- UserDailyFortuneSummaryModel .fortune_date ,
104- DailyFortuneResourceModel .fortune_type ,
105- DailyFortuneResourceModel .image_url ,
106- DailyFortuneResourceModel .description
107- ).join (
108- DailyFortuneResourceModel ,
109- UserDailyFortuneSummaryModel .daily_fortune_resource_id == DailyFortuneResourceModel .id
110- ).filter (
111- UserDailyFortuneSummaryModel .user_id == user_id ,
112- UserDailyFortuneSummaryModel .fortune_date == fortune_date
109+ query = (
110+ select (
111+ UserDailyFortuneSummaryModel .id ,
112+ UserDailyFortuneSummaryModel .user_id ,
113+ UserDailyFortuneSummaryModel .fortune_date ,
114+ DailyFortuneResourceModel .fortune_type ,
115+ DailyFortuneResourceModel .image_url ,
116+ DailyFortuneResourceModel .description ,
117+ )
118+ .join (
119+ DailyFortuneResourceModel ,
120+ UserDailyFortuneSummaryModel .daily_fortune_resource_id
121+ == DailyFortuneResourceModel .id ,
122+ )
123+ .filter (
124+ UserDailyFortuneSummaryModel .user_id == user_id ,
125+ UserDailyFortuneSummaryModel .fortune_date == fortune_date ,
126+ )
113127 )
114128
115129 result = await self .session .execute (query )
@@ -123,7 +137,39 @@ async def get_user_daily_fortune_summaries(
123137 fortune_date = summary [2 ],
124138 fortune_type = summary [3 ],
125139 image_url = summary [4 ],
126- description = summary [5 ]
140+ description = summary [5 ],
127141 )
128142 for summary in summaries
129- ]
143+ ]
144+
145+ async def get_user_daily_fortune_detail (
146+ self , user_id : str , fortune_date : date
147+ ) -> Optional [UserDailyFortuneDetailModel ]:
148+ """특정 날짜의 사용자 운세 상세 정보 조회"""
149+ query = select (UserDailyFortuneDetailModel ).filter (
150+ UserDailyFortuneDetailModel .user_id == user_id ,
151+ UserDailyFortuneDetailModel .fortune_date == fortune_date ,
152+ )
153+ result = await self .session .execute (query )
154+ return result .scalar_one_or_none ()
155+
156+ async def create_user_daily_fortune_detail (
157+ self ,
158+ user_id : str ,
159+ fortune_date : date ,
160+ fortune_score : int ,
161+ fortune_comment : str ,
162+ fortune_details : dict ,
163+ ) -> UserDailyFortuneDetailModel :
164+ """사용자 운세 상세 정보 생성"""
165+ model = UserDailyFortuneDetailModel (
166+ user_id = user_id ,
167+ fortune_date = fortune_date ,
168+ fortune_score = fortune_score ,
169+ fortune_comment = fortune_comment ,
170+ fortune_details = fortune_details ,
171+ )
172+ self .session .add (model )
173+ await self .session .flush ()
174+ await self .session .refresh (model )
175+ return model
0 commit comments