diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java index 28bcf6e..f9c3dd2 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/controller/DutchController.java @@ -1,5 +1,6 @@ package com.Dodutch_Server.domain.dutch.controller; +import com.Dodutch_Server.domain.auth.util.SecurityUtil; import com.Dodutch_Server.domain.dutch.dto.DutchDTO; import com.Dodutch_Server.domain.dutch.entity.Dutch; import com.Dodutch_Server.domain.dutch.repository.DutchRepository; @@ -34,8 +35,11 @@ private boolean isValidTrip(Long tripId) { @GetMapping("/dutch") public ResponseEntity getAllDutchList() { - List responseDTOs = dutchRepository.findAll(Sort.by(Sort.Order.desc("createdAt"))) - .stream() + Long memberId = SecurityUtil.getCurrentUserId(); + + List dutchList = dutchRepository.findByPayerIdOrPayeeId(memberId, memberId); + + List responseDTOs = dutchList.stream() .map(DutchResponseDTO::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok().body( @@ -51,8 +55,15 @@ public ResponseEntity getDutchList(@PathVariable Long tripId) { ); } - List responseDTOs = dutchRepository.findByTripId(tripId) - .stream() + Long memberId = SecurityUtil.getCurrentUserId(); + + List dutchList = dutchRepository.findByTripId(tripId).stream() + .filter(dutch -> dutch.getPayer().getId().equals(memberId) || + dutch.getPayee().getId().equals(memberId)) + .collect(Collectors.toList()); + + + List responseDTOs = dutchList.stream() .map(DutchResponseDTO::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok().body( @@ -69,6 +80,7 @@ public ResponseEntity getDutchDetail(@PathVariable Long tripId, @PathVariable } Optional dutch = dutchRepository.findByTripIdAndId(tripId, dutchId); + if (dutch.isPresent()) { DutchResponseDTO responseDTO = DutchResponseDTO.fromEntity(dutch.get()); return ResponseEntity.ok().body( @@ -106,7 +118,7 @@ public ResponseEntity markDutchAsCompleted(@PathVariable Long tripId, @PathVa } @PostMapping("/trip/{tripId}/dutch/calculate") - public ResponseEntity calculateDutch(@PathVariable Long tripId) { + public ResponseEntity calculateDutch(@PathVariable("tripId") Long tripId) { if (!isValidTrip(tripId)) { return ResponseEntity.status(404).body( new ApiResponse<>(false, "404", "해당 여행이 존재하지 않습니다", null) diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java b/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java index 6172e64..72d63b2 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/repository/DutchRepository.java @@ -11,4 +11,5 @@ public interface DutchRepository extends JpaRepository { List findByTripId(Long tripId); Optional findByTripIdAndId(Long tripId, Long id); boolean existsByTripIdAndPayerIdAndPayeeIdAndPerCost(Long tripId, Long payerId, Long payeeId, Integer perCost); + List findByPayerIdOrPayeeId(Long payerId, Long payeeId); } diff --git a/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java b/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java index 1d85f1a..e5397d8 100644 --- a/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java +++ b/src/main/java/com/Dodutch_Server/domain/dutch/service/DutchService.java @@ -116,6 +116,8 @@ public List calculateSettlement(Long tripId) { // 잔액 갱신 payeeBalance -= amountToPay; + payerBalance += amountToPay; + memberBalances.put(payee, payeeBalance); memberBalances.put(payer, payerBalance); } diff --git a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java index b9a87c2..e98b53a 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/controller/ExpenseController.java @@ -71,6 +71,7 @@ public ResponseDTO>> getExpensesByDate(@PathVariable Lo public ResponseDTO getExpensesByTrip(@PathVariable("tripId") Long tripId) { try { ExpenseResponseDTO responseData = expenseService.getExpensesByTrip(tripId); + return createSuccessResponse("200", "성공이요", responseData); } catch (IllegalArgumentException e) { return createErrorResponse("400", e.getMessage()); @@ -79,8 +80,8 @@ public ResponseDTO getExpensesByTrip(@PathVariable("tripId") @GetMapping("/{tripId}/expense/{expenseId}") public ResponseDTO> getExpenseById( - @PathVariable Long tripId, - @PathVariable Long expenseId) { + @PathVariable("tripId") Long tripId, + @PathVariable("tripId") Long expenseId) { try { Map expenseDetails = expenseService.getExpenseById(tripId, expenseId); diff --git a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java index 29a9d39..010fdbd 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/entity/Expense.java @@ -25,6 +25,7 @@ public class Expense extends BaseEntity { private Long id; private String title; private int amount; + @Enumerated(EnumType.STRING) private ExpenseCategory expenseCategory; private LocalDate expenseDate; diff --git a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java index 6ceb5e5..531ffab 100644 --- a/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java +++ b/src/main/java/com/Dodutch_Server/domain/expense/service/ExpenseService.java @@ -85,7 +85,7 @@ public void addExpense(Long tripId, Long payerId,ExpenseRequestDTO request, Mult .amount(request.getAmount()) .expenseDate(request.getExpenseDate()) .memo(request.getMemo()) - //.payer(payer) + .payer(payer) .trip(trip) .expenseImageUrl(expenseImageUrl) .build(); @@ -174,39 +174,40 @@ public ExpenseResponseDTO getExpensesByTrip(Long tripId) { Trip trip = tripRepository.findById(tripId) .orElseThrow(() -> new IllegalArgumentException("해당 여행이 존재하지 않습니다: " + tripId)); - // 남은 비용 계산 + List expenses = expenseRepository.findByTripId(tripId); + + Map categoryCosts = new HashMap<>(); + for (Expense expense : expenses) { + categoryCosts.put(expense.getExpenseCategory(), + categoryCosts.getOrDefault(expense.getExpenseCategory(), 0) + expense.getAmount()); + } + int remainingCost = (trip.getBudget() != null ? trip.getBudget() : 0) - (trip.getTotalCost() != null ? trip.getTotalCost() : 0); - // 카테고리별 비용 계산 - List categories = expenseRepository.findCategoryCostsByTripId(tripId) - .stream() - .map(result -> { - ExpenseResponseDTO.CategoryCostDTO dto = new ExpenseResponseDTO.CategoryCostDTO(); - dto.setExpenseCategory((ExpenseCategory) result.get("category")); - dto.setCost(((Number) result.get("cost")).intValue()); - return dto; - }) - .collect(Collectors.toList()); - - // 멤버 정보 조회 + List categories = categoryCosts.entrySet().stream() + .map(entry -> { + ExpenseResponseDTO.CategoryCostDTO categoryCostDTO = new ExpenseResponseDTO.CategoryCostDTO(); + categoryCostDTO.setExpenseCategory(entry.getKey()); + categoryCostDTO.setCost(entry.getValue()); + return categoryCostDTO; + }).collect(Collectors.toList()); + List members = tripMemberRepository.findByTripId(tripId).stream() .map(tripMember -> { ExpenseResponseDTO.MemberDTO memberDTO = new ExpenseResponseDTO.MemberDTO(); memberDTO.setMemberId(tripMember.getMember().getId()); memberDTO.setNickName(tripMember.getMember().getNickName()); return memberDTO; - }) - .collect(Collectors.toList()); - - ExpenseResponseDTO response = new ExpenseResponseDTO(); - response.setRemainingCost(remainingCost); - response.setCategories(categories); - response.setMembers(members); - response.setBudget(trip.getBudget()); //budget 추가함 + }).collect(Collectors.toList()); + ExpenseResponseDTO responseDTO = new ExpenseResponseDTO(); + responseDTO.setBudget(trip.getBudget()); + responseDTO.setRemainingCost(remainingCost); + responseDTO.setCategories(categories); + responseDTO.setMembers(members); - return response; + return responseDTO; } public List> getExpensesByDate(Long tripId) { diff --git a/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java b/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java index 5150112..0d09fda 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/controller/TripController.java @@ -83,7 +83,7 @@ public ApiResponse getShareTrip(@PathVariable("tripId") Lo @io.swagger.v3.oas.annotations.responses.ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "OK, 성공") }) - public ApiResponse updateTrip(@PathVariable Long tripId, @RequestBody TripUpdateRequestDTO request) { + public ApiResponse updateTrip(@PathVariable("tripId") Long tripId, @RequestBody TripUpdateRequestDTO request) { tripService.updateTrip(tripId, request); diff --git a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java index 28ba8c1..2f69809 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripInfoResponseDto.java @@ -1,6 +1,7 @@ package com.Dodutch_Server.domain.trip.dto.response; import lombok.*; +import org.joda.time.DateTime; import java.time.LocalDate; import java.util.List; @@ -34,5 +35,9 @@ public static class MemberDTO { @Setter public static class PhotoDTO { private String photoUrl; + private LocalDate expenseDate; + private String title; + private Integer amount; + private String memo; } -} \ No newline at end of file +} diff --git a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java index c06c772..8715198 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/dto/response/TripResponse.java @@ -16,7 +16,7 @@ public class TripResponse { private String place; // 장소 private Long budget; // 예산 private Integer totalCost; // 추가함 - private String memo; + //private String memo; private List members; // 멤버 리스트 추가 diff --git a/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java b/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java index a5699ad..249edca 100644 --- a/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java +++ b/src/main/java/com/Dodutch_Server/domain/trip/service/TripService.java @@ -171,6 +171,10 @@ public TripInfoResponseDto convertToTripInfoResponse(Trip trip) { .map(expense -> { TripInfoResponseDto.PhotoDTO photoDTO = new TripInfoResponseDto.PhotoDTO(); photoDTO.setPhotoUrl(expense.getExpenseImageUrl()); + photoDTO.setExpenseDate(expense.getExpenseDate()); + photoDTO.setTitle(expense.getTitle()); + photoDTO.setAmount(expense.getAmount()); + photoDTO.setMemo(expense.getMemo()); return photoDTO; }) .collect(Collectors.toList()); diff --git a/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java b/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java index 0a37c0f..7865e3c 100644 --- a/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java +++ b/src/main/java/com/Dodutch_Server/global/config/security/CorsConfig.java @@ -16,7 +16,6 @@ public class CorsConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:3000") - .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS","PATCH") .allowedHeaders("*") .allowCredentials(true); diff --git a/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java b/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java index 22ac54d..b570104 100644 --- a/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java +++ b/src/main/java/com/Dodutch_Server/global/config/security/SecurityConfig.java @@ -60,17 +60,16 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.cors(corsCustomizer -> corsCustomizer.configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); - config.setAllowedOrigins(Collections.singletonList("*")); - config.setAllowedMethods(Collections.singletonList("*")); - config.setAllowCredentials(true); - config.setAllowedHeaders(Collections.singletonList("*")); - config.setMaxAge(3600L); + config.setAllowedOrigins(Collections.singletonList("http://localhost:3000")); // 허용할 도메인 + config.setAllowedMethods(Collections.singletonList("*")); // 모든 메서드 허용 + config.setAllowCredentials(true); // 인증 정보 허용 + config.setAllowedHeaders(Collections.singletonList("*")); // 모든 헤더 허용 + config.setMaxAge(3600L); // Preflight 요청 캐싱 시간 (초 단위) return config; })); - /* 테스트 전 까지 JWT필터 주석처리 */