-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathExpenseService.java
More file actions
89 lines (77 loc) · 3.82 KB
/
ExpenseService.java
File metadata and controls
89 lines (77 loc) · 3.82 KB
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
package com.example.backoffice.expense;
import com.example.backoffice.common.BackofficeConstants;
import com.example.backoffice.exception.InvalidOperationException;
import com.example.backoffice.exception.ResourceNotFoundException;
import com.example.backoffice.trip.TripService;
import io.awspring.cloud.dynamodb.DynamoDbTemplate;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class ExpenseService {
private final DynamoDbTemplate dynamoDbTemplate;
private final TripService tripService;
public ExpenseService(DynamoDbTemplate dynamoDbTemplate, TripService tripService) {
this.dynamoDbTemplate = dynamoDbTemplate;
this.tripService = tripService;
}
public Expense createExpense(String userId, BigDecimal amount, String currency,
LocalDate date, String description, Expense.ExpenseType type,
String tripReference) {
if (tripReference != null && !tripReference.isBlank()) {
tripService.getTrip(tripReference);
}
Expense expense = Expense.create(userId, amount, currency, date, description, type, tripReference);
return dynamoDbTemplate.save(expense);
}
public List<Expense> getExpenses(String userId) {
QueryEnhancedRequest request = QueryEnhancedRequest.builder()
.queryConditional(QueryConditional.sortBeginsWith(
Key.builder()
.partitionValue(BackofficeConstants.USER_PREFIX + userId)
.sortValue(Expense.EXPENSE_PREFIX)
.build()))
.build();
return dynamoDbTemplate.query(request, Expense.class).items().stream().toList();
}
public List<Expense> getExpensesForTrip(String tripReference) {
tripService.getTrip(tripReference);
QueryEnhancedRequest request = QueryEnhancedRequest.builder()
.queryConditional(QueryConditional.keyEqualTo(
Key.builder().partitionValue(tripReference).build()))
.build();
return dynamoDbTemplate.query(request, Expense.class, "tripReference-index")
.items().stream().toList();
}
public Expense submitExpense(String expenseReference) {
Expense expense = getExpense(expenseReference);
if (expense.getStatus() != Expense.ExpenseStatus.DRAFT) {
throw new InvalidOperationException("Only draft expenses can be submitted");
}
expense.setStatus(Expense.ExpenseStatus.SUBMITTED);
expense.setUpdatedAt(LocalDateTime.now());
return dynamoDbTemplate.save(expense);
}
public Expense getExpense(String expenseReference) {
QueryEnhancedRequest request = QueryEnhancedRequest.builder()
.queryConditional(QueryConditional.keyEqualTo(
Key.builder().partitionValue(expenseReference).build()))
.build();
return dynamoDbTemplate.query(request, Expense.class, "expenseReference-index")
.items().stream().findFirst()
.orElseThrow(() -> new ResourceNotFoundException("Expense", expenseReference));
}
public Expense deleteExpense(String expenseReference) {
Expense expense = getExpense(expenseReference);
if (expense.getStatus() != Expense.ExpenseStatus.DRAFT) {
throw new InvalidOperationException("Only draft expenses can be deleted");
}
dynamoDbTemplate.delete(expense);
return expense;
}
}