728x90
320x100
✅ 구독 정보를 누르면 page User의 구독 정보를 볼 수 있음
✅ 여기서 구독취소/구독하기 버튼은 로그인한 user를 기준으로 구분되어야 함.
📌 UserProfileDto
package yerong.InstagramCloneCoding.web.dto.user;
import lombok.*;
import yerong.InstagramCloneCoding.domain.user.User;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserProfileDto {
private boolean pageOwnerState;
private int imageCount;
private boolean subscribeState;
private int subscribeCount;
private User user;
}
- subscribeState, subscribeCount를 추가해줌
📌 SubscribeRepository
package yerong.InstagramCloneCoding.repository.subs;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import yerong.InstagramCloneCoding.domain.subs.Subscribe;
import java.util.Optional;
@Repository
public interface SubscribeRepository extends JpaRepository<Subscribe, Long> {
@Modifying
@Query(value = "INSERT INTO subscribe(from_user_id, to_user_id, createdAt) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true)
int mSubscribe(Long fromUserId, Long toUserId);
@Modifying
@Query(value = "DELETE FROM subscribe WHERE from_user_id = :fromUserId and to_user_id = :toUserId", nativeQuery = true)
int mUnSubscribe(Long fromUserId, Long toUserId);
@Query(value = "SELECT COUNT(*) FROM subscribe WHERE from_user_id = :pageOwnerId AND to_user_id = :pageUserId", nativeQuery = true)
int mSubscribeState(Long pageOwnerId, Long pageUserId);
@Query(value = "SELECT COUNT(*) FROM subscribe WHERE from_user_id = :pageUserId", nativeQuery = true)
int mSubscribeCount(Long pageUserId);
}
- 구독 여부와 총 구독자 수를 db에서 받아온다
📌 UserServiceImpl
@Override
@Transactional
public UserProfileDto profile(Long pageUserId, Long pageOwnerId){
UserProfileDto dto = new UserProfileDto();
User pageUser = userRepository.findById(pageUserId).orElseThrow(() -> new CustomException("해당 프로필 페이지는 없는 페이지입니다."));
dto.setUser(pageUser);
dto.setImageCount(pageUser.getImages().size());
dto.setPageOwnerState(pageOwnerId.equals(pageUserId));
int state = subscribeRepository.mSubscribeState(pageOwnerId, pageUserId);
int count = subscribeRepository.mSubscribeCount(pageUserId);
dto.setSubscribeState(state==1);
dto.setSubscribeCount(count);
return dto;
}
- state, count에 값을 추가시켜준다
📌 SubscribeDto
package yerong.InstagramCloneCoding.web.dto.subscribe;
import lombok.*;
@NoArgsConstructor
@Builder
@Getter
@Setter
@AllArgsConstructor
public class SubscribeDto {
private Long id;
private String username;
private String profileImageUrl;
private Integer subscribeState;
private Integer equalState; //나 자신인지
}
- 구독 정보를 누르면 나타날 user을 위한 dto 생성
- 해당 user의 id, username, profileurl이 필요하다.
- 로그인된 사용자와의 구독 상태 필요
- 로그인된 사용자 본인인지 상태 필요
📌 UserApiController
@GetMapping("/api/user/{pageUserId}/subscribe")
public ResponseEntity<CMRespDto<?>> subscribeList
(@PathVariable Long pageUserId,
@AuthenticationPrincipal PrincipalDetails principalDetails
){
List<SubscribeDto> subscribeDtoList = subscribeService.getSubscribeList(pageUserId, principalDetails.getUser().getId());
return new ResponseEntity<CMRespDto<?>>(new CMRespDto<>(1, "구독 정보 가져오기 성공", subscribeDtoList), HttpStatus.OK);
}
- 구독 정보를 볼 page user의 id를 전달받음
- 로그인된 사용자의 id를 받음
📌 SubscribeServiceImpl
@Override
@Transactional
public List<SubscribeDto> getSubscribeList(Long pageUserId, Long pageOwnerId){
List<SubscribeDto> result = queryFactory
.select(Projections.fields(SubscribeDto.class,
user.id,
user.username,
user.profileImageUrl,
ExpressionUtils.as(
new CaseBuilder()
.when(JPAExpressions
.selectOne()
.from(subscribe)
.where(subscribe.fromUser.id.eq(pageOwnerId)
.and(subscribe.toUser.id.eq(user.id)))
.exists())
.then(1)
.otherwise(0),
"subscribeState"),
ExpressionUtils.as(
new CaseBuilder()
.when(user.id.eq(pageOwnerId)).then(1)
.otherwise(0), "equalState")
))
.from(user)
.leftJoin(subscribe).on(subscribe.toUser.id.eq(user.id))
.where(subscribe.fromUser.id.eq(pageUserId))
.fetch();
return result;
}
- querydsl을 이용해서 받아옴
- 로그인된 사용자 자신이라면 구독하기/구독취소 버튼이 안 뜨게 하기 위해 구분
- 로그인된 사용자가 구독을 했는지 안했는지 구분
PREV
NEXT
728x90
반응형
'프로젝트 > 인스타그램 클론 코딩' 카테고리의 다른 글
[인스타그램 클론 코딩][Spring boot] 10. 좋아요 및 인기 페이지 구현 (0) | 2024.02.23 |
---|---|
[인스타그램 클론 코딩][Spring boot] 9. 스토리(메인) 페이지 (0) | 2024.02.22 |
[인스타그램 클론 코딩][Spring boot] 7. 프로필 페이지 (2) | 2024.02.20 |
[인스타그램 클론 코딩][Spring boot] 6. 구독하기 (0) | 2024.02.19 |
[인스타그램 클론 코딩][Spring boot] 5. 회원 정보 수정 (1) | 2024.02.19 |