started to implement updates on transactions
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -12,6 +12,8 @@ public interface AccountDb {
|
||||
|
||||
Account loadAccount(long accountId);
|
||||
|
||||
Transaction loadTransaction(long transactionId);
|
||||
|
||||
List<Transaction> loadTransactions(Account account);
|
||||
|
||||
Account save(Account account);
|
||||
|
||||
@@ -63,6 +63,30 @@ public class AccountingModule extends BaseHandler implements AccountingService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPatch(Path path, HttpExchange ex) throws IOException {
|
||||
addCors(ex);
|
||||
try {
|
||||
var user = userService().refreshSession(ex);
|
||||
if (user.isEmpty()) return unauthorized(ex);
|
||||
var head = path.pop();
|
||||
return switch (head) {
|
||||
case TRANSACTION -> {
|
||||
try {
|
||||
var tid = Long.parseLong(path.pop());
|
||||
yield patchTransaction(user.get(),tid,ex);
|
||||
} catch (NumberFormatException ignored) {
|
||||
yield super.doPatch(path,ex);
|
||||
}
|
||||
|
||||
}
|
||||
case null, default -> super.doPatch(path, ex);
|
||||
};
|
||||
} catch (UmbrellaException e){
|
||||
return send(ex,e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPost(Path path, HttpExchange ex) throws IOException {
|
||||
addCors(ex);
|
||||
@@ -131,6 +155,18 @@ public class AccountingModule extends BaseHandler implements AccountingService {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean patchTransaction(UmbrellaUser user, long transactionId, HttpExchange ex) throws IOException {
|
||||
var transaction = accountDb.loadTransaction(transactionId);
|
||||
LOG.log(WARNING,"Missing permission check in patchTransaction(…)!");
|
||||
var json = json(ex);
|
||||
if (json.has(Field.DATE)){
|
||||
var date = LocalDate.parse(json.getString(Field.DATE));
|
||||
transaction.date(date);
|
||||
accountDb.save(transaction);
|
||||
}
|
||||
return sendContent(ex,transaction);
|
||||
}
|
||||
|
||||
private boolean postEntry(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||
var json = json(ex);
|
||||
if (!json.has(Field.ACCOUNT)) throw missingField(Field.ACCOUNT);
|
||||
|
||||
@@ -6,6 +6,7 @@ import static de.srsoftware.tools.jdbc.Condition.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||
import static de.srsoftware.umbrella.accounting.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.constants.Field.ID;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
||||
import static de.srsoftware.umbrella.core.model.Translatable.t;
|
||||
import static java.text.MessageFormat.format;
|
||||
@@ -51,7 +52,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
);""";
|
||||
|
||||
try {
|
||||
sql = format(sql,TABLE_ACCOUNTS, Field.ID, Field.NAME, Field.OWNER, Field.CURRENCY);
|
||||
sql = format(sql,TABLE_ACCOUNTS, ID, Field.NAME, Field.OWNER, Field.CURRENCY);
|
||||
var stmt = db.prepareStatement(sql);
|
||||
stmt.execute();
|
||||
stmt.close();
|
||||
@@ -68,7 +69,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
);
|
||||
""";
|
||||
try {
|
||||
sql = format(sql,TABLE_TAGS,Field.ID,Field.TAG);
|
||||
sql = format(sql,TABLE_TAGS, ID,Field.TAG);
|
||||
var stmt = db.prepareStatement(sql);
|
||||
stmt.execute();
|
||||
stmt.close();
|
||||
@@ -107,7 +108,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
{6} TEXT
|
||||
);""";
|
||||
try {
|
||||
sql = format(sql,TABLE_TRANSACTIONS,Field.ACCOUNT,Field.TIMESTAMP,Field.SOURCE,Field.DESTINATION, Field.AMOUNT,Field.DESCRIPTION, Field.ID);
|
||||
sql = format(sql,TABLE_TRANSACTIONS,Field.ACCOUNT,Field.TIMESTAMP,Field.SOURCE,Field.DESTINATION, Field.AMOUNT,Field.DESCRIPTION, ID);
|
||||
var stmt = db.prepareStatement(sql);
|
||||
stmt.execute();
|
||||
stmt.close();
|
||||
@@ -127,7 +128,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
while (rs.next()) accountIds.add(rs.getLong(1));
|
||||
rs.close();
|
||||
var accounts = new HashSet<Account>();
|
||||
rs = select(ALL).from(TABLE_ACCOUNTS).where(Field.ID, Condition.in(accountIds.toArray())).exec(db);
|
||||
rs = select(ALL).from(TABLE_ACCOUNTS).where(ID, Condition.in(accountIds.toArray())).exec(db);
|
||||
while (rs.next()) accounts.add(Account.of(rs));
|
||||
rs.close();
|
||||
return accounts;
|
||||
@@ -139,7 +140,7 @@ 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);
|
||||
var rs = select(ALL).from(TABLE_ACCOUNTS).where(ID,equal(accountId)).exec(db);
|
||||
Account account = null;
|
||||
if (rs.next()) account = Account.of(rs);
|
||||
rs.close();
|
||||
@@ -150,6 +151,20 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transaction loadTransaction(long transactionId) {
|
||||
try {
|
||||
Transaction transaction = null;
|
||||
var rs = select(ALL).from(TABLE_TRANSACTIONS).where(ID,equal(transactionId)).exec(db);
|
||||
if (rs.next()) transaction = Transaction.of(rs);
|
||||
rs.close();
|
||||
if (transaction != null) return transaction;
|
||||
throw failedToLoadObject(Text.TRANSACTION,transactionId);
|
||||
} catch (SQLException e) {
|
||||
throw failedToLoadObject(Text.TRANSACTION);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Transaction> loadTransactions(Account account) {
|
||||
try {
|
||||
@@ -161,7 +176,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
}
|
||||
rs.close();
|
||||
var transactionIds = transactions.keySet().toArray();
|
||||
rs = select(ALL).from(TABLE_TAGS_TRANSACTIONS).leftJoin(Field.TAG_ID,TABLE_TAGS,Field.ID).where(Field.TRANSACTION_ID,in(transactionIds)).exec(db);
|
||||
rs = select(ALL).from(TABLE_TAGS_TRANSACTIONS).leftJoin(Field.TAG_ID,TABLE_TAGS, ID).where(Field.TRANSACTION_ID,in(transactionIds)).exec(db);
|
||||
while (rs.next()) {
|
||||
var transaction = transactions.get(rs.getLong(Field.TRANSACTION_ID));
|
||||
if (transaction != null) transaction.tags().add(rs.getString(Field.TAG));
|
||||
@@ -191,9 +206,9 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
|
||||
@Override
|
||||
public Transaction save(Transaction transaction) {
|
||||
var timestamp = transaction.date().toEpochSecond(ZoneOffset.UTC);
|
||||
if (transaction.id() == 0) {
|
||||
try {
|
||||
var timestamp = transaction.date().toEpochSecond(ZoneOffset.UTC);
|
||||
var rs = Query.insertInto(TABLE_TRANSACTIONS, Field.ACCOUNT, Field.TIMESTAMP, Field.SOURCE, Field.DESTINATION, Field.AMOUNT, Field.DESCRIPTION)
|
||||
.values(transaction.accountId(), timestamp, transaction.source().value(), transaction.destination().value(), transaction.amount(), transaction.purpose())
|
||||
.execute(db).getGeneratedKeys();
|
||||
@@ -202,8 +217,15 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
} catch (SQLException e) {
|
||||
throw failedToStoreObject(transaction);
|
||||
}
|
||||
} else { // TODO : implement update
|
||||
throw UmbrellaException.failedToStoreObject(transaction);
|
||||
} else {
|
||||
try {
|
||||
Query.replaceInto(TABLE_TRANSACTIONS, Field.ID, Field.ACCOUNT, Field.TIMESTAMP, Field.SOURCE, Field.DESTINATION, Field.AMOUNT, Field.DESCRIPTION)
|
||||
.values(transaction.id(), transaction.accountId(), timestamp, transaction.source().value(), transaction.destination().value(), transaction.amount(), transaction.purpose())
|
||||
.execute(db).close();
|
||||
return transaction;
|
||||
} catch (SQLException e) {
|
||||
throw failedToStoreObject(transaction);
|
||||
}
|
||||
}
|
||||
return saveTags(transaction);
|
||||
}
|
||||
@@ -213,7 +235,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
var existingTags = new HashMap<String,Long>();
|
||||
try {
|
||||
var rs = select(ALL).from(TABLE_TAGS).where(Field.TAG,in(transaction.tags().toArray())).exec(db);
|
||||
while (rs.next()) existingTags.put(rs.getString(Field.TAG), rs.getLong(Field.ID));
|
||||
while (rs.next()) existingTags.put(rs.getString(Field.TAG), rs.getLong(ID));
|
||||
rs.close();
|
||||
} catch (SQLException e){
|
||||
throw failedToLoadMembers(transaction);
|
||||
@@ -257,7 +279,7 @@ public class SqliteDb extends BaseDb implements AccountDb {
|
||||
public Set<String> searchTagsContaining(String key, long accountId) {
|
||||
try {
|
||||
var tags = new HashSet<String>();
|
||||
var rs = select(ALL).from(TABLE_TRANSACTIONS).leftJoin(Field.ID,TABLE_TAGS_TRANSACTIONS,Field.TRANSACTION_ID).leftJoin(Field.TAG_ID,TABLE_TAGS,Field.ID).where(Field.TAG,like(format("%{0}%",key))).exec(db);
|
||||
var rs = select(ALL).from(TABLE_TRANSACTIONS).leftJoin(ID,TABLE_TAGS_TRANSACTIONS,Field.TRANSACTION_ID).leftJoin(Field.TAG_ID,TABLE_TAGS, ID).where(Field.TAG,like(format("%{0}%",key))).exec(db);
|
||||
while (rs.next()) tags.add(rs.getString(Field.TAG));
|
||||
rs.close();
|
||||
return tags;
|
||||
|
||||
Reference in New Issue
Block a user