@@ -11,14 +11,17 @@ import { SearchCourseNewDto } from './dto/search-course-new.dto';
1111import { CourseSearchStrategy } from './strategy/course-search-strategy' ;
1212import { SearchCourseReviewsWithKeywordRequest } from 'src/course-review/dto/search-course-reviews-with-keyword-request.dto' ;
1313import { GetRecommendationCoursesRequestDto } from './dto/get-recommendation-courses-request.dto' ;
14-
14+ import { SearchAllTimeCoursesRequestDto } from './dto/search-all-time-courses-request.dto' ;
15+ import { SearchAllTimeCoursesResponseDto } from './dto/search-all-time-courses-response.dto' ;
16+ import { CommonCourseService } from 'src/common-course/common-course.service' ;
1517@Injectable ( )
1618export class CourseService {
1719 constructor (
1820 private courseRepository : CourseRepository ,
1921 private courseDetailRepository : CourseDetailRepository ,
2022 @Inject ( 'CourseSearchStrategy' )
2123 private readonly strategies : CourseSearchStrategy [ ] ,
24+ private readonly commonCourseService : CommonCourseService ,
2225 ) { }
2326 async getCourse ( courseId : number ) : Promise < CommonCourseResponseDto > {
2427 const course = await this . courseRepository . findOne ( {
@@ -222,6 +225,53 @@ export class CourseService {
222225 return courses . map ( ( course ) => new CommonCourseResponseDto ( course ) ) ;
223226 }
224227
228+ async searchAllTimeCourses (
229+ searchAllTimeCoursesRequestDto : SearchAllTimeCoursesRequestDto ,
230+ ) : Promise < SearchAllTimeCoursesResponseDto > {
231+ const { keyword, cursorId } = searchAllTimeCoursesRequestDto ;
232+ let coursesQuery = this . courseRepository
233+ . createQueryBuilder ( 'course' )
234+ . where (
235+ 'course.courseName LIKE :keyword OR course.professorName LIKE :keyword OR course.courseCode LIKE :keyword' ,
236+ {
237+ keyword : `%${ keyword } %` ,
238+ } ,
239+ ) ;
240+
241+ if ( cursorId ) {
242+ coursesQuery = coursesQuery . andWhere ( 'course.id > :cursorId' , {
243+ cursorId,
244+ } ) ;
245+ }
246+
247+ const courses = await coursesQuery
248+ . orderBy ( 'course.id' , 'ASC' )
249+ . take ( PaginatedCoursesDto . LIMIT )
250+ . getMany ( ) ;
251+
252+ const coursePairs = courses . map ( ( course ) => ( {
253+ courseCode : course . courseCode . split ( '-' ) [ 0 ] ,
254+ professorName : course . professorName ,
255+ } ) ) ;
256+
257+ const reviewCountMap =
258+ await this . commonCourseService . getCourseReviewCount ( coursePairs ) ;
259+
260+ const coursesWithReviewCount = courses . map ( ( course ) => {
261+ const key = `${ course . courseCode . split ( '-' ) [ 0 ] } -${ course . professorName } ` ;
262+ return {
263+ id : course . id ,
264+ professorName : course . professorName ,
265+ courseName : course . courseName ,
266+ courseCode : course . courseCode ,
267+ totalRate : course . totalRate ,
268+ reviewCount : reviewCountMap . get ( key ) || 0 ,
269+ } ;
270+ } ) ;
271+
272+ return new SearchAllTimeCoursesResponseDto ( coursesWithReviewCount ) ;
273+ }
274+
225275 private async findSearchStrategy (
226276 searchCourseNewDto : SearchCourseNewDto ,
227277 ) : Promise < CourseSearchStrategy > {
0 commit comments