Skip to content

Commit

Permalink
Merge pull request #68 from DSM-PICK/32-add-application-ok-or-no
Browse files Browse the repository at this point in the history
🔀 :: (PICK-32) add application ok or no
  • Loading branch information
rudeh2926 authored Feb 8, 2024
2 parents b64dc81 + 3947350 commit 0a49719
Show file tree
Hide file tree
Showing 22 changed files with 224 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class AdminLoginService(
if (passwordEncoder.matches(adminLoginRequest.password, admin.password)) {
throw PasswordMissMatchException
}
val token = jwtTokenProvider.getToken(admin.name, Role.SCH.toString())
val token = jwtTokenProvider.generateToken(admin.name, Role.SCH.toString())
return token
}
}
22 changes: 22 additions & 0 deletions src/main/kotlin/dsm/pick2024/domain/admin/facade/AdminFacade.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dsm.pick2024.domain.admin.facade

import dsm.pick2024.domain.admin.domain.Admin
import dsm.pick2024.domain.admin.exception.AdminNotFoundException
import dsm.pick2024.domain.admin.port.`in`.AdminFacadeUseCase
import dsm.pick2024.domain.admin.port.out.FindByAdminIdPort
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.stereotype.Component

@Component
class AdminFacade(
private val findByAdminIdPort: FindByAdminIdPort
) : AdminFacadeUseCase {

override fun currentUser(): Admin {
val adminId = SecurityContextHolder.getContext().authentication.name
return getAdminByAdminId(adminId)
}

override fun getAdminByAdminId(adminId: String) =
findByAdminIdPort.findByAdminId(adminId) ?: throw AdminNotFoundException
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dsm.pick2024.domain.admin.port.`in`

import dsm.pick2024.domain.admin.domain.Admin

interface AdminFacadeUseCase {
fun currentUser(): Admin

fun getAdminByAdminId(adminId: String): Admin?
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ data class EarlyReturn(
val reason: String,
val startTime: LocalTime,
val username: String,
val status: Status
val status: Status,
val teacherName: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class EarlyReturnJpaEntity(

val username: String,

val teacherName: String? = null,

@Enumerated(value = EnumType.STRING)
val status: Status

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dsm.pick2024.domain.application.exception

import dsm.pick2024.global.error.exception.ErrorCode
import dsm.pick2024.global.error.exception.PickException

object EarlyReturnApplicationNotFoundException : PickException(
ErrorCode.EARLY_RETURN_NOT_FOUND
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,19 @@ class EarlyReturnMapper {
reason = reason,
startTime = startTime,
username = username,
status = status
status = status,
teacherName = teacherName
)
}

fun toDomain(entity: EarlyReturnJpaEntity) = entity.run {
EarlyReturn(
id = id,
id = id!!,
reason = reason,
startTime = startTime,
username = username,
status = status
status = status,
teacherName = teacherName
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import dsm.pick2024.domain.application.mapper.EarlyReturnMapper
import dsm.pick2024.domain.application.persistence.repository.EarlyReturnRepository
import dsm.pick2024.domain.application.port.out.EarlyReturnPort
import org.springframework.stereotype.Component
import java.util.*

@Component
class EarlyReturnPersistenceAdapter(
Expand All @@ -18,4 +19,11 @@ class EarlyReturnPersistenceAdapter(

override fun existsByUsername(username: String) =
earlyReturnRepository.existsByUsername(username)

override fun findById(id: UUID) =
earlyReturnRepository.findById(id).let { earlyReturnMapper.toDomain(it) }

override fun deleteById(id: UUID) {
earlyReturnRepository.deleteById(id)
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package dsm.pick2024.domain.application.persistence.repository

import dsm.pick2024.domain.application.entity.EarlyReturnJpaEntity
import org.springframework.data.jpa.repository.JpaRepository
import java.util.UUID
import org.springframework.data.repository.Repository
import java.util.*

interface EarlyReturnRepository : JpaRepository<EarlyReturnJpaEntity, UUID> {
interface EarlyReturnRepository : Repository<EarlyReturnJpaEntity, UUID> {
fun existsByUsername(username: String): Boolean

fun findById(id: UUID): EarlyReturnJpaEntity

fun deleteById(id: UUID)

fun save(entity: EarlyReturnJpaEntity)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dsm.pick2024.domain.application.port.`in`

import dsm.pick2024.domain.application.enums.Status
import java.util.UUID

interface StatusEarlyReturnUseCase {
fun statusEarlyReturn(status: Status, id: UUID)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dsm.pick2024.domain.application.port.out

import java.util.UUID

interface DeleteEarlyReturnApplicationPort {
fun deleteById(id: UUID)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ package dsm.pick2024.domain.application.port.out

interface EarlyReturnPort :
SaveEarlyReturnPort,
ExistsEarlyReturnByUsernamePort
ExistsEarlyReturnByUsernamePort,
FindEarlyReturnByIdPort,
DeleteEarlyReturnApplicationPort
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dsm.pick2024.domain.application.port.out

import dsm.pick2024.domain.application.domain.EarlyReturn
import java.util.UUID

interface FindEarlyReturnByIdPort {
fun findById(id: UUID): EarlyReturn
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package dsm.pick2024.domain.application.presentation

import dsm.pick2024.domain.application.enums.Status
import dsm.pick2024.domain.application.port.`in`.CreateEarlyReturnUseCase
import dsm.pick2024.domain.application.port.`in`.StatusEarlyReturnUseCase
import dsm.pick2024.domain.application.presentation.dto.request.CreateEarlyReturnRequest
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.*
import java.util.UUID

@Tag(name = "early API")
@RestController
@RequestMapping("/early-return")
class EarlyReturnController(
private val createEarlyReturnUseCase: CreateEarlyReturnUseCase
private val createEarlyReturnUseCase: CreateEarlyReturnUseCase,
private val statusEarlyReturnUseCase: StatusEarlyReturnUseCase
) {

@Operation(summary = "조기귀가 신청 API")
Expand All @@ -21,4 +25,12 @@ class EarlyReturnController(
@RequestBody createEarlyReturnRequest: CreateEarlyReturnRequest
) =
createEarlyReturnUseCase.createEarlyReturn(createEarlyReturnRequest)

@Operation(summary = "조기귀가 신청 상태변경 API")
@PatchMapping("/status/{id}")
fun statusEarlyReturn(
@RequestBody status: Status,
@PathVariable(value = "id") id: UUID
) =
statusEarlyReturnUseCase.statusEarlyReturn(status, id)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package dsm.pick2024.domain.application.service

import dsm.pick2024.domain.admin.port.`in`.AdminFacadeUseCase
import dsm.pick2024.domain.application.enums.Status
import dsm.pick2024.domain.application.port.`in`.StatusEarlyReturnUseCase
import dsm.pick2024.domain.application.port.out.DeleteEarlyReturnApplicationPort
import dsm.pick2024.domain.application.port.out.FindEarlyReturnByIdPort
import dsm.pick2024.domain.application.port.out.SaveEarlyReturnPort
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.util.UUID

@Service
class StatusEarlyReturnService(
private val adminFacadeUseCase: AdminFacadeUseCase,
private val saveEarlyReturnPort: SaveEarlyReturnPort,
private val findEarlyReturnByIdPort: FindEarlyReturnByIdPort,
private val deleteEarlyReturnApplicationPort: DeleteEarlyReturnApplicationPort
) : StatusEarlyReturnUseCase {

@Transactional
override fun statusEarlyReturn(status: Status, id: UUID) {
val admin = adminFacadeUseCase.currentUser()

if (Status.NO == status) {
deleteEarlyReturnApplicationPort.deleteById(id)
}

val earlyReturn = findEarlyReturnByIdPort.findById(id)
val update = earlyReturn.copy(
teacherName = admin.name,
status = status
)

saveEarlyReturnPort.save(update)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class UserLoginService(
if (passwordEncoder.matches(userLoginRequest.password, user.password)) {
throw PasswordMissMatchException
}
val token = jwtTokenProvider.getToken(user.name, Role.STU.toString())
val token = jwtTokenProvider.generateToken(user.name, Role.STU.toString())
return token
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import dsm.pick2024.global.config.filter.FilterConfig
import dsm.pick2024.global.security.jwt.JwtTokenProvider
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpMethod
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.http.SessionCreationPolicy
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
Expand All @@ -30,6 +31,14 @@ class SecurityConfig(
http.authorizeRequests()
.requestMatchers(CorsUtils::isCorsRequest)
.permitAll()
.antMatchers(HttpMethod.POST, "self-study/register")
.hasRole("SCH")
.antMatchers(HttpMethod.PATCH, "self-study/change")
.hasRole("SCH")
.antMatchers(HttpMethod.POST, "early-return/create")
.hasRole("STU")
.antMatchers(HttpMethod.PATCH, "early-return/*")
.hasRole("SCH")

http
.apply(FilterConfig(objectMapper, jwtTokenProvider))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ enum class ErrorCode(
SELF_STUDY_NOT_FOUND(404, "Self Study Not Found"),
EXISTS_SELF_STUDY_TEACHER(409, "Exists Self Study Teacher"),

EARLY_RETURN_NOT_FOUND(404, "Early Return Application Not Found"),
ALREADY_APPLYING_EARLY_RETURN(409, "Already applying For Early Return Application"),

ALREADY_APPLYING_MOVEMENT(409, "Already applying for movement"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package dsm.pick2024.global.security.auth

import dsm.pick2024.domain.admin.port.`in`.AdminFacadeUseCase
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.stereotype.Service

@Service
class AdminDetailsService(
private val adminFacadeUseCase: AdminFacadeUseCase
) : UserDetailsService {
override fun loadUserByUsername(username: String): UserDetails {
val admin = adminFacadeUseCase.getAdminByAdminId(username)
return AuthDetails(admin!!.name)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ class AuthDetails(
) : UserDetails {

companion object {
private val ROLE = "ROLE"
private val ROLE_STU = "ROLE_STU"
}

override fun getAuthorities(): Collection<GrantedAuthority?> {
return listOf<SimpleGrantedAuthority>(SimpleGrantedAuthority(ROLE))
return listOf<SimpleGrantedAuthority>(SimpleGrantedAuthority(ROLE_STU))
}

override fun getPassword(): String? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class JwtTokenFilter(
val token = jwtTokenProvider.resolveToken(request)

token?.run {
SecurityContextHolder.getContext().authentication = jwtTokenProvider.authorization(token)
SecurityContextHolder.getContext().authentication = jwtTokenProvider.authentication(token)
}

filterChain.doFilter(request, response)
Expand Down
Loading

0 comments on commit 0a49719

Please sign in to comment.