Skip to content

Commit d3dd0e6

Browse files
authored
Merge pull request #400 from GSM-MSG/feature/399-student-authentication-verify
학생 인증제의 상태를 조회하는 API 개발
2 parents 4d86558 + 297b2f8 commit d3dd0e6

File tree

16 files changed

+118
-7
lines changed

16 files changed

+118
-7
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package team.msg.sms.domain.authentication.dto.res
2+
3+
import team.msg.sms.domain.authentication.model.MarkingBoardType
4+
5+
data class QueryAuthenticationVerifyResponseData(
6+
val name: String,
7+
val score: Double,
8+
val grader: String?,
9+
val markingBoardType: MarkingBoardType
10+
)

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/model/MarkingBoard.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ data class MarkingBoard(
88
val authenticationId: UUID,
99
val studentId: UUID,
1010
val totalScore: Double = 0.0,
11-
val markingBoardType: MarkingBoardType
11+
val markingBoardType: MarkingBoardType,
12+
val graderName: String?
1213
)

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/service/GetMarkingBoardService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import team.msg.sms.domain.authentication.model.MarkingBoardType
66
import java.util.*
77

88
interface GetMarkingBoardService {
9+
fun verifyMarkingBoardByStudentId(studentId: UUID): MarkingBoard?
910
fun getMarkingBoardById(id: UUID): MarkingBoard
1011
fun getMarkingBoardByStudentIds(
1112
studentIds: List<UUID>,

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/service/impl/GetMarkingBoardServiceImpl.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import java.util.UUID
1414
class GetMarkingBoardServiceImpl(
1515
private val markingBoardPort: MarkingBoardPort
1616
) : GetMarkingBoardService {
17+
override fun verifyMarkingBoardByStudentId(studentId: UUID): MarkingBoard? =
18+
markingBoardPort.verifyMarkingBoardByStudentId(studentId)
19+
1720
override fun getMarkingBoardById(id: UUID): MarkingBoard {
1821
return markingBoardPort.queryMarkingBoardById(id) ?: throw MarkingBoardNotFoundException
1922
}

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/spi/QueryMarkingBoardPort.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import team.msg.sms.domain.authentication.model.MarkingBoardType
66
import java.util.UUID
77

88
interface QueryMarkingBoardPort {
9+
fun verifyMarkingBoardByStudentId(studentId: UUID): MarkingBoard?
910
fun queryMarkingBoardById(id: UUID): MarkingBoard?
1011
fun queryMarkingBoardByStudentIds(
1112
studentIds: List<UUID>,

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/usecase/GradingAuthenticationFormUseCase.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import team.msg.sms.domain.authentication.service.MarkingBoardService
1010
import team.msg.sms.domain.authentication.service.MarkingValueService
1111
import team.msg.sms.domain.authentication.service.UserFormValueService
1212
import team.msg.sms.domain.teacher.service.TeacherService
13+
import team.msg.sms.domain.user.service.UserService
1314
import java.time.LocalDateTime
1415
import java.util.UUID
1516

@@ -18,14 +19,17 @@ class GradingAuthenticationFormUseCase(
1819
private val markingValueService: MarkingValueService,
1920
private val markingBoardService: MarkingBoardService,
2021
private val userFormValueService: UserFormValueService,
21-
private val teacherService: TeacherService
22+
private val teacherService: TeacherService,
23+
private val userService: UserService
2224
) {
2325
fun execute(markingBoardId: UUID, gradingDataList: List<GradingRequestData>) {
2426
//요청한 setId 들 중 실제 userFormValue 테이블에 없는 setId 일 경우 최종점수에 영향을 미칠 수 있어 예외처리
2527
if (!userFormValueService.checkUserFormValueBySetIds(gradingDataList.map { it.setId })) throw UserFormValueNotFoundException
2628

2729
val teacher = teacherService.currentTeacher()
2830

31+
val user = userService.getUserById(teacher.userId)
32+
2933
val markingValueList = markingValueService.findMarkingValueListByMarkingBoardId(markingBoardId)
3034

3135
val markingValueMap = markingValueList.associateBy { it.setId }
@@ -55,7 +59,8 @@ class GradingAuthenticationFormUseCase(
5559
markingBoardService.save(
5660
markingBoard.copy(
5761
totalScore = totalScore,
58-
markingBoardType = MarkingBoardType.COMPLETED
62+
markingBoardType = MarkingBoardType.COMPLETED,
63+
graderName = user.name
5964
)
6065
)
6166
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package team.msg.sms.domain.authentication.usecase
2+
3+
import team.msg.sms.common.annotation.ReadOnlyUseCase
4+
import team.msg.sms.domain.authentication.dto.res.QueryAuthenticationVerifyResponseData
5+
import team.msg.sms.domain.authentication.model.MarkingBoardType
6+
import team.msg.sms.domain.authentication.service.MarkingBoardService
7+
import team.msg.sms.domain.student.service.StudentService
8+
9+
@ReadOnlyUseCase
10+
class QueryAuthenticationVerifyUseCase(
11+
private val studentService: StudentService,
12+
private val markingBoardService: MarkingBoardService
13+
) {
14+
fun execute(): QueryAuthenticationVerifyResponseData {
15+
val student = studentService.currentStudent()
16+
val markingBoard = markingBoardService.verifyMarkingBoardByStudentId(student.id)
17+
18+
return if (markingBoard == null) {
19+
QueryAuthenticationVerifyResponseData(
20+
name = student.name,
21+
score = 0.0,
22+
grader = null,
23+
markingBoardType = MarkingBoardType.NOT_SUBMITTED
24+
)
25+
} else {
26+
QueryAuthenticationVerifyResponseData(
27+
name = student.name,
28+
score = markingBoard.totalScore,
29+
grader = markingBoard.graderName,
30+
markingBoardType = markingBoard.markingBoardType
31+
)
32+
}
33+
34+
}
35+
}

sms-core/src/main/kotlin/team/msg/sms/domain/authentication/usecase/SubmitUserFormDataUseCase.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class SubmitUserFormDataUseCase(
5252
markingBoardType = MarkingBoardType.PENDING_REVIEW,
5353
authenticationId = authenticationFormId,
5454
studentId = student.id,
55+
graderName = null
5556
)
5657
markingBoardService.save(markingBoard)
5758
}

sms-infrastructure/src/main/kotlin/team/msg/sms/global/security/SecurityConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class SecurityConfig(
9898
.antMatchers(HttpMethod.GET, "/authentication/form").hasAnyAuthority(STUDENT, TEACHER)
9999
.antMatchers(HttpMethod.GET, "/authentication/{uuid}/form").hasAuthority(TEACHER)
100100
.antMatchers(HttpMethod.GET, "/authentication").hasAuthority(TEACHER)
101+
.antMatchers(HttpMethod.GET, "/authentication/verify").hasAuthority(STUDENT)
101102
.antMatchers(HttpMethod.PUT, "/authentication/{uuid}").hasAuthority(STUDENT)
102103
.antMatchers(HttpMethod.POST, "/authentication").hasAuthority(STUDENT)
103104
.antMatchers(HttpMethod.POST, "/authentication/submit").hasAuthority(STUDENT)

sms-persistence/src/main/kotlin/team/msg/sms/persistence/authentication/MarkingBoardPersistenceAdapter.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ class MarkingBoardPersistenceAdapter(
2121
markingBoardJpaRepository.save(markingBoard.toEntity())
2222
}
2323

24+
override fun verifyMarkingBoardByStudentId(studentId: UUID): MarkingBoard? =
25+
markingBoardCustomRepository.findMarkingBoardWithStudentId(studentId)?.toDomain()
26+
2427
override fun queryMarkingBoardById(id: UUID): MarkingBoard? =
2528
markingBoardJpaRepository.findByIdOrNull(id)?.toDomain()
2629

sms-persistence/src/main/kotlin/team/msg/sms/persistence/authentication/entity/MarkingBoardJpaEntity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@ class MarkingBoardJpaEntity(
2727
val totalScore: Double,
2828

2929
@Enumerated(EnumType.STRING)
30-
val markingBoardType : MarkingBoardType
30+
val markingBoardType : MarkingBoardType,
31+
32+
val graderName: String?
3133
): BaseUuidEntity(id)

sms-persistence/src/main/kotlin/team/msg/sms/persistence/authentication/mapper/MarkingBoardMapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ fun MarkingBoardJpaEntity.toDomain() =
1010
studentId = studentId,
1111
title = title,
1212
totalScore = totalScore,
13-
markingBoardType = markingBoardType
13+
markingBoardType = markingBoardType,
14+
graderName = graderName
1415
)
1516

1617
fun MarkingBoard.toEntity() =
@@ -20,5 +21,6 @@ fun MarkingBoard.toEntity() =
2021
studentId = studentId,
2122
title = title,
2223
totalScore = totalScore,
23-
markingBoardType = markingBoardType
24+
markingBoardType = markingBoardType,
25+
graderName = graderName
2426
)

sms-persistence/src/main/kotlin/team/msg/sms/persistence/authentication/repository/queryDSL/MarkingBoardCustomRepository.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package team.msg.sms.persistence.authentication.repository.queryDSL
22

33
import team.msg.sms.domain.authentication.dto.res.UserBoardPageResponseData
44
import team.msg.sms.domain.authentication.model.MarkingBoardType
5+
import team.msg.sms.persistence.authentication.entity.MarkingBoardJpaEntity
56
import java.util.*
67

78
interface MarkingBoardCustomRepository {
9+
fun findMarkingBoardWithStudentId(studentId: UUID): MarkingBoardJpaEntity?
10+
811
fun findMarkingBoardWithStudentInfoByStudentIds(
912
studentIds: List<UUID>,
1013
authenticationId: UUID,

sms-persistence/src/main/kotlin/team/msg/sms/persistence/authentication/repository/queryDSL/MarkingBoardRepositoryImpl.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import org.springframework.data.domain.PageRequest
77
import org.springframework.stereotype.Repository
88
import team.msg.sms.domain.authentication.dto.res.UserBoardPageResponseData
99
import team.msg.sms.domain.authentication.dto.res.UserBoardWithStudentInfoResponseData
10+
import team.msg.sms.domain.authentication.model.MarkingBoard
1011
import team.msg.sms.domain.authentication.model.MarkingBoardType
12+
import team.msg.sms.persistence.authentication.entity.MarkingBoardJpaEntity
13+
import team.msg.sms.persistence.authentication.entity.QAuthenticationFormJpaEntity
1114
import team.msg.sms.persistence.authentication.entity.QMarkingBoardJpaEntity
1215
import team.msg.sms.persistence.student.entity.QStudentJpaEntity
1316
import team.msg.sms.persistence.user.entity.QUserJpaEntity
@@ -17,6 +20,22 @@ import java.util.*
1720
class MarkingBoardRepositoryImpl(
1821
private val jpaQueryFactory: JPAQueryFactory
1922
) : MarkingBoardCustomRepository {
23+
override fun findMarkingBoardWithStudentId(studentId: UUID): MarkingBoardJpaEntity? {
24+
val qMarkingBoard = QMarkingBoardJpaEntity.markingBoardJpaEntity
25+
val qAuthenticationForm = QAuthenticationFormJpaEntity.authenticationFormJpaEntity
26+
val data = jpaQueryFactory
27+
.select(qMarkingBoard)
28+
.from(qMarkingBoard)
29+
.join(qAuthenticationForm).on(qMarkingBoard.authenticationId.eq(qAuthenticationForm.id))
30+
.where(
31+
qMarkingBoard.studentId.eq(studentId)
32+
.and(qAuthenticationForm.active.isTrue)
33+
)
34+
.fetch()
35+
return if (data.isEmpty()) null else {
36+
data.first()
37+
}
38+
}
2039

2140
override fun findMarkingBoardWithStudentInfoByStudentIds(
2241
studentIds: List<UUID>,

sms-presentation/src/main/kotlin/team/msg/sms/domain/authentication/AuthenticationWebAdapter.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,14 @@ class AuthenticationWebAdapter(
3232
private val createAuthenticationFormUseCase: CreateAuthenticationFormUseCase,
3333
private val queryStudentFormListUseCase: QueryStudentFormListUseCase,
3434
private val queryStudentAuthenticationFormDetailUseCase: QueryStudentAuthenticationFormDetailUseCase,
35-
private val gradingAuthenticationFormUseCase: GradingAuthenticationFormUseCase
35+
private val gradingAuthenticationFormUseCase: GradingAuthenticationFormUseCase,
36+
private val queryAuthenticationVerifyUseCase: QueryAuthenticationVerifyUseCase
3637
) {
38+
@GetMapping("/verify")
39+
fun verifyStudentAuthenticationForm(): ResponseEntity<QueryAuthenticationVerifyWebResponse> =
40+
queryAuthenticationVerifyUseCase.execute()
41+
.let { ResponseEntity.ok(it.toResponse()) }
42+
3743
@GetMapping("/form")
3844
fun queryAuthenticationForm(): ResponseEntity<QueryAuthenticationFormWebResponse> =
3945
queryAuthenticationFormUseCase.execute()
@@ -248,6 +254,14 @@ class AuthenticationWebAdapter(
248254
content = content
249255
)
250256

257+
private fun QueryAuthenticationVerifyResponseData.toResponse() =
258+
QueryAuthenticationVerifyWebResponse(
259+
name = name,
260+
score = score,
261+
grader = grader,
262+
markingBoardType = markingBoardType
263+
)
264+
251265
private fun isValidUUID(uuid: String): Boolean {
252266
return try {
253267
UUID.fromString(uuid)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package team.msg.sms.domain.authentication.dto.res
2+
3+
import team.msg.sms.domain.authentication.model.MarkingBoardType
4+
5+
data class QueryAuthenticationVerifyWebResponse(
6+
val name: String,
7+
val score: Double,
8+
val grader: String?,
9+
val markingBoardType: MarkingBoardType
10+
)

0 commit comments

Comments
 (0)