Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.mulmi.backend.domain.blacklist.entity;

import com.mulmi.backend.domain.user.entity.User;
import com.mulmi.backend.global.common.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(
name = "blacklists",
indexes = @Index(
name = "idx_blacklists_user_period",
columnList = "user_id,start_date,end_date"
)
)
public class Blacklist extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false)
private User user;

// Rental 엔터티 구현 후 연관관계로 전환한다.
@Column(name = "rental_id")
private Long rentalId;

@Column(name = "start_date", nullable = false)
private LocalDate startDate;

@Column(name = "end_date", nullable = false)
private LocalDate endDate;

@Column(nullable = false, columnDefinition = "TEXT")
private String reason;

public void updatePeriodAndReason(
LocalDate startDate,
LocalDate endDate,
String reason
) {
this.startDate = startDate;
this.endDate = endDate;
this.reason = reason;
}

public boolean overlaps(LocalDate otherStartDate, LocalDate otherEndDate) {
return !endDate.isBefore(otherStartDate)
&& !startDate.isAfter(otherEndDate);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.mulmi.backend.domain.blacklist.entity;

import com.mulmi.backend.domain.user.entity.User;
import com.mulmi.backend.domain.user.enums.UserRole;
import com.mulmi.backend.domain.user.enums.UserStatus;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;

import static org.assertj.core.api.Assertions.assertThat;

class BlacklistTest {

@Test
void updatePeriodAndReasonChangesBlacklistDetails() {
Blacklist blacklist = createBlacklist(
LocalDate.of(2026, 9, 1),
LocalDate.of(2026, 9, 30)
);

blacklist.updatePeriodAndReason(
LocalDate.of(2026, 10, 1),
LocalDate.of(2026, 10, 15),
"반납 지연"
);

assertThat(blacklist.getStartDate()).isEqualTo(LocalDate.of(2026, 10, 1));
assertThat(blacklist.getEndDate()).isEqualTo(LocalDate.of(2026, 10, 15));
assertThat(blacklist.getReason()).isEqualTo("반납 지연");
}

@Test
void overlapsIncludesBoundaryDates() {
Blacklist blacklist = createBlacklist(
LocalDate.of(2026, 9, 1),
LocalDate.of(2026, 9, 30)
);

assertThat(blacklist.overlaps(
LocalDate.of(2026, 9, 30),
LocalDate.of(2026, 10, 10)
)).isTrue();
assertThat(blacklist.overlaps(
LocalDate.of(2026, 10, 1),
LocalDate.of(2026, 10, 10)
)).isFalse();
}

private Blacklist createBlacklist(LocalDate startDate, LocalDate endDate) {
User user = User.builder()
.id(1L)
.loginId("C123456")
.studentId("C123456")
.password("encoded-password")
.name("홍길동")
.email("hong@example.com")
.phoneNumber("01012345678")
.college("공과대학")
.department("컴퓨터공학과")
.role(UserRole.STUDENT)
.status(UserStatus.ACTIVE)
.build();

return Blacklist.builder()
.id(1L)
.user(user)
.rentalId(101L)
.startDate(startDate)
.endDate(endDate)
.reason("장기 연체")
.build();
}
}
Loading