diff --git a/src/main/java/com/petlog/auth/service/TokenService.java b/src/main/java/com/petlog/auth/service/TokenService.java index b693adc..2edeaf1 100644 --- a/src/main/java/com/petlog/auth/service/TokenService.java +++ b/src/main/java/com/petlog/auth/service/TokenService.java @@ -4,7 +4,7 @@ import com.petlog.auth.repository.RefreshTokenRepository; import com.petlog.common.config.jwt.TokenProvider; import com.petlog.member.entity.Member; -import com.petlog.member.service.MemberService; +import com.petlog.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; @@ -23,24 +23,32 @@ public class TokenService { private static final int ONE_MONTH_HOURS = 24 * 30; private final TokenProvider tokenProvider; - private final MemberService memberService; private final RefreshTokenRepository refreshTokenRepository; + private final MemberRepository memberRepository; + @Transactional(readOnly = true) @Profile("local") public String generateLocalAccessToken(final Long memberId) { - final Member member = memberService.getMember(memberId); + final Member member = getMember(memberId); return tokenProvider.generateAccessToken(member, Duration.ofHours(ONE_YEAR_HOURS)); } + private Member getMember(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); + } + + @Transactional(readOnly = true) public String generateAccessToken(final Long memberId) { - final Member member = memberService.getMember(memberId); + final Member member = getMember(memberId); return tokenProvider.generateAccessToken(member, Duration.ofHours(ONE_HOUR)); } + @Transactional public String generateRefreshToken(final Long memberId) { - final Member member = memberService.getMember(memberId); + final Member member = getMember(memberId); final String refreshToken = tokenProvider.generateRefreshToken(member, Duration.ofHours(ONE_MONTH_HOURS)); refreshTokenRepository.save(new RefreshToken(member, refreshToken)); @@ -48,6 +56,7 @@ public String generateRefreshToken(final Long memberId) { return refreshToken; } + @Transactional(readOnly = true) public String reissueAccessToken(final String refreshToken) { if(!tokenProvider.validToken(refreshToken)) { @@ -55,7 +64,7 @@ public String reissueAccessToken(final String refreshToken) { } final Long memberId = getRefreshToken(refreshToken).getMember().getId(); - final Member member = memberService.getMember(memberId); + final Member member = getMember(memberId); return tokenProvider.generateAccessToken(member, Duration.ofHours(EXPIRED_AT_HOURS)); } diff --git a/src/main/java/com/petlog/docs/MemberControllerDocs.java b/src/main/java/com/petlog/docs/MemberControllerDocs.java index f959e02..8cf0d42 100644 --- a/src/main/java/com/petlog/docs/MemberControllerDocs.java +++ b/src/main/java/com/petlog/docs/MemberControllerDocs.java @@ -1,5 +1,6 @@ package com.petlog.docs; +import com.petlog.auth.resolver.Authenticated; import com.petlog.member.controller.dto.request.UpdateIsNotificationEnabledRequestDto; import com.petlog.member.controller.dto.response.GetIsNotificationEnabledResponseDto; import io.swagger.v3.oas.annotations.Operation; @@ -12,11 +13,11 @@ public interface MemberControllerDocs { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "알림 수신 여부 조회에 성공하였습니다.") @Operation(summary = "알림 수신 여부 조회 API") - ResponseEntity> getIsNotificationEnabled(); + ResponseEntity> getIsNotificationEnabled(@Authenticated final Long memberId); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "알림 수신 여부 설정에 성공하였습니다.") @Operation(summary = "알림 수신 여부 설정 API") - ResponseEntity> updateIsNotificationEnabled(final UpdateIsNotificationEnabledRequestDto request); + ResponseEntity> updateIsNotificationEnabled(@Authenticated final Long memberId, final UpdateIsNotificationEnabledRequestDto request); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "회원 탈퇴에 성공하였습니다.") @Operation(summary = "회원 탈퇴 API") diff --git a/src/main/java/com/petlog/member/controller/MemberController.java b/src/main/java/com/petlog/member/controller/MemberController.java index bb65ab4..d60cb4d 100644 --- a/src/main/java/com/petlog/member/controller/MemberController.java +++ b/src/main/java/com/petlog/member/controller/MemberController.java @@ -1,9 +1,11 @@ package com.petlog.member.controller; +import com.petlog.auth.resolver.Authenticated; import com.petlog.common.response.ApiResponse; import com.petlog.docs.MemberControllerDocs; import com.petlog.member.controller.dto.request.UpdateIsNotificationEnabledRequestDto; import com.petlog.member.controller.dto.response.GetIsNotificationEnabledResponseDto; +import com.petlog.member.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -20,9 +22,14 @@ @RestController public class MemberController implements MemberControllerDocs { + private final MemberService memberService; + @GetMapping("/api/notification") - public ResponseEntity> getIsNotificationEnabled() { - final GetIsNotificationEnabledResponseDto response = new GetIsNotificationEnabledResponseDto(true); + public ResponseEntity> getIsNotificationEnabled( + @Authenticated final Long memberId + ) { + final boolean isNotificationEnabled = memberService.getIsNotificationEnabled(memberId); + final GetIsNotificationEnabledResponseDto response = new GetIsNotificationEnabledResponseDto(isNotificationEnabled); return ResponseEntity.ok( ApiResponse.successWithData(GET_IS_NOTIFICATION_ENABLED, response) @@ -31,8 +38,11 @@ public ResponseEntity> getIsNot @PutMapping("/api/notification") public ResponseEntity> updateIsNotificationEnabled( + @Authenticated final Long memberId, @RequestBody final UpdateIsNotificationEnabledRequestDto request ) { + memberService.updateIsNotificationEnabled(memberId, request.isNotificationEnabled()); + return ResponseEntity.ok( ApiResponse.success(UPDATE_IS_NOTIFICATION_ENABLED) ); diff --git a/src/main/java/com/petlog/member/entity/Member.java b/src/main/java/com/petlog/member/entity/Member.java index af8ec59..3413719 100644 --- a/src/main/java/com/petlog/member/entity/Member.java +++ b/src/main/java/com/petlog/member/entity/Member.java @@ -43,4 +43,8 @@ public Member( this.isNotificationEnabled = true; this.providerId = providerId; } + + public void updateIsNotificationEnabled(final boolean isNotificationEnabled) { + this.isNotificationEnabled = isNotificationEnabled; + } } diff --git a/src/main/java/com/petlog/member/service/MemberService.java b/src/main/java/com/petlog/member/service/MemberService.java index ed03b11..f6a0db0 100644 --- a/src/main/java/com/petlog/member/service/MemberService.java +++ b/src/main/java/com/petlog/member/service/MemberService.java @@ -5,6 +5,7 @@ import com.petlog.member.service.dto.LoginDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Service @@ -12,11 +13,7 @@ public class MemberService { private final MemberRepository memberRepository; - public Member getMember(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 memberId 입니다. memberId: " + memberId)); - } - + @Transactional public Member login(final LoginDto dto) { final Member member = memberRepository.findByProviderId(dto.providerId()); @@ -30,4 +27,22 @@ public Member login(final LoginDto dto) { private Member signUp(final String name, final String email, final String providerId) { return memberRepository.save(new Member(name, email, providerId)); } + + @Transactional(readOnly = true) + public boolean getIsNotificationEnabled(final Long memberId) { + final Member member = getMember(memberId); + + return member.isNotificationEnabled(); + } + + private Member getMember(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); + } + + @Transactional + public void updateIsNotificationEnabled(final Long memberId, final boolean isNotificationEnabled) { + final Member member = getMember(memberId); + member.updateIsNotificationEnabled(isNotificationEnabled); + } } diff --git a/src/main/java/com/petlog/pet/service/PetService.java b/src/main/java/com/petlog/pet/service/PetService.java index 10be12d..273344a 100644 --- a/src/main/java/com/petlog/pet/service/PetService.java +++ b/src/main/java/com/petlog/pet/service/PetService.java @@ -178,6 +178,7 @@ public void createWateringRecord(final Long memberId, final Long groupId, final wateringDailyRecordRepository.save(record); } + @Transactional public void createPoopRecord(Long memberId, final Long groupId, final String memo) { final Member member = getMember(memberId); final PetGroup petGroup = getPetGroup(groupId); diff --git a/src/main/java/com/petlog/s3/service/S3Service.java b/src/main/java/com/petlog/s3/service/S3Service.java index c503ec4..6fe60ed 100644 --- a/src/main/java/com/petlog/s3/service/S3Service.java +++ b/src/main/java/com/petlog/s3/service/S3Service.java @@ -7,6 +7,7 @@ import com.petlog.s3.service.dto.S3PresignedUrlItem; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.UUID; @@ -18,6 +19,7 @@ public class S3Service { private final PresignedUrlGenerator presignedUrlGenerator; private final MemberRepository memberRepository; + @Transactional(readOnly = true) public GeneratedS3PresignedUrlDto generateS3PresignedUrl(final Long memberId, final FileType fileType, final List fileNames) { getMember(memberId); diff --git a/src/main/java/com/petlog/schedule/service/ScheduleService.java b/src/main/java/com/petlog/schedule/service/ScheduleService.java index 7b82712..a6a1877 100644 --- a/src/main/java/com/petlog/schedule/service/ScheduleService.java +++ b/src/main/java/com/petlog/schedule/service/ScheduleService.java @@ -120,6 +120,7 @@ private void validateIsScheduleWriter(final Member member, final Schedule schedu } } + @Transactional public void deleteSchedule(final Long memberId, final Long groupId, final Long scheduleId) { final Member member = getMember(memberId); final PetGroup petGroup = getPetGroup(groupId);