Skip to content

Commit 2510b32

Browse files
authored
Merge pull request #76 from Nexters/dev
Dev
2 parents 137e83b + 516a33d commit 2510b32

30 files changed

+977
-18
lines changed

.github/workflows/ci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
--health-retries=5
2929
3030
env:
31+
SPRING_PROFILES_ACTIVE: test
3132
SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/testdb
3233
SPRING_DATASOURCE_USERNAME: testuser
3334
SPRING_DATASOURCE_PASSWORD: testpassword
@@ -63,6 +64,13 @@ jobs:
6364
- name: Wait for MySQL to be ready
6465
run: sleep 15
6566

67+
- name: Make application-test.properties
68+
run: |
69+
cd ./src/test/resources
70+
touch ./application-test.properties
71+
echo "${{ secrets.PROPERTIES_TEST }}" > ./application-test.properties
72+
shell: bash
73+
6674
# 테스트를 제외한 프로젝트 빌드
6775
- name: Build With Gradle
6876
run: ./gradlew build -x test

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ dependencies {
3737
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
3838
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4'
3939
implementation 'com.google.firebase:firebase-admin:9.4.3'
40+
41+
implementation 'com.amazonaws:aws-java-sdk-s3:1.11.238'
4042
}
4143

4244
tasks.named('test') {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package donmani.donmani_server.common.config;
2+
3+
import com.amazonaws.auth.AWSStaticCredentialsProvider;
4+
import com.amazonaws.auth.BasicAWSCredentials;
5+
import com.amazonaws.client.builder.AwsClientBuilder;
6+
import com.amazonaws.services.s3.AmazonS3Client;
7+
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
8+
import org.springframework.beans.factory.annotation.Value;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
12+
@Configuration
13+
public class NcpStorageConfig {
14+
@Value("${ncp.storage.endpoint}")
15+
private String endPoint;
16+
17+
@Value("${ncp.storage.region}")
18+
private String regionName;
19+
20+
@Value("${ncp.storage.accessKey}")
21+
private String accessKey;
22+
23+
@Value("${ncp.storage.secretKey}")
24+
private String secretKey;
25+
26+
@Bean
27+
public AmazonS3Client amazonS3Client() {
28+
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
29+
return (AmazonS3Client) AmazonS3ClientBuilder
30+
.standard()
31+
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
32+
.withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
33+
.build();
34+
}
35+
}

src/main/java/donmani/donmani_server/expense/controller/ExpenseController.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@
1212

1313
import donmani.donmani_server.common.httpStatus.HttpStatusDTO;
1414
import donmani.donmani_server.expense.service.ExpenseService;
15-
import donmani.donmani_server.feedback.service.FeedbackService;
1615
import lombok.RequiredArgsConstructor;
1716

1817
@RestController
1918
@RequiredArgsConstructor
2019
public class ExpenseController {
2120
private final ExpenseService expenseService;
22-
private final FeedbackService feedbackService;
2321

2422
@GetMapping("expenses/calendar/{userKey}")
2523
public ResponseEntity<ExpenseResponseDTO> getExpensesCalendar(
@@ -77,8 +75,6 @@ public ResponseEntity<Void> addExpense(@RequestBody ExpenseRequestDTO request) {
7775
public ResponseEntity<HttpStatusDTO<Void>> addExpenseV1(@RequestBody ExpenseRequestDTO request) {
7876
try {
7977
expenseService.addExpense(request);
80-
feedbackService.addFeedback(request);
81-
8278
// 1. 소비 기록 성공 -> 201
8379
return ResponseEntity.ok(HttpStatusDTO.response(HttpStatus.CREATED.value(), "성공", null));
8480
} catch (Exception e) {

src/main/java/donmani/donmani_server/expense/dto/ExpenseResponseDTO.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import donmani.donmani_server.reward.dto.RewardItemResponseDTO;
56
import lombok.AllArgsConstructor;
67
import lombok.Builder;
78
import lombok.Getter;
@@ -16,4 +17,5 @@
1617
public class ExpenseResponseDTO {
1718
private String userKey;
1819
private List<RecordDTO> records;
20+
private List<RewardItemResponseDTO> saveItems;
1921
}

src/main/java/donmani/donmani_server/expense/service/ExpenseService.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import donmani.donmani_server.expense.entity.CategoryType;
1414
import donmani.donmani_server.expense.entity.FlagType;
1515

16+
import donmani.donmani_server.feedback.service.FeedbackService;
17+
import donmani.donmani_server.reward.service.RewardService;
1618
import org.springframework.data.domain.Page;
1719
import org.springframework.data.domain.PageRequest;
1820
import org.springframework.stereotype.Service;
@@ -31,6 +33,8 @@ public class ExpenseService {
3133

3234
private final ExpenseRepository expenseRepository;
3335
private final UserService userService;
36+
private final FeedbackService feedbackService;
37+
private final RewardService rewardService;
3438

3539
private final static int SIZE = 20; // 전체 조회 페이지 사이즈 고정
3640

@@ -69,6 +73,11 @@ public void addExpense(ExpenseRequestDTO request) {
6973
.collect(Collectors.toList());
7074

7175
expenseRepository.saveAll(expenses);
76+
77+
// 피드백 카드 / 선물 받기
78+
feedbackService.addFeedback(request);
79+
feedbackService.openFeedback(request.getUserKey());
80+
rewardService.acquireRandomItems(request.getUserKey(), request.getRecords().get(0).getDate());
7281
}
7382

7483

@@ -93,6 +102,7 @@ public ExpenseResponseDTO getExpenses(String userKey, int year, int month, boole
93102
return ExpenseResponseDTO.builder()
94103
.userKey(userKey)
95104
.records(expenseToDto(expenses, sortedDesc))
105+
.saveItems(rewardService.getSavedItem(userKey, year, month))
96106
.build();
97107
}
98108

@@ -228,13 +238,6 @@ public CategoryStatisticsDTO getCategoryStatistics(String userKey, int year, int
228238
.build();
229239
}
230240

231-
@Transactional(readOnly = true)
232-
public Expense getExpenseSubmitToday(Long userId, LocalDateTime date) {
233-
Expense expense = expenseRepository.findExpenseByUserIdAndAndCreatedAt(userId, date);
234-
235-
return expense;
236-
}
237-
238241
public Integer getTotalExpensesCount(String userKey) {
239242
// 1. 유저 정보 확인
240243
User user = userService.getUser(userKey);

src/main/java/donmani/donmani_server/feedback/controller/FeedbackController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ public ResponseEntity<HttpStatusDTO<FeedbackNotOpenedResponseDTO>> getNotOpenedF
4646
}
4747
}
4848

49-
@PostMapping("api/v1/feedback/{userKey}")
50-
public ResponseEntity<HttpStatusDTO<FeedbackOpenResponseDTO>> openFeedbackV1(@Valid @PathVariable String userKey) {
49+
@GetMapping("api/v1/feedback/content/{userKey}")
50+
public ResponseEntity<HttpStatusDTO<FeedbackOpenResponseDTO>> getFeedbackContentV1(@Valid @PathVariable String userKey) {
5151
try {
52-
FeedbackOpenResponseDTO response = feedbackService.openFeedback(userKey);
52+
FeedbackOpenResponseDTO response = feedbackService.getNotOpenedFeedbackContent(userKey);
5353

5454
// 1. 피드백 열기 성공 -> 201
5555
return ResponseEntity.ok(HttpStatusDTO.response(HttpStatus.CREATED.value(), "성공", response));

src/main/java/donmani/donmani_server/feedback/dto/FeedbackOpenResponseDTO.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package donmani.donmani_server.feedback.dto;
22

33
import donmani.donmani_server.expense.entity.CategoryType;
4+
import donmani.donmani_server.feedback.entity.Feedback;
45
import jakarta.persistence.EnumType;
56
import jakarta.persistence.Enumerated;
67
import lombok.AllArgsConstructor;

src/main/java/donmani/donmani_server/feedback/repository/FeedbackRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import java.time.LocalDateTime;
44
import java.util.List;
5+
import java.util.Optional;
56

7+
import donmani.donmani_server.user.entity.User;
68
import org.springframework.data.jpa.repository.JpaRepository;
79
import org.springframework.data.jpa.repository.Query;
810

@@ -20,4 +22,10 @@ public interface FeedbackRepository extends JpaRepository<Feedback, Long> {
2022

2123
@Query("SELECT f.title FROM Feedback f JOIN f.user u WHERE u.id = :userId")
2224
List<String> findFeedbackByUserIdUsedTitle(Long userId);
25+
26+
@Query("SELECT f FROM Feedback f JOIN f.user u WHERE u.id = :userId AND f.isOpened IS FALSE ORDER BY f.createdDate DESC")
27+
List<Feedback> findFeedbackByIsOpenedOrderByCreatedDateDesc(Long userId);
28+
29+
Optional<Feedback> findFirstByUserAndIsOpenedFalseOrderByCreatedDateDesc(User user);
30+
2331
}

src/main/java/donmani/donmani_server/feedback/service/FeedbackService.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.Random;
88
import java.util.stream.Collectors;
99

10+
import donmani.donmani_server.expense.repository.ExpenseRepository;
1011
import org.springframework.stereotype.Service;
1112
import org.springframework.transaction.annotation.Transactional;
1213

@@ -27,7 +28,7 @@
2728
@RequiredArgsConstructor
2829
public class FeedbackService {
2930
private final UserService userService;
30-
private final ExpenseService expenseService;
31+
private final ExpenseRepository expenseRepository;
3132
private final FeedbackRepository feedbackRepository;
3233
private final FeedbackTemplateProvider feedbackTemplateProvider;
3334

@@ -45,7 +46,7 @@ public void addFeedback(ExpenseRequestDTO requestDTO) {
4546
LocalDateTime baseTime = LocalDateTime.of(2025, 5, 26, 0, 0); // 2025-05-30 00:00
4647

4748
if (createdAt.isEqual(baseTime) || createdAt.isAfter(baseTime)) {
48-
Expense expense = expenseService.getExpenseSubmitToday(user.getId(), createdAt);
49+
Expense expense = expenseRepository.findExpenseByUserIdAndAndCreatedAt(user.getId(), createdAt);
4950

5051
// GOOD, BAD 일 경우 feedback 생성
5152
if (expense.getFlag() != null) {
@@ -148,8 +149,8 @@ public FeedbackOpenResponseDTO openFeedback(String userKey) {
148149

149150
notOpenedFeedback.setTitle(remainTemplate.getTitle());
150151
notOpenedFeedback.setContent(remainTemplate.getContent());
151-
notOpenedFeedback.setOpened(true);
152-
notOpenedFeedback.setUpdateDate(localDateTime);
152+
// notOpenedFeedback.setOpened(true);
153+
// notOpenedFeedback.setUpdateDate(localDateTime);
153154

154155
feedbackRepository.save(notOpenedFeedback);
155156

@@ -162,6 +163,25 @@ public FeedbackOpenResponseDTO openFeedback(String userKey) {
162163

163164
return response;
164165
}
166+
167+
@Transactional(readOnly = true)
168+
public FeedbackOpenResponseDTO getNotOpenedFeedbackContent(String userKey) {
169+
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Seoul"));
170+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
171+
172+
User user = userService.getUser(userKey);
173+
Feedback notOpenedFeedback = feedbackRepository.findFirstByUserAndIsOpenedFalseOrderByCreatedDateDesc(user).orElseThrow();
174+
175+
Boolean isToday = notOpenedFeedback.getExpense().getCreatedAt().format(formatter).equals(localDateTime.format(formatter));
176+
FeedbackOpenResponseDTO response = new FeedbackOpenResponseDTO(
177+
notOpenedFeedback.getTitle(),
178+
notOpenedFeedback.getContent(),
179+
notOpenedFeedback.getUser().getName(),
180+
notOpenedFeedback.getExpense().getCategory(),
181+
isToday);
182+
183+
return response;
184+
}
165185
}
166186

167187

0 commit comments

Comments
 (0)