-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExpenseRecordTrackerService.java
94 lines (76 loc) · 3.55 KB
/
ExpenseRecordTrackerService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package io.myfinbox.spendingplan.application;
import io.myfinbox.spendingplan.domain.CategoryIdentifier;
import io.myfinbox.spendingplan.domain.ExpenseRecord;
import io.myfinbox.spendingplan.domain.ExpenseRecords;
import io.myfinbox.spendingplan.domain.JarExpenseCategories;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import static io.myfinbox.spendingplan.domain.ExpenseRecord.ExpenseIdentifier;
/**
* Service class for tracking expense records.
*/
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
class ExpenseRecordTrackerService implements ExpenseRecordTrackerUseCase {
private final JarExpenseCategories jarExpenseCategories;
private final ExpenseRecords expenseRecords;
@Override
public List<ExpenseRecord> recordCreated(ExpenseModificationRecord createdRecord) {
// check if category tracked
var expenseCategories = jarExpenseCategories.findByCategoryId(new CategoryIdentifier(createdRecord.categoryId()));
if (expenseCategories.isEmpty()) { // skip untracked
return List.of();
}
var records = expenseCategories.stream()
.map(category -> ExpenseRecord.builder()
.expenseId(new ExpenseIdentifier(createdRecord.expenseId()))
.categoryId(new CategoryIdentifier(createdRecord.categoryId()))
.amount(createdRecord.amount())
.paymentType(createdRecord.paymentType())
.expenseDate(createdRecord.expenseDate())
.categoryName(createdRecord.categoryName())
.jarExpenseCategory(category)
.build())
.toList();
expenseRecords.saveAll(records);
log.debug("Expense records {} were created", records);
return records;
}
@Override
public List<ExpenseRecord> recordUpdated(ExpenseModificationRecord updatedRecord) {
var records = expenseRecords.findByExpenseId(new ExpenseIdentifier(updatedRecord.expenseId()));
if (records.isEmpty()) {
return List.of();
}
// check if category was changed
if (!records.getFirst().match(new CategoryIdentifier(updatedRecord.categoryId()))) {
log.debug("No expense records for update, expense category changed, try creating");
recordDeleted(updatedRecord); // delete all existing expense with existing category
return recordCreated(updatedRecord); // try creating if new category tracked
}
var updated = records.stream()
.peek(record -> record.update(ExpenseRecord.builder()
.amount(updatedRecord.amount())
.paymentType(updatedRecord.paymentType())
.expenseDate(updatedRecord.expenseDate())))
.toList();
expenseRecords.saveAll(updated); // FIXME fix save anti-pattern
log.debug("Expense records {} were updated", updated);
return updated;
}
@Override
public List<ExpenseRecord> recordDeleted(ExpenseModificationRecord deleteRecord) {
var records = expenseRecords.findByExpenseId(new ExpenseIdentifier(deleteRecord.expenseId()));
if (records.isEmpty()) {
return List.of();
}
expenseRecords.deleteAll(records);
log.debug("Expense records {} were deleted", records);
return records;
}
}