-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #11 from Nangman-Archive/develop
feat: 사용자 차단 도메인 구현
- Loading branch information
Showing
14 changed files
with
345 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
54 changes: 54 additions & 0 deletions
54
src/main/generated/com/example/copro/member/domain/QBlockedMemberMapping.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package com.example.copro.member.domain; | ||
|
||
import static com.querydsl.core.types.PathMetadataFactory.*; | ||
|
||
import com.querydsl.core.types.dsl.*; | ||
|
||
import com.querydsl.core.types.PathMetadata; | ||
import javax.annotation.processing.Generated; | ||
import com.querydsl.core.types.Path; | ||
import com.querydsl.core.types.dsl.PathInits; | ||
|
||
|
||
/** | ||
* QBlockedMemberMapping is a Querydsl query type for BlockedMemberMapping | ||
*/ | ||
@Generated("com.querydsl.codegen.DefaultEntitySerializer") | ||
public class QBlockedMemberMapping extends EntityPathBase<BlockedMemberMapping> { | ||
|
||
private static final long serialVersionUID = 16622364L; | ||
|
||
private static final PathInits INITS = PathInits.DIRECT2; | ||
|
||
public static final QBlockedMemberMapping blockedMemberMapping = new QBlockedMemberMapping("blockedMemberMapping"); | ||
|
||
public final QMember blockedMember; | ||
|
||
public final NumberPath<Long> id = createNumber("id", Long.class); | ||
|
||
public final QMember member; | ||
|
||
public QBlockedMemberMapping(String variable) { | ||
this(BlockedMemberMapping.class, forVariable(variable), INITS); | ||
} | ||
|
||
public QBlockedMemberMapping(Path<? extends BlockedMemberMapping> path) { | ||
this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); | ||
} | ||
|
||
public QBlockedMemberMapping(PathMetadata metadata) { | ||
this(metadata, PathInits.getFor(metadata, INITS)); | ||
} | ||
|
||
public QBlockedMemberMapping(PathMetadata metadata, PathInits inits) { | ||
this(BlockedMemberMapping.class, metadata, inits); | ||
} | ||
|
||
public QBlockedMemberMapping(Class<? extends BlockedMemberMapping> type, PathMetadata metadata, PathInits inits) { | ||
super(type, metadata, inits); | ||
this.blockedMember = inits.isInitialized("blockedMember") ? new QMember(forProperty("blockedMember")) : null; | ||
this.member = inits.isInitialized("member") ? new QMember(forProperty("member")) : null; | ||
} | ||
|
||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
src/main/java/com/example/copro/member/api/BlockedMemberController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package com.example.copro.member.api; | ||
|
||
import com.example.copro.global.template.RspTemplate; | ||
import com.example.copro.member.api.dto.request.BlockedMemberReqDto; | ||
import com.example.copro.member.application.BlockedMemberService; | ||
import com.example.copro.member.domain.Member; | ||
import io.swagger.v3.oas.annotations.Operation; | ||
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.Valid; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.security.core.annotation.AuthenticationPrincipal; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@Tag(name = "blockedMember", description = "BlockedMember Controller") | ||
@RestController | ||
@RequestMapping("/api") | ||
public class BlockedMemberController { | ||
private final BlockedMemberService blockedMemberService; | ||
|
||
public BlockedMemberController(BlockedMemberService blockedMemberService) { | ||
this.blockedMemberService = blockedMemberService; | ||
} | ||
|
||
@Operation(summary = "유저 차단", description = "해당 유저를 차단 목록에 추가합니다.") | ||
@ApiResponses(value = { | ||
@ApiResponse(responseCode = "200", description = "유저 차단 성공"), | ||
@ApiResponse(responseCode = "400", description = "잘못된 요청 값"), | ||
@ApiResponse(responseCode = "401", description = "헤더 없음 or 토큰 불일치", content = @Content(schema = @Schema(example = "INVALID_HEADER or INVALID_TOKEN"))) | ||
}) | ||
@PostMapping("/add-blocked") | ||
public RspTemplate<String> addBlockedMember(@AuthenticationPrincipal Member member, | ||
@Valid @RequestBody BlockedMemberReqDto blockedMemberReqDto) { | ||
blockedMemberService.addBlockedMember(member, blockedMemberReqDto); | ||
return new RspTemplate<>(HttpStatus.OK, "유저 차단 완료"); | ||
} | ||
|
||
@Operation(summary = "유저 차단 취소", description = "해당 유저를 차단 목록에서 취소합니다.") | ||
@ApiResponses(value = { | ||
@ApiResponse(responseCode = "200", description = "유저 차단 취소 성공"), | ||
@ApiResponse(responseCode = "400", description = "잘못된 요청 값"), | ||
@ApiResponse(responseCode = "401", description = "헤더 없음 or 토큰 불일치", content = @Content(schema = @Schema(example = "INVALID_HEADER or INVALID_TOKEN"))) | ||
}) | ||
@PostMapping("/cancel-blocked") | ||
public RspTemplate<String> cancelBlockedMember(@AuthenticationPrincipal Member member, | ||
@Valid @RequestBody BlockedMemberReqDto blockedMemberReqDto) { | ||
blockedMemberService.cancelBlockedMember(member, blockedMemberReqDto); | ||
return new RspTemplate<>(HttpStatus.OK, "유저 차단 취소 완료"); | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
src/main/java/com/example/copro/member/api/dto/request/BlockedMemberReqDto.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.example.copro.member.api.dto.request; | ||
|
||
import jakarta.validation.constraints.NotNull; | ||
|
||
public record BlockedMemberReqDto( | ||
@NotNull | ||
Long blockedMemberId | ||
) { | ||
} |
50 changes: 50 additions & 0 deletions
50
src/main/java/com/example/copro/member/application/BlockedMemberService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package com.example.copro.member.application; | ||
|
||
import com.example.copro.member.api.dto.request.BlockedMemberReqDto; | ||
import com.example.copro.member.domain.Member; | ||
import com.example.copro.member.domain.repository.BlockedMemberMappingRepository; | ||
import com.example.copro.member.domain.repository.MemberRepository; | ||
import com.example.copro.member.exception.ExistsBlockedMemberException; | ||
import com.example.copro.member.exception.MemberNotFoundException; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Service | ||
@Transactional(readOnly = true) | ||
public class BlockedMemberService { | ||
private final BlockedMemberMappingRepository blockedMemberMappingRepository; | ||
private final MemberRepository memberRepository; | ||
|
||
public BlockedMemberService(BlockedMemberMappingRepository blockedMemberMappingRepository, | ||
MemberRepository memberRepository) { | ||
this.blockedMemberMappingRepository = blockedMemberMappingRepository; | ||
this.memberRepository = memberRepository; | ||
} | ||
|
||
@Transactional | ||
public void addBlockedMember(Member member, BlockedMemberReqDto blockedMemberReqDto) { | ||
Member getMember = memberRepository.findById(member.getMemberId()).orElseThrow(MemberNotFoundException::new); | ||
Member blockedMember = memberRepository.findById(blockedMemberReqDto.blockedMemberId()).orElseThrow(MemberNotFoundException::new); | ||
|
||
validateExistsBlockedMember(getMember, blockedMember); | ||
|
||
getMember.addBlockedMember(blockedMember); | ||
memberRepository.save(getMember); | ||
} | ||
|
||
private void validateExistsBlockedMember(Member member, Member blockedMember) { | ||
if (blockedMemberMappingRepository.existsByMemberAndBlockedMember(member, blockedMember)) { | ||
throw new ExistsBlockedMemberException(); | ||
} | ||
} | ||
|
||
@Transactional | ||
public void cancelBlockedMember(Member member, BlockedMemberReqDto blockedMemberReqDto) { | ||
Member getMember = memberRepository.findById(member.getMemberId()).orElseThrow(MemberNotFoundException::new); | ||
Member blockedMember = memberRepository.findById(blockedMemberReqDto.blockedMemberId()).orElseThrow(MemberNotFoundException::new); | ||
|
||
getMember.cancelBlockedMember(blockedMember); | ||
memberRepository.save(getMember); | ||
} | ||
|
||
} |
33 changes: 33 additions & 0 deletions
33
src/main/java/com/example/copro/member/domain/BlockedMemberMapping.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package com.example.copro.member.domain; | ||
|
||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.GeneratedValue; | ||
import jakarta.persistence.GenerationType; | ||
import jakarta.persistence.Id; | ||
import jakarta.persistence.JoinColumn; | ||
import jakarta.persistence.ManyToOne; | ||
import lombok.AccessLevel; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Entity | ||
@Getter | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
public class BlockedMemberMapping { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "member_id") | ||
private Member member; | ||
|
||
@ManyToOne | ||
@JoinColumn(name = "blocked_member_id") | ||
private Member blockedMember; | ||
|
||
public BlockedMemberMapping(Member member, Member blockedMember) { | ||
this.member = member; | ||
this.blockedMember = blockedMember; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 13 additions & 0 deletions
13
src/main/java/com/example/copro/member/domain/repository/BlockedMemberMappingRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.example.copro.member.domain.repository; | ||
|
||
import com.example.copro.member.domain.BlockedMemberMapping; | ||
import com.example.copro.member.domain.Member; | ||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Pageable; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface BlockedMemberMappingRepository extends JpaRepository<BlockedMemberMapping, Long> { | ||
Page<BlockedMemberMapping> findByMember(Member member, Pageable pageable); | ||
boolean existsByMemberAndBlockedMember(Member member, Member blockedMember); | ||
|
||
} |
13 changes: 13 additions & 0 deletions
13
src/main/java/com/example/copro/member/exception/ExistsBlockedMemberException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.example.copro.member.exception; | ||
|
||
import com.example.copro.global.error.exception.InvalidGroupException; | ||
|
||
public class ExistsBlockedMemberException extends InvalidGroupException { | ||
public ExistsBlockedMemberException(String message) { | ||
super(message); | ||
} | ||
|
||
public ExistsBlockedMemberException() { | ||
this("이미 차단 목록에 추가 되었습니다."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
31 changes: 31 additions & 0 deletions
31
src/main/java/com/example/copro/member/mypage/api/dto/response/BlockedMemberResDto.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.example.copro.member.mypage.api.dto.response; | ||
|
||
import com.example.copro.member.domain.BlockedMemberMapping; | ||
import lombok.Builder; | ||
|
||
@Builder | ||
public record BlockedMemberResDto( | ||
Long blockedMemberId, | ||
String name, | ||
String email, | ||
String picture, | ||
String occupation, | ||
String language, | ||
int career, | ||
String gitHubUrl, | ||
boolean isBlocked | ||
) { | ||
public static BlockedMemberResDto of (BlockedMemberMapping blockedMemberMapping, boolean isBlocked) { | ||
return BlockedMemberResDto.builder() | ||
.blockedMemberId(blockedMemberMapping.getBlockedMember().getMemberId()) | ||
.name(blockedMemberMapping.getBlockedMember().getNickName()) | ||
.email(blockedMemberMapping.getBlockedMember().getEmail()) | ||
.picture(blockedMemberMapping.getBlockedMember().getPicture()) | ||
.occupation(blockedMemberMapping.getBlockedMember().getOccupation()) | ||
.language(blockedMemberMapping.getBlockedMember().getLanguage()) | ||
.career(blockedMemberMapping.getBlockedMember().getCareer()) | ||
.gitHubUrl(blockedMemberMapping.getBlockedMember().getGitHubUrl()) | ||
.isBlocked(isBlocked) | ||
.build(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.