Skip to content

Commit

Permalink
[FEAT] ProfileCard와 ProfileCardLike 엔티티 구현 (#81)
Browse files Browse the repository at this point in the history
* [FEAT] ProfileCard와 ProfileCardLike 엔티티 구현

* [FEAT] ProfileCard 동적 쿼리 조회 메서드 구현, 커서 기반 페이지네이션 적용
  • Loading branch information
JIN-076 committed Feb 19, 2024
1 parent 48d8b39 commit 79ed4f8
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.oeid.mogakgo.domain.profile.domain.entity;

import io.oeid.mogakgo.domain.user.domain.User;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "profile_card_tb")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ProfileCard {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "profile_card_id")
private Long id;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", updatable = false)
private User user;

@Column(name = "total_like_amount", nullable = false)
private Long totalLikeAmount;

@Builder
private ProfileCard(User user) {
this.user = user;
this.totalLikeAmount = 0L;
}

public static ProfileCard from(User user) {
return ProfileCard.builder()
.user(user)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package io.oeid.mogakgo.domain.profile.domain.entity;

import io.oeid.mogakgo.domain.user.domain.User;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Getter
@Entity
@Table(name = "profile_card_like_tb")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EntityListeners(AuditingEntityListener.class)
public class ProfileCardLike {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "profile_card_like_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "sender_id", updatable = false)
private User sender;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "receiver_id", updatable = false)
private User receiver;

@CreatedDate
@Column(name = "created_at")
private LocalDateTime createdAt;

@Builder
private ProfileCardLike(User sender, User receiver) {
this.sender = sender;
this.receiver = receiver;
}

public static ProfileCardLike of(User sender, User receiver) {
return ProfileCardLike.builder()
.sender(sender)
.receiver(receiver)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.oeid.mogakgo.domain.profile.infrastructure;

import io.oeid.mogakgo.domain.profile.domain.entity.ProfileCard;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProfileCardJpaRepository extends JpaRepository<ProfileCard, Long>, ProfileCardRepositoryCustom {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.oeid.mogakgo.domain.profile.infrastructure;

import io.oeid.mogakgo.domain.geo.domain.enums.Region;
import io.oeid.mogakgo.domain.profile.domain.entity.ProfileCard;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;

public interface ProfileCardRepositoryCustom {

Slice<ProfileCard> findByCondition(
Long cursorId, Long userId, Region region, Pageable pageable
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package io.oeid.mogakgo.domain.profile.infrastructure;

import static io.oeid.mogakgo.domain.profile.domain.entity.QProfileCard.profileCard;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import io.oeid.mogakgo.domain.geo.domain.enums.Region;
import io.oeid.mogakgo.domain.profile.domain.entity.ProfileCard;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class ProfileCardRepositoryCustomImpl implements ProfileCardRepositoryCustom {

private final JPAQueryFactory jpaQueryFactory;

@Override
public Slice<ProfileCard> findByCondition(
Long cursorId, Long userId, Region region, Pageable pageable
) {
List<ProfileCard> result = jpaQueryFactory.selectFrom(profileCard)
.where(
cursorIdEq(cursorId),
userIdEq(userId),
regionEq(region)
)
.limit(pageable.getPageSize() + 1)
.fetch();
boolean hasNext = checkLastPage(result, pageable);
return new SliceImpl<>(result, pageable, hasNext);
}

private BooleanExpression regionEq(Region region) {
return region != null ? profileCard.user.region.eq(region) : null;
}

private BooleanExpression userIdEq(Long userId) {
return userId != null ? profileCard.user.id.eq(userId) : null;
}

private BooleanExpression cursorIdEq(Long cursorId) {
return cursorId != null ? profileCard.id.gt(cursorId) : null;
}

private boolean checkLastPage(List<ProfileCard> profileCards, Pageable pageable) {
if (profileCards.size() > pageable.getPageSize()) {
profileCards.remove(pageable.getPageSize());
return true;
}
return false;
}
}

0 comments on commit 79ed4f8

Please sign in to comment.