Skip to content

Commit

Permalink
Merge pull request #19 from 7th-UMC-Hackathon-TeamV/feat/post
Browse files Browse the repository at this point in the history
Feat/post
  • Loading branch information
chaechaen authored Jan 11, 2025
2 parents a6c5243 + 30aa4f0 commit cd725fe
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/main/java/banban/springboot/domain/entity/News.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ public class News {
private boolean isBreakingNews;

@Column(nullable = false)
private LocalDateTime createdAt = LocalDateTime.now();
private LocalDateTime createdAt;

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

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

Expand All @@ -27,5 +28,8 @@ public interface NewsRepository extends JpaRepository<News,Long> {

// 특정 그룹의 일반 뉴스 조회
List<News> findByTeamGroupAndIsBreakingNewsFalse(TeamGroup teamGroup);

List<News> findByTeamGroupAndCreatedAtBetween(TeamGroup teamGroup, LocalDateTime start, LocalDateTime end);
void deleteByCreatedAtBefore(LocalDateTime dateTime);
}

80 changes: 79 additions & 1 deletion src/main/java/banban/springboot/service/NewsService.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,21 @@
import banban.springboot.repository.GroupRepository;
import banban.springboot.repository.MemberRepository;
import banban.springboot.repository.NewsRepository;
import banban.springboot.web.controller.NewsTestController;
import banban.springboot.web.dto.request.NewsRequestDTO;
import banban.springboot.web.dto.response.NewsResponseDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import java.util.List;

@Service
Expand All @@ -24,6 +33,7 @@ public class NewsService {
private final NewsRepository newsRepository;
private final MemberRepository memberRepository;
private final GroupRepository groupRepository;
//private final Environment environment;

@Transactional
public NewsResponseDTO.NewsCreateResponseDTO createNews(String groupKey, Long memberId, NewsRequestDTO newsRequestDTO) {
Expand All @@ -43,7 +53,8 @@ public NewsResponseDTO.NewsCreateResponseDTO createNews(String groupKey, Long me
.isBreakingNews(newsRequestDTO.isBreakingNews())
.likes(0)
.newsCategories(newsRequestDTO.getNewsCategories())
.createdAt(newsRequestDTO.getCreatedAt())
//.createdAt(newsRequestDTO.getCreatedAt())
.createdAt(getCurrentTime())
.build();

news = newsRepository.save(news);
Expand Down Expand Up @@ -124,4 +135,71 @@ public List<NewsResponseDTO.NewsReadResponseDTO> getRegularNewsByGroupKey(String
.map(NewsResponseDTO.NewsReadResponseDTO::from)
.toList();
}

// private LocalDateTime getCurrentTime() {
// if (isTestMode()) {
// return NewsTestController.getMockCurrentTime();
// }
// return LocalDateTime.now();
// }

// private boolean isTestMode() {
// return Arrays.asList(environment.getActiveProfiles()).contains("test");
// }

private LocalDateTime getCurrentTime() {
return NewsTestController.getMockCurrentTime(); // 항상 테스트 시간 반환
}

public List<NewsResponseDTO.NewsTodayResponseDTO> getTodayNews(String groupKey, Long memberId) {
// 그룹과 멤버 존재 확인
TeamGroup teamGroup = groupRepository.findByGroupKey(groupKey)
.orElseThrow(() -> new GeneralException(ErrorStatus.TEAMGROUP_NOT_FOUND));

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

//LocalDateTime now = LocalDateTime.now();
LocalDateTime now = getCurrentTime();
// LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
LocalDateTime startOfDay = now.minusDays(1).withHour(18).withMinute(0).withSecond(0);
LocalDateTime endOfToday = now.toLocalDate().atTime(17, 59, 59);

List<News> todayNews = newsRepository.findByTeamGroupAndCreatedAtBetween(
teamGroup, startOfDay, endOfToday);

return todayNews.stream()
.map(NewsResponseDTO.NewsTodayResponseDTO::from)
.collect(Collectors.toList());
}

public List<NewsResponseDTO.NewsYesterdayResponseDTO> getYesterdayNews(String groupKey, Long memberId) {
// 그룹과 멤버 존재 확인
TeamGroup teamGroup = groupRepository.findByGroupKey(groupKey)
.orElseThrow(() -> new GeneralException(ErrorStatus.TEAMGROUP_NOT_FOUND));

Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

//LocalDateTime now = LocalDateTime.now();
LocalDateTime now = getCurrentTime();
LocalDateTime twoYesterdayAt6PM = now.minusDays(2).withHour(18).withMinute(0).withSecond(0);
LocalDateTime yesterdayAt6PM = now.minusDays(1).withHour(17).withMinute(59).withSecond(59);

List<News> yesterdayNews = newsRepository.findByTeamGroupAndCreatedAtBetween(
teamGroup, twoYesterdayAt6PM, yesterdayAt6PM);

return yesterdayNews.stream()
.map(NewsResponseDTO.NewsYesterdayResponseDTO::from)
.collect(Collectors.toList());
}

@Scheduled(cron = "0 0 18 * * *")
@Transactional
public void deleteOldNews() {
LocalDateTime now = getCurrentTime(); // 수정된 부분
LocalDateTime yesterdayAt6PM = now.minusDays(1)
.withHour(18).withMinute(0).withSecond(0);
newsRepository.deleteByCreatedAtBefore(yesterdayAt6PM);
}
}
26 changes: 26 additions & 0 deletions src/main/java/banban/springboot/web/controller/NewsController.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,30 @@ public ApiResponse<List<NewsResponseDTO.NewsReadResponseDTO>> getRegularNewsByGr
List<NewsResponseDTO.NewsReadResponseDTO> regularNews = newsService.getRegularNewsByGroupKey(groupKey);
return ApiResponse.onSuccess(regularNews);
}

@GetMapping("/{groupKey}/users/news/today/{memberId}")
@Operation(summary = "오늘 공개 예정 뉴스글 조회")
@Parameters({
@Parameter(name = "groupKey", description = "그룹 키"),
@Parameter(name = "memberId", description = "멤버 ID")
})
public ApiResponse<List<NewsResponseDTO.NewsTodayResponseDTO>> getTodayNews(
@PathVariable String groupKey,
@PathVariable Long memberId) {
List<NewsResponseDTO.NewsTodayResponseDTO> todayNews = newsService.getTodayNews(groupKey, memberId);
return ApiResponse.onSuccess(todayNews);
}

@GetMapping("/{groupKey}/users/news/yesterday/{memberId}")
@Operation(summary = "어제 공개된 뉴스글 조회")
@Parameters({
@Parameter(name = "groupKey", description = "그룹 키"),
@Parameter(name = "memberId", description = "멤버 ID")
})
public ApiResponse<List<NewsResponseDTO.NewsYesterdayResponseDTO>> getYesterdayNews(
@PathVariable String groupKey,
@PathVariable Long memberId) {
List<NewsResponseDTO.NewsYesterdayResponseDTO> yesterdayNews = newsService.getYesterdayNews(groupKey, memberId);
return ApiResponse.onSuccess(yesterdayNews);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package banban.springboot.web.controller;

import banban.springboot.apiPayload.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

@Tag(name = "뉴스-테스트")
@RestController
@RequiredArgsConstructor
@Validated
@RequestMapping("/api/test")
public class NewsTestController {

private static LocalDateTime mockCurrentTime;

@Operation(summary = "테스트용 현재 시간 설정")
@PostMapping("/set-time")
public ApiResponse<String> setTestTime(
@RequestParam @Parameter(example = "2024-01-02T14:00:00", description = "설정할 시간 (yyyy-MM-dd'T'HH:mm:ss 형식)")
String dateTime) {
mockCurrentTime = LocalDateTime.parse(dateTime);
return ApiResponse.onSuccess("현재 시간이 " + dateTime + "으로 설정되었습니다.");
}

@Operation(summary = "현재 설정된 테스트 시간 조회")
@GetMapping("/current-time")
public ApiResponse<String> getCurrentTestTime() {
return ApiResponse.onSuccess(mockCurrentTime.toString());
}

public static LocalDateTime getMockCurrentTime() {
return mockCurrentTime;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ public class NewsRequestDTO {
@NotNull(message = "긍정인지 부정인지 작성해주세요")
private NewsCategories newsCategories;

private LocalDateTime createdAt = LocalDateTime.now();
//private LocalDateTime createdAt = LocalDateTime.now();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.*;
import org.springframework.web.multipart.MultipartFile;

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


Expand All @@ -18,6 +19,7 @@ public static class NewsCreateResponseDTO {
private Long newsId;
private String headline;
private String content;
private LocalDateTime createdAt;
//private List<MultipartFile> images;
private boolean isBreakingNews;

Expand All @@ -27,6 +29,57 @@ public static NewsCreateResponseDTO from(News news) {
.headline(news.getHeadline())
.content(news.getContent())
.isBreakingNews(news.isBreakingNews())
.createdAt(news.getCreatedAt())
.build();
}
}

@Getter
@Setter
@NoArgsConstructor
@Builder
@AllArgsConstructor
public static class NewsTodayResponseDTO {
private Long newsId;
private String headline;
private String content;
private boolean isBreakingNews;
private int likes;
private LocalDateTime createdAt;

public static NewsTodayResponseDTO from(News news) {
return NewsTodayResponseDTO.builder()
.newsId(news.getId())
.headline(news.getHeadline())
.content(news.getContent())
.isBreakingNews(news.isBreakingNews())
.likes(news.getLikes())
.createdAt(news.getCreatedAt())
.build();
}
}

@Getter
@Setter
@NoArgsConstructor
@Builder
@AllArgsConstructor
public static class NewsYesterdayResponseDTO {
private Long newsId;
private String headline;
private String content;
private boolean isBreakingNews;
private int likes;
private LocalDateTime createdAt;

public static NewsYesterdayResponseDTO from(News news) {
return NewsYesterdayResponseDTO.builder()
.newsId(news.getId())
.headline(news.getHeadline())
.content(news.getContent())
.isBreakingNews(news.isBreakingNews())
.likes(news.getLikes())
.createdAt(news.getCreatedAt())
.build();
}
}
Expand Down

0 comments on commit cd725fe

Please sign in to comment.