Skip to content

Commit

Permalink
Merge pull request #47 from DevKor-github/feature/course
Browse files Browse the repository at this point in the history
Feature/course
  • Loading branch information
Devheun authored Jul 22, 2024
2 parents c3872c9 + bf9c0fc commit 17ed5d0
Show file tree
Hide file tree
Showing 10 changed files with 406 additions and 141 deletions.
77 changes: 54 additions & 23 deletions src/course-review/course-review.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,30 +59,61 @@ export class CourseReviewService {
);
}

const courseReview = this.courseReviewRepository.create({
...createCourseReviewRequestDto,
userId: user.id,
});
await this.courseReviewRepository.save(courseReview);
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const courseReview = queryRunner.manager.create(CourseReviewEntity, {
...createCourseReviewRequestDto,
userId: user.id,
});
await queryRunner.manager.save(courseReview);

// 해당 강의에 대한 모든 강의평 조회
const courseReviews = await queryRunner.manager.find(CourseReviewEntity, {
where: {
courseCode: createCourseReviewRequestDto.courseCode,
professorName: createCourseReviewRequestDto.professorName,
},
});

return {
id: courseReview.id,
reviewer: user.username,
createdAt: courseReview.createdAt,
rate: courseReview.rate,
classLevel: courseReview.classLevel,
teamProject: courseReview.teamProject,
amountLearned: courseReview.amountLearned,
teachingSkills: courseReview.teachingSkills,
attendance: courseReview.attendance,
recommendCount: courseReview.recommendCount,
textReview: courseReview.textReview,
professorName: courseReview.professorName,
year: courseReview.year,
semester: courseReview.semester,
courseCode: courseReview.courseCode,
userId: courseReview.userId,
};
// 강의평 점수들의 평균 계산
const totalRate =
courseReviews.reduce((sum, review) => sum + review.rate, 0) /
courseReviews.length;

const courses =
await this.courseService.searchCoursesByCourseCodeAndProfessorName(
createCourseReviewRequestDto.courseCode,
createCourseReviewRequestDto.professorName,
);
const courseIds = courses.map((course) => course.id);
await this.courseService.updateCourseTotalRate(courseIds, totalRate);
await queryRunner.commitTransaction();
return {
id: courseReview.id,
reviewer: user.username,
createdAt: courseReview.createdAt,
rate: courseReview.rate,
classLevel: courseReview.classLevel,
teamProject: courseReview.teamProject,
amountLearned: courseReview.amountLearned,
teachingSkills: courseReview.teachingSkills,
attendance: courseReview.attendance,
recommendCount: courseReview.recommendCount,
textReview: courseReview.textReview,
professorName: courseReview.professorName,
year: courseReview.year,
semester: courseReview.semester,
courseCode: courseReview.courseCode,
userId: courseReview.userId,
};
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}
}

async getCourseReviewSummary(
Expand Down
109 changes: 67 additions & 42 deletions src/course/course.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,13 @@ import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard';
import { SearchCourseCodeDto } from './dto/search-course-code.dto';
import { SearchCourseNameDto } from './dto/search-course-name.dto';
import { SearchProfessorNameDto } from './dto/search-professor-name.dto';
import { PaginatedCoursesDto } from './dto/paginated-courses.dto';

@ApiTags('course')
@Controller('course')
export class CourseController {
constructor(private courseService: CourseService) {}

@Get()
@ApiOperation({
summary: '모든 강의 조회',
description: '등록된 모든 강의를 조회합니다.',
})
@ApiResponse({
status: 200,
description: '모든 강의 조회 성공 시',
type: CommonCourseResponseDto,
isArray: true,
})
async getAllCourses(): Promise<CommonCourseResponseDto[]> {
return await this.courseService.getAllCourses();
}

// 학수번호 검색
@UseGuards(JwtAuthGuard)
@Get('search-course-code')
Expand All @@ -47,15 +33,19 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '학수번호로 강의 검색 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async searchCourseCode(
@Query() searchCourseCodeDto: SearchCourseCodeDto,
): Promise<CommonCourseResponseDto[]> {
): Promise<PaginatedCoursesDto> {
return await this.courseService.searchCourseCode(searchCourseCodeDto);
}

Expand All @@ -77,16 +67,20 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '전공 과목명으로 강의 검색 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async searchMajorCourseName(
@Query('major') major: string,
@Query() searchCourseNameDto: SearchCourseNameDto,
): Promise<CommonCourseResponseDto[]> {
): Promise<PaginatedCoursesDto> {
return await this.courseService.searchMajorCourseName(
major,
searchCourseNameDto,
Expand All @@ -106,15 +100,19 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '교양 과목명으로 강의 검색 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async searchGeneralCourseName(
@Query() searchCourseNameDto: SearchCourseNameDto,
): Promise<CommonCourseResponseDto[]> {
): Promise<PaginatedCoursesDto> {
return await this.courseService.searchGeneralCourseName(
searchCourseNameDto,
);
Expand All @@ -138,16 +136,20 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '전공 과목 담당 교수님 성함으로 강의 검색 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async searchMajorProfessorName(
@Query('major') major: string,
@Query() searchProfessorNameDto: SearchProfessorNameDto,
): Promise<CommonCourseResponseDto[]> {
): Promise<PaginatedCoursesDto> {
return await this.courseService.searchMajorProfessorName(
major,
searchProfessorNameDto,
Expand All @@ -167,15 +169,19 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '교양 담당 교수님 성함으로 강의 검색 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async searchGeneralProfessorName(
@Query() searchProfessorNameDto: SearchProfessorNameDto,
): Promise<CommonCourseResponseDto[]> {
): Promise<PaginatedCoursesDto> {
return await this.courseService.searchGeneralProfessorName(
searchProfessorNameDto,
);
Expand All @@ -189,14 +195,20 @@ export class CourseController {
summary: '교양 강의 조회',
description: '모든 교양 강의를 조회합니다.',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '교양 강의 조회 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async getGeneralCourses(): Promise<CommonCourseResponseDto[]> {
return await this.courseService.getGeneralCourses();
async getGeneralCourses(
@Query('cursorId') cursorId?: number,
): Promise<PaginatedCoursesDto> {
return await this.courseService.getGeneralCourses(cursorId);
}

// 전공 리스트 (학부별)
Expand All @@ -212,16 +224,21 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '전공 강의 조회 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async getMajorCourses(
@Query('major') major: string,
): Promise<CommonCourseResponseDto[]> {
return await this.courseService.getMajorCourses(major);
@Query('cursorId') cursorId?: number,
): Promise<PaginatedCoursesDto> {
return await this.courseService.getMajorCourses(major, cursorId);
}

// 학문의 기초 리스트
Expand All @@ -237,16 +254,24 @@ export class CourseController {
required: true,
type: 'string',
})
@ApiQuery({
name: 'cursorId',
required: false,
type: 'number',
})
@ApiResponse({
status: 200,
description: '학문의 기초 강의 조회 성공 시',
type: CommonCourseResponseDto,
isArray: true,
type: PaginatedCoursesDto,
})
async getAcademicFoundationCourses(
@Query('college') college: string,
): Promise<CommonCourseResponseDto[]> {
return await this.courseService.getAcademicFoundationCourses(college);
@Query('cursorId') cursorId?: number,
): Promise<PaginatedCoursesDto> {
return await this.courseService.getAcademicFoundationCourses(
college,
cursorId,
);
}

@Get('/:courseId')
Expand Down
Loading

0 comments on commit 17ed5d0

Please sign in to comment.