Skip to content

Commit

Permalink
feat: add review info to course
Browse files Browse the repository at this point in the history
  • Loading branch information
dujiajun committed Jul 10, 2024
1 parent 791c667 commit 6140469
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 20 deletions.
18 changes: 15 additions & 3 deletions model/converter/course.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func ConvertCoursePOToDomain(course po.CoursePO) domain.Course {
}
}

func PackCategoriesToCourse(course *domain.Course, categories []string) {
func PackCourseWithCategories(course *domain.Course, categories []string) {
if categories == nil {
return
}
Expand All @@ -46,14 +46,14 @@ func PackCategoriesToCourse(course *domain.Course, categories []string) {
course.Categories = categories
}

func PackMainTeacherToCourse(course *domain.Course, mainTeacherPO po.TeacherPO) {
func PackCourseWithMainTeacher(course *domain.Course, mainTeacherPO po.TeacherPO) {
if course == nil {
return
}
course.MainTeacher = *ConvertTeacherPOToDomain(&mainTeacherPO)
}

func PackOfferedCourseToCourse(course *domain.Course, offeredCoursePOs []po.OfferedCoursePO) {
func PackCourseWithOfferedCourse(course *domain.Course, offeredCoursePOs []po.OfferedCoursePO) {
if course == nil {
return
}
Expand All @@ -65,6 +65,16 @@ func PackOfferedCourseToCourse(course *domain.Course, offeredCoursePOs []po.Offe
course.OfferedCourses = offeredCourses
}

func PackCourseWithReviewInfo(course *domain.Course, info po.CourseReviewInfo) {
if course == nil {
return
}
course.ReviewInfo = domain.CourseReviewInfo{
Average: info.Average,
Count: info.Count,
}
}

func ConvertCourseDomainToListDTO(course domain.Course) dto.CourseListItemDTO {
mainTeacherDTO := dto.TeacherDTO{
ID: course.MainTeacher.ID,
Expand All @@ -81,6 +91,7 @@ func ConvertCourseDomainToListDTO(course domain.Course) dto.CourseListItemDTO {
MainTeacher: mainTeacherDTO,
Categories: course.Categories,
Department: course.Department,
ReviewInfo: course.ReviewInfo,
}
}

Expand Down Expand Up @@ -137,6 +148,7 @@ func ConvertCourseDomainToDetailDTO(course domain.Course) dto.CourseDetailDTO {
Credit: course.Credit,
MainTeacher: ConvertTeacherDomainToDTO(course.MainTeacher),
OfferedCourse: make([]dto.OfferedCourseDTO, 0),
ReviewInfo: course.ReviewInfo,
}
for _, offeredCourse := range course.OfferedCourses {
offeredCourseDTO := ConvertOfferedCourseDomainToDTO(offeredCourse)
Expand Down
6 changes: 6 additions & 0 deletions model/domain/course.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ type OfferedCourse struct {
Grade []string
}

type CourseReviewInfo struct {
Average float64 `json:"average"`
Count int64 `json:"count"`
}

type Course struct {
ID int64
Code string
Expand All @@ -17,6 +22,7 @@ type Course struct {
Department string
Categories []string
OfferedCourses []OfferedCourse
ReviewInfo CourseReviewInfo
}

type TrainingPlan struct {
Expand Down
30 changes: 17 additions & 13 deletions model/dto/course.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dto

import "jcourse_go/model/domain"

type TeacherDTO struct {
ID int64 `json:"id"`
Code string `json:"code"`
Expand All @@ -17,26 +19,28 @@ type OfferedCourseDTO struct {
}

type CourseDetailDTO struct {
ID int64 `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
Credit float64 `json:"credit"`
MainTeacher TeacherDTO `json:"main_teacher"`
OfferedCourse []OfferedCourseDTO `json:"offered_courses"`
ID int64 `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
Credit float64 `json:"credit"`
MainTeacher TeacherDTO `json:"main_teacher"`
OfferedCourse []OfferedCourseDTO `json:"offered_courses"`
ReviewInfo domain.CourseReviewInfo `json:"review_info"`
}

type CourseDetailRequest struct {
CourseID int64 `uri:"courseID" binding:"required"`
}

type CourseListItemDTO struct {
ID int64 `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
Credit float64 `json:"credit"`
MainTeacher TeacherDTO `json:"main_teacher"`
Categories []string `json:"categories"`
Department string `json:"department"`
ID int64 `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
Credit float64 `json:"credit"`
MainTeacher TeacherDTO `json:"main_teacher"`
Categories []string `json:"categories"`
Department string `json:"department"`
ReviewInfo domain.CourseReviewInfo `json:"review_info"`
}

type CourseListRequest struct {
Expand Down
6 changes: 6 additions & 0 deletions model/po/course.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,9 @@ type TrainingPlanCoursePO struct {
func (po *TrainingPlanCoursePO) TableName() string {
return "training_plan_courses"
}

type CourseReviewInfo struct {
CourseID int64
Average float64
Count int64
}
18 changes: 18 additions & 0 deletions repository/review.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type IReviewQuery interface {
CreateReview(ctx context.Context, review po.ReviewPO) (int64, error)
UpdateReview(ctx context.Context, review po.ReviewPO) (int64, error)
DeleteReview(ctx context.Context, opts ...DBOption) (int64, error)
GetCourseReviewInfo(ctx context.Context, courseIDs []int64) (map[int64]po.CourseReviewInfo, error)
WithID(id int64) DBOption
WithCourseID(courseID int64) DBOption
WithUserID(userID int64) DBOption
Expand All @@ -28,6 +29,23 @@ type ReviewQuery struct {
db *gorm.DB
}

func (c *ReviewQuery) GetCourseReviewInfo(ctx context.Context, courseIDs []int64) (map[int64]po.CourseReviewInfo, error) {
infoMap := make(map[int64]po.CourseReviewInfo)
infos := make([]po.CourseReviewInfo, 0)
result := c.db.WithContext(ctx).Model(&po.ReviewPO{}).
Select("count(*) as count, avg(rate) as average, course_id").
Group("course_id").
Where("course_id in (?)", courseIDs).
Find(&infos)
if result.Error != nil {
return infoMap, result.Error
}
for _, info := range infos {
infoMap[info.CourseID] = info
}
return infoMap, nil
}

func (c *ReviewQuery) GetReviewCount(ctx context.Context, opts ...DBOption) (int64, error) {
db := c.optionDB(ctx, opts...)
count := int64(0)
Expand Down
22 changes: 18 additions & 4 deletions service/course.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,17 @@ func GetCourseDetail(ctx context.Context, courseID int64) (*domain.Course, error
return nil, err
}

reviewQuery := repository.NewReviewQuery()
infos, err := reviewQuery.GetCourseReviewInfo(ctx, []int64{courseID})
if err != nil {
return nil, err
}

course := converter.ConvertCoursePOToDomain(*coursePO)
converter.PackMainTeacherToCourse(&course, *teacherPO)
converter.PackOfferedCourseToCourse(&course, offeredCoursePOs)
converter.PackCategoriesToCourse(&course, courseCategories[course.ID])
converter.PackCourseWithMainTeacher(&course, *teacherPO)
converter.PackCourseWithOfferedCourse(&course, offeredCoursePOs)
converter.PackCourseWithCategories(&course, courseCategories[course.ID])
converter.PackCourseWithReviewInfo(&course, infos[course.ID])
return &course, nil
}

Expand Down Expand Up @@ -83,10 +90,17 @@ func GetCourseList(ctx context.Context, filter domain.CourseListFilter) ([]domai
return nil, err
}

reviewQuery := repository.NewReviewQuery()
infos, err := reviewQuery.GetCourseReviewInfo(ctx, courseIDs)
if err != nil {
return nil, err
}

courses := make([]domain.Course, 0, len(coursePOs))
for _, coursePO := range coursePOs {
course := converter.ConvertCoursePOToDomain(coursePO)
converter.PackCategoriesToCourse(&course, courseCategories[int64(coursePO.ID)])
converter.PackCourseWithCategories(&course, courseCategories[int64(coursePO.ID)])
converter.PackCourseWithReviewInfo(&course, infos[int64(coursePO.ID)])
courses = append(courses, course)
}
return courses, nil
Expand Down

0 comments on commit 6140469

Please sign in to comment.