Skip to content

Commit f56280d

Browse files
authored
AIM-16-챌린지-도메인-엔티티-및-레포지토리-구현 (#11)
* feat: challenge entity 작성 * feat: WeeklyProgress entity 작성 * feat: WeeklyComment entity 작성 * feat: ChallengeMember entity 작성 * feat: ChallengeImage entity 작성 * feat: JPARepository 생성 * refactor: ChallengeMember PK를 EmbeddedId 기반으로 리팩토링
1 parent cc1daaa commit f56280d

16 files changed

+321
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
import lombok.experimental.SuperBuilder;
6+
import targeter.aim.common.auditor.TimeStampedEntity;
7+
import targeter.aim.domain.user.entity.User;
8+
9+
import java.time.LocalDate;
10+
11+
@Entity
12+
@Getter
13+
@Setter
14+
@SuperBuilder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@Table(name="challenge")
18+
public class Challenge extends TimeStampedEntity {
19+
20+
@Id
21+
@Column(name = "challenge_id")
22+
@GeneratedValue(strategy = GenerationType.IDENTITY)
23+
@Setter(AccessLevel.NONE)
24+
private Long id;
25+
26+
@ManyToOne(fetch = FetchType.LAZY)
27+
@JoinColumn(name = "host_id", nullable = false)
28+
private User host;
29+
30+
@Column(nullable = false, length = 15)
31+
private String name;
32+
33+
@Column(nullable = false)
34+
private String job;
35+
36+
@Column(name = "started_at", nullable = false)
37+
private LocalDate startedAt;
38+
39+
@Column(name = "duration_week", nullable = false)
40+
private Integer durationWeek;
41+
42+
@Enumerated(EnumType.STRING)
43+
@Column(nullable = false)
44+
private ChallengeMode mode;
45+
46+
@Enumerated(EnumType.STRING)
47+
@Column(nullable = false)
48+
private ChallengeStatus status;
49+
50+
@Enumerated(EnumType.STRING)
51+
@Column(nullable = false)
52+
private ChallengeVisibility visibility;
53+
54+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
import lombok.experimental.SuperBuilder;
6+
import targeter.aim.common.auditor.TimeStampedEntity;
7+
import targeter.aim.domain.user.entity.User;
8+
9+
@Entity
10+
@Getter
11+
@Setter
12+
@SuperBuilder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Table(name="member")
16+
public class ChallengeMember extends TimeStampedEntity {
17+
18+
@EmbeddedId
19+
private ChallengeMemberId id;
20+
21+
@Enumerated(EnumType.STRING)
22+
@Column(nullable = false)
23+
private MemberRole role;
24+
25+
@Enumerated(EnumType.STRING)
26+
@Column
27+
private ChallengeResult result;
28+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
import targeter.aim.domain.user.entity.User;
6+
7+
import java.io.Serializable;
8+
9+
@Embeddable
10+
@Getter
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
@EqualsAndHashCode
14+
@Builder
15+
public class ChallengeMemberId implements Serializable {
16+
17+
@ManyToOne(fetch = FetchType.LAZY)
18+
@JoinColumn(name = "challenge_id", nullable = false)
19+
private Challenge challenge;
20+
21+
@ManyToOne(fetch = FetchType.LAZY)
22+
@JoinColumn(name = "user_id", nullable = false)
23+
private User user;
24+
25+
public static ChallengeMemberId of(Challenge challenge, User user) {
26+
return ChallengeMemberId.builder()
27+
.challenge(challenge)
28+
.user(user)
29+
.build();
30+
}
31+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
public enum ChallengeMode {
4+
SOLO,
5+
VS
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
public enum ChallengeResult {
4+
WIN,
5+
LOSE
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
public enum ChallengeStatus {
4+
IN_PROGRESS,
5+
COMPLETED
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
public enum ChallengeVisibility {
4+
PUBLIC,
5+
PRIVATE
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
public enum MemberRole {
4+
HOST,
5+
MEMBER
6+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
import lombok.experimental.SuperBuilder;
6+
import targeter.aim.common.auditor.TimeStampedEntity;
7+
import targeter.aim.domain.user.entity.User;
8+
9+
@Entity
10+
@Getter
11+
@Setter
12+
@SuperBuilder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Table(name = "weekly_comment")
16+
public class WeeklyComment extends TimeStampedEntity {
17+
18+
@Id
19+
@Column(name = "weekly_comment_id")
20+
@GeneratedValue(strategy = GenerationType.IDENTITY)
21+
@Setter(AccessLevel.NONE)
22+
private Long id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "parent_comment_id")
26+
private WeeklyComment parentComment;
27+
28+
@ManyToOne(fetch = FetchType.LAZY)
29+
@JoinColumn(name = "user_id", nullable = false)
30+
private User user;
31+
32+
@ManyToOne(fetch = FetchType.LAZY)
33+
@JoinColumn(name = "weekly_progress_id", nullable = false)
34+
private WeeklyProgress weeklyProgress;
35+
36+
@Column(nullable = false)
37+
private String content;
38+
39+
@Column(nullable = false)
40+
private Integer depth;
41+
42+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package targeter.aim.domain.challenge.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
import lombok.experimental.SuperBuilder;
6+
import targeter.aim.common.auditor.TimeStampedEntity;
7+
import targeter.aim.domain.user.entity.User;
8+
9+
@Entity
10+
@Getter
11+
@Setter
12+
@SuperBuilder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Table(name="weekly_progress")
16+
public class WeeklyProgress extends TimeStampedEntity {
17+
18+
@Id
19+
@GeneratedValue(strategy = GenerationType.IDENTITY)
20+
@Setter(AccessLevel.NONE)
21+
@Column(name = "weekly_progress_id")
22+
private Long id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "challenge_id", nullable = false)
26+
private Challenge challenge;
27+
28+
@ManyToOne(fetch = FetchType.LAZY)
29+
@JoinColumn(name = "user_id", nullable = false)
30+
private User user;
31+
32+
@Column(name = "week_number", nullable = false)
33+
private Integer weekNumber;
34+
35+
@Column
36+
private String title;
37+
38+
@Column(columnDefinition = "TEXT")
39+
private String content;
40+
41+
@Column(name = "stopwatch_time_seconds")
42+
private Integer stopwatchTimeSeconds;
43+
44+
@Column(name = "is_complete", nullable = false)
45+
private Boolean isComplete;
46+
47+
}

0 commit comments

Comments
 (0)