Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ [STMT-200] 스터디 도메인 구현 #92

Merged
merged 13 commits into from
Mar 11, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading