diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt index 6bbec6a..f9aa17c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.member import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.login.LoginRequest +import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping @@ -34,4 +35,14 @@ class MemberController(private val service: MemberService) { ApiResponse.ok(service.getMemberInfo(member, container ?: "web")) } + + @PostMapping("/notification") + fun updateNotificationSettings( + @RequestBody request: UpdateNotificationSettingRequest, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.updateNotificationSettings(request, member)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 263db54..55ed5d6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -9,6 +9,8 @@ import kr.co.vividnext.sodalive.jwt.TokenProvider import kr.co.vividnext.sodalive.member.info.GetMemberInfoResponse import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginResponse +import kr.co.vividnext.sodalive.member.notification.MemberNotificationService +import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest import kr.co.vividnext.sodalive.member.signUp.SignUpRequest import kr.co.vividnext.sodalive.member.stipulation.Stipulation import kr.co.vividnext.sodalive.member.stipulation.StipulationAgree @@ -36,6 +38,8 @@ class MemberService( private val stipulationRepository: StipulationRepository, private val stipulationAgreeRepository: StipulationAgreeRepository, + private val memberNotificationService: MemberNotificationService, + private val s3Uploader: S3Uploader, private val validator: SignUpValidator, private val tokenProvider: TokenProvider, @@ -92,6 +96,16 @@ class MemberService( ) } + @Transactional + fun updateNotificationSettings(request: UpdateNotificationSettingRequest, member: Member) { + memberNotificationService.updateNotification( + live = request.live, + uploadContent = request.uploadContent, + message = request.message, + member = member + ) + } + private fun login( email: String, password: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationRepository.kt new file mode 100644 index 0000000..6d461d9 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationRepository.kt @@ -0,0 +1,25 @@ +package kr.co.vividnext.sodalive.member.notification + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.member.notification.QMemberNotification.memberNotification +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +@Repository +interface MemberNotificationRepository : JpaRepository, MemberNotificationQueryRepository + +interface MemberNotificationQueryRepository { + fun getMemberNotification(memberId: Long): MemberNotification? +} + +@Repository +class MemberNotificationQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory +) : MemberNotificationQueryRepository { + override fun getMemberNotification(memberId: Long): MemberNotification? { + return queryFactory + .selectFrom(memberNotification) + .where(memberNotification.member.id.eq(memberId)) + .fetchFirst() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationService.kt new file mode 100644 index 0000000..d46fc53 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/MemberNotificationService.kt @@ -0,0 +1,27 @@ +package kr.co.vividnext.sodalive.member.notification + +import kr.co.vividnext.sodalive.member.Member +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional(readOnly = true) +class MemberNotificationService(private val repository: MemberNotificationRepository) { + fun updateNotification( + live: Boolean? = null, + uploadContent: Boolean? = null, + message: Boolean? = null, + member: Member + ) { + var notification = repository.getMemberNotification(memberId = member.id!!) + if (notification == null) { + notification = MemberNotification(uploadContent, live, message) + notification.member = member + repository.save(notification) + } else { + if (live != null) notification.live = live + if (message != null) notification.message = message + if (uploadContent != null) notification.uploadContent = uploadContent + } + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/UpdateNotificationSettingRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/UpdateNotificationSettingRequest.kt new file mode 100644 index 0000000..e9bc210 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/notification/UpdateNotificationSettingRequest.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.member.notification + +data class UpdateNotificationSettingRequest( + val live: Boolean?, + val message: Boolean?, + val uploadContent: Boolean? +)