11import { Pool } from 'pg' ;
22import logger from '@/configs/logger.config' ;
33import { DBError } from '@/exception' ;
4+ import { getCurrentKSTDateString , getKSTDateStringWithOffset } from '@/utils/date.util' ;
45
56export class PostRepository {
67 constructor ( private pool : Pool ) { }
@@ -12,6 +13,10 @@ export class PostRepository {
1213 isAsc : boolean = false ,
1314 limit : number = 15
1415 ) {
16+ const nowDateKST = getCurrentKSTDateString ( ) ;
17+ const tomorrowDateKST = getKSTDateStringWithOffset ( 24 * 60 ) ;
18+ const yesterDateKST = getKSTDateStringWithOffset ( - 24 * 60 ) ;
19+
1520 try {
1621 // 1) 정렬 컬럼 매핑
1722 let sortCol = 'p.released_at' ;
@@ -70,12 +75,12 @@ export class PostRepository {
7075 LEFT JOIN (
7176 SELECT post_id, daily_view_count, daily_like_count, date
7277 FROM posts_postdailystatistics
73- WHERE ( date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC')::date
78+ WHERE date >= ' ${ nowDateKST } ' AND date < ' ${ tomorrowDateKST } '
7479 ) pds ON p.id = pds.post_id
7580 LEFT JOIN (
7681 SELECT post_id, daily_view_count, daily_like_count, date
7782 FROM posts_postdailystatistics
78- WHERE ( date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC' - INTERVAL '1 day')::date
83+ WHERE date >= ' ${ yesterDateKST } ' AND date < ' ${ nowDateKST } '
7984 ) yesterday_stats ON p.id = yesterday_stats.post_id
8085 WHERE p.user_id = $1
8186 AND p.is_active = TRUE
@@ -128,6 +133,10 @@ export class PostRepository {
128133 isAsc : boolean = false ,
129134 limit : number = 15
130135 ) {
136+ const nowDateKST = getCurrentKSTDateString ( ) ;
137+ const tomorrowDateKST = getKSTDateStringWithOffset ( 24 * 60 ) ;
138+ const yesterDateKST = getKSTDateStringWithOffset ( - 24 * 60 ) ;
139+
131140 try {
132141 const selectFields = `
133142 p.id,
@@ -170,25 +179,25 @@ export class PostRepository {
170179 }
171180
172181 const query = `
173- SELECT ${ selectFields }
174- FROM posts_post p
175- LEFT JOIN (
176- SELECT post_id, daily_view_count, daily_like_count, date
177- FROM posts_postdailystatistics
178- WHERE ( date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC')::date
179- ) pds ON p.id = pds.post_id
180- LEFT JOIN (
181- SELECT post_id, daily_view_count, daily_like_count, date
182- FROM posts_postdailystatistics
183- WHERE (date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC' - INTERVAL '1 day')::date
184- ) yesterday_stats ON p.id = yesterday_stats.post_id
185- WHERE p.user_id = $1
186- AND p.is_active = TRUE
187- AND (pds.post_id IS NOT NULL OR yesterday_stats.post_id IS NOT NULL)
188- ${ cursorCondition }
189- ORDER BY ${ orderByExpression }
190- LIMIT ${ cursor ? '$4' : '$2' }
191- ` ;
182+ SELECT ${ selectFields }
183+ FROM posts_post p
184+ LEFT JOIN (
185+ SELECT post_id, daily_view_count, daily_like_count, date
186+ FROM posts_postdailystatistics
187+ WHERE date >= ' ${ nowDateKST } ' AND date < ' ${ tomorrowDateKST } '
188+ ) pds ON p.id = pds.post_id
189+ LEFT JOIN (
190+ SELECT post_id, daily_view_count, daily_like_count, date
191+ FROM posts_postdailystatistics
192+ WHERE date >= ' ${ yesterDateKST } ' AND date < ' ${ nowDateKST } '
193+ ) yesterday_stats ON p.id = yesterday_stats.post_id
194+ WHERE p.user_id = $1
195+ AND p.is_active = TRUE
196+ AND (pds.post_id IS NOT NULL OR yesterday_stats.post_id IS NOT NULL)
197+ ${ cursorCondition }
198+ ORDER BY ${ orderByExpression }
199+ LIMIT ${ cursor ? '$4' : '$2' }
200+ ` ;
192201
193202 const posts = await this . pool . query ( query , params ) ;
194203
@@ -225,25 +234,28 @@ export class PostRepository {
225234 }
226235
227236 async getYesterdayAndTodayViewLikeStats ( userId : number ) {
228- // ! pds.updated_at 은 FE 화면을 위해 억지로 9h 시간 더한 값임 주의
237+ const nowDateKST = getCurrentKSTDateString ( ) ;
238+ const tomorrowDateKST = getKSTDateStringWithOffset ( 24 * 60 ) ;
239+ const yesterDateKST = getKSTDateStringWithOffset ( - 24 * 60 ) ;
240+
229241 try {
230242 const query = `
231243 SELECT
232244 COALESCE(SUM(pds.daily_view_count), 0) AS daily_view_count,
233245 COALESCE(SUM(pds.daily_like_count), 0) AS daily_like_count,
234246 COALESCE(SUM(yesterday_stats.daily_view_count), 0) AS yesterday_views,
235247 COALESCE(SUM(yesterday_stats.daily_like_count), 0) AS yesterday_likes,
236- ( MAX(pds.updated_at AT TIME ZONE 'Asia/Seoul') AT TIME ZONE 'UTC' ) AS last_updated_date
248+ MAX(pds.updated_at) AS last_updated_date
237249 FROM posts_post p
238250 LEFT JOIN (
239251 SELECT post_id, daily_view_count, daily_like_count, updated_at
240252 FROM posts_postdailystatistics
241- WHERE ( date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC')::date
253+ WHERE date >= ' ${ nowDateKST } ' AND date < ' ${ tomorrowDateKST } '
242254 ) pds ON p.id = pds.post_id
243255 LEFT JOIN (
244256 SELECT post_id, daily_view_count, daily_like_count
245257 FROM posts_postdailystatistics
246- WHERE ( date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC'):: date = (NOW() AT TIME ZONE 'UTC' - INTERVAL '1 day')::date
258+ WHERE date >= ' ${ yesterDateKST } ' AND date < ' ${ nowDateKST } '
247259 ) yesterday_stats ON p.id = yesterday_stats.post_id
248260 WHERE p.user_id = $1
249261 AND p.is_active = TRUE
@@ -263,31 +275,31 @@ export class PostRepository {
263275 // 기본 쿼리 부분
264276 const baseQuery = `
265277 SELECT
266- ( pds.date AT TIME ZONE 'Asia/Seoul') AT TIME ZONE 'UTC' AS date,
278+ pds.date,
267279 pds.daily_view_count,
268280 pds.daily_like_count
269281 FROM posts_postdailystatistics pds
270282 WHERE pds.post_id = $1
271283 ` ;
272284
273285 // 날짜 필터링 조건 구성
274- const dateFilterQuery = ( start && end )
275- ? `
276- AND (pds.date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date >= ($2 AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date
277- AND (pds.date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date <= ($3 AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date
278- `
279- : '' ;
286+ let dateFilterQuery = '' ;
287+ const queryParams : Array < number | string > = [ postId ] ;
288+
289+ if ( start && end ) {
290+ dateFilterQuery = `
291+ AND pds.date >= $2
292+ AND pds.date <= $3
293+ ` ;
294+ queryParams . push ( start , end ) ;
295+ }
280296
281297 // 정렬 조건 추가
282298 const orderByQuery = `ORDER BY pds.date ASC` ;
283299
284300 // 최종 쿼리 조합
285301 const fullQuery = [ baseQuery , dateFilterQuery , orderByQuery ] . join ( ' ' ) ;
286302
287- // 파라미터 배열 구성
288- const queryParams : Array < number | string > = [ postId ] ;
289- if ( start && end ) queryParams . push ( start , end ) ;
290-
291303 // 쿼리 실행
292304 const result = await this . pool . query ( fullQuery , queryParams ) ;
293305 return result . rows ;
@@ -301,15 +313,15 @@ export class PostRepository {
301313 try {
302314 const query = `
303315 SELECT
304- ( pds.date AT TIME ZONE 'Asia/Seoul') AT TIME ZONE 'UTC' AS date,
316+ pds.date,
305317 pds.daily_view_count,
306318 pds.daily_like_count
307319 FROM posts_post p
308320 JOIN posts_postdailystatistics pds ON p.id = pds.post_id
309321 WHERE p.post_uuid = $1
310322 AND p.is_active = TRUE
311- AND ( pds.date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date >= ($2 AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date
312- AND ( pds.date AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date <= ($3 AT TIME ZONE 'Asia/Seoul' AT TIME ZONE 'UTC')::date
323+ AND pds.date >= $2
324+ AND pds.date <= $3
313325 ORDER BY pds.date ASC
314326 ` ;
315327
0 commit comments