diff --git a/src/main/java/com/sasiedzi/event/domain/UserAccount.java b/src/main/java/com/sasiedzi/event/domain/UserAccount.java index 780442f..7328795 100644 --- a/src/main/java/com/sasiedzi/event/domain/UserAccount.java +++ b/src/main/java/com/sasiedzi/event/domain/UserAccount.java @@ -1,8 +1,11 @@ package com.sasiedzi.event.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import jakarta.persistence.*; import java.io.Serializable; +import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; @@ -43,6 +46,15 @@ public class UserAccount implements Serializable { return this.id; } + @Transient + // @JsonSerialize + BigDecimal balance = BigDecimal.ZERO; + + @JsonProperty("balance") + public BigDecimal getBalance() { + return balance; + } + public UserAccount id(Long id) { this.setId(id); return this; @@ -88,6 +100,10 @@ public class UserAccount implements Serializable { return this; } + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + public Set getTransactionItems() { return this.transactionItems; } diff --git a/src/main/java/com/sasiedzi/event/repository/TransactionItemRepository.java b/src/main/java/com/sasiedzi/event/repository/TransactionItemRepository.java index c51bde1..f3e33cc 100644 --- a/src/main/java/com/sasiedzi/event/repository/TransactionItemRepository.java +++ b/src/main/java/com/sasiedzi/event/repository/TransactionItemRepository.java @@ -39,4 +39,7 @@ public interface TransactionItemRepository extends JpaRepository findOneWithToOneRelationships(@Param("id") Long id); + + @Query("select transactionItem from TransactionItem transactionItem where transactionItem.userAccount.id =:accountId") + List getTransactionItemsForAccountId(@Param("accountId") Long accountId); } diff --git a/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java b/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java index 14114b1..73ade7f 100644 --- a/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java +++ b/src/main/java/com/sasiedzi/event/repository/UserAccountRepository.java @@ -1,5 +1,6 @@ package com.sasiedzi.event.repository; +import com.sasiedzi.event.domain.Charge; import com.sasiedzi.event.domain.UserAccount; import java.util.List; import java.util.Optional; @@ -27,4 +28,8 @@ public interface UserAccountRepository extends UserAccountRepositoryWithBagRelat default Page findAllWithEagerRelationships(Pageable pageable) { return this.fetchBagRelationships(this.findAll(pageable)); } + + @Query("select userAccount from UserAccount userAccount join fetch userAccount.users") + // List findByUserLogin(String login); + List findAllFetchAccounts(); } diff --git a/src/main/java/com/sasiedzi/event/service/EventService.java b/src/main/java/com/sasiedzi/event/service/EventService.java index 8fa3b13..0a07063 100644 --- a/src/main/java/com/sasiedzi/event/service/EventService.java +++ b/src/main/java/com/sasiedzi/event/service/EventService.java @@ -2,10 +2,8 @@ package com.sasiedzi.event.service; import com.sasiedzi.event.domain.*; import com.sasiedzi.event.domain.enumeration.TransactionType; -import com.sasiedzi.event.repository.EventRepository; -import com.sasiedzi.event.repository.TransactionRepository; -import com.sasiedzi.event.repository.UserAccountRepository; -import com.sasiedzi.event.web.rest.TransactionResource; +import com.sasiedzi.event.repository.*; +import com.sasiedzi.event.web.rest.AccountResource; import jakarta.validation.Valid; import java.math.BigDecimal; import java.math.RoundingMode; @@ -16,6 +14,8 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.AuthenticatedPrincipal; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +30,15 @@ public class EventService { private final EventRepository eventRepository; + @Autowired + private UserService userService; + + @Autowired + private UserRepository userRepository; + + @Autowired + private AccountResource accountResource; + public EventService(EventRepository eventRepository) { this.eventRepository = eventRepository; } @@ -186,10 +195,7 @@ public class EventService { String login = registration.getUser().getLogin(); UserAccount userAccount = accountsByLogin.get(login); if (userAccount == null) { - userAccount = new UserAccount(); - userAccount.setName(registration.getUser().getName()); - userAccount.getUsers().add(registration.getUser()); - userAccount = userAccountRepository.save(userAccount); + userAccount = createNewAccountForLogin(login); accountsByLogin.put(login, userAccount); } accountsToCharge.add(userAccount); @@ -227,4 +233,72 @@ public class EventService { return eventRepository.findById(event.getId()); } + + public String getCurrentAuthenticatedUserAsDTO() { + if (SecurityContextHolder.getContext().getAuthentication() == null) { + return null; + } + if (SecurityContextHolder.getContext() == null) { + return null; + } + Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + if (principal instanceof AuthenticatedPrincipal) { + return ((AuthenticatedPrincipal) principal).getName(); + // return userService.getUserFromAuthentication((AbstractAuthenticationToken) principal); + } else { + throw new RuntimeException("User could not be found"); + } + } + + public UserAccount createNewAccountForLogin(String login) { + UserAccount entity = new UserAccount(); + Optional oneByLogin = userRepository.findOneByLogin(login); + if (oneByLogin.isPresent()) { + entity.setName(oneByLogin.get().getName()); + entity.getUsers().add(oneByLogin.get()); + entity = userAccountRepository.save(entity); + return entity; + } else { + throw new RuntimeException("user not found"); + } + } + + public UserAccount getOrCreateForCurrentUser() { + // if (true) return new UserAccount(); + String username = getCurrentAuthenticatedUserAsDTO(); + if (username != null) { + // List userAccounts = userAccountRepository.findByUserLogin(currentAuthenticatedUserAsDTO.getLogin()); + List userAccounts = userAccountRepository + .findAllFetchAccounts() + .stream() + .filter(accountResource -> { + return accountResource.getUsers().stream().anyMatch(user -> user.getLogin().equals(username)); + }) + .toList(); + if (userAccounts.isEmpty()) { + return createNewAccountForLogin(username); + } else { + UserAccount userAccount = userAccounts.get(0); + List transactionItemsForAccountId = transactionItemRepository.getTransactionItemsForAccountId( + userAccount.getId() + ); + + BigDecimal totalBalance = transactionItemsForAccountId + .stream() + .map(TransactionItem::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + userAccount.setBalance(totalBalance); + + return userAccount; + } + } else { + UserAccount userAccount = new UserAccount(); + userAccount.setName("Unauthenticated User"); + return userAccount; + } + } + + @Autowired + TransactionItemRepository transactionItemRepository; } diff --git a/src/main/java/com/sasiedzi/event/service/dto/UserDTO.java b/src/main/java/com/sasiedzi/event/service/dto/UserDTO.java index 036b855..5c27b14 100644 --- a/src/main/java/com/sasiedzi/event/service/dto/UserDTO.java +++ b/src/main/java/com/sasiedzi/event/service/dto/UserDTO.java @@ -1,6 +1,7 @@ package com.sasiedzi.event.service.dto; import com.sasiedzi.event.domain.User; +import jakarta.persistence.Transient; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/com/sasiedzi/event/web/rest/UserAccountResource.java b/src/main/java/com/sasiedzi/event/web/rest/UserAccountResource.java index 4ae9472..4b70ff7 100644 --- a/src/main/java/com/sasiedzi/event/web/rest/UserAccountResource.java +++ b/src/main/java/com/sasiedzi/event/web/rest/UserAccountResource.java @@ -1,7 +1,10 @@ package com.sasiedzi.event.web.rest; +import com.sasiedzi.event.domain.User; import com.sasiedzi.event.domain.UserAccount; import com.sasiedzi.event.repository.UserAccountRepository; +import com.sasiedzi.event.service.EventService; +import com.sasiedzi.event.service.UserService; import com.sasiedzi.event.web.rest.errors.BadRequestAlertException; import java.net.URI; import java.net.URISyntaxException; @@ -10,8 +13,11 @@ import java.util.Objects; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import tech.jhipster.web.util.HeaderUtil; @@ -166,6 +172,12 @@ public class UserAccountResource { return ResponseUtil.wrapOrNotFound(userAccount); } + @GetMapping("/currentUser") + public UserAccount getCurrentUserAccount() { + UserAccount userAccount = eventService.getOrCreateForCurrentUser(); + return userAccount; + } + /** * {@code DELETE /user-accounts/:id} : delete the "id" userAccount. * @@ -180,4 +192,7 @@ public class UserAccountResource { .headers(HeaderUtil.createEntityDeletionAlert(applicationName, false, ENTITY_NAME, id.toString())) .build(); } + + @Autowired + EventService eventService; } diff --git a/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts b/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts index d4371c5..24df627 100644 --- a/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts +++ b/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts @@ -1,10 +1,13 @@ import { type Ref, computed, defineComponent, inject, ref } from 'vue'; -import { useRouter } from 'vue-router'; +import { useRoute, useRouter } from 'vue-router'; import type LoginService from '@/account/login.service'; import type AccountService from '@/account/account.service'; import EntitiesMenu from '@/entities/entities-menu.vue'; import { useStore } from '@/store'; +import UserAccountService from '@/entities/user-account/user-account.service'; +import { useAlertService } from '@/shared/alert/alert.service'; +import type { IUserAccount } from '@/shared/model/user-account.model'; export default defineComponent({ compatConfig: { MODE: 3 }, @@ -27,6 +30,21 @@ export default defineComponent({ const inProduction = computed(() => store.activeProfiles.indexOf('prod') > -1); const authenticated = computed(() => store.authenticated); + const userAccountService = inject('userAccountService', () => new UserAccountService()); + const userAccount: Ref = ref({}); + + const retrieveUserAccount = async () => { + try { + const res = await userAccountService().getCurrentUser(); + userAccount.value = res; + } catch (error) { + userAccount.value = {}; + } + }; + console.log('Asdf'); + retrieveUserAccount(); + console.log('Asdf2'); + const openLogin = () => { loginService.login(); }; @@ -53,12 +71,14 @@ export default defineComponent({ subIsActive, accountService, openLogin, + userAccount, version, currentLanguage, hasAnyAuthorityValues, openAPIEnabled, inProduction, authenticated, + retrieveUserAccount, }; }, methods: { diff --git a/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue b/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue index 82ad2ed..0a26e34 100644 --- a/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue +++ b/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue @@ -1,8 +1,19 @@ diff --git a/src/main/webapp/app/entities/transaction/transaction.component.ts b/src/main/webapp/app/entities/transaction/transaction.component.ts index 4d9ca7d..3dbfc14 100644 --- a/src/main/webapp/app/entities/transaction/transaction.component.ts +++ b/src/main/webapp/app/entities/transaction/transaction.component.ts @@ -7,6 +7,13 @@ import { useAlertService } from '@/shared/alert/alert.service'; export default defineComponent({ compatConfig: { MODE: 3 }, name: 'Transaction', + props: { + userAccountId: { + type: [Number, String], + required: false, + default: null, + }, + }, setup() { const transactionService = inject('transactionService', () => new TransactionService()); const alertService = inject('alertService', () => useAlertService(), true); diff --git a/src/main/webapp/app/entities/user-account/user-account.service.ts b/src/main/webapp/app/entities/user-account/user-account.service.ts index 5b8ffbd..027ba9d 100644 --- a/src/main/webapp/app/entities/user-account/user-account.service.ts +++ b/src/main/webapp/app/entities/user-account/user-account.service.ts @@ -18,6 +18,19 @@ export default class UserAccountService { }); } + public getCurrentUser(): Promise { + return new Promise((resolve, reject) => { + axios + .get(`${baseApiUrl}/currentUser`) + .then(res => { + resolve(res.data); + }) + .catch(err => { + reject(err); + }); + }); + } + public retrieve(): Promise { return new Promise((resolve, reject) => { axios diff --git a/src/main/webapp/app/router/entities.ts b/src/main/webapp/app/router/entities.ts index f1902e0..d58d2af 100644 --- a/src/main/webapp/app/router/entities.ts +++ b/src/main/webapp/app/router/entities.ts @@ -108,6 +108,12 @@ export default { component: Transaction, meta: { authorities: [Authority.USER] }, }, + { + path: 'my-transaction/:userAccountId?', + name: 'MyTransaction', + component: Transaction, + meta: { authorities: [Authority.USER] }, + }, { path: 'transaction/new', name: 'TransactionCreate', diff --git a/src/main/webapp/app/shared/model/user-account.model.ts b/src/main/webapp/app/shared/model/user-account.model.ts index 330fffe..73353aa 100644 --- a/src/main/webapp/app/shared/model/user-account.model.ts +++ b/src/main/webapp/app/shared/model/user-account.model.ts @@ -4,6 +4,7 @@ export interface IUserAccount { id?: number; name?: string | null; users?: IUser[] | null; + balance?: number | 0; } export class UserAccount implements IUserAccount { @@ -11,5 +12,6 @@ export class UserAccount implements IUserAccount { public id?: number, public name?: string | null, public users?: IUser[] | null, + public balance?: number | 0, ) {} }