Skip to content

Commit

Permalink
snutt 전달용 강의평점 api 생성 (#103)
Browse files Browse the repository at this point in the history
* mongoItemCursorReader로 변경
- spring batch 5.1.1 적용된 최신 spring boot로 업데이트
- MongoItemReader->MongoItemCursorReader
- kotlin 플러그인 업데이트

* snutt 전달용 강의평점 api 생성

* ktlint 적용

* Fix typo

* 리뷰 반영
  • Loading branch information
Hank-Choi authored Apr 4, 2024
1 parent 217ab90 commit 4777fe7
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class EvaluationController(
@GetMapping("/v1/lectures/{id}/evaluations")
fun getLectureEvaluations(
@PathVariable(value = "id") lectureId: Long,
@RequestParam("cursor") cursor: String?,
@RequestParam cursor: String?,
@RequestAttribute(value = "UserId") userId: String,
): CursorPaginationResponse<EvaluationWithSemesterResponse> {
return evaluationService.getEvaluationsOfLecture(userId, lectureId, cursor)
Expand All @@ -74,7 +74,7 @@ class EvaluationController(

@GetMapping("/v1/evaluations/users/me")
fun getEvaluationsOfMe(
@RequestParam("cursor") cursor: String?,
@RequestParam cursor: String?,
@RequestAttribute(value = "UserId") userId: String,
): CursorPaginationResponse<EvaluationWithLectureResponse> {
return evaluationService.getMyEvaluations(userId, cursor)
Expand All @@ -83,7 +83,7 @@ class EvaluationController(
@GetMapping("/v1/tags/main/{id}/evaluations")
fun getMainTagEvaluations(
@PathVariable(value = "id") tagId: Long,
@RequestParam("cursor") cursor: String?,
@RequestParam cursor: String?,
@RequestAttribute(value = "UserId") userId: String,
): CursorPaginationResponse<EvaluationWithLectureResponse> {
return evaluationService.getMainTagEvaluations(userId, tagId, cursor)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import com.wafflestudio.snuttev.core.common.dto.common.ListResponse
import com.wafflestudio.snuttev.core.common.dto.common.PaginationResponse
import com.wafflestudio.snuttev.core.domain.lecture.dto.EvLectureSummaryForSnutt
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureAndSemesterLecturesResponse
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureDto
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureIdResponse
Expand Down Expand Up @@ -41,17 +42,25 @@ class LectureController(
@GetMapping("/v1/lectures/id")
fun getLectureId(
@RequestParam("course_number") courseNumber: String,
@RequestParam("instructor") instructor: String,
@RequestParam instructor: String,
): LectureIdResponse {
return lectureService.getLectureIdFromCourseNumber(courseNumber, instructor)
}

@GetMapping("/v1/lectures/snutt-summary")
fun getEvLectureSummaryForSnutt(
@RequestParam semesterLectureSnuttIds: List<String>,
): ListResponse<EvLectureSummaryForSnutt> {
val evLectureSummary = lectureService.getEvLectureSummaryForSnutt(semesterLectureSnuttIds)
return ListResponse(evLectureSummary)
}

@GetMapping("/v1/users/me/lectures/latest")
fun getLecturesTakenByCurrentUser(
@Parameter(hidden = true)
@RequestParam("snutt_lecture_info")
snuttLectureInfoString: String? = "",
@RequestParam("filter")
@RequestParam
filter: String?,
@RequestAttribute(value = "UserId")
userId: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.wafflestudio.snuttev.sync

import com.wafflestudio.snuttev.core.common.type.LectureClassification
import com.wafflestudio.snuttev.core.common.util.SemesterUtils
import com.wafflestudio.snuttev.core.domain.lecture.model.Lecture
import com.wafflestudio.snuttev.core.domain.lecture.model.SemesterLecture
import com.wafflestudio.snuttev.core.domain.lecture.repository.LectureRepository
import com.wafflestudio.snuttev.core.domain.lecture.repository.SemesterLectureRepository
import com.wafflestudio.snuttev.sync.model.SnuttSemesterLecture
import com.wafflestudio.snuttev.sync.repository.SnuttSemesterLectureRepository
import jakarta.persistence.EntityManagerFactory
import org.springframework.batch.core.Job
import org.springframework.batch.core.Step
Expand All @@ -16,8 +14,8 @@ import org.springframework.batch.core.repository.JobRepository
import org.springframework.batch.core.step.builder.StepBuilder
import org.springframework.batch.item.ItemProcessor
import org.springframework.batch.item.ItemWriter
import org.springframework.batch.item.data.MongoItemReader
import org.springframework.batch.item.data.builder.MongoItemReaderBuilder
import org.springframework.batch.item.data.MongoCursorItemReader
import org.springframework.batch.item.data.builder.MongoCursorItemReaderBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
Expand All @@ -36,8 +34,6 @@ class SnuttLectureSyncJobConfig(
private val mongoTemplate: MongoTemplate,
private val semesterLectureRepository: SemesterLectureRepository,
private val lectureRepository: LectureRepository,
private val semesterUtils: SemesterUtils,
private val snuttSemesterLectureRepository: SnuttSemesterLectureRepository,
) {
companion object {
private const val JOB_NAME = "SYNC_JOB"
Expand Down Expand Up @@ -104,12 +100,12 @@ class SnuttLectureSyncJobConfig(
.build()
}

private fun reader(query: Query): MongoItemReader<SnuttSemesterLecture> {
return MongoItemReaderBuilder<SnuttSemesterLecture>()
private fun reader(query: Query): MongoCursorItemReader<SnuttSemesterLecture> {
return MongoCursorItemReaderBuilder<SnuttSemesterLecture>()
.template(mongoTemplate)
.collection("lectures").query(query)
.sorts(mapOf("courseNumber" to Sort.DEFAULT_DIRECTION))
.targetType(SnuttSemesterLecture::class.java).pageSize(CHUNK_SIZE)
.sorts(mapOf("_id" to Sort.DEFAULT_DIRECTION))
.targetType(SnuttSemesterLecture::class.java)
.name(this::reader.name)
.build()
}
Expand Down Expand Up @@ -138,6 +134,7 @@ class SnuttLectureSyncJobConfig(
this.extraInfo = item.remark
this.lecture = lecture
this.credit = item.credit
this.snuttId = item.id
} ?: SemesterLecture(
lecture,
item.year,
Expand All @@ -147,6 +144,7 @@ class SnuttLectureSyncJobConfig(
item.academicYear,
item.category,
LectureClassification.customValueOf(item.classification)!!,
item.id,
).also { semesterLecturesMap["${item.courseNumber},${item.instructor},${item.year},${item.semester}"] = it }
}
}
Expand Down
10 changes: 5 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import org.springframework.boot.gradle.tasks.bundling.BootJar
import java.io.ByteArrayOutputStream

plugins {
id("org.springframework.boot") version "3.1.4" apply false
id("org.springframework.boot") version "3.2.4" apply false
id("io.spring.dependency-management") version "1.1.3"
kotlin("jvm") version "1.9.10"
kotlin("plugin.spring") version "1.8.21"
kotlin("plugin.allopen") version "1.8.21"
kotlin("plugin.noarg") version "1.8.21"
kotlin("jvm") version "1.9.22"
kotlin("plugin.spring") version "1.9.22"
kotlin("plugin.allopen") version "1.9.22"
kotlin("plugin.noarg") version "1.9.22"
id("org.jlleitschuh.gradle.ktlint") version "11.3.2"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,9 @@ data class LectureTakenByUserResponse(
val takenYear: Int,
val takenSemester: Int,
)

data class EvLectureSummaryForSnutt(
val snuttId: String,
val evLectureId: Long,
val avgRating: Double?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,8 @@ data class LectureEvaluationSummaryDao(
val avgLifeBalance: Double?,
val avgRating: Double?,
)

data class LectureRatingDao(
val id: Long,
val avgRating: Double?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@ import jakarta.persistence.Column
import jakarta.persistence.Convert
import jakarta.persistence.Entity
import jakarta.persistence.FetchType
import jakarta.persistence.Index
import jakarta.persistence.JoinColumn
import jakarta.persistence.ManyToOne
import jakarta.persistence.OneToMany
import jakarta.persistence.Table
import jakarta.persistence.UniqueConstraint

@Entity
@Table(uniqueConstraints = [UniqueConstraint(columnNames = ["lecture_id", "year", "semester"])])
@Table(
uniqueConstraints = [UniqueConstraint(columnNames = ["lecture_id", "year", "semester"])],
indexes = [Index(name = "semester_lecture_snutt_id_index", columnList = "snutt_id")],
)
class SemesterLecture(
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "lecture_id", nullable = false)
Expand All @@ -37,6 +41,9 @@ class SemesterLecture(
@Convert(converter = LectureClassificationConverter::class)
var classification: LectureClassification,

@Column(name = "snutt_id", columnDefinition = "char(24)")
var snuttId: String? = null,

@OneToMany(mappedBy = "semesterLecture")
val evaluations: List<LectureEvaluation> = listOf(),
) : BaseEntity()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.wafflestudio.snuttev.core.domain.lecture.repository

import com.wafflestudio.snuttev.core.domain.lecture.model.Lecture
import com.wafflestudio.snuttev.core.domain.lecture.model.LectureEvaluationSummaryDao
import com.wafflestudio.snuttev.core.domain.lecture.model.LectureRatingDao
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query

Expand All @@ -22,4 +23,13 @@ interface LectureRepository : JpaRepository<Lecture, Long?>, LectureRepositoryCu
""",
)
fun findLectureWithAvgEvById(id: Long): LectureEvaluationSummaryDao

@Query(
"""
select new com.wafflestudio.snuttev.core.domain.lecture.model.LectureRatingDao(
sl.lecture.id, avg(le.rating)
) from LectureEvaluation le right join le.semesterLecture sl where sl.lecture.id in :ids and le.isHidden = false group by sl.lecture.id
""",
)
fun findAllRatingsByLectureIds(ids: List<Long>): List<LectureRatingDao>
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@ interface SemesterLectureRepository : JpaRepository<SemesterLecture, Long> {
fun findAllByLectureIdOrderByYearDescSemesterDesc(lectureId: Long): List<SemesterLectureWithLecture>

fun findByYearAndSemesterAndLecture(year: Int, semester: Int, lecture: Lecture): SemesterLecture?

@Query("SELECT sl FROM SemesterLecture sl INNER JOIN FETCH Lecture l ON sl.lecture = l WHERE sl.snuttId IN :snuttIds")
fun findAllBySnuttIds(snuttIds: List<String>): List<SemesterLecture>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.wafflestudio.snuttev.core.common.error.LectureNotFoundException
import com.wafflestudio.snuttev.core.common.util.SemesterUtils
import com.wafflestudio.snuttev.core.domain.evaluation.dto.SemesterLectureDto
import com.wafflestudio.snuttev.core.domain.evaluation.repository.LectureEvaluationRepository
import com.wafflestudio.snuttev.core.domain.lecture.dto.EvLectureSummaryForSnutt
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureAndSemesterLecturesResponse
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureDto
import com.wafflestudio.snuttev.core.domain.lecture.dto.LectureIdResponse
Expand Down Expand Up @@ -118,6 +119,19 @@ class LectureService(
return LectureIdResponse(lecture.id!!)
}

fun getEvLectureSummaryForSnutt(semesterLectureSnuttIds: List<String>): List<EvLectureSummaryForSnutt> {
val lectures = semesterLectureRepository.findAllBySnuttIds(semesterLectureSnuttIds)
val ratingMap = lectureRepository.findAllRatingsByLectureIds(lectures.map { it.lecture.id!! })
.associate { it.id to it.avgRating }
return lectures.map {
EvLectureSummaryForSnutt(
snuttId = it.snuttId!!,
evLectureId = it.lecture.id!!,
avgRating = ratingMap[it.lecture.id!!],
)
}
}

private fun mappingTagsToLectureProperty(request: SearchLectureRequest): SearchQueryDto {
val tags = tagRepository.getTagsWithTagGroupByTagsIdIsIn(request.tags)
val tagMap: Map<String, List<Any>> = tags.groupBy({ it.tagGroup.name }, {
Expand Down
2 changes: 2 additions & 0 deletions core/src/main/resources/db/V4__semester_lecture_snutt_id.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE semester_lecture ADD COLUMN snutt_id CHAR(24) DEFAULT NULL;
ALTER TABLE semester_lecture ADD INDEX semester_lecture_snutt_id_index(snutt_id);

0 comments on commit 4777fe7

Please sign in to comment.