diff --git a/src/main/kotlin/gomushin/backend/core/oauth/handler/CustomSuccessHandler.kt b/src/main/kotlin/gomushin/backend/core/oauth/handler/CustomSuccessHandler.kt index 614c017..b8e9a4d 100644 --- a/src/main/kotlin/gomushin/backend/core/oauth/handler/CustomSuccessHandler.kt +++ b/src/main/kotlin/gomushin/backend/core/oauth/handler/CustomSuccessHandler.kt @@ -41,14 +41,14 @@ class CustomSuccessHandler( response!!.addCookie(createCookie("access_token", accessToken)) // response.sendRedirect("https://frontend-sarang.vercel.app") - response.sendRedirect("http://localhost:8080") + response.sendRedirect("http://localhost:5173") } private fun createCookie(key: String, value: String): Cookie { val cookie = Cookie(key, value) cookie.path = "/" cookie.isHttpOnly = true - cookie.secure = true + cookie.secure = false //Todo : 밋업 할 때는 true로 변경하기 cookie.maxAge = 1800 return cookie } diff --git a/src/main/kotlin/gomushin/backend/member/domain/entity/Member.kt b/src/main/kotlin/gomushin/backend/member/domain/entity/Member.kt index 9da0e76..adf38bd 100644 --- a/src/main/kotlin/gomushin/backend/member/domain/entity/Member.kt +++ b/src/main/kotlin/gomushin/backend/member/domain/entity/Member.kt @@ -43,7 +43,7 @@ class Member( var isCouple: Boolean = false, @Column(name = "emotion") - var emotion: String = "", + var emotion : Int? = null, @Column(name = "fcm_token", nullable = false) var fcmToken: String = "", @@ -74,4 +74,12 @@ class Member( fun updateCoupleStatus() { this.isCouple = !this.isCouple } + + fun updateEmotion(emotion: Int) { + this.emotion = emotion + } + + fun updateStatusMessage(statusMessage: String) { + this.statusMessage = statusMessage + } } diff --git a/src/main/kotlin/gomushin/backend/member/domain/service/MemberService.kt b/src/main/kotlin/gomushin/backend/member/domain/service/MemberService.kt index 7f3e0bd..7ffbcc2 100644 --- a/src/main/kotlin/gomushin/backend/member/domain/service/MemberService.kt +++ b/src/main/kotlin/gomushin/backend/member/domain/service/MemberService.kt @@ -3,6 +3,7 @@ package gomushin.backend.member.domain.service import gomushin.backend.core.infrastructure.exception.BadRequestException import gomushin.backend.member.domain.entity.Member import gomushin.backend.member.domain.repository.MemberRepository +import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -21,4 +22,11 @@ class MemberService( fun findById(id: Long): Member? { return memberRepository.findByIdOrNull(id) } + + @Transactional + fun updateMyEmotionAndStatusMessage(id: Long, updateMyEmotionAndStatusMessageRequest: UpdateMyEmotionAndStatusMessageRequest) { + val member = getById(id) + member.updateEmotion(updateMyEmotionAndStatusMessageRequest.emotion) + member.updateStatusMessage(updateMyEmotionAndStatusMessageRequest.statusMessage) + } } diff --git a/src/main/kotlin/gomushin/backend/member/dto/request/UpdateMyEmotionAndStatusMessageRequest.kt b/src/main/kotlin/gomushin/backend/member/dto/request/UpdateMyEmotionAndStatusMessageRequest.kt new file mode 100644 index 0000000..65d2504 --- /dev/null +++ b/src/main/kotlin/gomushin/backend/member/dto/request/UpdateMyEmotionAndStatusMessageRequest.kt @@ -0,0 +1,13 @@ +package gomushin.backend.member.dto.request + +import io.swagger.v3.oas.annotations.media.Schema + + +data class UpdateMyEmotionAndStatusMessageRequest( + @Schema(description = "이모지(1 : 보고싶어요, 2: 기분 좋아요, 3 : 아무느낌 없어요, " + + "4 : 피곤해요, 5: 서운해요, 6 : 걱정돼요, 7 : 짜증나요)", example = "1") + val emotion : Int, + + @Schema(description = "상태 메시지", example = "보고 싶어요") + val statusMessage : String +) diff --git a/src/main/kotlin/gomushin/backend/member/dto/response/MyStatusMessageResponse.kt b/src/main/kotlin/gomushin/backend/member/dto/response/MyStatusMessageResponse.kt new file mode 100644 index 0000000..f210fdb --- /dev/null +++ b/src/main/kotlin/gomushin/backend/member/dto/response/MyStatusMessageResponse.kt @@ -0,0 +1,13 @@ +package gomushin.backend.member.dto.response + +import gomushin.backend.member.domain.entity.Member + +data class MyStatusMessageResponse ( + val statusMessage : String? +) { + companion object { + fun of(member: Member) = MyStatusMessageResponse( + member.statusMessage + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gomushin/backend/member/facade/MemberInfoFacade.kt b/src/main/kotlin/gomushin/backend/member/facade/MemberInfoFacade.kt index 9fcc9a6..98cae42 100644 --- a/src/main/kotlin/gomushin/backend/member/facade/MemberInfoFacade.kt +++ b/src/main/kotlin/gomushin/backend/member/facade/MemberInfoFacade.kt @@ -2,7 +2,9 @@ package gomushin.backend.member.facade import gomushin.backend.core.CustomUserDetails import gomushin.backend.member.domain.service.MemberService +import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest import gomushin.backend.member.dto.response.MyInfoResponse +import gomushin.backend.member.dto.response.MyStatusMessageResponse import org.springframework.stereotype.Component @Component @@ -13,4 +15,12 @@ class MemberInfoFacade( val member = memberService.getById(customUserDetails.getId()) return MyInfoResponse.of(member) } + + fun getMyStatusMessage(customUserDetails: CustomUserDetails): MyStatusMessageResponse { + val member = memberService.getById(customUserDetails.getId()) + return MyStatusMessageResponse.of(member) + } + + fun updateMyEmotionAndStatusMessage(customUserDetails: CustomUserDetails, updateMyEmotionAndStatusMessageRequest: UpdateMyEmotionAndStatusMessageRequest) + = memberService.updateMyEmotionAndStatusMessage(customUserDetails.getId(), updateMyEmotionAndStatusMessageRequest) } diff --git a/src/main/kotlin/gomushin/backend/member/presentation/ApiPath.kt b/src/main/kotlin/gomushin/backend/member/presentation/ApiPath.kt index 6f8e66b..e6dd080 100644 --- a/src/main/kotlin/gomushin/backend/member/presentation/ApiPath.kt +++ b/src/main/kotlin/gomushin/backend/member/presentation/ApiPath.kt @@ -3,4 +3,6 @@ package gomushin.backend.member.presentation object ApiPath { const val ONBOARDING = "/v1/member/onboarding" const val MY_INFO = "/v1/member/my-info" + const val MY_STATUS_MESSAGE = "/v1/member/my-status-message" + const val UPDATE_MY_EMOTION_AND_STATUS_MESSAGE = "/v1/member/my-emotion-and-status-message" } diff --git a/src/main/kotlin/gomushin/backend/member/presentation/MemberInfoController.kt b/src/main/kotlin/gomushin/backend/member/presentation/MemberInfoController.kt index ab02f14..0801b24 100644 --- a/src/main/kotlin/gomushin/backend/member/presentation/MemberInfoController.kt +++ b/src/main/kotlin/gomushin/backend/member/presentation/MemberInfoController.kt @@ -2,13 +2,21 @@ package gomushin.backend.member.presentation import gomushin.backend.core.CustomUserDetails import gomushin.backend.core.common.web.response.ApiResponse +import gomushin.backend.core.infrastructure.exception.BadRequestException +import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest import gomushin.backend.member.facade.MemberInfoFacade import gomushin.backend.member.dto.response.MyInfoResponse +import gomushin.backend.member.dto.response.MyStatusMessageResponse import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.tags.Tag +import jakarta.validation.Valid import org.springframework.http.HttpStatus import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.validation.BindingResult +import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.ResponseStatus import org.springframework.web.bind.annotation.RestController @@ -27,4 +35,25 @@ class MemberInfoController( val member = memberInfoFacade.getMemberInfo(customUserDetails) return ApiResponse.success(member) } + + @ResponseStatus(HttpStatus.OK) + @GetMapping(ApiPath.MY_STATUS_MESSAGE) + @Operation(summary = "내 상태 메시지 조회", description = "getMyStatusMessage") + fun getMyStatusMessage( + @AuthenticationPrincipal customUserDetails: CustomUserDetails + ): ApiResponse { + val statusMessage = memberInfoFacade.getMyStatusMessage(customUserDetails) + return ApiResponse.success(statusMessage) + } + + @ResponseStatus(HttpStatus.OK) + @PostMapping(ApiPath.UPDATE_MY_EMOTION_AND_STATUS_MESSAGE) + @Operation(summary = "내 상태 이모지 및 상태 메시지 저장", description = "updateMyEmotionAndStatusMessage") + fun updateMyEmotionAndStatusMessage( + @AuthenticationPrincipal customUserDetails: CustomUserDetails, + @RequestBody updateMyEmotionAndStatusMessageRequest: UpdateMyEmotionAndStatusMessageRequest + ): ApiResponse { + memberInfoFacade.updateMyEmotionAndStatusMessage(customUserDetails, updateMyEmotionAndStatusMessageRequest) + return ApiResponse.success(true) + } } diff --git a/src/test/kotlin/gomushin/backend/member/domain/service/MemberServiceTest.kt b/src/test/kotlin/gomushin/backend/member/domain/service/MemberServiceTest.kt index 2d0f017..cc2e1c7 100644 --- a/src/test/kotlin/gomushin/backend/member/domain/service/MemberServiceTest.kt +++ b/src/test/kotlin/gomushin/backend/member/domain/service/MemberServiceTest.kt @@ -4,6 +4,7 @@ import gomushin.backend.member.domain.entity.Member import gomushin.backend.member.domain.repository.MemberRepository import gomushin.backend.member.domain.value.Provider import gomushin.backend.member.domain.value.Role +import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -46,4 +47,30 @@ class MemberServiceTest { // then assertEquals(expectedMember, result) } + + @DisplayName("이모지 및 상태 메시지 업데이트 - 성공") + @Test + fun updateMyEmotionAndStatusMessage() { + // given + val memberId = 1L + val expectedMember = Member( + id = 1L, + name = "테스트", + nickname = "테스트 닉네임", + email = "test@test.com", + birthDate = null, + profileImageUrl = null, + provider = Provider.KAKAO, + role = Role.GUEST, + emotion = 1, + statusMessage = "상태 변경전" + ) + val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(2, "상태 변경후") + //when + `when`(memberRepository.findById(memberId)).thenReturn(Optional.of(expectedMember)) + val result = memberService.updateMyEmotionAndStatusMessage(memberId, updateMyEmotionAndStatusMessageRequest) + //then + assertEquals(expectedMember.emotion, updateMyEmotionAndStatusMessageRequest.emotion) + assertEquals(expectedMember.statusMessage, updateMyEmotionAndStatusMessageRequest.statusMessage) + } } diff --git a/src/test/kotlin/gomushin/backend/member/facade/MemberInfoFacadeTest.kt b/src/test/kotlin/gomushin/backend/member/facade/MemberInfoFacadeTest.kt index d7610c3..3cd03cc 100644 --- a/src/test/kotlin/gomushin/backend/member/facade/MemberInfoFacadeTest.kt +++ b/src/test/kotlin/gomushin/backend/member/facade/MemberInfoFacadeTest.kt @@ -5,6 +5,7 @@ import gomushin.backend.member.domain.entity.Member import gomushin.backend.member.domain.service.MemberService import gomushin.backend.member.domain.value.Provider import gomushin.backend.member.domain.value.Role +import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -37,6 +38,7 @@ class MemberInfoFacadeTest { profileImageUrl = null, provider = Provider.KAKAO, role = Role.MEMBER, + statusMessage = "상태 메시지" ) customUserDetails = mock(CustomUserDetails::class.java) @@ -56,4 +58,27 @@ class MemberInfoFacadeTest { verify(memberService).getById(1L) assertEquals(member.nickname, result.nickname) } + + @DisplayName("내 상태 메시지 조회") + @Test + fun getMyStatusMessage() { + //given + `when`(memberService.getById(customUserDetails.getId())).thenReturn(member) + //when + val result = memberInfoFacade.getMyStatusMessage(customUserDetails) + //then + verify(memberService).getById(1L) + assertEquals(member.statusMessage, result.statusMessage) + } + + @DisplayName("이모지 및 상태 메시지 업데이트") + @Test + fun updateMyEmotionAndStatusMessage() { + //given + val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(1, "좋은 날씨야") + //when + val result = memberInfoFacade.updateMyEmotionAndStatusMessage(customUserDetails, updateMyEmotionAndStatusMessageRequest) + //then + verify(memberService).updateMyEmotionAndStatusMessage(1L, updateMyEmotionAndStatusMessageRequest) + } }