Skip to content

Commit

Permalink
Merge pull request #92 from Stumeet/STMT-200-study_group
Browse files Browse the repository at this point in the history
✨ [STMT-200] 스터디 도메인 구현
  • Loading branch information
05AM authored Mar 11, 2024
2 parents 70016c2 + 2c1e10a commit fe1b138
Show file tree
Hide file tree
Showing 24 changed files with 606 additions and 10 deletions.
29 changes: 19 additions & 10 deletions src/main/java/com/stumeet/server/common/model/ApiResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.stumeet.server.common.exception.error.Error;
import com.stumeet.server.common.response.ErrorCode;
import com.stumeet.server.common.exception.error.ErrorField;
import com.stumeet.server.common.response.SuccessCode;

import java.util.List;
import org.springframework.validation.BindingResult;

Expand All @@ -13,17 +15,9 @@ public record ApiResponse<T>(
@JsonInclude(value = JsonInclude.Include.NON_NULL)
T data
) {
public static <T> ApiResponse<T> success(int code, String message, T data) {
return new ApiResponse<>(code, message, data);
}

public static ApiResponse<Void> success(int code, String message) {
return new ApiResponse<>(code, message, null);
}

// TODO: 삭제 예정 메서드 : 해당 메서드를 사용 부분 수정 요망
public static ApiResponse<Void> fail(int code, String message) {
return new ApiResponse<>(code, message, null);
public static <T> ApiResponse<T> success(SuccessCode code, T data) {
return new ApiResponse<>(code.getHttpStatusCode(), code.getMessage(), data);
}

public static ApiResponse<Void> fail(ErrorCode errorCode) {
Expand All @@ -41,4 +35,19 @@ public static ApiResponse<List<Error>> fail(ErrorCode errorCode, BindingResult b
ErrorField.toErrors(bindingResult)
);
}

// TODO: 삭제 예정 메서드 : 해당 메서드를 사용 부분 수정 요망

public static <T> ApiResponse<T> success(int code, String message, T data) {
return new ApiResponse<>(code, message, data);
}

public static ApiResponse<Void> success(int code, String message) {
return new ApiResponse<>(code, message, null);
}

public static ApiResponse<Void> fail(int code, String message) {
return new ApiResponse<>(code, message, null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ public enum ErrorCode {
*/
ACCESS_DENIED_EXCEPTION(HttpStatus.FORBIDDEN, "유효하지 않은 요청입니다."),

/*
404 - NOT FOUND
*/
STUDY_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 스터디 입니다."),

/*
500 - INTERNAL SERVER ERROR
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum SuccessCode {

GET_SUCCESS(HttpStatus.OK, "조회에 성공했습니다."),
SIGN_UP_SUCCESS(HttpStatus.CREATED, "회원가입에 성공했습니다.")
;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.stumeet.server.study.adapter.in.web;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.stumeet.server.common.annotation.WebAdapter;
import com.stumeet.server.common.model.ApiResponse;
import com.stumeet.server.common.response.SuccessCode;
import com.stumeet.server.study.adapter.in.web.response.StudyDetailResponse;
import com.stumeet.server.study.application.port.in.StudyQueryUseCase;

import lombok.RequiredArgsConstructor;

@WebAdapter
@RequestMapping("/api/v1/studies")
@RequiredArgsConstructor
public class StudyQueryApi {

private final StudyQueryUseCase studyQueryUseCase;

@GetMapping("/{id}")
public ResponseEntity<ApiResponse<StudyDetailResponse>> getStudy(
@PathVariable(name = "id") Long id
) {
StudyDetailResponse response = studyQueryUseCase.getStudyDetailById(id);
return ResponseEntity.ok(ApiResponse.success(SuccessCode.GET_SUCCESS, response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.stumeet.server.study.adapter.in.web.response;

import java.time.LocalDateTime;
import java.util.List;

import lombok.Builder;

@Builder
public record StudyDetailResponse(
Long id,
String field,
String name,
List<String> topics,
String intro,
String region,
String rule,
String mainImage,
int headCount,
LocalDateTime startDate,
LocalDateTime endDate,
boolean isFinished,
boolean isDeleted
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.stumeet.server.study.adapter.out.persistance;

import org.springframework.data.jpa.repository.JpaRepository;

import com.stumeet.server.study.adapter.out.persistance.entity.StudyJpaEntity;

public interface JpaStudyRepository extends JpaRepository<StudyJpaEntity, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.stumeet.server.study.adapter.out.persistance;

import com.stumeet.server.common.annotation.PersistenceAdapter;
import com.stumeet.server.study.adapter.out.persistance.entity.StudyJpaEntity;
import com.stumeet.server.study.adapter.out.persistance.mapper.StudyPersistenceMapper;
import com.stumeet.server.study.application.port.out.StudyQueryPort;
import com.stumeet.server.study.domain.Study;

import lombok.RequiredArgsConstructor;

@PersistenceAdapter
@RequiredArgsConstructor
public class StudyPersistenceAdapter implements StudyQueryPort {

private final StudyRepository studyRepository;
private final StudyPersistenceMapper studyPersistenceMapper;

@Override
public Study getById(Long id) {
StudyJpaEntity entity = studyRepository.findById(id);
return studyPersistenceMapper.toDomain(entity);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stumeet.server.study.adapter.out.persistance;

import com.stumeet.server.study.adapter.out.persistance.entity.StudyJpaEntity;

public interface StudyRepository {

StudyJpaEntity findById(Long id);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.stumeet.server.study.adapter.out.persistance;

import org.springframework.stereotype.Repository;

import com.stumeet.server.common.exception.model.BusinessException;
import com.stumeet.server.common.response.ErrorCode;
import com.stumeet.server.study.adapter.out.persistance.entity.StudyJpaEntity;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class StudyRepositoryImpl implements StudyRepository {

private final JpaStudyRepository jpaStudyRepository;

@Override
public StudyJpaEntity findById(Long id) {
return jpaStudyRepository.findById(id)
.orElseThrow(() -> new BusinessException(ErrorCode.STUDY_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.stumeet.server.study.adapter.out.persistance.entity;

import org.hibernate.annotations.Comment;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "study_field")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StudyFieldJpaEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Comment("스터디 분야 아이디")
private Long id;

@Column(name = "name", length = 20)
@Comment("분야명")
private String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.stumeet.server.study.adapter.out.persistance.entity;

import java.time.LocalDateTime;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.Comment;

import com.stumeet.server.common.model.BaseTimeEntity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
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;

@Entity
@Table(name = "study")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class StudyJpaEntity extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Comment("스터디 그룹 아이디")
private Long id;

@ManyToOne
@JoinColumn(name = "study_field_id", nullable = false)
@Comment("분야")
private StudyFieldJpaEntity studyField;

@Column(name = "name", length = 20, nullable = false)
@Comment("스터디명")
private String name;

@Column(name = "topics")
@Comment("주제")
private String topics;

@Column(name = "intro", length = 100, nullable = false)
@Comment("소개")
private String intro;

@Column(name = "region", length = 50, nullable = false)
@Comment("지역")
private String region;

@Column(name = "rule", length = 100)
@Comment("규칙")
private String rule;

@Column(name = "main_image", length = 500)
@Comment("메인 이미지")
private String mainImage;

@Column(name = "head_count", length = 100, nullable = false)
@ColumnDefault("1")
@Comment("현재 인원")
private int headCount;

@Column(name = "start_date", nullable = false)
@Comment("시작일")
private LocalDateTime startDate;

@Column(name = "end_date", nullable = false)
@Comment("종료일")
private LocalDateTime endDate;

@Column(name = "is_finished", nullable = false)
@ColumnDefault("false")
@Comment("완료 여부")
private boolean isFinished;

@Column(name = "is_deleted", nullable = false)
@ColumnDefault("false")
@Comment("삭제 여부")
private boolean isDeleted;

@Column(name = "deleted_at")
@Comment("삭제된 시간")
private LocalDateTime deletedAt;

public Boolean getIsFinished() {
return this.isFinished;
}

public Boolean getIsDeleted() {
return this.isDeleted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.stumeet.server.study.adapter.out.persistance.mapper;

import org.springframework.stereotype.Component;

import com.stumeet.server.study.adapter.out.persistance.entity.StudyFieldJpaEntity;
import com.stumeet.server.study.domain.StudyField;

@Component
public class StudyFieldPersistenceMapper {

public StudyFieldJpaEntity toEntity(StudyField domain) {
return StudyFieldJpaEntity.builder()
.id(domain.getId())
.name(domain.getName())
.build();
}

public StudyField toDomain(StudyFieldJpaEntity entity) {
return StudyField.builder()
.id(entity.getId())
.name(entity.getName())
.build();
}
}
Loading

0 comments on commit fe1b138

Please sign in to comment.