Skip to content

Commit a1807e2

Browse files
authored
Merge pull request #56 from Money-Touch/feat/#55
[#55] Feat: 소비기록 카테고리 불러오기 api 구현
2 parents 5ce0711 + 7709c87 commit a1807e2

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

src/main/java/com/server/money_touch/domain/consumptionRecord/controller/ConsumptionRecordController.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.server.money_touch.domain.consumptionRecord.controller;
22

3+
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionCategoryResponse;
34
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordRequest;
45
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordResponse;
56
import com.server.money_touch.domain.consumptionRecord.service.ConsumptionRecordService;
@@ -11,12 +12,13 @@
1112
import io.swagger.v3.oas.annotations.Operation;
1213
import io.swagger.v3.oas.annotations.tags.Tag;
1314
import jakarta.validation.Valid;
14-
import jakarta.websocket.server.PathParam;
1515
import lombok.RequiredArgsConstructor;
1616
import lombok.extern.slf4j.Slf4j;
1717
import org.springframework.validation.annotation.Validated;
1818
import org.springframework.web.bind.annotation.*;
1919

20+
import java.util.List;
21+
2022
@Tag(name = "소비 기록 페이지", description = "소비 기록에 관한 API")
2123
@Slf4j
2224
@Validated
@@ -49,4 +51,17 @@ public ApiResponse<ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO> p
4951
return ApiResponse.onSuccess(response);
5052
}
5153

54+
// 소비 카테고리 목록 조회 API
55+
@Operation(summary = "소비 카테고리 목록 조회", description = "기본 + 커스텀 + 루틴 카테고리를 순서대로 반환합니다.")
56+
@ApiSuccessCodeExample(resultClass = ConsumptionCategoryResponse.CategoryInfoDTO.class)
57+
@ApiErrorCodeExample(value = ErrorStatus.class, name = "USER_NOT_FOUND")
58+
@GetMapping("/categories")
59+
public ApiResponse<List<ConsumptionCategoryResponse.CategoryInfoDTO>> getConsumptionCategories() {
60+
61+
// 유저 아이디 임시 지정
62+
List<ConsumptionCategoryResponse.CategoryInfoDTO> categoryList =
63+
consumptionRecordService.getSortedCategoriesForUser(1L);
64+
return ApiResponse.onSuccess(categoryList);
65+
}
66+
5267
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.server.money_touch.domain.consumptionRecord.dto;
2+
3+
import com.server.money_touch.domain.consumptionRecord.entity.ConsumptionCategory;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
public class ConsumptionCategoryResponse {
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Schema(description = "소비 카테고리 정보 DTO")
15+
public static class CategoryInfoDTO {
16+
17+
@Schema(description = "카테고리 이름", example = "배달/외식")
18+
private String categoryName;
19+
20+
public static CategoryInfoDTO fromEntity(ConsumptionCategory category) {
21+
return new CategoryInfoDTO(
22+
category.getBudgetCategoryName()
23+
);
24+
}
25+
}
26+
27+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.server.money_touch.domain.consumptionRecord.service;
22

3+
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionCategoryResponse;
34
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordRequest;
45
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordResponse;
5-
import com.server.money_touch.global.validation.annotation.ExistUser;
6+
7+
import java.util.List;
68

79
public interface ConsumptionRecordService {
10+
811
ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO createConsumptionRecord(Long userId, ConsumptionRecordRequest.ConsumptionRecordCreateDTO request);
12+
13+
List<ConsumptionCategoryResponse.CategoryInfoDTO> getSortedCategoriesForUser(Long userId);
914
}

src/main/java/com/server/money_touch/domain/consumptionRecord/service/ConsumptionRecordServiceImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.server.money_touch.domain.consumptionRecord.service;
22

3+
import com.server.money_touch.domain.budget.enums.CategoryType;
34
import com.server.money_touch.domain.consumptionRecord.converter.totalConsumption.TotalConsumptionConverter;
5+
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionCategoryResponse;
46
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordRequest;
57
import com.server.money_touch.domain.consumptionRecord.dto.ConsumptionRecordResponse;
68
import com.server.money_touch.domain.consumptionRecord.entity.ConsumptionCategory;
@@ -19,6 +21,9 @@
1921

2022
import java.time.LocalDate;
2123
import java.time.LocalDateTime;
24+
import java.util.Comparator;
25+
import java.util.List;
26+
import java.util.stream.Collectors;
2227

2328
@Service
2429
@RequiredArgsConstructor
@@ -83,6 +88,24 @@ public ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO createConsumpt
8388

8489
}
8590

91+
@Override
92+
@Transactional(readOnly = true)
93+
public List<ConsumptionCategoryResponse.CategoryInfoDTO> getSortedCategoriesForUser(Long userId) {
94+
User user = userRepository.findById(userId)
95+
.orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND));
96+
97+
List<ConsumptionCategory> allCategories = consumptionCategoryRepository.findAllByUser(user);
98+
99+
return allCategories.stream()
100+
.sorted(Comparator.comparingInt(cat -> {
101+
CategoryType type = cat.getBudgetCategoryType();
102+
if (type == CategoryType.DEFAULT) return 0;
103+
if (type == CategoryType.CUSTOM) return 1;
104+
return 2; // ROUTINE_CATEGORY
105+
}))
106+
.map(ConsumptionCategoryResponse.CategoryInfoDTO::fromEntity)
107+
.collect(Collectors.toList());
108+
}
86109

87110

88111
}

0 commit comments

Comments
 (0)