Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.myteam.server.article.controller;

import lombok.RequiredArgsConstructor;
import org.myteam.server.article.controller.response.ArticleResponse;
import org.myteam.server.article.entity.Type;
import org.myteam.server.article.service.ArticleReadService;
import org.myteam.server.global.web.response.ResponseDto;
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 org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static org.myteam.server.global.web.response.ResponseStatus.SUCCESS;

@RestController
@RequestMapping("/api/article")
@RequiredArgsConstructor
public class ArticleController {

private final ArticleReadService articleReadService;

@GetMapping("/list/{type}")
private ResponseEntity<ResponseDto<List<ArticleResponse>>> findAll(@PathVariable Type type) {
return ResponseEntity.ok(new ResponseDto<>(
SUCCESS.name(),
"기사 목록 조회 성공",
articleReadService.findAll(type)));
}

@GetMapping("/{articleId}")
private ResponseEntity<ResponseDto<ArticleResponse>> findById(@PathVariable Long articleId) {
return ResponseEntity.ok(new ResponseDto<>(
SUCCESS.name(),
"기사 상세 조회 성공",
articleReadService.findById(articleId)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.myteam.server.article.controller.response;

import lombok.Builder;
import lombok.Getter;
import org.myteam.server.article.entity.Article;
import org.myteam.server.article.entity.Type;

import java.time.LocalDateTime;

@Getter
public class ArticleResponse {
private Long id;

private Type type;

private String title;

private String thumbImgUrl;

private String description;

private LocalDateTime postDate;

@Builder
public ArticleResponse(Long id, Type type, String title, String thumbImgUrl, String description, LocalDateTime postDate) {
this.id = id;
this.type = type;
this.title = title;
this.thumbImgUrl = thumbImgUrl;
this.description = description;
this.postDate = postDate;
}

public static ArticleResponse of(Article article) {
return ArticleResponse.builder()
.id(article.getId())
.type(article.getType())
.title(article.getTitle())
.thumbImgUrl(article.getThumbImgUrl())
.description(article.getDescription())
.postDate(article.getPostDate())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.myteam.server.article.controller.response;

import lombok.Builder;
import lombok.Getter;
import org.myteam.server.article.entity.Article;

import java.time.LocalDateTime;

@Getter
public class ArticleSaveResponse {
private Long id;

private String title;

private String thumbImgUrl;

private String description;

private LocalDateTime postDate;

@Builder
public ArticleSaveResponse(Long id, String title, String thumbImgUrl, String description, LocalDateTime postDate) {
this.id = id;
this.title = title;
this.thumbImgUrl = thumbImgUrl;
this.description = description;
this.postDate = postDate;
}

public static ArticleSaveResponse of(Article article) {
return ArticleSaveResponse.builder()
.id(article.getId())
.title(article.getTitle())
.thumbImgUrl(article.getThumbImgUrl())
.description(article.getDescription())
.postDate(article.getPostDate())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.myteam.server.article.dto;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.myteam.server.article.entity.Article;
import org.myteam.server.article.entity.Type;

import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
public class ArticleSaveRequest {

private String title;

private Type type;

private String thumbImgUrl;

private String description;

private LocalDateTime postDate;

@Builder
public ArticleSaveRequest(String title, Type type, String thumbImgUrl, String description, LocalDateTime postDate) {
this.title = title;
this.type = type;
this.thumbImgUrl = thumbImgUrl;
this.description = description;
this.postDate = postDate;
}

public Article toEntity() {
return Article.builder()
.title(this.title)
.type(this.type)
.thumbImgUrl(this.thumbImgUrl)
.description(this.description)
.postDate(this.postDate)
.build();
}
}
41 changes: 41 additions & 0 deletions src/main/java/org/myteam/server/article/entity/Article.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.myteam.server.article.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.myteam.server.global.domain.Base;

import java.time.LocalDateTime;
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Article extends Base {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private Type type;

private String title;

private String thumbImgUrl;

private String description;

private LocalDateTime postDate;

@Builder
public Article(Long id, Type type, String title, String thumbImgUrl, String description, LocalDateTime postDate) {
this.id = id;
this.type = type;
this.title = title;
this.thumbImgUrl = thumbImgUrl;
this.description = description;
this.postDate = postDate;
}
}
14 changes: 14 additions & 0 deletions src/main/java/org/myteam/server/article/entity/Type.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.myteam.server.article.entity;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Type {
BASEBALL("야구"),
ESPORTS("E스포츠"),
FOOTBALL("건강");

private final String text;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.myteam.server.article.repository;

import org.myteam.server.article.entity.Article;
import org.myteam.server.article.entity.Type;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ArticleRepository extends JpaRepository<Article, Long> {
List<Article> findByType(Type type);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.myteam.server.article.service;

import lombok.RequiredArgsConstructor;
import org.myteam.server.article.controller.response.ArticleResponse;
import org.myteam.server.article.entity.Type;
import org.myteam.server.article.repository.ArticleRepository;
import org.myteam.server.global.exception.PlayHiveException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static org.myteam.server.global.exception.ErrorCode.RESOURCE_NOT_FOUND;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ArticleReadService {

private final ArticleRepository articleRepository;

public List<ArticleResponse> findAll(Type type) {
return articleRepository.findByType(type).stream()
.map(ArticleResponse::of)
.toList();
}

public ArticleResponse findById(Long id) {
return ArticleResponse.of(articleRepository.findById(id)
.orElseThrow(() -> new PlayHiveException(RESOURCE_NOT_FOUND, id + " 는 존재하지 않는 기사입니다.")));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.myteam.server.article.service;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.myteam.server.article.controller.response.ArticleSaveResponse;
import org.myteam.server.article.dto.ArticleSaveRequest;
import org.myteam.server.article.repository.ArticleRepository;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
@Transactional
public class ArticleService {

private final ArticleRepository articleRepository;

public ArticleSaveResponse save(ArticleSaveRequest articleSaveRequest) {
return ArticleSaveResponse.of(articleRepository.save(articleSaveRequest.toEntity()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
@Getter
public class ResponseDto<T> {
private final String status; // SUCCESS 성공, FAIL 실패

private final String msg;
private final T data; // <T> 이거 해주어야 되네...
}
Loading
Loading