diff --git a/src/main/java/nextstep/courses/domain/Enrollment.java b/src/main/java/nextstep/courses/domain/Enrollment.java index 3d682328aa..cd11728a39 100644 --- a/src/main/java/nextstep/courses/domain/Enrollment.java +++ b/src/main/java/nextstep/courses/domain/Enrollment.java @@ -19,6 +19,14 @@ public Enrollment(SessionState sessionState, Students students) { this.students = students; } + public SessionState getSessionState() { + return sessionState; + } + + public Students getStudents() { + return students; + } + public void enroll(NsUser loginUser) { if (!this.sessionState.isRecruiting()) { throw new IllegalArgumentException("수강신청은 모집중에만 가능합니다"); diff --git a/src/main/java/nextstep/courses/domain/Image.java b/src/main/java/nextstep/courses/domain/Image.java index 7e7ba2bee8..85eee77243 100644 --- a/src/main/java/nextstep/courses/domain/Image.java +++ b/src/main/java/nextstep/courses/domain/Image.java @@ -8,8 +8,17 @@ public Image(int size, String type, int width, int height) { this(new ImageSize(size, width, height), ImageType.of(type)); } + public ImageSize getImageSize() { + return imageSize; + } + + public ImageType getImageType() { + return imageType; + } + public Image(ImageSize imageSize, ImageType imageType) { this.imageSize = imageSize; this.imageType = imageType; } + } diff --git a/src/main/java/nextstep/courses/domain/ImageSize.java b/src/main/java/nextstep/courses/domain/ImageSize.java index bff1c4cc81..ce9a229f05 100644 --- a/src/main/java/nextstep/courses/domain/ImageSize.java +++ b/src/main/java/nextstep/courses/domain/ImageSize.java @@ -30,4 +30,16 @@ private void validateSize(int size) { throw new IllegalArgumentException("이미지 크기는 1MB 이하여야 한다"); } } + + public int getSize() { + return size; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } } diff --git a/src/main/java/nextstep/courses/domain/ImageType.java b/src/main/java/nextstep/courses/domain/ImageType.java index 103e75c213..114bd45614 100644 --- a/src/main/java/nextstep/courses/domain/ImageType.java +++ b/src/main/java/nextstep/courses/domain/ImageType.java @@ -11,6 +11,10 @@ public enum ImageType { private String type; + public String getType() { + return type; + } + ImageType(String type) { this.type = type; } diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/Session.java index 523a0f729f..af1e8a2cff 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/Session.java @@ -5,6 +5,7 @@ import java.time.LocalDate; public class Session { + private long id; private final String title; private final Image image; private final SessionPeriod sessionPeriod; @@ -12,19 +13,20 @@ public class Session { private final SessionType sessionType; private final int price; - public Session(String title, int size, String imageType, + public Session(long id, String title, int size, String imageType, int width, int height, LocalDate startedAt, LocalDate endedAt, String state, String sessionType, int capacity, int price) { - this(title, new Image(size, imageType, width, height), + this(id, title, new Image(size, imageType, width, height), new SessionPeriod(startedAt, endedAt), new Enrollment(SessionState.of(state), capacity), SessionType.of(sessionType), price); } - public Session(String title, Image image, + public Session(long id, String title, Image image, SessionPeriod sessionPeriod, Enrollment enrollment, SessionType sessionType, int price ) { + this.id = id; this.title = title; this.image = image; this.sessionPeriod = sessionPeriod; @@ -33,6 +35,34 @@ public Session(String title, Image image, this.price = price; } + public long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public Image getImage() { + return image; + } + + public SessionPeriod getSessionPeriod() { + return sessionPeriod; + } + + public Enrollment getEnrollment() { + return enrollment; + } + + public SessionType getSessionType() { + return sessionType; + } + + public int getPrice() { + return price; + } + public void enroll(NsUser loginUser) { enrollment.enroll(loginUser); } diff --git a/src/main/java/nextstep/courses/domain/SessionPeriod.java b/src/main/java/nextstep/courses/domain/SessionPeriod.java index a892700517..f9e632bd43 100644 --- a/src/main/java/nextstep/courses/domain/SessionPeriod.java +++ b/src/main/java/nextstep/courses/domain/SessionPeriod.java @@ -13,6 +13,14 @@ public SessionPeriod(LocalDate startedAt, LocalDate endedAt) { this.endedAt = endedAt; } + public LocalDate getStartedAt() { + return startedAt; + } + + public LocalDate getEndedAt() { + return endedAt; + } + private void validateDate(LocalDate startedAt, LocalDate endedAt) { if (startedAt.isAfter(endedAt)) { throw new IllegalArgumentException("강의 시작인은 종료일 이후여야 합니다"); diff --git a/src/main/java/nextstep/courses/domain/SessionRepository.java b/src/main/java/nextstep/courses/domain/SessionRepository.java new file mode 100644 index 0000000000..ebf96c5815 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/SessionRepository.java @@ -0,0 +1,7 @@ +package nextstep.courses.domain; + +public interface SessionRepository { + int save(Session session); + + Session findById(Long id); +} diff --git a/src/main/java/nextstep/courses/domain/SessionState.java b/src/main/java/nextstep/courses/domain/SessionState.java index 337a083714..d4ec12d07c 100644 --- a/src/main/java/nextstep/courses/domain/SessionState.java +++ b/src/main/java/nextstep/courses/domain/SessionState.java @@ -20,6 +20,10 @@ public static SessionState of(String state) { .orElseThrow(() -> new IllegalArgumentException("지원하지 않는 세션 상태입니다.")); } + public String getState() { + return state; + } + public boolean isRecruiting() { return this == RECRUITING; } diff --git a/src/main/java/nextstep/courses/domain/SessionType.java b/src/main/java/nextstep/courses/domain/SessionType.java index 55da80cc54..b3ed9fae6b 100644 --- a/src/main/java/nextstep/courses/domain/SessionType.java +++ b/src/main/java/nextstep/courses/domain/SessionType.java @@ -12,6 +12,10 @@ public enum SessionType { this.type = type; } + public String getType() { + return type; + } + public static SessionType of(String type) { return Arrays.stream(values()) .filter(it -> it.type.equals(type)) diff --git a/src/main/java/nextstep/courses/domain/Students.java b/src/main/java/nextstep/courses/domain/Students.java index 533d868fac..dd3d5beba3 100644 --- a/src/main/java/nextstep/courses/domain/Students.java +++ b/src/main/java/nextstep/courses/domain/Students.java @@ -26,4 +26,12 @@ public void add(NsUser loginUser) { } this.students.add(loginUser); } + + public List getStudents() { + return students; + } + + public int getCapacity() { + return capacity; + } } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java new file mode 100644 index 0000000000..e1573901a5 --- /dev/null +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -0,0 +1,74 @@ +package nextstep.courses.infrastructure; + +import nextstep.courses.domain.Course; +import nextstep.courses.domain.CourseRepository; +import nextstep.courses.domain.Session; +import nextstep.courses.domain.SessionRepository; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.Date; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Repository("sessionRepository") +public class JdbcSessionRepository implements SessionRepository { + private JdbcOperations jdbcTemplate; + + public JdbcSessionRepository(JdbcOperations jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int save(Session session) { + String sql = "insert into session (id, title, image_size, image_type, image_width, image_height, " + + "started_at, ended_at, state, session_type, capacity, price) " + + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + return jdbcTemplate.update(sql, + session.getId(), + session.getTitle(), + session.getImage().getImageSize().getSize(), + session.getImage().getImageType().getType(), + session.getImage().getImageSize().getWidth(), + session.getImage().getImageSize().getHeight(), + java.sql.Date.valueOf(session.getSessionPeriod().getStartedAt()), + java.sql.Date.valueOf(session.getSessionPeriod().getEndedAt()), + session.getEnrollment().getSessionState().getState(), + session.getSessionType().toString(), + session.getEnrollment().getStudents().getCapacity(), + session.getPrice()); + } + + @Override + public Session findById(Long id) { + String sql = "select id, title, image_size, image_type, image_width, image_height, " + + "started_at, ended_at, state, session_type, capacity, price " + + "from session where id = ?"; + + RowMapper rowMapper = (rs, rowNum) -> new Session( + rs.getLong("id"), + rs.getString("title"), + rs.getInt("image_size"), + rs.getString("image_type"), + rs.getInt("image_width"), + rs.getInt("image_height"), + toLocalDate(rs.getDate("started_at")), + toLocalDate(rs.getDate("ended_at")), + rs.getString("state"), + rs.getString("session_type"), + rs.getInt("capacity"), + rs.getInt("price")); + + return jdbcTemplate.queryForObject(sql, rowMapper, id); + } + + private LocalDate toLocalDate(Date timestamp) { + if (timestamp == null) { + return null; + } + return timestamp.toLocalDate(); + } +} diff --git a/src/main/java/nextstep/courses/service/SessionService.java b/src/main/java/nextstep/courses/service/SessionService.java new file mode 100644 index 0000000000..6607c86e5d --- /dev/null +++ b/src/main/java/nextstep/courses/service/SessionService.java @@ -0,0 +1,23 @@ +package nextstep.courses.service; + +import nextstep.courses.domain.Session; +import nextstep.courses.domain.SessionRepository; +import nextstep.users.domain.NsUser; +import nextstep.users.domain.UserRepository; + +public class SessionService { + private final SessionRepository sessionRepository; + private final UserRepository userRepository; + public SessionService(SessionRepository sessionRepository, UserRepository userRepository) { + this.sessionRepository = sessionRepository; + this.userRepository = userRepository; + } + + public void enroll(long sessionId, String userId) { + NsUser loginUser = this.userRepository.findByUserId(userId); + Session session = this.sessionRepository.findById(sessionId); + + session.enroll(loginUser); + sessionRepository.save(session); + } +} diff --git a/src/main/java/nextstep/users/domain/UserRepository.java b/src/main/java/nextstep/users/domain/UserRepository.java index 745a85dc1e..a3e018e9df 100755 --- a/src/main/java/nextstep/users/domain/UserRepository.java +++ b/src/main/java/nextstep/users/domain/UserRepository.java @@ -3,5 +3,5 @@ import java.util.Optional; public interface UserRepository { - Optional findByUserId(String userId); + NsUser findByUserId(String userId); } diff --git a/src/main/java/nextstep/users/infrastructure/JdbcUserRepository.java b/src/main/java/nextstep/users/infrastructure/JdbcUserRepository.java index 005f04fc5a..5c7a4ac8ec 100644 --- a/src/main/java/nextstep/users/infrastructure/JdbcUserRepository.java +++ b/src/main/java/nextstep/users/infrastructure/JdbcUserRepository.java @@ -19,7 +19,7 @@ public JdbcUserRepository(JdbcOperations jdbcTemplate) { } @Override - public Optional findByUserId(String userId) { + public NsUser findByUserId(String userId) { String sql = "select id, user_id, password, name, email, created_at, updated_at from ns_user where user_id = ?"; RowMapper rowMapper = (rs, rowNum) -> new NsUser( rs.getLong(1), @@ -29,7 +29,7 @@ public Optional findByUserId(String userId) { rs.getString(5), toLocalDateTime(rs.getTimestamp(6)), toLocalDateTime(rs.getTimestamp(7))); - return Optional.of(jdbcTemplate.queryForObject(sql, rowMapper, userId)); + return jdbcTemplate.queryForObject(sql, rowMapper, userId); } private LocalDateTime toLocalDateTime(Timestamp timestamp) {