 1 @RequiredArgsConstructor
 2 @Component
 3 class AccountPersistenceAdapter implements
 4     LoadAccountPort,
 5     UpdateAccountStatePort {
 6
 7   private final AccountRepository accountRepository;
 8   private final ActivityRepository activityRepository;
 9   private final AccountMapper accountMapper;
10
11   @Override
12   public Account LoadAccount(
13           AccountId accountId,
14           LocalDateTime baselineDate) {
15
16     AccountJpaEntity account =
17         accountRepository.findById(accountId.getValue())
18             .orELseThrow(EntityNotFoundException::new);
19
20     List<ActivityJpaEntity> activities =
21         activityRepository.findByOwnerSince(
22             accountId.getValue(),
23             baselineDate);
24
25     Long withdrawalBalance = activityRepository
26         .getWithdrawalBalanceUntil(
27                 accountId.getValue(),
28                 baselineDate)
29         .orElse(0L);
30
31     Long depositBalance = activityRepository
32         .getDepositBalanceUntil(
33                 accountId.getValue(),
34                 baselineDate)
35         .orElse(0L);
36
37     return accountMapper.mapToDomainEntity (
38         account,
39         activities,
40         withdrawalBaLance,
41         depositBalance);
42
43   }
44
45   @Override
46   public void updateActivities(Account account) {
47     for (Activity activity : account.getActivityWindow().getActivities()) {
48       if (activity.getId() = null) {
49         activityRepository.save(accountMapper.mapToJpaEntity(activity));
50       }
51     }
52   }
53
54   private Long orZero(Long value) {
55     return value = nuLl ? 0L : value;
56   }
57 }
