-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIncomeController.java
74 lines (64 loc) · 3.33 KB
/
IncomeController.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
package io.myfinbox.income.adapter.web;
import io.myfinbox.income.application.CreateIncomeUseCase;
import io.myfinbox.income.application.DeleteIncomeUseCase;
import io.myfinbox.income.application.IncomeCommand;
import io.myfinbox.income.application.UpdateIncomeUseCase;
import io.myfinbox.income.domain.Income;
import io.myfinbox.rest.IncomeResource;
import io.myfinbox.shared.ApiFailureHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.UUID;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
import static org.springframework.http.ResponseEntity.*;
import static org.springframework.web.servlet.support.ServletUriComponentsBuilder.fromCurrentRequest;
@RestController
@RequestMapping(path = "/v1/incomes")
@RequiredArgsConstructor
final class IncomeController implements IncomesApi {
private final CreateIncomeUseCase createIncomeUseCase;
private final UpdateIncomeUseCase updateIncomeUseCase;
private final DeleteIncomeUseCase deleteIncomeUseCase;
private final ApiFailureHandler apiFailureHandler;
@PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
public ResponseEntity<?> create(@RequestBody IncomeResource resource) {
return createIncomeUseCase.create(toCommand(resource))
.fold(apiFailureHandler::handle,
income -> created(fromCurrentRequest().path("/{id}").build(income.getId().id()))
.body(toResource(income)));
}
@PutMapping(path = "/{incomeId}", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
public ResponseEntity<?> update(@PathVariable UUID incomeId, @RequestBody IncomeResource resource) {
return updateIncomeUseCase.update(incomeId, toCommand(resource))
.fold(apiFailureHandler::handle, income -> ok().body(toResource(income)));
}
@DeleteMapping(path = "/{incomeId}", produces = APPLICATION_JSON_VALUE)
public ResponseEntity<?> delete(@PathVariable UUID incomeId) {
return deleteIncomeUseCase.delete(incomeId)
.fold(apiFailureHandler::handle, ok -> noContent().build());
}
private IncomeResource toResource(Income income) {
return new IncomeResource()
.incomeId(income.getId().id())
.accountId(income.getAccount().id())
.incomeSourceId(income.getIncomeSource().getId().id())
.amount(income.getAmountAsNumber())
.currencyCode(income.getCurrencyCode())
.incomeDate(income.getIncomeDate())
.creationTimestamp(income.getCreationTimestamp().toString())
.paymentType(income.getPaymentType().value())
.description(income.getDescription());
}
private IncomeCommand toCommand(IncomeResource resource) {
return IncomeCommand.builder()
.accountId(resource.getAccountId())
.incomeSourceId(resource.getIncomeSourceId())
.amount(resource.getAmount())
.currencyCode(resource.getCurrencyCode())
.paymentType(resource.getPaymentType())
.incomeDate(resource.getIncomeDate())
.description(resource.getDescription())
.build();
}
}