diff --git a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandController.java b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandController.java new file mode 100644 index 000000000..8b6b00e3e --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandController.java @@ -0,0 +1,35 @@ +package com.votogether.domain.alarm.controller; + +import com.votogether.domain.alarm.service.AlarmCommandService; +import com.votogether.domain.member.entity.Member; +import com.votogether.global.jwt.Auth; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Positive; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RequiredArgsConstructor +@RequestMapping("/alarms") +@RestController +public class AlarmCommandController implements AlarmCommandControllerDocs { + + private final AlarmCommandService alarmCommandService; + + @PatchMapping("/{id}") + public ResponseEntity readAlarm( + @PathVariable("id") @Positive(message = "알림 ID는 양수만 가능합니다.") final Long alarmId, + @RequestParam("type") @NotBlank(message = "알림 타입이 공백이거나 존재하지 않습니다.") final String type, + @Auth final Member loginMember + ) { + alarmCommandService.readAlarm(alarmId, type, loginMember); + return ResponseEntity.ok().build(); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandControllerDocs.java b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandControllerDocs.java new file mode 100644 index 000000000..434ebd874 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmCommandControllerDocs.java @@ -0,0 +1,51 @@ +package com.votogether.domain.alarm.controller; + +import com.votogether.domain.member.entity.Member; +import com.votogether.global.exception.ExceptionResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Positive; +import org.springframework.http.ResponseEntity; + +@Tag(name = "알림 커맨드", description = "알림 커맨드 API") +public interface AlarmCommandControllerDocs { + + @Operation( + summary = "알림 읽기", + description = "알림을 읽을 수 있는 대상이라면 알림을 읽습니다." + ) + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "알림 읽기 성공" + ), + @ApiResponse( + responseCode = "400", + description = """ + 1.알림 ID가 양수가 아닌 경우 + + 2.알림을 읽을 수 있는 대상이 아닌 경우 + """, + content = @Content(schema = @Schema(implementation = ExceptionResponse.class)) + ), + @ApiResponse( + responseCode = "404", + description = "알림이 존재하지 않은 경우", + content = @Content(schema = @Schema(implementation = ExceptionResponse.class)) + ) + }) + ResponseEntity readAlarm( + @Parameter(description = "알림 ID", example = "1") + @Positive(message = "알림 ID는 양수만 가능합니다.") final Long alarmId, + @Parameter(description = "알림 타입", example = "CONTENT") + @NotBlank(message = "알림 타입이 공백이거나 존재하지 않습니다.") final String alarmType, + final Member loginMember + ); + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryController.java b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryController.java index d33b4aa79..177b1d834 100644 --- a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryController.java +++ b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryController.java @@ -37,18 +37,19 @@ public ResponseEntity> getPostAlarm( @GetMapping("/report") public ResponseEntity> getReportActionAlarms( @RequestParam @PositiveOrZero(message = "페이지는 0이상 정수만 가능합니다.") final int page, - @Auth final Member loginMember + @Auth final Member member ) { - final List response = alarmQueryService.getReportActionAlarms(loginMember, page); + final List response = alarmQueryService.getReportActionAlarms(member, page); return ResponseEntity.ok(response); } @GetMapping("/report/{id}") public ResponseEntity getReportActionAlarm( @PathVariable("id") final Long reportActionAlarmId, - @Auth final Member loginMember + @Auth final Member member ) { - final ReportActionResponse response = alarmQueryService.getReportActionAlarm(reportActionAlarmId, loginMember); + final ReportActionResponse response = + alarmQueryService.getReportActionAlarm(reportActionAlarmId, member); return ResponseEntity.ok(response); } diff --git a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryControllerDocs.java b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryControllerDocs.java index 3e1e21af0..8c2a24998 100644 --- a/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryControllerDocs.java +++ b/backend/src/main/java/com/votogether/domain/alarm/controller/AlarmQueryControllerDocs.java @@ -17,10 +17,13 @@ import java.util.List; import org.springframework.http.ResponseEntity; -@Tag(name = "알림", description = "알림 API") +@Tag(name = "알림 조회", description = "알림 조회 API") public interface AlarmQueryControllerDocs { - @Operation(summary = "게시글 내역 알림 조회", description = "게시글 내역 알림을 조회한다.") + @Operation( + summary = "게시글 내역 알림 조회", + description = "게시글 내역 알림을 조회한다." + ) @ApiResponses({ @ApiResponse( responseCode = "200", @@ -37,18 +40,37 @@ ResponseEntity> getPostAlarm( @Auth final Member loginMember ); - @Operation(summary = "신고 조치 알림 조회", description = "신고 조치 알림 목록을 조회한다.") - @ApiResponse(responseCode = "200", description = "조회 성공") + @Operation( + summary = "신고조치알림 조회", + description = "신고조치알림목록을 조회한다." + ) + @ApiResponses({ + @ApiResponse( + responseCode = "201", + description = "신고조치알림 조회 성공" + ), + @ApiResponse( + responseCode = "400", + description = "페이지가 0이상 정수가 아닌 경우", + content = @Content(schema = @Schema(implementation = ExceptionResponse.class)) + ) + }) ResponseEntity> getReportActionAlarms( @Parameter(description = "현재 페이지 위치", example = "0") @PositiveOrZero(message = "페이지는 0이상 정수만 가능합니다.") final int page, final Member member ); - @Operation(summary = "신고 조치 알림 상세 조회", description = "신고 조치 알림를 상세 조회한다.") - @ApiResponse(responseCode = "200", description = "조회 성공") + @Operation( + summary = "신고조치알림 상세 조회", + description = "신고조치알림를 상세 조회한다." + ) + @ApiResponse( + responseCode = "201", + description = "신고조치알림 상세 조회 성공" + ) ResponseEntity getReportActionAlarm( - @Parameter(description = "신고 조치 알림 ID", example = "1") final Long reportActionAlarmId, + @Parameter(description = "신고조치알림 ID", example = "1") final Long reportActionAlarmId, final Member member ); diff --git a/backend/src/main/java/com/votogether/domain/alarm/entity/Alarm.java b/backend/src/main/java/com/votogether/domain/alarm/entity/Alarm.java index a2cc1572b..cb833a54e 100644 --- a/backend/src/main/java/com/votogether/domain/alarm/entity/Alarm.java +++ b/backend/src/main/java/com/votogether/domain/alarm/entity/Alarm.java @@ -1,8 +1,10 @@ package com.votogether.domain.alarm.entity; import com.votogether.domain.alarm.entity.vo.AlarmType; +import com.votogether.domain.alarm.exception.AlarmExceptionType; import com.votogether.domain.common.BaseEntity; import com.votogether.domain.member.entity.Member; +import com.votogether.global.exception.BadRequestException; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -13,6 +15,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.util.Objects; import lombok.AccessLevel; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -61,4 +64,14 @@ private Alarm( this.isChecked = isChecked; } + public void read() { + this.isChecked = true; + } + + public void checkOwner(final Member member) { + if (!Objects.equals(this.member.getId(), member.getId())) { + throw new BadRequestException(AlarmExceptionType.NOT_OWNER); + } + } + } diff --git a/backend/src/main/java/com/votogether/domain/alarm/entity/ReportActionAlarm.java b/backend/src/main/java/com/votogether/domain/alarm/entity/ReportActionAlarm.java index 0e1390e23..2000928b3 100644 --- a/backend/src/main/java/com/votogether/domain/alarm/entity/ReportActionAlarm.java +++ b/backend/src/main/java/com/votogether/domain/alarm/entity/ReportActionAlarm.java @@ -1,8 +1,10 @@ package com.votogether.domain.alarm.entity; +import com.votogether.domain.alarm.exception.AlarmExceptionType; import com.votogether.domain.common.BaseEntity; import com.votogether.domain.member.entity.Member; import com.votogether.domain.report.entity.vo.ReportType; +import com.votogether.global.exception.BadRequestException; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -13,6 +15,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.util.Objects; import lombok.AccessLevel; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -61,4 +64,14 @@ private ReportActionAlarm( this.isChecked = isChecked; } + public void read() { + this.isChecked = true; + } + + public void checkOwner(final Member member) { + if (!Objects.equals(this.member.getId(), member.getId())) { + throw new BadRequestException(AlarmExceptionType.NOT_OWNER); + } + } + } diff --git a/backend/src/main/java/com/votogether/domain/alarm/entity/vo/AlarmActionType.java b/backend/src/main/java/com/votogether/domain/alarm/entity/vo/AlarmActionType.java new file mode 100644 index 000000000..517c91fe9 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/entity/vo/AlarmActionType.java @@ -0,0 +1,20 @@ +package com.votogether.domain.alarm.entity.vo; + +import com.votogether.domain.alarm.exception.AlarmExceptionType; +import com.votogether.global.exception.BadRequestException; +import java.util.Arrays; + +public enum AlarmActionType { + + CONTENT, + REPORT, + ; + + public static AlarmActionType from(final String actionType) { + return Arrays.stream(AlarmActionType.values()) + .filter(alarmActionType -> alarmActionType.name().equals(actionType)) + .findFirst() + .orElseThrow(() -> new BadRequestException(AlarmExceptionType.NOT_FOUND_ACTION_TYPE)); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/exception/AlarmExceptionType.java b/backend/src/main/java/com/votogether/domain/alarm/exception/AlarmExceptionType.java new file mode 100644 index 000000000..e60ab801d --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/exception/AlarmExceptionType.java @@ -0,0 +1,23 @@ +package com.votogether.domain.alarm.exception; + +import com.votogether.global.exception.ExceptionType; +import lombok.Getter; + +@Getter +public enum AlarmExceptionType implements ExceptionType { + + NOT_FOUND_ACTION(1300, "신고조치알림이 존재하지 않습니다."), + NOT_FOUND(1301, "알림이 존재하지 않습니다."), + NOT_OWNER(1302, "알림을 읽을 대상이 아닙니다."), + NOT_FOUND_ACTION_TYPE(1303, "등록되지 않은 알림 동작입니다."), + ; + + private final int code; + private final String message; + + AlarmExceptionType(final int code, final String message) { + this.code = code; + this.message = message; + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/exception/ReportActionAlarmExceptionType.java b/backend/src/main/java/com/votogether/domain/alarm/exception/ReportActionAlarmExceptionType.java deleted file mode 100644 index 4875a13a3..000000000 --- a/backend/src/main/java/com/votogether/domain/alarm/exception/ReportActionAlarmExceptionType.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.votogether.domain.alarm.exception; - -import com.votogether.global.exception.ExceptionType; -import lombok.Getter; - -@Getter -public enum ReportActionAlarmExceptionType implements ExceptionType { - - NOT_FOUND(1300, "신고조치알림이 존재하지 않습니다."), - ; - - private final int code; - private final String message; - - ReportActionAlarmExceptionType(final int code, final String message) { - this.code = code; - this.message = message; - } - -} diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/AlarmCommandService.java b/backend/src/main/java/com/votogether/domain/alarm/service/AlarmCommandService.java new file mode 100644 index 000000000..650aab2c5 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/service/AlarmCommandService.java @@ -0,0 +1,28 @@ +package com.votogether.domain.alarm.service; + +import com.votogether.domain.alarm.entity.vo.AlarmActionType; +import com.votogether.domain.alarm.service.strategy.AlarmReadStrategy; +import com.votogether.domain.alarm.service.strategy.AlarmReadStrategyProvider; +import com.votogether.domain.member.entity.Member; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class AlarmCommandService { + + private final AlarmReadStrategyProvider alarmReadStrategyProvider; + + public void readAlarm( + final Long alarmId, + final String type, + final Member loginMember + ) { + final AlarmActionType alarmActionType = AlarmActionType.from(type); + final AlarmReadStrategy alarmReadStrategy = alarmReadStrategyProvider.getStrategy(alarmActionType); + alarmReadStrategy.read(alarmId, loginMember); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/AlarmQueryService.java b/backend/src/main/java/com/votogether/domain/alarm/service/AlarmQueryService.java index 1b96112a2..2cb9b85a0 100644 --- a/backend/src/main/java/com/votogether/domain/alarm/service/AlarmQueryService.java +++ b/backend/src/main/java/com/votogether/domain/alarm/service/AlarmQueryService.java @@ -6,7 +6,7 @@ import com.votogether.domain.alarm.entity.Alarm; import com.votogether.domain.alarm.entity.ReportActionAlarm; import com.votogether.domain.alarm.entity.vo.AlarmType; -import com.votogether.domain.alarm.exception.ReportActionAlarmExceptionType; +import com.votogether.domain.alarm.exception.AlarmExceptionType; import com.votogether.domain.alarm.repository.AlarmRepository; import com.votogether.domain.alarm.repository.ReportActionAlarmRepository; import com.votogether.domain.member.entity.Member; @@ -55,8 +55,11 @@ private String makeNicknameBy(final Alarm alarm) { } public List getReportActionAlarms(final Member member, final int page) { - final PageRequest pageRequest = PageRequest.of(page, BASIC_PAGE_SIZE, - Sort.by(Sort.Direction.DESC, "createdAt")); + final PageRequest pageRequest = PageRequest.of( + page, + BASIC_PAGE_SIZE, + Sort.by(Sort.Direction.DESC, "createdAt") + ); final List reportActionAlarms = reportActionAlarmRepository .findByMember(member, pageRequest); @@ -68,7 +71,7 @@ public List getReportActionAlarms(final Member member public ReportActionResponse getReportActionAlarm(final Long reportActionAlarmId, final Member member) { final ReportActionAlarm reportActionAlarm = reportActionAlarmRepository .findByIdAndMember(reportActionAlarmId, member) - .orElseThrow(() -> new NotFoundException(ReportActionAlarmExceptionType.NOT_FOUND)); + .orElseThrow(() -> new NotFoundException(AlarmExceptionType.NOT_FOUND_ACTION)); return ReportActionResponse.from(reportActionAlarm); } diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategy.java b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategy.java new file mode 100644 index 000000000..13c78d1c9 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategy.java @@ -0,0 +1,9 @@ +package com.votogether.domain.alarm.service.strategy; + +import com.votogether.domain.member.entity.Member; + +public interface AlarmReadStrategy { + + void read(final Long id, final Member member); + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategyProvider.java b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategyProvider.java new file mode 100644 index 000000000..557e020ba --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/AlarmReadStrategyProvider.java @@ -0,0 +1,26 @@ +package com.votogether.domain.alarm.service.strategy; + +import com.votogether.domain.alarm.entity.vo.AlarmActionType; +import java.util.EnumMap; +import java.util.Map; +import org.springframework.stereotype.Component; + +@Component +public class AlarmReadStrategyProvider { + + private final Map readStrategies; + + public AlarmReadStrategyProvider( + final ContentAlarmReadStrategy contentAlarmReadStrategy, + final ReportAlarmReadStrategy reportAlarmReadStrategy + ) { + readStrategies = new EnumMap<>(AlarmActionType.class); + readStrategies.put(AlarmActionType.CONTENT, contentAlarmReadStrategy); + readStrategies.put(AlarmActionType.REPORT, reportAlarmReadStrategy); + } + + public AlarmReadStrategy getStrategy(final AlarmActionType alarmActionType) { + return readStrategies.get(alarmActionType); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ContentAlarmReadStrategy.java b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ContentAlarmReadStrategy.java new file mode 100644 index 000000000..b692e30a0 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ContentAlarmReadStrategy.java @@ -0,0 +1,26 @@ +package com.votogether.domain.alarm.service.strategy; + +import com.votogether.domain.alarm.entity.Alarm; +import com.votogether.domain.alarm.exception.AlarmExceptionType; +import com.votogether.domain.alarm.repository.AlarmRepository; +import com.votogether.domain.member.entity.Member; +import com.votogether.global.exception.NotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class ContentAlarmReadStrategy implements AlarmReadStrategy { + + private final AlarmRepository alarmRepository; + + @Override + public void read(final Long id, final Member member) { + final Alarm alarm = alarmRepository.findById(id) + .orElseThrow(() -> new NotFoundException(AlarmExceptionType.NOT_FOUND)); + + alarm.checkOwner(member); + alarm.read(); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ReportAlarmReadStrategy.java b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ReportAlarmReadStrategy.java new file mode 100644 index 000000000..df6a98e79 --- /dev/null +++ b/backend/src/main/java/com/votogether/domain/alarm/service/strategy/ReportAlarmReadStrategy.java @@ -0,0 +1,26 @@ +package com.votogether.domain.alarm.service.strategy; + +import com.votogether.domain.alarm.entity.ReportActionAlarm; +import com.votogether.domain.alarm.exception.AlarmExceptionType; +import com.votogether.domain.alarm.repository.ReportActionAlarmRepository; +import com.votogether.domain.member.entity.Member; +import com.votogether.global.exception.NotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class ReportAlarmReadStrategy implements AlarmReadStrategy { + + private final ReportActionAlarmRepository reportActionAlarmRepository; + + @Override + public void read(final Long id, final Member member) { + final ReportActionAlarm reportActionAlarm = reportActionAlarmRepository.findById(id) + .orElseThrow(() -> new NotFoundException(AlarmExceptionType.NOT_FOUND_ACTION)); + + reportActionAlarm.checkOwner(member); + reportActionAlarm.read(); + } + +} diff --git a/backend/src/main/java/com/votogether/domain/member/dto/response/MemberInfoResponse.java b/backend/src/main/java/com/votogether/domain/member/dto/response/MemberInfoResponse.java index eac615eb4..6a3f5073d 100644 --- a/backend/src/main/java/com/votogether/domain/member/dto/response/MemberInfoResponse.java +++ b/backend/src/main/java/com/votogether/domain/member/dto/response/MemberInfoResponse.java @@ -1,7 +1,7 @@ package com.votogether.domain.member.dto.response; import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import io.swagger.v3.oas.annotations.media.Schema; @Schema(description = "회원 정보 응답") @@ -16,7 +16,7 @@ public record MemberInfoResponse( Integer birthYear, @Schema(description = "권한", example = "MEMBER") - Role role, + Roles roles, @Schema(description = "작성한 게시글 수", example = "5") int postCount, diff --git a/backend/src/main/java/com/votogether/domain/member/entity/Member.java b/backend/src/main/java/com/votogether/domain/member/entity/Member.java index c1f71858f..ce854e871 100644 --- a/backend/src/main/java/com/votogether/domain/member/entity/Member.java +++ b/backend/src/main/java/com/votogether/domain/member/entity/Member.java @@ -4,7 +4,7 @@ import com.votogether.domain.common.BaseEntity; import com.votogether.domain.member.entity.vo.Gender; import com.votogether.domain.member.entity.vo.Nickname; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import com.votogether.domain.member.entity.vo.SocialType; import com.votogether.domain.member.exception.MemberExceptionType; import com.votogether.global.exception.BadRequestException; @@ -42,21 +42,22 @@ public class Member extends BaseEntity { @Embedded private Nickname nickname; - @Enumerated(value = EnumType.STRING) + @Enumerated(EnumType.STRING) @Column(length = 20) private Gender gender; private Integer birthYear; - @Enumerated(value = EnumType.STRING) + @Enumerated(EnumType.STRING) @Column(length = 20, nullable = false) private SocialType socialType; @Column(nullable = false) private String socialId; - @Column(nullable = false) - private Role role; + @Enumerated(EnumType.STRING) + @Column(nullable = false, length = 20) + private Roles roles; @Builder private Member( @@ -65,14 +66,14 @@ private Member( final Integer birthYear, final SocialType socialType, final String socialId, - final Role role + final Roles roles ) { this.nickname = new Nickname(nickname); this.gender = gender; this.birthYear = birthYear; this.socialType = socialType; this.socialId = socialId; - this.role = role; + this.roles = roles; } public static Member from(final KakaoMemberResponse response) { @@ -80,7 +81,7 @@ public static Member from(final KakaoMemberResponse response) { .nickname(INITIAL_NICKNAME_PREFIX + RandomStringUtils.random(10, true, true)) .socialType(SocialType.KAKAO) .socialId(String.valueOf(response.id())) - .role(Role.MEMBER) + .roles(Roles.MEMBER) .build(); } diff --git a/backend/src/main/java/com/votogether/domain/member/entity/vo/Role.java b/backend/src/main/java/com/votogether/domain/member/entity/vo/Roles.java similarity index 78% rename from backend/src/main/java/com/votogether/domain/member/entity/vo/Role.java rename to backend/src/main/java/com/votogether/domain/member/entity/vo/Roles.java index 3a8ab3e92..cbd952b83 100644 --- a/backend/src/main/java/com/votogether/domain/member/entity/vo/Role.java +++ b/backend/src/main/java/com/votogether/domain/member/entity/vo/Roles.java @@ -1,6 +1,6 @@ package com.votogether.domain.member.entity.vo; -public enum Role { +public enum Roles { ADMIN, MEMBER; diff --git a/backend/src/main/java/com/votogether/domain/member/service/MemberService.java b/backend/src/main/java/com/votogether/domain/member/service/MemberService.java index d07728b77..69894c34e 100644 --- a/backend/src/main/java/com/votogether/domain/member/service/MemberService.java +++ b/backend/src/main/java/com/votogether/domain/member/service/MemberService.java @@ -65,7 +65,7 @@ public MemberInfoResponse findMemberInfo(final Member member) { member.getNickname(), member.getGender(), member.getBirthYear(), - member.getRole(), + member.getRoles(), numberOfPosts, numberOfVotes ); diff --git a/backend/src/main/java/com/votogether/domain/report/controller/ReportCommandControllerDocs.java b/backend/src/main/java/com/votogether/domain/report/controller/ReportCommandControllerDocs.java index 5c43d4699..41c844ce8 100644 --- a/backend/src/main/java/com/votogether/domain/report/controller/ReportCommandControllerDocs.java +++ b/backend/src/main/java/com/votogether/domain/report/controller/ReportCommandControllerDocs.java @@ -10,7 +10,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.Positive; import org.springframework.http.ResponseEntity; @Tag(name = "신고", description = "신고 API") @@ -42,7 +41,7 @@ public interface ReportCommandControllerDocs { responseCode = "400", description = """ 1.신고 ID가 양의 정수가 아닌 경우 - + 2.신고 ID가 존재하지 않은 경우 """, content = @Content(schema = @Schema(implementation = ExceptionResponse.class)) diff --git a/backend/src/main/java/com/votogether/domain/report/dto/response/ReportResponse.java b/backend/src/main/java/com/votogether/domain/report/dto/response/ReportResponse.java index 3f2d9d097..b9c6da2a0 100644 --- a/backend/src/main/java/com/votogether/domain/report/dto/response/ReportResponse.java +++ b/backend/src/main/java/com/votogether/domain/report/dto/response/ReportResponse.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.votogether.domain.report.dto.ReportAggregateDto; -import com.votogether.domain.report.entity.Report; import com.votogether.domain.report.entity.vo.ReportType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; @@ -28,14 +27,14 @@ public record ReportResponse( LocalDateTime createdAt ) { - public static ReportResponse of(final ReportAggregateDto reportAggregateDto, final String target) { - return new ReportResponse( - reportAggregateDto.reportMaxId(), - reportAggregateDto.reportType(), - Arrays.stream(reportAggregateDto.reasons().split(",")).toList(), - target, - reportAggregateDto.createdAt() - ); - } + public static ReportResponse of(final ReportAggregateDto reportAggregateDto, final String target) { + return new ReportResponse( + reportAggregateDto.reportMaxId(), + reportAggregateDto.reportType(), + Arrays.stream(reportAggregateDto.reasons().split(",")).toList(), + target, + reportAggregateDto.createdAt() + ); + } } diff --git a/backend/src/main/java/com/votogether/domain/report/exception/ReportExceptionType.java b/backend/src/main/java/com/votogether/domain/report/exception/ReportExceptionType.java index 69e8162e1..75f6dd8a6 100644 --- a/backend/src/main/java/com/votogether/domain/report/exception/ReportExceptionType.java +++ b/backend/src/main/java/com/votogether/domain/report/exception/ReportExceptionType.java @@ -15,8 +15,7 @@ public enum ReportExceptionType implements ExceptionType { REPORT_MY_NICKNAME(1206, "자신의 닉네임은 신고할 수 없습니다."), DUPLICATE_NICKNAME_REPORT(1207, "하나의 닉네임에 대해서 중복하여 신고할 수 없습니다."), NOT_FOUND(1208, "신고가 존재하지 않습니다."), - NOT_FOUND_REPORT_AGGREGATE(1209, "신고 집계가 존재하지 않습니다.") - ; + NOT_FOUND_REPORT_AGGREGATE(1209, "신고 집계가 존재하지 않습니다."); private final int code; private final String message; diff --git a/backend/src/main/java/com/votogether/domain/report/service/ReportQueryService.java b/backend/src/main/java/com/votogether/domain/report/service/ReportQueryService.java index 5dfa30dd4..f1d04ad74 100644 --- a/backend/src/main/java/com/votogether/domain/report/service/ReportQueryService.java +++ b/backend/src/main/java/com/votogether/domain/report/service/ReportQueryService.java @@ -1,8 +1,8 @@ package com.votogether.domain.report.service; import com.votogether.domain.report.dto.ReportAggregateDto; -import com.votogether.domain.report.dto.response.ReportResponse; import com.votogether.domain.report.dto.response.ReportPageResponse; +import com.votogether.domain.report.dto.response.ReportResponse; import com.votogether.domain.report.repository.ReportRepository; import com.votogether.domain.report.service.strategy.ReportActionProvider; import com.votogether.domain.report.service.strategy.ReportStrategy; diff --git a/backend/src/test/java/com/votogether/domain/alarm/controller/AlarmCommandControllerTest.java b/backend/src/test/java/com/votogether/domain/alarm/controller/AlarmCommandControllerTest.java new file mode 100644 index 000000000..983147264 --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/alarm/controller/AlarmCommandControllerTest.java @@ -0,0 +1,104 @@ +package com.votogether.domain.alarm.controller; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.any; +import static org.mockito.BDDMockito.anyLong; +import static org.mockito.BDDMockito.willDoNothing; + +import com.votogether.domain.alarm.service.AlarmCommandService; +import com.votogether.domain.member.entity.Member; +import com.votogether.test.ControllerTest; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.servlet.MockMvc; + +@WebMvcTest(AlarmCommandController.class) +class AlarmCommandControllerTest extends ControllerTest { + + @Autowired + MockMvc mockMvc; + + @MockBean + AlarmCommandService alarmCommandService; + + @BeforeEach + void setUp() { + RestAssuredMockMvc.mockMvc(mockMvc); + } + + @Nested + @DisplayName("알림을 읽을 시") + class ReadAlarm { + + @Test + @DisplayName("정상적인 요청이라면 200 응답을 반환한다.") + void readAlarm() throws Exception { + // given + mockingAuthArgumentResolver(); + willDoNothing().given(alarmCommandService).readAlarm(anyLong(), anyString(), any(Member.class)); + + // when, then + RestAssuredMockMvc + .given().log().all() + .headers(HttpHeaders.AUTHORIZATION, BEARER_TOKEN) + .param("type", "CONTENT") + .when().patch("/alarms/{id}", 1L) + .then().log().all() + .status(HttpStatus.OK); + } + + @ParameterizedTest + @ValueSource(longs = {-1, 0}) + @DisplayName("알림ID가 양수가 아니라면 400 응답을 반환한다.") + void negativeAlarmId(Long alarmId) throws Exception { + // given + mockingAuthArgumentResolver(); + willDoNothing().given(alarmCommandService).readAlarm(anyLong(), anyString(), any(Member.class)); + + // when, then + RestAssuredMockMvc + .given().log().all() + .headers(HttpHeaders.AUTHORIZATION, BEARER_TOKEN) + .param("type", "CONTENT") + .when().patch("/alarms/{id}", alarmId) + .then().log().all() + .status(HttpStatus.BAD_REQUEST) + .body("code", equalTo(201)) + .body("message", containsString("알림 ID는 양수만 가능합니다.")); + } + + @ParameterizedTest + @ValueSource(strings = {"", " "}) + @DisplayName("알림 타입이 공백이거나 존재하지 않으면 400 응답을 반환한다.") + void emptyAlarmType(String alarmType) throws Exception { + // given + mockingAuthArgumentResolver(); + willDoNothing().given(alarmCommandService).readAlarm(anyLong(), anyString(), any(Member.class)); + + // when, then + RestAssuredMockMvc + .given().log().all() + .headers(HttpHeaders.AUTHORIZATION, BEARER_TOKEN) + .param("type", alarmType) + .when().patch("/alarms/{id}", 1L) + .then().log().all() + .status(HttpStatus.BAD_REQUEST) + .body("code", equalTo(201)) + .body("message", containsString("알림 타입이 공백이거나 존재하지 않습니다.")); + } + + } + +} diff --git a/backend/src/test/java/com/votogether/domain/alarm/entity/AlarmTest.java b/backend/src/test/java/com/votogether/domain/alarm/entity/AlarmTest.java new file mode 100644 index 000000000..a0cc671f2 --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/alarm/entity/AlarmTest.java @@ -0,0 +1,57 @@ +package com.votogether.domain.alarm.entity; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.votogether.domain.alarm.entity.vo.AlarmType; +import com.votogether.domain.member.entity.Member; +import com.votogether.global.exception.BadRequestException; +import com.votogether.test.fixtures.MemberFixtures; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +class AlarmTest { + + @Test + @DisplayName("알림을 읽으면 읽음 여부가 TRUE로 수정된다.") + void readAlarm() { + // given + Member member = MemberFixtures.MALE_30.get(); + Alarm alarm = Alarm.builder() + .member(member) + .alarmType(AlarmType.COMMENT) + .targetId(1L) + .detail("detail") + .isChecked(false) + .build(); + + // when + alarm.read(); + + // then + assertThat(alarm.isChecked()).isTrue(); + } + + @Test + @DisplayName("알림 읽을 대상이 아니라면 예외를 던진다.") + void checkOwner() { + // given + Member member = MemberFixtures.MALE_30.get(); + ReflectionTestUtils.setField(member, "id", 1L); + Alarm alarm = Alarm.builder() + .member(member) + .alarmType(AlarmType.COMMENT) + .targetId(1L) + .detail("detail") + .isChecked(false) + .build(); + Member other = MemberFixtures.MALE_20.get(); + + // when, then + assertThatThrownBy(() -> alarm.checkOwner(other)) + .isInstanceOf(BadRequestException.class) + .hasMessage("알림을 읽을 대상이 아닙니다."); + } + +} diff --git a/backend/src/test/java/com/votogether/domain/alarm/entity/ReportActionAlarmTest.java b/backend/src/test/java/com/votogether/domain/alarm/entity/ReportActionAlarmTest.java new file mode 100644 index 000000000..e215d59a9 --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/alarm/entity/ReportActionAlarmTest.java @@ -0,0 +1,57 @@ +package com.votogether.domain.alarm.entity; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.votogether.domain.member.entity.Member; +import com.votogether.domain.report.entity.vo.ReportType; +import com.votogether.global.exception.BadRequestException; +import com.votogether.test.fixtures.MemberFixtures; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +class ReportActionAlarmTest { + + @Test + @DisplayName("알림을 읽으면 읽음 여부가 TRUE로 수정된다.") + void readAlarm() { + // given + Member member = MemberFixtures.MALE_30.get(); + ReportActionAlarm reportActionAlarm = ReportActionAlarm.builder() + .member(member) + .reportType(ReportType.POST) + .target("target") + .reasons("reasons") + .isChecked(false) + .build(); + + // when + reportActionAlarm.read(); + + // then + assertThat(reportActionAlarm.isChecked()).isTrue(); + } + + @Test + @DisplayName("알림 읽을 대상이 아니라면 예외를 던진다.") + void checkOwner() { + // given + Member member = MemberFixtures.MALE_30.get(); + ReflectionTestUtils.setField(member, "id", 1L); + ReportActionAlarm reportActionAlarm = ReportActionAlarm.builder() + .member(member) + .reportType(ReportType.POST) + .target("target") + .reasons("reasons") + .isChecked(false) + .build(); + Member other = MemberFixtures.MALE_20.get(); + + // when, then + assertThatThrownBy(() -> reportActionAlarm.checkOwner(other)) + .isInstanceOf(BadRequestException.class) + .hasMessage("알림을 읽을 대상이 아닙니다."); + } + +} diff --git a/backend/src/test/java/com/votogether/domain/alarm/entity/vo/AlarmActionTypeTest.java b/backend/src/test/java/com/votogether/domain/alarm/entity/vo/AlarmActionTypeTest.java new file mode 100644 index 000000000..d88cabc9a --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/alarm/entity/vo/AlarmActionTypeTest.java @@ -0,0 +1,44 @@ +package com.votogether.domain.alarm.entity.vo; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.votogether.global.exception.BadRequestException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class AlarmActionTypeTest { + + @Nested + @DisplayName("타입으로 부터 알림 액션 타입을 생성할 때") + class From { + + @ParameterizedTest + @ValueSource(strings = {"CONTENT", "REPORT"}) + @DisplayName("존재하는 타입이라면 액션 타입을 반환한다.") + void existType(String type) { + // given, when + AlarmActionType alarmActionType = AlarmActionType.from(type); + + // then + assertThat(alarmActionType).isEqualTo(AlarmActionType.valueOf(type)); + } + + @Test + @DisplayName("존재하지 않은 타입이라면 예외를 던진다.") + void notExistType() { + // given + String type = "HELLO"; + + // when, then + assertThatThrownBy(() -> AlarmActionType.from(type)) + .isInstanceOf(BadRequestException.class) + .hasMessage("등록되지 않은 알림 동작입니다."); + } + + } + +} diff --git a/backend/src/test/java/com/votogether/domain/alarm/service/AlarmCommandServiceTest.java b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmCommandServiceTest.java new file mode 100644 index 000000000..c8eb2ac71 --- /dev/null +++ b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmCommandServiceTest.java @@ -0,0 +1,91 @@ +package com.votogether.domain.alarm.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.votogether.domain.alarm.entity.Alarm; +import com.votogether.domain.alarm.entity.ReportActionAlarm; +import com.votogether.domain.alarm.entity.vo.AlarmType; +import com.votogether.domain.alarm.repository.AlarmRepository; +import com.votogether.domain.alarm.repository.ReportActionAlarmRepository; +import com.votogether.domain.member.entity.Member; +import com.votogether.domain.report.entity.vo.ReportType; +import com.votogether.global.exception.NotFoundException; +import com.votogether.test.ServiceTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class AlarmCommandServiceTest extends ServiceTest { + + @Autowired + AlarmCommandService alarmCommandService; + + @Autowired + AlarmRepository alarmRepository; + + @Autowired + ReportActionAlarmRepository reportActionAlarmRepository; + + @Nested + @DisplayName("알림을 읽을 시") + class ReadAlarm { + + @Test + @DisplayName("정상적인 요청이라면 알림을 읽는다.") + void readAlarm() { + // given + Member member = memberTestPersister.builder().save(); + Alarm alarm = Alarm.builder() + .member(member) + .alarmType(AlarmType.COMMENT) + .targetId(1L) + .detail("detail") + .isChecked(false) + .build(); + alarmRepository.save(alarm); + String type = "CONTENT"; + + // when + alarmCommandService.readAlarm(alarm.getId(), type, member); + + // then + assertThat(alarm.isChecked()).isTrue(); + } + + @Test + @DisplayName("정상적인 요청이라면 신고 알림을 읽는다.") + void readReportAlarm() { + // given + Member member = memberTestPersister.builder().save(); + ReportActionAlarm reportActionAlarm = ReportActionAlarm.builder() + .member(member) + .reportType(ReportType.POST) + .target("target") + .reasons("reasons") + .isChecked(false) + .build(); + reportActionAlarmRepository.save(reportActionAlarm); + String type = "REPORT"; + + // when + alarmCommandService.readAlarm(reportActionAlarm.getId(), type, member); + } + + @Test + @DisplayName("알림이 존재하지 않으면 예외를 던진다.") + void notExistAlarm() { + // given + Member member = memberTestPersister.builder().save(); + String type = "CONTENT"; + + // when, then + assertThatThrownBy(() -> alarmCommandService.readAlarm(-1L, type, member)) + .isInstanceOf(NotFoundException.class) + .hasMessage("알림이 존재하지 않습니다."); + } + + } + +} diff --git a/backend/src/test/java/com/votogether/domain/alarm/service/AlarmEventListenerTest.java b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmEventListenerTest.java index 1f4a84ce7..5d271e908 100644 --- a/backend/src/test/java/com/votogether/domain/alarm/service/AlarmEventListenerTest.java +++ b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmEventListenerTest.java @@ -9,6 +9,7 @@ import com.votogether.domain.member.entity.Member; import com.votogether.test.ServiceTest; import java.util.List; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +26,7 @@ class AlarmEventListenerTest extends ServiceTest { @Autowired AlarmRepository alarmRepository; + @Disabled @Test @DisplayName("게시글 관련 알림 이벤트를 수신한다.") void handlePostAlarmEvent() throws Exception { diff --git a/backend/src/test/java/com/votogether/domain/alarm/service/AlarmQueryServiceTest.java b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmQueryServiceTest.java index e54075ae0..77794e7c3 100644 --- a/backend/src/test/java/com/votogether/domain/alarm/service/AlarmQueryServiceTest.java +++ b/backend/src/test/java/com/votogether/domain/alarm/service/AlarmQueryServiceTest.java @@ -116,7 +116,7 @@ void getEmptyListWhenNoEventOccurs() { } @Test - @DisplayName("신고 조치 알림 목록을 조회한다.") + @DisplayName("신고조치알림 목록을 조회한다.") void getReportActionAlarms() { // given Member member = memberTestPersister.builder().save(); diff --git a/backend/src/test/java/com/votogether/domain/member/controller/MemberControllerTest.java b/backend/src/test/java/com/votogether/domain/member/controller/MemberControllerTest.java index b6278c8b5..d0758af95 100644 --- a/backend/src/test/java/com/votogether/domain/member/controller/MemberControllerTest.java +++ b/backend/src/test/java/com/votogether/domain/member/controller/MemberControllerTest.java @@ -13,7 +13,7 @@ import com.votogether.domain.member.dto.response.MemberInfoResponse; import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import com.votogether.domain.member.entity.vo.SocialType; import com.votogether.global.jwt.TokenPayload; import com.votogether.test.ControllerTest; @@ -55,7 +55,7 @@ void findMemberInfo() throws Exception { "저문", Gender.MALE, 1988, - Role.MEMBER, + Roles.MEMBER, 0, 0 ); diff --git a/backend/src/test/java/com/votogether/domain/member/service/MemberServiceTest.java b/backend/src/test/java/com/votogether/domain/member/service/MemberServiceTest.java index c25d7fe2c..058a21387 100644 --- a/backend/src/test/java/com/votogether/domain/member/service/MemberServiceTest.java +++ b/backend/src/test/java/com/votogether/domain/member/service/MemberServiceTest.java @@ -10,7 +10,7 @@ import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.entity.MemberCategory; import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import com.votogether.domain.member.entity.vo.SocialType; import com.votogether.domain.member.repository.MemberCategoryRepository; import com.votogether.domain.member.repository.MemberRepository; @@ -92,7 +92,7 @@ void changeNickname() { .birthYear(1966) .socialId("abc123") .socialType(SocialType.KAKAO) - .role(Role.MEMBER) + .roles(Roles.MEMBER) .build(); String newNickname = "jeomxon"; Member savedMember = memberRepository.save(member); @@ -153,7 +153,7 @@ void changeNicknameThrowsExceptionNotPassedChangingCycle() { .birthYear(1966) .socialId("abc123") .socialType(SocialType.KAKAO) - .role(Role.MEMBER) + .roles(Roles.MEMBER) .build(); Member savedMember = memberRepository.save(member); @@ -179,7 +179,7 @@ void updateDetailsSuccess() { .nickname("저문") .socialType(SocialType.KAKAO) .socialId("123123123") - .role(Role.MEMBER) + .roles(Roles.MEMBER) .build(); Member member = memberRepository.save(unsavedMember); MemberDetailRequest request = new MemberDetailRequest(Gender.FEMALE, 2000); @@ -216,7 +216,7 @@ void updateDetailsSameBirthYear() { .birthYear(1993) .socialType(SocialType.KAKAO) .socialId("123123123") - .role(Role.MEMBER) + .roles(Roles.MEMBER) .build(); Member member = memberRepository.save(unsavedMember); diff --git a/backend/src/test/java/com/votogether/domain/report/controller/ReportCommandControllerTest.java b/backend/src/test/java/com/votogether/domain/report/controller/ReportCommandControllerTest.java index 5636369b2..379bbe927 100644 --- a/backend/src/test/java/com/votogether/domain/report/controller/ReportCommandControllerTest.java +++ b/backend/src/test/java/com/votogether/domain/report/controller/ReportCommandControllerTest.java @@ -1,7 +1,5 @@ package com.votogether.domain.report.controller; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; import static org.mockito.BDDMockito.willDoNothing; import com.votogether.domain.member.entity.Member; diff --git a/backend/src/test/java/com/votogether/domain/report/service/ReportCommandServiceTest.java b/backend/src/test/java/com/votogether/domain/report/service/ReportCommandServiceTest.java index 5a1be68a2..f8cfd85f1 100644 --- a/backend/src/test/java/com/votogether/domain/report/service/ReportCommandServiceTest.java +++ b/backend/src/test/java/com/votogether/domain/report/service/ReportCommandServiceTest.java @@ -29,10 +29,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.transaction.TestTransaction; class ReportCommandServiceTest extends ServiceTest { @@ -336,7 +333,6 @@ void postNotReportAction() { ReportActionRequest request = new ReportActionRequest(savedReport.getId(), false); reportCommandService.reportAction(request); - // then Post savedPost = postRepository.findById(post.getId()).get(); Optional reportById = reportRepository.findById(savedReport.getId()); @@ -505,7 +501,7 @@ void reportNotExistException() { assertThatThrownBy(() -> reportCommandService.reportAction(request)) .isInstanceOf(NotFoundException.class); } - + } } diff --git a/backend/src/test/java/com/votogether/domain/report/service/ReportQueryServiceTest.java b/backend/src/test/java/com/votogether/domain/report/service/ReportQueryServiceTest.java index b6d0a2a17..5acffd146 100644 --- a/backend/src/test/java/com/votogether/domain/report/service/ReportQueryServiceTest.java +++ b/backend/src/test/java/com/votogether/domain/report/service/ReportQueryServiceTest.java @@ -5,8 +5,8 @@ import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.service.MemberService; import com.votogether.domain.post.entity.comment.Comment; -import com.votogether.domain.report.dto.response.ReportResponse; import com.votogether.domain.report.dto.response.ReportPageResponse; +import com.votogether.domain.report.dto.response.ReportResponse; import com.votogether.domain.report.entity.Report; import com.votogether.domain.report.entity.vo.ReportType; import com.votogether.test.ServiceTest; diff --git a/backend/src/test/java/com/votogether/global/jwt/TokenProcessorTest.java b/backend/src/test/java/com/votogether/global/jwt/TokenProcessorTest.java index cbf74ddbe..d5e618d70 100644 --- a/backend/src/test/java/com/votogether/global/jwt/TokenProcessorTest.java +++ b/backend/src/test/java/com/votogether/global/jwt/TokenProcessorTest.java @@ -5,9 +5,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.votogether.domain.member.entity.Member; -import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; -import com.votogether.domain.member.entity.vo.SocialType; import com.votogether.domain.member.repository.MemberRepository; import com.votogether.test.RepositoryTest; import com.votogether.test.fixtures.MemberFixtures; diff --git a/backend/src/test/java/com/votogether/test/fixtures/MemberFixtures.java b/backend/src/test/java/com/votogether/test/fixtures/MemberFixtures.java index 0b95a023e..ed1ab2631 100644 --- a/backend/src/test/java/com/votogether/test/fixtures/MemberFixtures.java +++ b/backend/src/test/java/com/votogether/test/fixtures/MemberFixtures.java @@ -2,45 +2,51 @@ import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import com.votogether.domain.member.entity.vo.SocialType; public enum MemberFixtures { - MALE_UNDER_10("user1", Gender.MALE, 2015, "user1", Role.MEMBER), - FEMALE_UNDER_10("user2", Gender.FEMALE, 2015, "user2", Role.MEMBER), - MALE_10("user3", Gender.MALE, 2005, "user3", Role.MEMBER), - FEMALE_10("user4", Gender.FEMALE, 2005, "user4", Role.MEMBER), - MALE_20("user7", Gender.MALE, 1995, "user7", Role.MEMBER), - FEMALE_20("user8", Gender.FEMALE, 1995, "user8", Role.MEMBER), - MALE_30("user9", Gender.MALE, 1985, "user9", Role.MEMBER), - FEMALE_30("user10", Gender.FEMALE, 1985, "user10", Role.MEMBER), - MALE_40("user11", Gender.MALE, 1975, "user11", Role.MEMBER), - FEMALE_40("user12", Gender.FEMALE, 1975, "user12", Role.MEMBER), - MALE_50("user13", Gender.MALE, 1965, "user13", Role.MEMBER), - FEMALE_50("user14", Gender.FEMALE, 1965, "user14", Role.MEMBER), - MALE_60("user15", Gender.MALE, 1955, "user15", Role.MEMBER), - FEMALE_60("user16", Gender.FEMALE, 1955, "user16", Role.MEMBER), - MALE_70("user17", Gender.MALE, 1945, "user17", Role.MEMBER), - FEMALE_70("user18", Gender.FEMALE, 1945, "user18", Role.MEMBER), - MALE_80("user19", Gender.MALE, 1935, "user19", Role.MEMBER), - FEMALE_80("user20", Gender.FEMALE, 1935, "user20", Role.MEMBER), - MALE_OVER_90("user21", Gender.MALE, 1925, "user21", Role.MEMBER), - FEMALE_OVER_90("user22", Gender.FEMALE, 1925, "user22", Role.MEMBER), + MALE_UNDER_10("user1", Gender.MALE, 2015, "user1", Roles.MEMBER), + FEMALE_UNDER_10("user2", Gender.FEMALE, 2015, "user2", Roles.MEMBER), + MALE_10("user3", Gender.MALE, 2005, "user3", Roles.MEMBER), + FEMALE_10("user4", Gender.FEMALE, 2005, "user4", Roles.MEMBER), + MALE_20("user7", Gender.MALE, 1995, "user7", Roles.MEMBER), + FEMALE_20("user8", Gender.FEMALE, 1995, "user8", Roles.MEMBER), + MALE_30("user9", Gender.MALE, 1985, "user9", Roles.MEMBER), + FEMALE_30("user10", Gender.FEMALE, 1985, "user10", Roles.MEMBER), + MALE_40("user11", Gender.MALE, 1975, "user11", Roles.MEMBER), + FEMALE_40("user12", Gender.FEMALE, 1975, "user12", Roles.MEMBER), + MALE_50("user13", Gender.MALE, 1965, "user13", Roles.MEMBER), + FEMALE_50("user14", Gender.FEMALE, 1965, "user14", Roles.MEMBER), + MALE_60("user15", Gender.MALE, 1955, "user15", Roles.MEMBER), + FEMALE_60("user16", Gender.FEMALE, 1955, "user16", Roles.MEMBER), + MALE_70("user17", Gender.MALE, 1945, "user17", Roles.MEMBER), + FEMALE_70("user18", Gender.FEMALE, 1945, "user18", Roles.MEMBER), + MALE_80("user19", Gender.MALE, 1935, "user19", Roles.MEMBER), + FEMALE_80("user20", Gender.FEMALE, 1935, "user20", Roles.MEMBER), + MALE_OVER_90("user21", Gender.MALE, 1925, "user21", Roles.MEMBER), + FEMALE_OVER_90("user22", Gender.FEMALE, 1925, "user22", Roles.MEMBER), ; private final String nickname; private final Gender gender; private final Integer birthYear; private final String socialId; - private final Role role; + private final Roles roles; - MemberFixtures(final String nickname, final Gender gender, final Integer birthYear, final String socialId, final Role role) { + MemberFixtures( + final String nickname, + final Gender gender, + final Integer birthYear, + final String socialId, + final Roles roles + ) { this.nickname = nickname; this.gender = gender; this.birthYear = birthYear; this.socialId = socialId; - this.role = role; + this.roles = roles; } public Member get() { @@ -50,7 +56,7 @@ public Member get() { .birthYear(birthYear) .socialType(SocialType.KAKAO) .socialId(socialId) - .role(role) + .roles(roles) .build(); } diff --git a/backend/src/test/java/com/votogether/test/persister/MemberTestPersister.java b/backend/src/test/java/com/votogether/test/persister/MemberTestPersister.java index cdae31007..e62e0a0b0 100644 --- a/backend/src/test/java/com/votogether/test/persister/MemberTestPersister.java +++ b/backend/src/test/java/com/votogether/test/persister/MemberTestPersister.java @@ -2,7 +2,7 @@ import com.votogether.domain.member.entity.Member; import com.votogether.domain.member.entity.vo.Gender; -import com.votogether.domain.member.entity.vo.Role; +import com.votogether.domain.member.entity.vo.Roles; import com.votogether.domain.member.entity.vo.SocialType; import com.votogether.domain.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -25,7 +25,7 @@ public final class MemberBuilder { private Integer birthYear; private SocialType socialType; private String socialId; - private Role role; + private Roles roles; public MemberBuilder nickname(String nickname) { this.nickname = nickname; @@ -52,8 +52,8 @@ public MemberBuilder socialId(String socialId) { return this; } - public MemberBuilder role(Role role) { - this.role = role; + public MemberBuilder roles(Roles roles) { + this.roles = roles; return this; } @@ -64,7 +64,7 @@ public Member save() { .birthYear(birthYear == null ? 1995 : birthYear) .socialType(socialType == null ? SocialType.KAKAO : socialType) .socialId(socialId == null ? RandomStringUtils.random(10, true, true) : socialId) - .role(role == null ? Role.MEMBER : role) + .roles(roles == null ? Roles.MEMBER : roles) .build(); return memberRepository.save(member); }