diff --git a/src/main/java/sopt/org/hmh/domain/banner/Banner.java b/src/main/java/sopt/org/hmh/domain/banner/Banner.java new file mode 100644 index 00000000..09c54308 --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/Banner.java @@ -0,0 +1,25 @@ +package sopt.org.hmh.domain.banner; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static jakarta.persistence.GenerationType.IDENTITY; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Banner { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + private String title; + private String subTitle; + private String imageUrl; + private String linkUrl; +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/BannerJpaRepository.java b/src/main/java/sopt/org/hmh/domain/banner/BannerJpaRepository.java new file mode 100644 index 00000000..4580ec20 --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/BannerJpaRepository.java @@ -0,0 +1,9 @@ +package sopt.org.hmh.domain.banner; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface BannerJpaRepository extends JpaRepository { + Optional findTopByOrderByIdAsc(); // 디비에 배너 하나만 존재 +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/BannerResponse.java b/src/main/java/sopt/org/hmh/domain/banner/BannerResponse.java new file mode 100644 index 00000000..2a2d831f --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/BannerResponse.java @@ -0,0 +1,20 @@ +package sopt.org.hmh.domain.banner; + +import lombok.Builder; + +@Builder +public record BannerResponse( + String title, + String subTitle, + String imageUrl, + String linkUrl +) { + public static BannerResponse of(Banner banner) { + return BannerResponse.builder() + .title(banner.getTitle()) + .subTitle(banner.getSubTitle()) + .imageUrl(banner.getImageUrl()) + .linkUrl(banner.getLinkUrl()) + .build(); + } +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/BannerService.java b/src/main/java/sopt/org/hmh/domain/banner/BannerService.java new file mode 100644 index 00000000..e548f7bf --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/BannerService.java @@ -0,0 +1,19 @@ +package sopt.org.hmh.domain.banner; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import sopt.org.hmh.domain.banner.exception.BannerError; +import sopt.org.hmh.domain.banner.exception.BannerException; + +@Service +@RequiredArgsConstructor +public class BannerService { + + private final BannerJpaRepository bannerRepository; + + public BannerResponse getBanner() { + return bannerRepository.findTopByOrderByIdAsc() + .map(BannerResponse::of) + .orElseThrow(() -> new BannerException(BannerError.BANNER_NOT_FOUND)); + } +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/controller/BannerApi.java b/src/main/java/sopt/org/hmh/domain/banner/controller/BannerApi.java new file mode 100644 index 00000000..3d9aff8c --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/controller/BannerApi.java @@ -0,0 +1,29 @@ +package sopt.org.hmh.domain.banner.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import sopt.org.hmh.domain.banner.BannerResponse; +import sopt.org.hmh.global.common.response.BaseResponse; + +@Tag(name = "배너 관련 API") +public interface BannerApi { + + @Operation( + summary = "배너 정보를 불러오는 API", + responses = { + @ApiResponse( + responseCode = "200", + description = "배너 정보 불러오기에 성공하였습니다."), + @ApiResponse( + responseCode = "404", + description = "배너를 찾을 수 없습니다.", + content = @Content), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류입니다.", + content = @Content)}) + ResponseEntity> orderGetBanner(); +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/controller/BannerController.java b/src/main/java/sopt/org/hmh/domain/banner/controller/BannerController.java new file mode 100644 index 00000000..257ae403 --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/controller/BannerController.java @@ -0,0 +1,27 @@ +package sopt.org.hmh.domain.banner.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import sopt.org.hmh.domain.banner.BannerResponse; +import sopt.org.hmh.domain.banner.BannerService; +import sopt.org.hmh.domain.banner.exception.BannerSuccess; +import sopt.org.hmh.global.common.response.BaseResponse; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v2/banner") +public class BannerController implements BannerApi { + + private final BannerService bannerService; + + @Override + @GetMapping + public ResponseEntity> orderGetBanner() { + return ResponseEntity + .status(BannerSuccess.GET_BANNER_SUCCESS.getHttpStatus()) + .body(BaseResponse.success(BannerSuccess.GET_BANNER_SUCCESS, bannerService.getBanner())); + } +} diff --git a/src/main/java/sopt/org/hmh/domain/banner/exception/BannerError.java b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerError.java new file mode 100644 index 00000000..4340d78d --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerError.java @@ -0,0 +1,30 @@ +package sopt.org.hmh.domain.banner.exception; + +import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import sopt.org.hmh.global.common.exception.base.ErrorBase; + +@AllArgsConstructor +public enum BannerError implements ErrorBase { + + BANNER_NOT_FOUND(HttpStatus.NOT_FOUND, "배너를 찾을 수 없습니다."), + ; + + private final HttpStatus status; + private final String errorMessage; + + @Override + public int getHttpStatusCode() { + return status.value(); + } + + @Override + public HttpStatus getHttpStatus() { + return this.status; + } + + @Override + public String getErrorMessage() { + return this.errorMessage; + } +} \ No newline at end of file diff --git a/src/main/java/sopt/org/hmh/domain/banner/exception/BannerException.java b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerException.java new file mode 100644 index 00000000..9c8ba48f --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerException.java @@ -0,0 +1,7 @@ +package sopt.org.hmh.domain.banner.exception; + +import sopt.org.hmh.global.common.exception.base.ExceptionBase; + +public class BannerException extends ExceptionBase { + public BannerException(BannerError error) { super(error); } +} \ No newline at end of file diff --git a/src/main/java/sopt/org/hmh/domain/banner/exception/BannerSuccess.java b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerSuccess.java new file mode 100644 index 00000000..3ec98db9 --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/banner/exception/BannerSuccess.java @@ -0,0 +1,30 @@ +package sopt.org.hmh.domain.banner.exception; + +import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import sopt.org.hmh.global.common.exception.base.SuccessBase; + +@AllArgsConstructor +public enum BannerSuccess implements SuccessBase { + + GET_BANNER_SUCCESS(HttpStatus.OK, "배너 정보 불러오기에 성공하였습니다."), + ; + + private final HttpStatus status; + private final String successMessage; + + @Override + public int getHttpStatusCode() { + return this.status.value(); + } + + @Override + public HttpStatus getHttpStatus() { + return this.status; + } + + @Override + public String getSuccessMessage() { + return this.successMessage; + } +}