@@ -3,17 +3,24 @@ package com.ddd.sonnypolabobe.domain.board.repository
3
3
import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardCreateRequest
4
4
import com.ddd.sonnypolabobe.domain.board.controller.dto.BoardGetResponse
5
5
import com.ddd.sonnypolabobe.domain.board.my.dto.MyBoardDto
6
+ import com.ddd.sonnypolabobe.domain.board.repository.vo.BoardGetOneVo
7
+ import com.ddd.sonnypolabobe.domain.user.dto.GenderType
6
8
import com.ddd.sonnypolabobe.global.util.DateConverter
7
9
import com.ddd.sonnypolabobe.global.util.UuidConverter
8
10
import com.ddd.sonnypolabobe.global.util.UuidGenerator
11
+ import com.ddd.sonnypolabobe.jooq.polabo.enums.UserGender
9
12
import com.ddd.sonnypolabobe.jooq.polabo.tables.Board
13
+ import com.ddd.sonnypolabobe.jooq.polabo.tables.BoardSticker
10
14
import com.ddd.sonnypolabobe.jooq.polabo.tables.Polaroid
11
- import org.jooq.DSLContext
12
- import org.jooq.Record6
13
- import org.jooq.Record7
15
+ import com.ddd.sonnypolabobe.jooq.polabo.tables.User
16
+ import org.jooq.*
14
17
import org.jooq.impl.DSL
18
+ import org.jooq.impl.DSL.*
15
19
import org.springframework.stereotype.Repository
20
+ import java.sql.Timestamp
21
+ import java.time.LocalDate
16
22
import java.time.LocalDateTime
23
+ import java.time.temporal.ChronoUnit
17
24
import java.util.*
18
25
19
26
@Repository
@@ -38,18 +45,22 @@ class BoardJooqRepositoryImpl(
38
45
return if (result == 1 ) id else null
39
46
}
40
47
41
- override fun selectOneById (id : UUID ): Array < out Record7 < String ?, Long ?, String ?, String ?, LocalDateTime ?, Long ?, String ?> > {
48
+ override fun selectOneById (id : UUID ): List < BoardGetOneVo > {
42
49
val jBoard = Board .BOARD
43
50
val jPolaroid = Polaroid .POLAROID
51
+
44
52
return this .dslContext
45
53
.select(
54
+ jBoard.ID .convertFrom { it?.let {UuidConverter .byteArrayToUUID(it) } },
46
55
jBoard.TITLE ,
47
- jPolaroid.ID ,
56
+ jBoard.USER_ID .`as `(BoardGetOneVo ::ownerId.name),
57
+ jPolaroid.ID .`as `(BoardGetOneVo ::polaroidId.name),
48
58
jPolaroid.IMAGE_KEY ,
49
59
jPolaroid.ONE_LINE_MESSAGE ,
50
60
jPolaroid.CREATED_AT ,
51
61
jPolaroid.USER_ID ,
52
- jPolaroid.NICKNAME
62
+ jPolaroid.NICKNAME ,
63
+ jPolaroid.OPTIONS
53
64
)
54
65
.from(jBoard)
55
66
.leftJoin(jPolaroid).on(
@@ -61,7 +72,7 @@ class BoardJooqRepositoryImpl(
61
72
.and (jBoard.ACTIVEYN .eq(1 ))
62
73
)
63
74
.orderBy(jPolaroid.CREATED_AT .desc())
64
- .fetchArray( )
75
+ .fetchInto( BoardGetOneVo :: class .java )
65
76
66
77
}
67
78
@@ -216,4 +227,74 @@ class BoardJooqRepositoryImpl(
216
227
.fetchOne(0 , Long ::class .java)
217
228
? : 0L
218
229
}
230
+
231
+ override fun selectRecommendTitle (userBirth : LocalDate ? , userGender : GenderType ): List <String > {
232
+ val jBoard = Board .BOARD
233
+ val jUser = User .USER
234
+ val jPolaroid = Polaroid .POLAROID
235
+ // 현재 날짜 기준으로 연령대를 계산하는 로직
236
+ var userAgeGroup : String = " 20-29세"
237
+ if (userBirth != null ) {
238
+ val age = ChronoUnit .YEARS .between(userBirth, LocalDate .now())
239
+ userAgeGroup = if (age < 15 ) {
240
+ " 15세 미만"
241
+ } else if (age < 20 ) {
242
+ " 15-19세"
243
+ } else if (age < 30 ) {
244
+ " 20-29세"
245
+ } else if (age < 40 ) {
246
+ " 30-39세"
247
+ } else if (age < 50 ) {
248
+ " 40-49세"
249
+ } else if (age < 60 ) {
250
+ " 50-59세"
251
+ } else {
252
+ " 60대 이상"
253
+ }
254
+ }
255
+
256
+ // 기준일 (30일 전)
257
+ val thirtyDaysAgo = LocalDateTime .now().minusDays(30 )
258
+
259
+ // 쿼리 작성
260
+ return this .dslContext.select(jBoard.TITLE )
261
+ .from(jBoard)
262
+ .join(jUser)
263
+ .on(jBoard.USER_ID .eq(jUser.ID ))
264
+ .leftJoin(
265
+ this .dslContext.select(jPolaroid.BOARD_ID , count().`as `(" polaroid_count" ))
266
+ .from(jPolaroid)
267
+ .where(jPolaroid.YN .eq(1 )
268
+ .and (jPolaroid.ACTIVEYN .eq(1 )))
269
+ .groupBy(jPolaroid.BOARD_ID )
270
+ .asTable(" sub_query" )
271
+ )
272
+ .on(jBoard.ID .eq(field(name(" sub_query" , " board_id" ), jBoard.ID .dataType)))
273
+ .where(jBoard.YN .eq(1 )
274
+ .and (jBoard.ACTIVEYN .eq(1 ))
275
+ .and (jBoard.CREATED_AT .greaterOrEqual(thirtyDaysAgo))
276
+ .and (genderAndAgeGroupMatch(userGender, userAgeGroup))
277
+ )
278
+ .orderBy(field(" sub_query.polaroid_count" , Int ::class .java).desc(), jBoard.CREATED_AT .desc())
279
+ .limit(16 )
280
+ .fetchInto(String ::class .java)
281
+ }
282
+
283
+ // 성별 및 연령대 일치 조건을 위한 메서드
284
+ private fun genderAndAgeGroupMatch ( userGender : GenderType , userAgeGroup : String? ): Condition {
285
+ return User .USER .GENDER .eq(UserGender .valueOf(userGender.name))
286
+ .or (User .USER .BIRTH_DT .isNotNull().and (ageGroupCondition(userAgeGroup)))
287
+ }
288
+
289
+ // 연령대 계산 로직에 따른 조건을 처리하는 메서드
290
+ private fun ageGroupCondition (ageGroup : String? ) : Condition {
291
+ return `when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(15 )), " 15세 미만" )
292
+ .`when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(19 )), " 15-19세" )
293
+ .`when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(29 )), " 20-29세" )
294
+ .`when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(39 )), " 30-39세" )
295
+ .`when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(49 )), " 40-49세" )
296
+ .`when `(User .USER .BIRTH_DT .ge(LocalDate .now().minusYears(59 )), " 50-59세" )
297
+ .otherwise(" 60대 이상" ).eq(ageGroup);
298
+ }
299
+
219
300
}
0 commit comments