diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c2c0c657..b4c74ea3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @louis7308 @Huuuunee @dolong2 @yoonjibin @KimTaeO @JuuuuHong @ani2689 \ No newline at end of file +* @louis7308 @Huuuunee @dolong2 @yoonjibin @KimTaeO @ani2689 @ta2ye0n \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/domain/repository/NoticeRepository.kt b/src/main/kotlin/com/msg/gcms/domain/notice/domain/repository/NoticeRepository.kt index d3429a5b..631d568a 100644 --- a/src/main/kotlin/com/msg/gcms/domain/notice/domain/repository/NoticeRepository.kt +++ b/src/main/kotlin/com/msg/gcms/domain/notice/domain/repository/NoticeRepository.kt @@ -1,6 +1,9 @@ package com.msg.gcms.domain.notice.domain.repository +import com.msg.gcms.domain.club.domain.entity.Club import com.msg.gcms.domain.notice.domain.entity.Notice import org.springframework.data.repository.CrudRepository -interface NoticeRepository : CrudRepository \ No newline at end of file +interface NoticeRepository : CrudRepository { + fun findByClub (club: Club): List +} \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/presentation/NoticeController.kt b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/NoticeController.kt index b6e91cc9..2fc5c1ba 100644 --- a/src/main/kotlin/com/msg/gcms/domain/notice/presentation/NoticeController.kt +++ b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/NoticeController.kt @@ -2,18 +2,16 @@ package com.msg.gcms.domain.notice.presentation import com.msg.gcms.domain.notice.presentation.data.request.CreateNoticeRequestDto import com.msg.gcms.domain.notice.presentation.data.response.FindNoticeDetailResponseDto +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListResponseDto import com.msg.gcms.domain.notice.service.CreateNoticeService import com.msg.gcms.domain.notice.service.DeleteNoticeService import com.msg.gcms.domain.notice.service.FindNoticeDetailService +import com.msg.gcms.domain.notice.service.NoticeListService import com.msg.gcms.domain.notice.utils.NoticeConverter import com.msg.gcms.global.annotation.RequestController import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.DeleteMapping -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.* import javax.validation.Valid @RequestController("/notification") @@ -21,7 +19,8 @@ class NoticeController( private val createNoticeService: CreateNoticeService, private val noticeConverter: NoticeConverter, private val deleteNoticeService: DeleteNoticeService, - private val findNoticeDetailService: FindNoticeDetailService + private val findNoticeDetailService: FindNoticeDetailService, + private val noticeListService: NoticeListService ) { @PostMapping("/{club_id}") fun createNotice( @@ -46,4 +45,10 @@ class NoticeController( findNoticeDetailService.execute(id) .let { ResponseEntity.status(HttpStatus.OK).body(it) } + @GetMapping("/{club_id}/all") + fun noticeList( + @PathVariable("club_id") clubId: Long + ): ResponseEntity = + noticeListService.execute(clubId) + .let { ResponseEntity.ok().body(noticeConverter.toResponse(it)) } } \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListDto.kt b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListDto.kt new file mode 100644 index 00000000..5204987c --- /dev/null +++ b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListDto.kt @@ -0,0 +1,14 @@ +package com.msg.gcms.domain.notice.presentation.data.response + +import java.time.LocalDateTime + +data class NoticeListDto( + val notices: List +) { + data class NoticeResponseDto( + val id: Long, + val title: String, + val username: String, + val createdAt: LocalDateTime + ) +} diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListResponseDto.kt b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListResponseDto.kt new file mode 100644 index 00000000..6fabe6a1 --- /dev/null +++ b/src/main/kotlin/com/msg/gcms/domain/notice/presentation/data/response/NoticeListResponseDto.kt @@ -0,0 +1,5 @@ +package com.msg.gcms.domain.notice.presentation.data.response + +data class NoticeListResponseDto( + val notices: List +) diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/service/NoticeListService.kt b/src/main/kotlin/com/msg/gcms/domain/notice/service/NoticeListService.kt new file mode 100644 index 00000000..c89f2968 --- /dev/null +++ b/src/main/kotlin/com/msg/gcms/domain/notice/service/NoticeListService.kt @@ -0,0 +1,7 @@ +package com.msg.gcms.domain.notice.service + +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListDto + +interface NoticeListService { + fun execute(clubId: Long): NoticeListDto +} \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/service/impl/NoticeListServiceImpl.kt b/src/main/kotlin/com/msg/gcms/domain/notice/service/impl/NoticeListServiceImpl.kt new file mode 100644 index 00000000..a2c81fa8 --- /dev/null +++ b/src/main/kotlin/com/msg/gcms/domain/notice/service/impl/NoticeListServiceImpl.kt @@ -0,0 +1,38 @@ +package com.msg.gcms.domain.notice.service.impl + +import com.msg.gcms.domain.auth.domain.Role +import com.msg.gcms.domain.club.domain.repository.ClubRepository +import com.msg.gcms.domain.club.exception.ClubNotFoundException +import com.msg.gcms.domain.club.exception.NotClubMemberException +import com.msg.gcms.domain.notice.domain.repository.NoticeRepository +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListDto +import com.msg.gcms.domain.notice.service.NoticeListService +import com.msg.gcms.domain.notice.utils.NoticeConverter +import com.msg.gcms.global.annotation.ServiceWithReadOnlyTransaction +import com.msg.gcms.global.util.UserUtil +import org.springframework.data.repository.findByIdOrNull + +@ServiceWithReadOnlyTransaction +class NoticeListServiceImpl( + private val noticeRepository: NoticeRepository, + private val clubRepository: ClubRepository, + private val noticeConverter: NoticeConverter, + private val userUtil: UserUtil +) : NoticeListService { + override fun execute(clubId: Long): NoticeListDto { + val user = userUtil.fetchCurrentUser() + val club = clubRepository.findByIdOrNull(clubId) + ?: throw ClubNotFoundException() + + if (user.roles[0] == Role.ROLE_STUDENT) { + if (!user.club.contains(club)) { + throw NotClubMemberException() + } + } + + val notices = noticeRepository.findByClub(club) + .map { noticeConverter.toDto(it) } + + return noticeConverter.toListDto(notices) + } +} diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/utils/NoticeConverter.kt b/src/main/kotlin/com/msg/gcms/domain/notice/utils/NoticeConverter.kt index fdc9bff9..46a86960 100644 --- a/src/main/kotlin/com/msg/gcms/domain/notice/utils/NoticeConverter.kt +++ b/src/main/kotlin/com/msg/gcms/domain/notice/utils/NoticeConverter.kt @@ -5,10 +5,18 @@ import com.msg.gcms.domain.notice.domain.entity.Notice import com.msg.gcms.domain.notice.presentation.data.dto.NoticeDto import com.msg.gcms.domain.notice.presentation.data.request.CreateNoticeRequestDto import com.msg.gcms.domain.notice.presentation.data.response.FindNoticeDetailResponseDto +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListDto +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListResponseDto import com.msg.gcms.domain.user.domain.entity.User interface NoticeConverter { fun toDto(requestDto: CreateNoticeRequestDto): NoticeDto fun toResponse(notice: Notice): FindNoticeDetailResponseDto fun toEntity(dto: NoticeDto, user: User, club: Club): Notice + + fun toDto(entity: Notice): NoticeListDto.NoticeResponseDto + + fun toListDto(dto: List): NoticeListDto + + fun toResponse(dto: NoticeListDto): NoticeListResponseDto } \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/domain/notice/utils/impl/NoticeConverterImpl.kt b/src/main/kotlin/com/msg/gcms/domain/notice/utils/impl/NoticeConverterImpl.kt index 8607715b..a65f35dc 100644 --- a/src/main/kotlin/com/msg/gcms/domain/notice/utils/impl/NoticeConverterImpl.kt +++ b/src/main/kotlin/com/msg/gcms/domain/notice/utils/impl/NoticeConverterImpl.kt @@ -5,6 +5,8 @@ import com.msg.gcms.domain.notice.domain.entity.Notice import com.msg.gcms.domain.notice.presentation.data.dto.NoticeDto import com.msg.gcms.domain.notice.presentation.data.request.CreateNoticeRequestDto import com.msg.gcms.domain.notice.presentation.data.response.FindNoticeDetailResponseDto +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListDto +import com.msg.gcms.domain.notice.presentation.data.response.NoticeListResponseDto import com.msg.gcms.domain.notice.utils.NoticeConverter import com.msg.gcms.domain.user.domain.entity.User import org.springframework.stereotype.Component @@ -24,6 +26,13 @@ class NoticeConverterImpl : NoticeConverter { createdAt = notice.createdAt ) + override fun toDto(entity: Notice): NoticeListDto.NoticeResponseDto = NoticeListDto.NoticeResponseDto( + id = entity.id, + title = entity.title, + username = entity.user.nickname, + createdAt = entity.createdAt + ) + override fun toEntity(dto: NoticeDto, user: User, club: Club): Notice = Notice( id = dto.id, title = dto.title, @@ -32,4 +41,14 @@ class NoticeConverterImpl : NoticeConverter { user = user, club = club ) + + override fun toListDto(dto: List): NoticeListDto = + NoticeListDto( + notices = dto + ) + + override fun toResponse(dto: NoticeListDto): NoticeListResponseDto = + NoticeListResponseDto( + notices = dto.notices + ) } \ No newline at end of file diff --git a/src/main/kotlin/com/msg/gcms/global/security/SecurityConfig.kt b/src/main/kotlin/com/msg/gcms/global/security/SecurityConfig.kt index 478c6cd8..0a234040 100644 --- a/src/main/kotlin/com/msg/gcms/global/security/SecurityConfig.kt +++ b/src/main/kotlin/com/msg/gcms/global/security/SecurityConfig.kt @@ -49,6 +49,7 @@ class SecurityConfig( .antMatchers(HttpMethod.POST, "/notification/{club_id}").authenticated() .antMatchers(HttpMethod.GET, "/notification/{id}").authenticated() .antMatchers(HttpMethod.DELETE, "/notification/{id}").authenticated() + .antMatchers(HttpMethod.GET, "/notification/{club_id}/all").authenticated() .antMatchers(HttpMethod.GET, "/club-member/{club_id}").authenticated() .antMatchers(HttpMethod.POST, "/club-member/{club_id}").authenticated()