working on loading of account data

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-04-02 18:14:19 +02:00
parent a5d5d5872d
commit d4aaa24aaa
8 changed files with 142 additions and 12 deletions

View File

@@ -4,9 +4,15 @@ import de.srsoftware.umbrella.core.model.Account;
import de.srsoftware.umbrella.core.model.Transaction;
import java.util.Collection;
import java.util.List;
public interface AccountDb {
Collection<Account> listAccounts(long userId);
Account loadAccount(long accountId);
List<Transaction> loadTransactions(Account account);
Account save(Account account);
Transaction save(Transaction transaction);

View File

@@ -20,6 +20,8 @@ import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static de.srsoftware.tools.Optionals.nullIfEmpty;
@@ -53,10 +55,13 @@ public class AccountingModule extends BaseHandler implements AccountingService {
var head = path.pop();
return switch (head) {
case null -> getAccounts(user.get(),ex);
default -> super.doGet(path,ex);
default -> {
try {
yield getAccount(user.get(),Long.parseLong(head),ex);
} catch (NumberFormatException ignored) {}
yield super.doGet(path,ex);
}
};
} catch (NumberFormatException e){
return sendContent(ex,HTTP_BAD_REQUEST,"Invalid project id");
} catch (UmbrellaException e){
return send(ex,e);
}
@@ -74,13 +79,41 @@ public class AccountingModule extends BaseHandler implements AccountingService {
case null -> postEntry(user.get(),ex);
default -> super.doPost(path,ex);
};
} catch (NumberFormatException e){
return sendContent(ex,HTTP_BAD_REQUEST,"Invalid project id");
} catch (UmbrellaException e){
return send(ex,e);
}
}
private boolean getAccount(UmbrellaUser user, long accountId, HttpExchange ex) throws IOException {
var account = accountDb.loadAccount(accountId);
var transactions = accountDb.loadTransactions(account);
var userMap = new HashMap<Long,UmbrellaUser>();
var foundRequestingUser = false;
for (var i=0; i<transactions.size();i++){
var transaction = transactions.get(i);
try {
var userId = Long.parseLong(transaction.source());
var u = userMap.get(userId);
if (u == null) userMap.put(userId,u=userService().loadUser(userId));
if (!foundRequestingUser) foundRequestingUser = user.equals(u);
transaction = new Transaction(transaction.accountId(),transaction.date(),u.name(),transaction.destination(),transaction.amount(),transaction.purpose());
transactions.set(i,transaction);
} catch (NumberFormatException ignored){}
try {
var userId = Long.parseLong(transaction.destination());
var u = userMap.get(userId);
if (u == null) userMap.put(userId,u=userService().loadUser(userId));
if (!foundRequestingUser) foundRequestingUser = user.equals(u);
transaction = new Transaction(transaction.accountId(),transaction.date(),transaction.source(),u.name(),transaction.amount(),transaction.purpose());
transactions.set(i,transaction);
} catch (NumberFormatException ignored){}
}
return sendContent(ex, Map.of(
Field.ACCOUNT,account.toMap(),
Field.TRANSACTIONS,transactions.stream().map(Transaction::toMap).toList()
));
}
private boolean getAccounts(UmbrellaUser user, HttpExchange ex) throws IOException {
return sendContent(ex,accountDb.listAccounts(user.id()).stream().map(Account::toMap));
}

View File

@@ -11,11 +11,14 @@ import de.srsoftware.umbrella.core.model.Transaction;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import static de.srsoftware.tools.NotImplemented.notImplemented;
import static de.srsoftware.tools.jdbc.Condition.equal;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.tools.jdbc.Query.select;
import static de.srsoftware.umbrella.accounting.Constants.TABLE_ACCOUNTS;
import static de.srsoftware.umbrella.accounting.Constants.TABLE_TRANSACTIONS;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
@@ -80,14 +83,14 @@ public class SqliteDb extends BaseDb implements AccountDb {
public HashSet<Account> listAccounts(long userId) {
try {
var accountIds = new HashSet<Long>();
var rs = Query.select("DISTINCT " + Field.ACCOUNT).from(TABLE_TRANSACTIONS).where(Field.SOURCE, equal(userId)).exec(db);
var rs = select("DISTINCT " + Field.ACCOUNT).from(TABLE_TRANSACTIONS).where(Field.SOURCE, equal(userId)).exec(db);
while (rs.next()) accountIds.add(rs.getLong(1));
rs.close();
rs = Query.select("DISTINCT " + Field.ACCOUNT).from(TABLE_TRANSACTIONS).where(Field.DESTINATION, equal(userId)).exec(db);
rs = select("DISTINCT " + Field.ACCOUNT).from(TABLE_TRANSACTIONS).where(Field.DESTINATION, equal(userId)).exec(db);
while (rs.next()) accountIds.add(rs.getLong(1));
rs.close();
var accounts = new HashSet<Account>();
rs = Query.select(ALL).from(TABLE_ACCOUNTS).where(Field.ID, Condition.in(accountIds.toArray())).exec(db);
rs = select(ALL).from(TABLE_ACCOUNTS).where(Field.ID, Condition.in(accountIds.toArray())).exec(db);
while (rs.next()) accounts.add(Account.of(rs));
rs.close();
return accounts;
@@ -96,6 +99,33 @@ public class SqliteDb extends BaseDb implements AccountDb {
}
}
@Override
public Account loadAccount(long accountId) {
try {
var rs = select(ALL).from(TABLE_ACCOUNTS).where(Field.ID,equal(accountId)).exec(db);
Account account = null;
if (rs.next()) account = Account.of(rs);
rs.close();
if (account==null) throw failedToLoadObject(Text.ACCOUNT,accountId);
return account;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public List<Transaction> loadTransactions(Account account) {
try {
var list = new ArrayList<Transaction>();
var rs = select(ALL).from(TABLE_TRANSACTIONS).where(Field.ACCOUNT,equal(account.id())).exec(db);
while (rs.next()) list.add(Transaction.of(rs));
rs.close();
return list;
} catch (SQLException e) {
throw failedToLoadMembers(account);
}
}
@Override
public Account save(Account account) {
if (account.id() == 0) try { // new account