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
Expand Up @@ -3,9 +3,12 @@
import EatPic.spring.domain.calendar.dto.CalendarDayResponse;
import EatPic.spring.domain.calendar.service.CalendarService;
import EatPic.spring.domain.card.repository.CardRepository;
import EatPic.spring.domain.user.entity.User;
import EatPic.spring.domain.user.service.UserService;
import EatPic.spring.global.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -20,19 +23,22 @@
public class CalendarController {

private final CalendarService calendarService;
private final UserService userService;


@Operation(summary = "캘린더 화면 데이터 조회", //Operation의 구성요소 중 하나로, API에 대한 한줄요약.
description = "캘린더에서 기록이 있는 날짜에 해당하는 대표이미지를 불러오는 API") //상세설명
@GetMapping
public ApiResponse<List<CalendarDayResponse>> getCalendar(
//@AuthenticationPrincipal CustomUserDetails userDetails,
HttpServletRequest request,
@RequestParam int year,
@RequestParam int month
) {
Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기
User user = userService.getLoginUser(request);
//Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기
//User user = userDetails.getUser(); //아니면 이렇게 해서 객체 자체를 넘기기 (이게 일반적인 방법)
return ApiResponse.onSuccess(calendarService.getCalendar(userId, year, month));
return ApiResponse.onSuccess(calendarService.getCalendar(user, year, month));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import EatPic.spring.domain.card.entity.Card;
import EatPic.spring.domain.card.entity.Meal;
import EatPic.spring.domain.card.repository.CardRepository;
import EatPic.spring.domain.user.entity.User;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
Expand All @@ -24,7 +25,9 @@
public class CalendarService {
private final CardRepository cardRepository;

public List<CalendarDayResponse> getCalendar(Long userId, int year, int month) {
public List<CalendarDayResponse> getCalendar(User user, int year, int month) {
Long userId = user.getId();

// 현재 월과 이전 월 구하기
YearMonth currentMonth = YearMonth.of(year, month);
YearMonth previousMonth = currentMonth.minusMonths(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class CardController {
@PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "픽카드 생성하기 (픽카드 기록 작성)", description = "픽카드를 생성할 때 호출되는 api")
public ApiResponse<CreateCardResponse> createCard(
HttpServletRequest req,
@RequestParam("request") String requestJson,
@RequestPart(value = "cardImageFile", required = false) MultipartFile cardImageFile) {

Expand All @@ -57,12 +58,13 @@ public ApiResponse<CreateCardResponse> createCard(
throw new GeneralException(ErrorStatus.REQUEST_BODY_INVALID);
}

Long userId = 1L;
//Long userId = 1L;
User user = userService.getLoginUser(req);

if (cardImageFile == null || cardImageFile.isEmpty()) {
throw new GeneralException(ErrorStatus.IMAGE_REQUIRED);
}
CardResponse.CreateCardResponse response = cardService.createNewCard(request, userId, cardImageFile);
CardResponse.CreateCardResponse response = cardService.createNewCard(request, user, cardImageFile);
return ApiResponse.onSuccess(response);
}

Expand Down Expand Up @@ -115,12 +117,13 @@ public ApiResponse<List<TodayCardResponse>> getTodayCards(
@Operation(summary = "픽카드 수정", description = "카드의 메모, 레시피, 위치 정보 등을 수정합니다.")
@PutMapping("/api/cards/{cardId}")
public ResponseEntity<ApiResponse<CardDetailResponse>> updateCard(
HttpServletRequest req,
@Parameter(description = "수정할 카드 ID", example = "12")
@PathVariable(name = "cardId") Long cardId,
@RequestBody CardUpdateRequest request)
{
Long userId = 1L;
return ResponseEntity.ok(ApiResponse.onSuccess(cardService.updateCard(cardId, userId, request)));
User user = userService.getLoginUser(req);
return ResponseEntity.ok(ApiResponse.onSuccess(cardService.updateCard(cardId, user, request)));
}

@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
import java.util.List;

public interface CardService {
CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, Long userId, MultipartFile cardImageFile);
CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile);
CardDetailResponse getCardDetail(Long cardId, Long userId);
CardFeedResponse getCardFeed(Long cardId, Long userId);
void deleteCard(Long cardId, Long userId);
List<TodayCardResponse> getTodayCards(Long userId);
CardDetailResponse updateCard(Long cardId, Long userId, CardUpdateRequest request);
CardDetailResponse updateCard(Long cardId, User user, CardUpdateRequest request);
CardResponse.PagedCardFeedResponseDto getCardFeedByCursor(HttpServletRequest request, Long userId, int size, Long cursor);
List<RecommendCardResponse> getRecommendedCardPreviews(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,11 @@ private void connectHashtagsToCard(Card card, List<String> hashtags, User user)

@Override
@Transactional
public CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, Long userId, MultipartFile cardImageFile) {
public CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile) {

Long userId = user.getId();
// 아직 유저 관련 처리 안했음
User user = userRepository.findUserById(userId);
//User user = userRepository.findUserById(userId);

// 오늘 날짜 00:00부터 23:59:59까지 범위 계산
LocalDate today = LocalDate.now();
Expand Down Expand Up @@ -287,11 +288,11 @@ public List<TodayCardResponse> getTodayCards(Long userId) {

@Override
@Transactional
public CardDetailResponse updateCard(Long cardId, Long userId, CardUpdateRequest request) {
public CardDetailResponse updateCard(Long cardId, User user, CardUpdateRequest request) {
Card card = cardRepository.findById(cardId)
.orElseThrow(() -> new ExceptionHandler(ErrorStatus.CARD_NOT_FOUND));

if (!card.getUser().getId().equals(userId)) {
if (!card.getUser().getId().equals(user.getId())) {
throw new ExceptionHandler(ErrorStatus.CARD_UPDATE_FORBIDDEN);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import EatPic.spring.global.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
Expand All @@ -25,25 +26,34 @@ public class NotificationController {

@GetMapping("/recent")
@Operation(summary = "최근 알림 목록 조회 (7일 이내)", description = "현재 로그인한 사용자의 최근 알림을 조회합니다.")
public ApiResponse<List<RecentNotificationResponse>> getRecentNotifications() {
Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기
public ApiResponse<List<RecentNotificationResponse>> getRecentNotifications(
HttpServletRequest request
) {
User user = userService.getLoginUser(request);
//Long userId = 1L; //Long userId = userDetails.getUser().getId(); //로그인 구현 시 이렇게 바꾸기
//User user = userDetails.getUser(); //아니면 이렇게 해서 객체 자체를 넘기기 (이게 일반적인 방법)
return ApiResponse.onSuccess(notificationService.getRecentNotifications(userId));
return ApiResponse.onSuccess(notificationService.getRecentNotifications(user));
}

@PostMapping("/check")
@Operation(summary = "알림 확인 시간 업데이트", description = "사용자가 알림 화면에 들어가면 마지막 확인 시간을 업데이트합니다.")
public ApiResponse<Void> checkNotifications() {
Long userId = 1L; // 로그인 기능 구현 전 임시 사용자
notificationService.checkNotifications(userId);
public ApiResponse<Void> checkNotifications(
HttpServletRequest request
) {
User user = userService.getLoginUser(request);
//Long userId = 1L; // 로그인 기능 구현 전 임시 사용자
notificationService.checkNotifications(user);
return ApiResponse.onSuccess(null);
}

@GetMapping("/unread-status")
@Operation(summary = "새 알림 여부 확인", description = "최근 알림 생성 시각과 마지막 확인 시각을 비교하여 새 알림 여부를 반환합니다.")
public ApiResponse<Map<String, Boolean>> getUnreadStatus() {
Long userId = 1L; // 로그인 기능 구현 전 임시 사용자
boolean isUnread = notificationService.isUnreadNotification(userId);
public ApiResponse<Map<String, Boolean>> getUnreadStatus(
HttpServletRequest request
) {
User user = userService.getLoginUser(request);
//Long userId = 1L; // 로그인 기능 구현 전 임시 사용자
boolean isUnread = notificationService.isUnreadNotification(user);
return ApiResponse.onSuccess(Map.of("isUnread", isUnread));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import EatPic.spring.domain.user.repository.UserFollowRepository;
import EatPic.spring.domain.user.repository.UserRepository;
import EatPic.spring.global.common.code.status.ErrorStatus;
import EatPic.spring.global.common.exception.GeneralException;
import EatPic.spring.global.common.exception.handler.ExceptionHandler;
import java.time.LocalDateTime;
import java.util.List;
Expand All @@ -27,8 +28,7 @@ public class NotificationService {
private final UserRepository userRepository;


public List<RecentNotificationResponse> getRecentNotifications(Long userId) {
User currentUser = userRepository.findById(userId).orElse(null);
public List<RecentNotificationResponse> getRecentNotifications(User currentUser) {
// 7일 전 기준 시각
LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7);

Expand Down Expand Up @@ -62,18 +62,12 @@ private RecentNotificationResponse convertToDto(Notification notification, User
return NotificationConverter.toRecentNotificationResponse(notification, cardImageUrl, isFollowing);
}

public void checkNotifications(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new ExceptionHandler(ErrorStatus.USER_NOT_FOUND));

public void checkNotifications(User user) {
user.updateLastNotificationCheckAt(LocalDateTime.now());
userRepository.save(user);
}

public boolean isUnreadNotification(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new ExceptionHandler(ErrorStatus.USER_NOT_FOUND));

public boolean isUnreadNotification(User user) {
LocalDateTime lastChecked = user.getLastNotificationCheckAt();
Notification latest = notificationRepository.findTopByReceiverOrderByCreatedAtDesc(user);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import EatPic.spring.domain.user.entity.User;
import EatPic.spring.domain.user.repository.UserBadgeRepository;
import EatPic.spring.domain.user.service.UserBadgeService;
import EatPic.spring.domain.user.service.UserService;
import EatPic.spring.global.common.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -23,21 +25,27 @@ public class UserBadgeController {

private final UserBadgeRepository userBadgeRepository;
private final UserBadgeService userBadgeService;
private final UserService userService;

@GetMapping("/home")
@Operation(summary = "홈화면 진입 시 유저 뱃지 리스트 이행률순 조회 ", description = "홈화면에서 유저가 보유한 뱃지 리스트를 이행률 기준으로 정렬하여 조회합니다.")
public ApiResponse<List<HomeBadgeResponse>> getUserBadgesForHome() {
Long userId = 1L;
List<HomeBadgeResponse> responses = userBadgeService.getUserBadgesForHome(userId);
public ApiResponse<List<HomeBadgeResponse>> getUserBadgesForHome(
HttpServletRequest request
) {
User user = userService.getLoginUser(request);
//Long userId = 1L;
List<HomeBadgeResponse> responses = userBadgeService.getUserBadgesForHome(user);
return ApiResponse.onSuccess(responses);
}

@Operation(summary = "유저 뱃지 상세 조회", description = "뱃지 팝업에 들어갈 상세 정보를 조회합니다.")
@GetMapping("/my/{userBadgeId}")
public ApiResponse<BadgeDetailResponseDTO> getBadgeDetail(
HttpServletRequest request,
@PathVariable Long userBadgeId) {
Long userId = 1L;
return ApiResponse.onSuccess(userBadgeService.getBadgeDetail(userId, userBadgeId));
User user = userService.getLoginUser(request);
//Long userId = 1L;
return ApiResponse.onSuccess(userBadgeService.getBadgeDetail(user, userBadgeId));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ public class UserBadgeService {
private final ReactionRepository reactionRepository;

// 홈화면 뱃지 리스트 조회
public List<HomeBadgeResponse> getUserBadgesForHome(Long userId) {
User user = userRepository.findUserById(userId); // 로그인 적용할 때 바꾸기!! 인자 User로 받기!
@Transactional
public List<HomeBadgeResponse> getUserBadgesForHome(User user) {
List<UserBadge> userBadges = userBadgeRepository.findByUser(user);
return UserBadgeConverter.toHomeBadgeDTOList(userBadges);
}

public BadgeDetailResponseDTO getBadgeDetail(Long userId, Long userBadgeId) {
User user = userRepository.findUserById(userId);
@Transactional
public BadgeDetailResponseDTO getBadgeDetail(User user, Long userBadgeId) {
UserBadge userBadge = userBadgeRepository.findByUser_IdAndUserBadgeId(user.getId(), userBadgeId)
.orElseThrow(() -> new ExceptionHandler(ErrorStatus._BAD_REQUEST));
return UserBadgeConverter.toBadgeDetailResponse(userBadge);
Expand Down
Loading