Skip to content

Commit

Permalink
feat: 친구 도메인 관련 기능 구현 (#63)
Browse files Browse the repository at this point in the history
  • Loading branch information
D0ri123 authored Aug 20, 2023
1 parent f8de606 commit eab8b51
Show file tree
Hide file tree
Showing 41 changed files with 416 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dnd.bbok.domain.common;
package com.dnd.bbok.common;

import java.time.LocalDate;
import javax.persistence.Column;
Expand All @@ -22,4 +22,8 @@ public abstract class BaseTimeEntity {
@Column(name = "MODIFIED_AT")
private LocalDate modifiedAt;

protected void setCreatedAt(LocalDate date) {
this.createdAt = date;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static javax.persistence.FetchType.*;
import static javax.persistence.GenerationType.IDENTITY;

import com.dnd.bbok.domain.common.BaseTimeEntity;
import com.dnd.bbok.common.BaseTimeEntity;
import com.dnd.bbok.diary.domain.Emoji;
import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendEntity;
import com.sun.istack.NotNull;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public class CreateDiaryService implements CreateDiaryUseCase {
private final LoadBookmarkPort loadBookmarkPort;


//TODO: 친구가 없는 상태인데 다이어리 생성 요청했을 때의 에러도 필요할 것 같습니다!
@Override
public CreateDiaryResponse createDiary(UUID memberId, Long friendId, CreateDiaryRequest createDiaryRequest) {
// 1. 다섯 개 이상의 태그를 사용하려 했다면 에러
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static javax.persistence.FetchType.*;
import static javax.persistence.GenerationType.IDENTITY;

import com.dnd.bbok.domain.common.BaseTimeEntity;
import com.dnd.bbok.common.BaseTimeEntity;
import com.dnd.bbok.domain.member.entity.Member;
import com.sun.istack.NotNull;
import javax.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dnd.bbok.domain.member.entity;

import com.dnd.bbok.domain.common.BaseTimeEntity;
import com.dnd.bbok.common.BaseTimeEntity;
import com.github.f4b6a3.uuid.UuidCreator;
import java.util.UUID;
import javax.persistence.Column;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.dnd.bbok.friend.adapter.in.web;

import com.dnd.bbok.friend.application.port.in.request.UpdateFriendRequest;
import com.dnd.bbok.friend.application.port.in.usecase.EditFriendUseCase;
import com.dnd.bbok.member.application.port.in.response.SessionUser;
import com.dnd.bbok.global.response.MessageResponse;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import lombok.RequiredArgsConstructor;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1")
@Api(tags = "친구 관련 컨트롤러")
@RequiredArgsConstructor
public class EditFriendInfoController {

private final EditFriendUseCase editFriendUseCase;

@ApiOperation(value = "친구 정보 수정")
@PatchMapping("/friend/{id}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<MessageResponse> getBbokCharacter(
@Parameter(name = "id", in = ParameterIn.PATH, description = "친구 id") @PathVariable("id") Long friendId,
@RequestBody UpdateFriendRequest updateFriendRequest,
@AuthenticationPrincipal SessionUser sessionUser
) {
editFriendUseCase.editName(sessionUser.getUuid() ,friendId, updateFriendRequest);
return new ResponseEntity<>(
MessageResponse.of(HttpStatus.OK, "친구 이름 수정 성공"), HttpStatus.OK);
}

@ApiOperation(value = "친구 관계 정리")
@PatchMapping("/friend/{id}/deactivate")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<MessageResponse> getBbokCharacter(
@Parameter(name = "id", in = ParameterIn.PATH, description = "친구 id") @PathVariable("id") Long friendId,
@AuthenticationPrincipal SessionUser sessionUser
) {
editFriendUseCase.editStatus(sessionUser.getUuid(), friendId);
return new ResponseEntity<>(
MessageResponse.of(HttpStatus.OK, "친구와의 관계 정리 성공"), HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dnd.bbok.friend.adapter.in.web;

import com.dnd.bbok.friend.application.port.in.response.BbokCharactersDto;
import com.dnd.bbok.friend.application.port.in.response.BbokCharacterGroupInfo;
import com.dnd.bbok.friend.application.port.in.usecase.GetIconQuery;

import com.dnd.bbok.global.response.DataResponse;
Expand All @@ -25,8 +25,8 @@ public class GetFriendCharacterController {
@ApiOperation(value = "캐릭터 정보 제공")
@GetMapping("/character")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<DataResponse<BbokCharactersDto>> getBbokCharacter() {
BbokCharactersDto characters = getIconQuery.getCharacterIconUrl();
public ResponseEntity<DataResponse<BbokCharacterGroupInfo>> getBbokCharacter() {
BbokCharacterGroupInfo characters = getIconQuery.getCharacterIconUrl();
return new ResponseEntity<>(
DataResponse.of(HttpStatus.OK, "캐릭터 목록 제공 성공", characters), HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dnd.bbok.friend.adapter.in.web;

import com.dnd.bbok.friend.application.port.in.response.FriendsDto;
import com.dnd.bbok.friend.application.port.in.response.FriendGroupInfo;
import com.dnd.bbok.friend.application.port.in.usecase.GetFriendsQuery;
import com.dnd.bbok.global.response.DataResponse;
import com.dnd.bbok.member.application.port.in.response.SessionUser;
Expand All @@ -26,10 +26,10 @@ public class GetFriendsController {
@ApiOperation(value = "친구 목록 조회")
@GetMapping("/friend")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<DataResponse<FriendsDto>> getFriends(
public ResponseEntity<DataResponse<FriendGroupInfo>> getFriends(
@AuthenticationPrincipal SessionUser sessionUser
) {
FriendsDto friends = getFriendsQuery.getFriends(sessionUser.getUuid());
FriendGroupInfo friends = getFriendsQuery.getFriends(sessionUser.getUuid());
return new ResponseEntity<>(
DataResponse.of(HttpStatus.OK, "친구 목록 조회 성공", friends), HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.dnd.bbok.friend.adapter.in.web;

import com.dnd.bbok.friend.application.port.in.request.FriendRequestDto;
import com.dnd.bbok.friend.application.port.in.request.FriendInfoRequest;
import com.dnd.bbok.friend.application.port.in.usecase.RegisterFriendUseCase;
import com.dnd.bbok.global.response.MessageResponse;
import com.dnd.bbok.member.application.port.in.response.SessionUser;
import com.dnd.bbok.global.response.MessageResponse;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
Expand All @@ -29,7 +31,7 @@ public class RegisterFriendController {
@PreAuthorize("isAuthenticated()")
public ResponseEntity<MessageResponse> createFriend(
@AuthenticationPrincipal SessionUser sessionUser,
@RequestBody FriendRequestDto requestFriend) {
@RequestBody FriendInfoRequest requestFriend) {
registerFriendUseCase.createFriendCharacter(sessionUser.getUuid(), requestFriend);
return new ResponseEntity<>(
MessageResponse.of(HttpStatus.CREATED, "친구 등록 성공"), HttpStatus.CREATED);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package com.dnd.bbok.friend.adapter.out.persistence;

import static com.dnd.bbok.global.exception.ErrorCode.FRIEND_IS_NOT_ACTIVE;
import static com.dnd.bbok.global.exception.ErrorCode.FRIEND_NOT_FOUND;
import static com.dnd.bbok.global.exception.ErrorCode.INVALID_FRIEND_NAME;
import static com.dnd.bbok.global.exception.ErrorCode.MEMBER_NOT_FOUND;
import static com.dnd.bbok.global.exception.ErrorCode.OTHER_FRIEND_ALREADY_ACTIVE;

import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendEntity;
import com.dnd.bbok.friend.adapter.out.persistence.mapper.FriendMapper;
import com.dnd.bbok.friend.adapter.out.persistence.repository.FriendTestRepository;
import com.dnd.bbok.friend.application.port.in.request.FriendRequestDto;
import com.dnd.bbok.friend.application.port.in.request.FriendInfoRequest;
import com.dnd.bbok.friend.application.port.in.request.UpdateFriendRequest;
import com.dnd.bbok.friend.application.port.out.FriendValidatorPort;
import com.dnd.bbok.friend.application.port.out.LoadFriendPort;
import com.dnd.bbok.friend.application.port.out.SaveFriendPort;
import com.dnd.bbok.friend.application.port.out.UpdateFriendPort;
import com.dnd.bbok.friend.domain.Friend;
import com.dnd.bbok.global.exception.BusinessException;
import com.dnd.bbok.member.adapter.out.persistence.entity.MemberEntity;
import com.dnd.bbok.member.adapter.out.persistence.mapper.MemberMapper;
import com.dnd.bbok.member.adapter.out.persistence.repository.MemberTestRepository;
import com.dnd.bbok.member.domain.Member;
import java.util.List;
Expand All @@ -26,21 +31,22 @@
@RequiredArgsConstructor
@Slf4j
public class FriendPersistenceAdapter
implements LoadFriendPort, FriendValidatorPort, SaveFriendPort {
implements LoadFriendPort, FriendValidatorPort, SaveFriendPort, UpdateFriendPort {

private final FriendTestRepository friendRepository;
private final FriendTestRepository friendTestRepository;
private final MemberTestRepository memberRepository;
private final FriendMapper friendMapper;
private final MemberMapper memberMapper;

@Override
public List<Friend> getByMemberId(UUID memberId) {
List<FriendEntity> friends = friendRepository.findAllFriends(memberId);
List<FriendEntity> friends = friendTestRepository.findAllFriends(memberId);
return friendMapper.convertEntitiesToDomain(friends);
}

@Override
public void checkOtherActiveFriend(Member member) {
List<FriendEntity> otherFriends = friendRepository.findAllFriends(member.getId());
List<FriendEntity> otherFriends = friendTestRepository.findAllFriends(member.getId());
if(otherFriends.stream().anyMatch(FriendEntity::isActive)) {
throw new BusinessException(OTHER_FRIEND_ALREADY_ACTIVE);
}
Expand All @@ -55,10 +61,40 @@ public void validateNaming(String friendName) {
}

@Override
public void saveFriend(UUID memberId, FriendRequestDto friendRequest) {
public Friend isActiveFriend(UUID memberId, Long friendId) {
FriendEntity friend = friendTestRepository.findFriendById(friendId)
.orElseThrow(() -> new BusinessException(FRIEND_NOT_FOUND));
if(!friend.isActive()) {
throw new BusinessException(FRIEND_IS_NOT_ACTIVE);
}
Member memberDomain = memberMapper.toDomain(friend.getMember());
//member 도메인을 생성해주는 MemberMapper가 필요하다.
return friendMapper.toDomain(memberDomain, friend);
}

@Override
public void saveFriend(UUID memberId, FriendInfoRequest friendRequest) {
MemberEntity member = memberRepository.findById(memberId)
.orElseThrow(() -> new BusinessException(MEMBER_NOT_FOUND));
FriendEntity friendEntity = friendMapper.convertDtoToEntity(member, friendRequest);
friendRepository.save(friendEntity);
friendTestRepository.save(friendEntity);
}

@Override
public void updateFriend(Friend friend, UpdateFriendRequest friendRequest) {
MemberEntity member = memberRepository.findById(friend.getMember().getId())
.orElseThrow(() -> new BusinessException(MEMBER_NOT_FOUND));
FriendEntity friendEntity = friendMapper.toEntity(member, friend);
friendEntity.changeFriendName(friendRequest.getName());
friendTestRepository.save(friendEntity);
}

@Override
public void updateStatus(UUID memberId, Friend friend) {
MemberEntity member = memberRepository.findById(memberId)
.orElseThrow(() -> new BusinessException(MEMBER_NOT_FOUND));
FriendEntity friendEntity = friendMapper.toEntity(member, friend);
friendEntity.deactivateFriend();
friendTestRepository.save(friendEntity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.GenerationType.IDENTITY;

import com.dnd.bbok.domain.common.BaseTimeEntity;
import com.dnd.bbok.common.BaseTimeEntity;
import com.dnd.bbok.friend.domain.BbokCharacter;
import com.dnd.bbok.member.adapter.out.persistence.entity.MemberEntity;
import com.sun.istack.NotNull;
import java.time.LocalDate;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
Expand Down Expand Up @@ -50,13 +51,23 @@ public void changeFriendScore(Long friendScore) {
this.friendScore = friendScore;
}

public void changeFriendName(String friendName) {
this.name = friendName;
}

public void deactivateFriend() {
this.active = false;
}

@Builder
public FriendEntity(BbokCharacter bbok, String name, boolean active, Long friendScore, MemberEntity member) {
public FriendEntity(Long id, BbokCharacter bbok, String name, boolean active,
Long friendScore, MemberEntity member, LocalDate createdAt) {
this.id = id;
this.bbok = bbok;
this.name = name;
this.active = active;
this.friendScore = friendScore;
this.member = member;
this.setCreatedAt(createdAt);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
import static com.dnd.bbok.friend.domain.BbokCharacter.*;

import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendEntity;
import com.dnd.bbok.friend.application.port.in.request.FriendRequestDto;
import com.dnd.bbok.friend.application.port.in.request.FriendInfoRequest;
import com.dnd.bbok.friend.domain.BbokCharacter;
import com.dnd.bbok.friend.domain.Friend;
import com.dnd.bbok.member.adapter.out.persistence.entity.MemberEntity;
import com.dnd.bbok.member.domain.Member;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Component;
Expand All @@ -21,12 +22,13 @@ public List<Friend> convertEntitiesToDomain(List<FriendEntity> friends) {
.name(friend.getName())
.bbok(friend.getBbok())
.friendScore(friend.getFriendScore())
.createdAt(friend.getCreatedAt())
.active(friend.isActive())
.build())
.collect(Collectors.toList());
}

public FriendEntity convertDtoToEntity(MemberEntity member, FriendRequestDto friendRequest) {
public FriendEntity convertDtoToEntity(MemberEntity member, FriendInfoRequest friendRequest) {
BbokCharacter friendCharacter =
(friendRequest.getCharacter().equals("CACTUS")) ? SIDE_CACTUS : SIDE_HEDGEHOG;

Expand All @@ -38,4 +40,28 @@ public FriendEntity convertDtoToEntity(MemberEntity member, FriendRequestDto fri
.member(member)
.build();
}

public Friend toDomain(Member member, FriendEntity friend) {
return Friend.builder()
.id(friend.getId())
.name(friend.getName())
.friendScore(friend.getFriendScore())
.createdAt(friend.getCreatedAt())
.bbok(friend.getBbok())
.active(friend.isActive())
.member(member)
.build();
}

public FriendEntity toEntity(MemberEntity member, Friend friend) {
return FriendEntity.builder()
.createdAt(friend.getCreatedAt())
.id(friend.getId())
.name(friend.getName())
.bbok(friend.getBbok())
.active(friend.isActive())
.friendScore(friend.getFriendScore())
.member(member)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.dnd.bbok.friend.adapter.out.persistence.entity.FriendEntity;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -12,4 +13,9 @@ public interface FriendTestRepository extends JpaRepository<FriendEntity, Long>
@Query("select f from FriendEntity f where f.member.id = :memberId")
List<FriendEntity> findAllFriends(@Param("memberId") UUID memberId);

@Query("select f from FriendEntity f where f.member.id = :memberId and f.name = :friendName")
FriendEntity findFriendWithNameCond(@Param("memberId") UUID memberId,@Param("friendName") String friendName);

@Query("select f from FriendEntity f join fetch f.member where f.id = :friendId")
Optional<FriendEntity> findFriendById(@Param("friendId") Long friendId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

@Getter
@NoArgsConstructor
public class FriendRequestDto {
public class FriendInfoRequest {

@ApiModelProperty(value = "친구 이름")
private String name;
Expand Down
Loading

0 comments on commit eab8b51

Please sign in to comment.