Super Kawaii Cute Cat Kaoani [인스타그램 클론 코딩][Spring boot] 8. 구독 정보 뷰 렌더링

[인스타그램 클론 코딩][Spring boot] 8. 구독 정보 뷰 렌더링

2024. 2. 21. 23:29
728x90
SMALL

✅ 구독 정보를 누르면 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

https://nyeroni.tistory.com/entry/%EC%9D%B8%EC%8A%A4%ED%83%80%EA%B7%B8%EB%9E%A8-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9Spring-boot-7-%ED%94%84%EB%A1%9C%ED%95%84-%ED%8E%98%EC%9D%B4%EC%A7%80

 

[인스타그램 클론 코딩][Spring boot] 7. 프로필 페이지

포토 이미지 등록 multipart/form-data UUID 포토 이미지 렌더링 엔티티에 파일이 아닌 url 저장 사진을 전송받으면 그 사진을 서버에 특정 폴더에 저장하게 될 것임(DB에 그 경로를 insert 할 것!) 📌 Image

nyeroni.tistory.com

NEXT

 

[인스타그램 클론 코딩][Spring boot] 9. 스토리(메인) 페이지

✅ 필요한 것 게시글을 올린 user 정보 (이름, 프로필사진) 사진에 대한 정보 캡션에 대한 정보 좋아요, 댓글에 대한 정보 (좀 뒤에 구현 예정) 📌 ImageDto package yerong.InstagramCloneCoding.web.dto.image; impor

nyeroni.tistory.com

728x90
SMALL

 

728x90
LIST

BELATED ARTICLES

more