Skip to content

Commit 6d43e46

Browse files
Merge pull request #22 from EntryDSM/feature/14-layered-to-hexagonal-admin
feature/14-layered-to-hexagonal-admin
2 parents c7d30f6 + 3185bc6 commit 6d43e46

18 files changed

Lines changed: 393 additions & 0 deletions
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.`in`.web
2+
3+
import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.request.AdminLoginRequest
4+
import hs.kr.entrydsm.user.domain.admin.application.port.`in`.AdminLoginUseCase
5+
import hs.kr.entrydsm.user.domain.admin.application.port.`in`.AdminTokenRefreshUseCase
6+
import hs.kr.entrydsm.user.domain.admin.application.port.`in`.DeleteAllTableUseCase
7+
import hs.kr.entrydsm.user.domain.admin.application.port.`in`.QueryAdminByUUIDUseCase
8+
import hs.kr.entrydsm.user.global.document.admin.AdminApiDocument
9+
import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse
10+
import jakarta.validation.Valid
11+
import org.springframework.web.bind.annotation.DeleteMapping
12+
import org.springframework.web.bind.annotation.GetMapping
13+
import org.springframework.web.bind.annotation.PathVariable
14+
import org.springframework.web.bind.annotation.PostMapping
15+
import org.springframework.web.bind.annotation.PutMapping
16+
import org.springframework.web.bind.annotation.RequestBody
17+
import org.springframework.web.bind.annotation.RequestHeader
18+
import org.springframework.web.bind.annotation.RequestMapping
19+
import org.springframework.web.bind.annotation.RestController
20+
import java.util.UUID
21+
22+
/**
23+
* 관리자 관련 HTTP 요청을 처리하는 REST 컨트롤러 클래스입니다.
24+
*/
25+
@RestController
26+
@RequestMapping("/admin")
27+
class AdminWebAdapter(
28+
private val adminLoginUseCase: AdminLoginUseCase,
29+
private val adminTokenRefreshUseCase: AdminTokenRefreshUseCase,
30+
private val deleteAllTableUseCase: DeleteAllTableUseCase,
31+
private val queryAdminByUUIDUseCase: QueryAdminByUUIDUseCase,
32+
) : AdminApiDocument {
33+
/**
34+
* 관리자 로그인을 처리합니다.
35+
*/
36+
@PostMapping("/auth")
37+
override fun login(
38+
@RequestBody @Valid
39+
adminLoginRequest: AdminLoginRequest,
40+
): TokenResponse = adminLoginUseCase.login(adminLoginRequest)
41+
42+
/**
43+
* 관리자 토큰을 갱신합니다.
44+
*/
45+
@PutMapping("/auth")
46+
override fun tokenRefresh(
47+
@RequestHeader("X-Refresh-Token") refreshToken: String,
48+
): TokenResponse = adminTokenRefreshUseCase.refresh(refreshToken)
49+
50+
/**
51+
* 모든 테이블을 삭제합니다.
52+
*/
53+
@DeleteMapping("/auth")
54+
override fun deleteAllTable() = deleteAllTableUseCase.deleteAllTables()
55+
56+
/**
57+
* UUID로 관리자 정보를 조회합니다.
58+
*/
59+
@GetMapping("/{adminId}")
60+
override fun findAdminById(
61+
@PathVariable adminId: UUID,
62+
) = queryAdminByUUIDUseCase.queryByUUID(adminId)
63+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.response
2+
3+
import java.util.UUID
4+
5+
/**
6+
* 내부 시스템 간 관리자 정보 응답 데이터를 담는 DTO 클래스입니다.
7+
*/
8+
data class InternalAdminResponse(
9+
val id: UUID,
10+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.out
2+
3+
import hs.kr.entrydsm.user.global.base.BaseUUIDEntity
4+
import jakarta.persistence.Column
5+
import jakarta.persistence.Entity
6+
import java.util.UUID
7+
8+
/**
9+
* 관리자 정보를 데이터베이스에 저장하기 위한 JPA 엔티티 클래스입니다.
10+
* 데이터베이스의 tbl_admin 테이블과 매핑됩니다.
11+
*
12+
* @property adminId 관리자 로그인 ID
13+
* @property password 해시화된 비밀번호
14+
*/
15+
@Entity(name = "tbl_admin")
16+
class AdminJpaEntity(
17+
id: UUID?,
18+
@Column(name = "admin_id", length = 15, nullable = false)
19+
val adminId: String,
20+
@Column(name = "password", length = 60, nullable = false)
21+
val password: String,
22+
) : BaseUUIDEntity(id)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.out.mapper
2+
3+
import hs.kr.entrydsm.user.domain.admin.adapter.out.AdminJpaEntity
4+
import hs.kr.entrydsm.user.domain.admin.model.Admin
5+
import hs.kr.entrydsm.user.global.mapper.GenericMapper
6+
import org.mapstruct.Mapper
7+
8+
/**
9+
* [Admin] 도메인 모델과 [AdminJpaEntity] JPA 엔티티 간의 변환을 담당하는 MapStruct 매퍼 클래스입니다.
10+
*/
11+
@Mapper(componentModel = "spring")
12+
abstract class AdminMapper : GenericMapper<AdminJpaEntity, Admin> {
13+
14+
/**
15+
* 도메인 모델 [Admin]을 JPA 엔티티 [AdminJpaEntity]로 변환합니다.
16+
*
17+
* @param model 변환할 도메인 모델
18+
* @return 변환된 JPA 엔티티
19+
*/
20+
abstract override fun toEntity(model: Admin): AdminJpaEntity
21+
22+
/**
23+
* JPA 엔티티 [AdminJpaEntity]를 도메인 모델 [Admin]로 변환합니다.
24+
*
25+
* @param entity 변환할 JPA 엔티티 (nullable)
26+
* @return 변환된 도메인 모델 (nullable)
27+
*/
28+
abstract override fun toModel(entity: AdminJpaEntity?): Admin?
29+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.out.persistence
2+
3+
import hs.kr.entrydsm.user.domain.admin.adapter.out.mapper.AdminMapper
4+
import hs.kr.entrydsm.user.domain.admin.adapter.out.persistence.repository.AdminRepository
5+
import hs.kr.entrydsm.user.domain.admin.application.port.out.AdminPort
6+
import hs.kr.entrydsm.user.domain.admin.model.Admin
7+
import org.springframework.data.repository.findByIdOrNull
8+
import org.springframework.stereotype.Component
9+
import java.util.UUID
10+
11+
/**
12+
* 관리자 데이터의 영속성 처리를 담당하는 어댑터 클래스입니다.
13+
*/
14+
@Component
15+
class AdminPersistenceAdapter(
16+
private val adminRepository: AdminRepository,
17+
private val adminMapper: AdminMapper,
18+
) : AdminPort {
19+
/**
20+
* UUID를 이용하여 관리자 정보를 조회합니다.
21+
*
22+
* @param id 조회할 관리자의 UUID
23+
* @return 조회된 관리자 정보, 존재하지 않을 경우 null
24+
*/
25+
override fun findById(id: UUID): Admin? {
26+
return adminRepository.findByIdOrNull(id)?.let { adminMapper.toModel(it) }
27+
}
28+
29+
/**
30+
* 관리자 ID를 이용하여 관리자 정보를 조회합니다.
31+
*
32+
* @param adminId 조회할 관리자의 ID
33+
* @return 조회된 관리자 정보, 존재하지 않을 경우 null
34+
*/
35+
override fun findByAdminId(adminId: String): Admin? {
36+
return adminRepository.findByAdminId(adminId)?.let { adminMapper.toModel(it) }
37+
}
38+
39+
/**
40+
* 관리자 정보를 저장합니다.
41+
*
42+
* @param admin 저장할 관리자 정보
43+
*/
44+
override fun save(admin: Admin) {
45+
adminRepository.save(adminMapper.toEntity(admin))
46+
}
47+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package hs.kr.entrydsm.user.domain.admin.adapter.out.persistence.repository
2+
3+
import hs.kr.entrydsm.user.domain.admin.adapter.out.AdminJpaEntity
4+
import org.springframework.data.jpa.repository.JpaRepository
5+
import java.util.UUID
6+
7+
/**
8+
* 관리자 JPA 엔티티에 대한 데이터 액세스를 담당하는 리포지토리 인터페이스입니다.
9+
*/
10+
interface AdminRepository : JpaRepository<AdminJpaEntity, UUID> {
11+
/**
12+
* 관리자 ID로 관리자를 조회합니다.
13+
*/
14+
fun findByAdminId(adminId: String): AdminJpaEntity?
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package hs.kr.entrydsm.user.domain.admin.application.port.`in`
2+
3+
import hs.kr.entrydsm.user.domain.admin.model.Admin
4+
5+
/**
6+
* 관리자 Facade 기능을 정의하는 UseCase 인터페이스입니다.
7+
*/
8+
interface AdminFacadeUseCase {
9+
/**
10+
* 현재 인증된 관리자의 사용자 정보를 조회합니다.
11+
*/
12+
fun getCurrentUser(): Admin
13+
14+
/**
15+
* 관리자 ID로 사용자 정보를 조회합니다.
16+
*/
17+
fun getUserById(adminId: String): Admin
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package hs.kr.entrydsm.user.domain.admin.application.port.`in`
2+
3+
import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.request.AdminLoginRequest
4+
import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse
5+
6+
/**
7+
* 관리자 로그인 유스케이스 인터페이스입니다.
8+
* 관리자 인증 및 토큰 발급 처리를 정의합니다.
9+
*/
10+
interface AdminLoginUseCase {
11+
/**
12+
* 관리자 로그인을 처리합니다.
13+
*
14+
* @param request 관리자 로그인 요청 정보
15+
* @return 생성된 인증 토큰 응답
16+
*/
17+
fun login(request: AdminLoginRequest): TokenResponse
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package hs.kr.entrydsm.user.domain.admin.application.port.`in`
2+
3+
import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse
4+
5+
/**
6+
* 관리자 토큰 갱신 기능을 정의하는 UseCase 인터페이스입니다.
7+
*/
8+
interface AdminTokenRefreshUseCase {
9+
/**
10+
* 관리자 토큰을 갱신합니다.
11+
*/
12+
fun refresh(token: String): TokenResponse
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package hs.kr.entrydsm.user.domain.admin.application.port.`in`
2+
3+
/**
4+
* 모든 테이블 삭제 기능을 정의하는 UseCase 인터페이스입니다.
5+
*/
6+
interface DeleteAllTableUseCase {
7+
/**
8+
* 모든 테이블을 삭제합니다.
9+
*/
10+
fun deleteAllTables()
11+
}

0 commit comments

Comments
 (0)