Skip to content
This repository has been archived by the owner on Dec 7, 2024. It is now read-only.

Commit

Permalink
Merge pull request #318 from GSM-MSG/314-feat/notification-detail-api
Browse files Browse the repository at this point in the history
🔀 :: 314 공지사항 상세 조회 API
  • Loading branch information
KimTaeO authored Apr 4, 2024
2 parents 25d48f7 + 8865afe commit 0962bf5
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@
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.NoticeListDto
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")
class NoticeController(
private val createNoticeService: CreateNoticeService,
private val noticeConverter: NoticeConverter,
private val deleteNoticeService: DeleteNoticeService,
private val findNoticeDetailService: FindNoticeDetailService,
private val noticeListService: NoticeListService
) {
@PostMapping("/{club_id}")
Expand All @@ -40,11 +38,17 @@ class NoticeController(
deleteNoticeService.execute(id)
.let { ResponseEntity.status(HttpStatus.NO_CONTENT).build() }

@GetMapping("/{id}")
fun findNoticeDetail(
@PathVariable id: Long
): ResponseEntity<FindNoticeDetailResponseDto> =
findNoticeDetailService.execute(id)
.let { ResponseEntity.status(HttpStatus.OK).body(it) }

@GetMapping("/{club_id}/all")
fun noticeList(
@PathVariable("club_id") clubId: Long
): ResponseEntity<NoticeListResponseDto> =
noticeListService.execute(clubId)
.let { ResponseEntity.ok().body(noticeConverter.toResponse(it)) }

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.msg.gcms.domain.notice.presentation.data.response

import java.time.LocalDateTime

data class FindNoticeDetailResponseDto(
val title: String,
val content : String,
val username : String,
val userProfileImg : String?,
val createdAt : LocalDateTime
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.msg.gcms.domain.notice.service

import com.msg.gcms.domain.notice.presentation.data.response.FindNoticeDetailResponseDto

interface FindNoticeDetailService {
fun execute(id: Long): FindNoticeDetailResponseDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.msg.gcms.domain.notice.service.impl

import com.msg.gcms.domain.auth.domain.Role
import com.msg.gcms.domain.club.exception.HeadNotSameException
import com.msg.gcms.domain.notice.domain.repository.NoticeRepository
import com.msg.gcms.domain.notice.exception.NoticeNotFoundException
import com.msg.gcms.domain.notice.presentation.data.response.FindNoticeDetailResponseDto
import com.msg.gcms.domain.notice.service.FindNoticeDetailService
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 FindNoticeDetailServiceImpl(
private val userUtil: UserUtil,
private val noticeRepository: NoticeRepository,
private val noticeConverter: NoticeConverter
) : FindNoticeDetailService {
override fun execute(id: Long): FindNoticeDetailResponseDto {
val currentUser = userUtil.fetchCurrentUser()

val notice = noticeRepository.findByIdOrNull(id) ?: throw NoticeNotFoundException()

if (notice.club.user != currentUser && currentUser.roles[0] != Role.ROLE_ADMIN)
throw HeadNotSameException()

return noticeConverter.toResponse(notice)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ import com.msg.gcms.domain.club.domain.entity.Club
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.msg.gcms.domain.club.domain.entity.Club
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
Expand All @@ -17,6 +18,14 @@ class NoticeConverterImpl : NoticeConverter {
content = requestDto.content
)

override fun toResponse(notice: Notice): FindNoticeDetailResponseDto = FindNoticeDetailResponseDto(
title = notice.title,
content = notice.content,
username = notice.user.nickname,
userProfileImg = notice.user.profileImg,
createdAt = notice.createdAt
)

override fun toDto(entity: Notice): NoticeListDto.NoticeResponseDto = NoticeListDto.NoticeResponseDto(
id = entity.id,
title = entity.title,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class SecurityConfig(
.antMatchers(HttpMethod.GET, "/attend/excel").hasRole("ADMIN")

.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()

Expand Down

0 comments on commit 0962bf5

Please sign in to comment.