Skip to content

Commit

Permalink
Merge pull request #130 from GSM-MSG/129-feat/create-certification
Browse files Browse the repository at this point in the history
# 129 자격증 등록 기능 개발
  • Loading branch information
JuuuuHong authored Nov 14, 2023
2 parents c646ad9 + b9899bf commit 2fe3319
Show file tree
Hide file tree
Showing 16 changed files with 126 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package team.msg.domain.certification.mapper

import team.msg.domain.certification.presentation.data.request.CreateCertificationRequest
import team.msg.domain.certification.presentation.data.web.CreateCertificationWebRequest

interface CertificationRequestMapper {
fun createCertificationWebRequestToDto(webRequest: CreateCertificationWebRequest): CreateCertificationRequest
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package team.msg.domain.certification.mapper

import org.springframework.stereotype.Component
import team.msg.domain.certification.presentation.data.request.CreateCertificationRequest
import team.msg.domain.certification.presentation.data.web.CreateCertificationWebRequest

@Component
class CertificationRequestMapperImpl : CertificationRequestMapper {
/**
* 자격증 등록 Web Request 를 애플리케이션 영역에서 사용될 Dto 로 매핑합니다.
*/
override fun createCertificationWebRequestToDto(webRequest: CreateCertificationWebRequest) = CreateCertificationRequest(
name = webRequest.name,
acquisitionDate = webRequest.acquisitionDate
)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package team.msg.domain.certification.presentation

import javax.validation.Valid
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import team.msg.domain.certification.mapper.CertificationRequestMapper
import team.msg.domain.certification.presentation.data.web.CreateCertificationWebRequest
import team.msg.domain.certification.service.CertificationService

@RestController
@RequestMapping("/certification")
class CertificationController(
private val certificationService: CertificationService,
private val certificationRequestMapper: CertificationRequestMapper
) {
@PostMapping
fun createCertification(@RequestBody @Valid webRequest: CreateCertificationWebRequest): ResponseEntity<Void> {
val request = certificationRequestMapper.createCertificationWebRequestToDto(webRequest)
certificationService.createCertification(request)
return ResponseEntity.status(HttpStatus.CREATED).build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package team.msg.domain.certification.presentation.data.request

import java.time.LocalDate

data class CreateCertificationRequest(
val name: String,
val acquisitionDate: LocalDate
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package team.msg.domain.certification.presentation.data.web

import javax.validation.constraints.NotBlank
import javax.validation.constraints.NotNull
import java.time.LocalDate

data class CreateCertificationWebRequest(
@field:NotBlank
val name: String,

@field:NotNull
val acquisitionDate: LocalDate
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team.msg.domain.certification.service

import team.msg.domain.certification.presentation.data.request.CreateCertificationRequest

interface CertificationService {
fun createCertification(createCertificationRequest: CreateCertificationRequest)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package team.msg.domain.certification.service

import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import team.msg.common.util.UserUtil
import team.msg.domain.certifiacation.model.Certification
import team.msg.domain.certifiacation.repository.CertificationRepository
import team.msg.domain.certification.presentation.data.request.CreateCertificationRequest
import team.msg.domain.student.exception.StudentNotFoundException
import team.msg.domain.student.model.Student
import team.msg.domain.student.repository.StudentRepository
import team.msg.domain.user.model.User
import java.util.*

@Service
class CertificationServiceImpl(
private val certificationRepository: CertificationRepository,
private val studentRepository: StudentRepository,
private val userUtil: UserUtil
) : CertificationService {

/**
* 자격증에 대한 정보를 작성하는 비지니스 로직입니다.
* @param 자격증을 소지한 학생 id
*/
@Transactional(rollbackFor = [Exception::class])
override fun createCertification(request: CreateCertificationRequest) {
val user = userUtil.queryCurrentUser()
val student = studentRepository findByUer user

val certification = Certification(
id = UUID.randomUUID(),
studentId = student.id,
name = request.name,
acquisitionDate = request.acquisitionDate
)

certificationRepository.save(certification)
}

private infix fun StudentRepository.findByUer(user: User): Student =
this.findByUser(user)
?: throw StudentNotFoundException("존재하지 않는 유저입니다. info : [ userId = ${user.id} ]")
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ class SecurityConfig(
.mvcMatchers(HttpMethod.GET, "/faq").permitAll()
.mvcMatchers(HttpMethod.GET, "/faq/{id}").permitAll()

// certification
.mvcMatchers(HttpMethod.POST, "/certification/{student_id}").hasRole(STUDENT)

// user
.mvcMatchers(HttpMethod.GET, "/user").authenticated()

Expand Down

0 comments on commit 2fe3319

Please sign in to comment.