diff --git a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/dto/NoticeResponse.kt b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/dto/NoticeResponse.kt index 12b972f35..b0f527add 100644 --- a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/dto/NoticeResponse.kt +++ b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/dto/NoticeResponse.kt @@ -37,3 +37,17 @@ data class NoticesResponse( data class NoticeIdResponse( val noticeId: UUID ) + +data class LatestNoticeResponse( + val id: UUID, + val title: String +) { + companion object { + fun of(notice: Notice): LatestNoticeResponse { + return LatestNoticeResponse( + id = notice.id, + title = notice.title + ) + } + } +} diff --git a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeService.kt b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeService.kt index 22187d784..64fc9b170 100644 --- a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeService.kt +++ b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeService.kt @@ -8,6 +8,8 @@ interface GetNoticeService { fun getAllNoticesBySchoolIdAndOrder(schoolId: UUID, orderType: OrderType): List + fun getLatestNoticeBySchoolId(schoolId: UUID): Notice? + fun getNoticeById(noticeId: UUID): Notice fun getNoticeByIdAndManagerId(noticeId: UUID, managerId: UUID): Notice diff --git a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeServiceImpl.kt b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeServiceImpl.kt index 7b38f4ecc..230480da1 100644 --- a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeServiceImpl.kt +++ b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/service/GetNoticeServiceImpl.kt @@ -16,6 +16,10 @@ class GetNoticeServiceImpl( return queryNoticePort.queryAllNoticesBySchoolIdAndOrder(schoolId, orderType) } + override fun getLatestNoticeBySchoolId(schoolId: UUID): Notice? { + return queryNoticePort.queryLatestNoticeBySchoolId(schoolId) + } + override fun getNoticeById(noticeId: UUID): Notice { return queryNoticePort.queryNoticeById(noticeId) ?: throw NoticeNotFoundException diff --git a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/spi/QueryNoticePort.kt b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/spi/QueryNoticePort.kt index a50566de4..dac2f8c04 100644 --- a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/spi/QueryNoticePort.kt +++ b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/spi/QueryNoticePort.kt @@ -13,5 +13,7 @@ interface QueryNoticePort { fun queryAllNoticesBySchoolIdAndOrder(schoolId: UUID, orderType: OrderType): List + fun queryLatestNoticeBySchoolId(schoolId: UUID): Notice? + fun queryNoticeByIdAndManagerId(noticeId: UUID, managerId: UUID): Notice? } diff --git a/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/usecase/QueryLatestNoticeUseCase.kt b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/usecase/QueryLatestNoticeUseCase.kt new file mode 100644 index 000000000..faa3ee46d --- /dev/null +++ b/dms-main/main-core/src/main/kotlin/team/aliens/dms/domain/notice/usecase/QueryLatestNoticeUseCase.kt @@ -0,0 +1,20 @@ +package team.aliens.dms.domain.notice.usecase + +import team.aliens.dms.common.annotation.ReadOnlyUseCase +import team.aliens.dms.domain.notice.dto.LatestNoticeResponse +import team.aliens.dms.domain.notice.service.NoticeService +import team.aliens.dms.domain.user.service.UserService + +@ReadOnlyUseCase +class QueryLatestNoticeUseCase( + private val userService: UserService, + private val noticeService: NoticeService +) { + + fun execute(): LatestNoticeResponse? { + val user = userService.getCurrentUser() + val latestNotice = noticeService.getLatestNoticeBySchoolId(user.schoolId) + + return latestNotice?.let { LatestNoticeResponse.of(it) } + } +} diff --git a/dms-main/main-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt b/dms-main/main-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt index 7bd86ddf2..b1d42aa73 100644 --- a/dms-main/main-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt +++ b/dms-main/main-infrastructure/src/main/kotlin/team/aliens/dms/global/security/SecurityConfig.kt @@ -84,6 +84,7 @@ class SecurityConfig( authorize // /notices + .requestMatchers(HttpMethod.GET, "/notices/latest").hasAnyAuthority(STUDENT.name, MANAGER.name) .requestMatchers(HttpMethod.GET, "/notices/status").hasAuthority(STUDENT.name) .requestMatchers(HttpMethod.GET, "/notices").hasAnyAuthority(STUDENT.name, MANAGER.name) .requestMatchers(HttpMethod.GET, "/notices/{notice-id}").hasAnyAuthority(STUDENT.name, MANAGER.name) diff --git a/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/NoticePersistenceAdapter.kt b/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/NoticePersistenceAdapter.kt index aa1231dae..d228ffde4 100644 --- a/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/NoticePersistenceAdapter.kt +++ b/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/NoticePersistenceAdapter.kt @@ -37,6 +37,10 @@ class NoticePersistenceAdapter( } } + override fun queryLatestNoticeBySchoolId(schoolId: UUID) = noticeMapper.toDomain( + noticeRepository.findFirstByManagerUserSchoolIdOrderByCreatedAtDesc(schoolId) + ) + override fun queryNoticeByIdAndManagerId(noticeId: UUID, managerId: UUID) = noticeMapper.toDomain( noticeRepository.findByIdAndManagerUserId(noticeId, managerId) ) diff --git a/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/repository/NoticeJpaRepository.kt b/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/repository/NoticeJpaRepository.kt index 50b7130c3..e5bccd30a 100644 --- a/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/repository/NoticeJpaRepository.kt +++ b/dms-main/main-persistence/src/main/kotlin/team/aliens/dms/persistence/notice/repository/NoticeJpaRepository.kt @@ -16,5 +16,7 @@ interface NoticeJpaRepository : JpaRepository { fun findAllByManagerUserSchoolIdOrderByCreatedAtDesc(schoolId: UUID): List + fun findFirstByManagerUserSchoolIdOrderByCreatedAtDesc(schoolId: UUID): NoticeJpaEntity? + fun findByIdAndManagerUserId(id: UUID, managerId: UUID): NoticeJpaEntity? } diff --git a/dms-main/main-presentation/src/main/kotlin/team/aliens/dms/domain/notice/NoticeWebAdapter.kt b/dms-main/main-presentation/src/main/kotlin/team/aliens/dms/domain/notice/NoticeWebAdapter.kt index 618d6ac0c..d1da5a248 100644 --- a/dms-main/main-presentation/src/main/kotlin/team/aliens/dms/domain/notice/NoticeWebAdapter.kt +++ b/dms-main/main-presentation/src/main/kotlin/team/aliens/dms/domain/notice/NoticeWebAdapter.kt @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.ResponseStatus import org.springframework.web.bind.annotation.RestController +import team.aliens.dms.domain.notice.dto.LatestNoticeResponse import team.aliens.dms.domain.notice.dto.NoticeIdResponse import team.aliens.dms.domain.notice.dto.NoticeResponse import team.aliens.dms.domain.notice.dto.NoticesResponse @@ -23,6 +24,7 @@ import team.aliens.dms.domain.notice.dto.request.WebOrderType import team.aliens.dms.domain.notice.dto.response.GetNoticeStatusResponse import team.aliens.dms.domain.notice.usecase.CreateNoticeUseCase import team.aliens.dms.domain.notice.usecase.QueryAllNoticesUseCase +import team.aliens.dms.domain.notice.usecase.QueryLatestNoticeUseCase import team.aliens.dms.domain.notice.usecase.QueryNoticeDetailsUseCase import team.aliens.dms.domain.notice.usecase.QueryNoticeStatusUseCase import team.aliens.dms.domain.notice.usecase.RemoveNoticeUseCase @@ -36,6 +38,7 @@ class NoticeWebAdapter( private val queryNoticeStatusUseCase: QueryNoticeStatusUseCase, private val queryNoticeDetailsUseCase: QueryNoticeDetailsUseCase, private val queryAllNoticesUseCase: QueryAllNoticesUseCase, + private val queryLatestNoticeUseCase: QueryLatestNoticeUseCase, private val removeNoticeUseCase: RemoveNoticeUseCase, private val updateNoticeUseCase: UpdateNoticeUseCase, private val createNoticeUseCase: CreateNoticeUseCase @@ -48,6 +51,11 @@ class NoticeWebAdapter( return GetNoticeStatusResponse(result) } + @GetMapping("/latest") + fun getLatestNotice(): LatestNoticeResponse? { + return queryLatestNoticeUseCase.execute() + } + @GetMapping("/{notice-id}") fun getDetails(@PathVariable("notice-id") @NotNull noticeId: UUID): NoticeResponse { return queryNoticeDetailsUseCase.execute(noticeId)