Skip to content

Commit cf69049

Browse files
authored
Merge pull request #3 from Nexters/feat/create-entity
feat: 1차 도메인 설계
2 parents 3bfcc12 + 0f0ae84 commit cf69049

File tree

10 files changed

+436
-0
lines changed

10 files changed

+436
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.climbup.climbup.attempt.entity;
2+
3+
import com.climbup.climbup.common.entity.BaseEntity;
4+
import com.climbup.climbup.route.entity.RouteMission;
5+
import com.climbup.climbup.session.entity.UserSession;
6+
import com.climbup.climbup.user.entity.User;
7+
import jakarta.persistence.*;
8+
import lombok.AccessLevel;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
import lombok.Setter;
12+
import lombok.experimental.SuperBuilder;
13+
14+
@Entity
15+
@Table(name = "user_mission_attempts", indexes = {
16+
@Index(name = "idx_attempt_user_session", columnList = "user_id, session_id")
17+
})
18+
@Getter
19+
@Setter
20+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
21+
@SuperBuilder
22+
public class UserMissionAttempt extends BaseEntity {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
private Long id;
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 = "session_id", nullable = false)
34+
private UserSession session;
35+
36+
@ManyToOne(fetch = FetchType.LAZY)
37+
@JoinColumn(name = "mission_id", nullable = false)
38+
private RouteMission mission;
39+
40+
@Column(name = "success", nullable = false)
41+
private Boolean success;
42+
43+
@Column(name = "video_url", columnDefinition = "TEXT")
44+
private String videoUrl;
45+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.climbup.climbup.common.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.EntityListeners;
5+
import jakarta.persistence.MappedSuperclass;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
import lombok.experimental.SuperBuilder;
9+
import org.springframework.data.annotation.CreatedDate;
10+
import org.springframework.data.annotation.LastModifiedDate;
11+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
12+
13+
import java.time.LocalDateTime;
14+
15+
@EntityListeners(AuditingEntityListener.class)
16+
@MappedSuperclass
17+
@Getter
18+
@NoArgsConstructor
19+
@SuperBuilder
20+
public class BaseEntity {
21+
22+
@CreatedDate
23+
@Column(updatable = false)
24+
private LocalDateTime createdAt;
25+
26+
@LastModifiedDate
27+
private LocalDateTime updatedAt;
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.climbup.climbup.gym.entity;
2+
3+
import com.climbup.climbup.common.entity.BaseEntity;
4+
import com.climbup.climbup.route.entity.RouteMission;
5+
import jakarta.persistence.*;
6+
import lombok.AccessLevel;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.experimental.SuperBuilder;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
@Entity
16+
@Table(name = "climbing_gyms")
17+
@Getter
18+
@Setter
19+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
20+
@SuperBuilder
21+
public class ClimbingGym extends BaseEntity {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private Long id;
26+
27+
@Column(name = "name", nullable = false, length = 100)
28+
private String name;
29+
30+
@Column(name = "location", nullable = false)
31+
private String location;
32+
33+
@Column(name = "sector_info", columnDefinition = "TEXT")
34+
private String sectorInfo;
35+
36+
@Column(name = "image_url", columnDefinition = "TEXT")
37+
private String imageUrl;
38+
39+
@OneToMany(mappedBy = "gym", cascade = CascadeType.ALL)
40+
private List<RouteMission> routeMissions = new ArrayList<>();
41+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.climbup.climbup.recommendation.entity;
2+
3+
import com.climbup.climbup.common.entity.BaseEntity;
4+
import com.climbup.climbup.route.entity.RouteMission;
5+
import com.climbup.climbup.session.entity.UserSession;
6+
import jakarta.persistence.*;
7+
import lombok.AccessLevel;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
import lombok.Setter;
11+
import lombok.experimental.SuperBuilder;
12+
13+
@Entity
14+
@Table(name = "challenge_recommendations")
15+
@Getter
16+
@Setter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@SuperBuilder
19+
public class ChallengeRecommendation extends BaseEntity {
20+
21+
@Id
22+
@GeneratedValue(strategy = GenerationType.IDENTITY)
23+
private Long id;
24+
25+
@ManyToOne(fetch = FetchType.LAZY)
26+
@JoinColumn(name = "session_id", nullable = false)
27+
private UserSession session;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)
30+
@JoinColumn(name = "mission_id", nullable = false)
31+
private RouteMission mission;
32+
33+
@Column(name = "recommended_order", nullable = false)
34+
private Integer recommendedOrder;
35+
36+
// Join 없이 미션 난이도 조회
37+
public String getDifficulty() {
38+
return mission != null ? mission.getDifficulty() : null;
39+
}
40+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.climbup.climbup.route.entity;
2+
3+
import com.climbup.climbup.attempt.entity.UserMissionAttempt;
4+
import com.climbup.climbup.common.entity.BaseEntity;
5+
import com.climbup.climbup.gym.entity.ClimbingGym;
6+
import com.climbup.climbup.recommendation.entity.ChallengeRecommendation;
7+
import com.climbup.climbup.sector.entity.Sector;
8+
import jakarta.persistence.*;
9+
import lombok.*;
10+
import lombok.experimental.SuperBuilder;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
@Entity
16+
@Table(name = "route_missions")
17+
@Getter
18+
@Setter
19+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
20+
@SuperBuilder
21+
public class RouteMission extends BaseEntity {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private Long id;
26+
27+
@ManyToOne(fetch = FetchType.LAZY)
28+
@JoinColumn(name = "gym_id", nullable = false)
29+
private ClimbingGym gym;
30+
31+
@ManyToOne(fetch = FetchType.LAZY)
32+
@JoinColumn(name = "sector_id", nullable = false)
33+
private Sector sector;
34+
35+
@Column(name = "difficulty", nullable = false, length = 10)
36+
private String difficulty;
37+
38+
@Column(name = "score", nullable = false)
39+
private Integer score;
40+
41+
@Column(name = "image_url", nullable = false, columnDefinition = "TEXT")
42+
private String imageUrl;
43+
44+
@Column(name = "video_url", nullable = false, columnDefinition = "TEXT")
45+
private String videoUrl;
46+
47+
@OneToMany(mappedBy = "mission", cascade = CascadeType.ALL)
48+
private List<UserMissionAttempt> attempts = new ArrayList<>();
49+
50+
@OneToMany(mappedBy = "mission", cascade = CascadeType.ALL)
51+
private List<ChallengeRecommendation> recommendations = new ArrayList<>();
52+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.climbup.climbup.sector.entity;
2+
3+
import com.climbup.climbup.common.entity.BaseEntity;
4+
import com.climbup.climbup.route.entity.RouteMission;
5+
import jakarta.persistence.*;
6+
import lombok.AccessLevel;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.experimental.SuperBuilder;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
@Entity
16+
@Table(name = "sectors")
17+
@Getter
18+
@Setter
19+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
20+
@SuperBuilder
21+
public class Sector extends BaseEntity {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private Long id;
26+
27+
@Column(name = "name", nullable = false, length = 50)
28+
private String name;
29+
30+
@Column(name = "image_url", nullable = false, columnDefinition = "TEXT")
31+
private String imageUrl;
32+
33+
@OneToMany(mappedBy = "sector", cascade = CascadeType.ALL)
34+
private List<RouteMission> routeMissions = new ArrayList<>();
35+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.climbup.climbup.session.entity;
2+
3+
import com.climbup.climbup.attempt.entity.UserMissionAttempt;
4+
import com.climbup.climbup.common.entity.BaseEntity;
5+
import com.climbup.climbup.recommendation.entity.ChallengeRecommendation;
6+
import com.climbup.climbup.sr.entity.SRHistory;
7+
import com.climbup.climbup.user.entity.User;
8+
import jakarta.persistence.*;
9+
import lombok.AccessLevel;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
import lombok.Setter;
13+
import lombok.experimental.SuperBuilder;
14+
15+
import java.time.LocalDate;
16+
import java.time.LocalDateTime;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
@Entity
21+
@Table(name = "user_sessions", indexes = {
22+
@Index(name = "idx_session_user_date", columnList = "user_id, session_date")
23+
})
24+
@Getter
25+
@Setter
26+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
27+
@SuperBuilder
28+
public class UserSession extends BaseEntity {
29+
30+
@Id
31+
@GeneratedValue(strategy = GenerationType.IDENTITY)
32+
private Long id;
33+
34+
@ManyToOne(fetch = FetchType.LAZY)
35+
@JoinColumn(name = "user_id", nullable = false)
36+
private User user;
37+
38+
@Column(name = "session_date", nullable = false)
39+
private LocalDate sessionDate;
40+
41+
@Column(name = "started_at", nullable = false)
42+
private LocalDateTime startedAt;
43+
44+
@Column(name = "ended_at")
45+
private LocalDateTime endedAt;
46+
47+
@Column(name = "total_duration")
48+
private Integer totalDuration;
49+
50+
@Column(name = "sr_gained", nullable = false, columnDefinition = "INT DEFAULT 0")
51+
private Integer srGained = 0;
52+
53+
@Column(name = "completed_count", nullable = false, columnDefinition = "INT DEFAULT 0")
54+
private Integer completedCount = 0;
55+
56+
@Column(name = "attempted_count", nullable = false, columnDefinition = "INT DEFAULT 0")
57+
private Integer attemptedCount = 0;
58+
59+
@OneToMany(mappedBy = "session", cascade = CascadeType.ALL)
60+
private List<UserMissionAttempt> attempts = new ArrayList<>();
61+
62+
@OneToMany(mappedBy = "session", cascade = CascadeType.ALL)
63+
private List<ChallengeRecommendation> recommendations = new ArrayList<>();
64+
65+
@OneToMany(mappedBy = "session", cascade = CascadeType.ALL)
66+
private List<SRHistory> srHistories = new ArrayList<>();
67+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.climbup.climbup.sr.entity;
2+
3+
import com.climbup.climbup.common.entity.BaseEntity;
4+
import com.climbup.climbup.route.entity.RouteMission;
5+
import com.climbup.climbup.user.entity.User;
6+
import com.climbup.climbup.session.entity.UserSession;
7+
import jakarta.persistence.*;
8+
import lombok.AccessLevel;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
import lombok.Setter;
12+
import lombok.experimental.SuperBuilder;
13+
14+
@Entity
15+
@Table(name = "sr_histories")
16+
@Getter
17+
@Setter
18+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
19+
@SuperBuilder
20+
public class SRHistory extends BaseEntity {
21+
22+
@Id
23+
@GeneratedValue(strategy = GenerationType.IDENTITY)
24+
private Long id;
25+
26+
@ManyToOne(fetch = FetchType.LAZY)
27+
@JoinColumn(name = "user_id", nullable = false)
28+
private User user;
29+
30+
@ManyToOne(fetch = FetchType.LAZY)
31+
@JoinColumn(name = "session_id", nullable = false)
32+
private UserSession session;
33+
34+
@ManyToOne(fetch = FetchType.LAZY)
35+
@JoinColumn(name = "mission_id", nullable = false)
36+
private RouteMission mission;
37+
38+
@Column(name = "sr_before")
39+
private Integer srBefore;
40+
41+
@Column(name = "sr_after", nullable = false)
42+
private Integer srAfter;
43+
}

0 commit comments

Comments
 (0)