Skip to content

Commit e05a202

Browse files
committed
✨Feat: 알람기능 관련 엔티티 구현
1 parent 24b42e8 commit e05a202

2 files changed

Lines changed: 115 additions & 0 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.be.sportizebe.domain.notification.entity;
2+
3+
import com.be.sportizebe.domain.club.entity.Club;
4+
import com.be.sportizebe.domain.user.entity.User;
5+
import com.be.sportizebe.global.common.BaseTimeEntity;
6+
import jakarta.persistence.*;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
12+
@Entity
13+
@Getter
14+
@Builder
15+
@AllArgsConstructor
16+
@NoArgsConstructor
17+
@Table(name = "join_club_request", uniqueConstraints = {
18+
@UniqueConstraint(columnNames = {"user_id", "club_id"})
19+
})
20+
public class JoinClubRequest extends BaseTimeEntity {
21+
22+
public enum JoinClubRequestStatus {
23+
PENDING, // 대기
24+
ACCEPTED, // 승인
25+
REJECTED // 거절
26+
}
27+
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.IDENTITY)
30+
private Long id;
31+
32+
@ManyToOne(fetch = FetchType.LAZY)
33+
@JoinColumn(name = "user_id", nullable = false)
34+
private User user; // 가입 신청자
35+
36+
@ManyToOne(fetch = FetchType.LAZY)
37+
@JoinColumn(name = "club_id", nullable = false)
38+
private Club club; // 가입 신청 대상 동호회
39+
40+
@Enumerated(EnumType.STRING)
41+
@Column(nullable = false)
42+
@Builder.Default
43+
private JoinClubRequestStatus status = JoinClubRequestStatus.PENDING;
44+
45+
// 가입 승인 시 상태 변경
46+
public void accept() {
47+
this.status = JoinClubRequestStatus.ACCEPTED;
48+
}
49+
50+
// 가입 거절 시 상태 변경
51+
public void reject() {
52+
this.status = JoinClubRequestStatus.REJECTED;
53+
}
54+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.be.sportizebe.domain.notification.entity;
2+
3+
import com.be.sportizebe.domain.user.entity.User;
4+
import com.be.sportizebe.global.common.BaseTimeEntity;
5+
import jakarta.persistence.*;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
@Entity
12+
@Getter
13+
@Builder
14+
@AllArgsConstructor
15+
@NoArgsConstructor
16+
@Table(name = "notifications", indexes = {
17+
@Index(name = "idx_notification_receiver", columnList = "receiver_id"),
18+
@Index(name = "idx_notification_is_read", columnList = "receiver_id, is_read")
19+
})
20+
public class Notification extends BaseTimeEntity {
21+
22+
public enum NotificationType {
23+
JOIN_REQUEST, // 가입 신청 (동호회장에게)
24+
JOIN_APPROVED, // 가입 승인 (신청자에게)
25+
JOIN_REJECTED, // 가입 거절 (신청자에게)
26+
CHAT, // 새 채팅 메시지
27+
COMMENT // 새 댓글
28+
}
29+
30+
@Id
31+
@GeneratedValue(strategy = GenerationType.IDENTITY)
32+
private Long id;
33+
34+
@ManyToOne(fetch = FetchType.LAZY)
35+
@JoinColumn(name = "receiver_id", nullable = false)
36+
private User receiver; // 알림 수신자
37+
38+
@Enumerated(EnumType.STRING)
39+
@Column(nullable = false)
40+
private NotificationType type;
41+
42+
@Column(nullable = false)
43+
private String message; // 알림 메시지
44+
45+
@Column(nullable = false)
46+
@Builder.Default
47+
private Boolean isRead = false;
48+
49+
// 가입 신청 관련 알림용 (JOIN_REQUEST, JOIN_APPROVED, JOIN_REJECTED)
50+
@ManyToOne(fetch = FetchType.LAZY)
51+
@JoinColumn(name = "join_request_id")
52+
private JoinClubRequest joinClubRequest;
53+
54+
// 댓글 알림용 - targetId와 targetType으로 다형성 처리
55+
// COMMENT: postId, CHAT: chatRoomId 등
56+
private Long targetId;
57+
58+
public void markAsRead() {
59+
this.isRead = true;
60+
}
61+
}

0 commit comments

Comments
 (0)