refactor: move services and AITools to MoneyMap.Core

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 18:18:20 -04:00
parent 3deca29f05
commit 3b01efd8a6
27 changed files with 10 additions and 5 deletions
@@ -0,0 +1,79 @@
using Microsoft.EntityFrameworkCore;
using MoneyMap.Data;
using MoneyMap.Models;
namespace MoneyMap.Services;
/// <summary>
/// Service for core transaction operations including duplicate detection,
/// retrieval, and deletion.
/// </summary>
public interface ITransactionService
{
/// <summary>
/// Checks if a transaction is a duplicate based on date, amount, name, memo,
/// account, and card.
/// </summary>
Task<bool> IsDuplicateAsync(Transaction transaction);
/// <summary>
/// Gets a transaction by ID with optional related data.
/// </summary>
Task<Transaction?> GetTransactionByIdAsync(long id, bool includeRelated = false);
/// <summary>
/// Deletes a transaction and all related data (receipts, parse logs, line items).
/// </summary>
Task<bool> DeleteTransactionAsync(long id);
}
public class TransactionService : ITransactionService
{
private readonly MoneyMapContext _db;
public TransactionService(MoneyMapContext db)
{
_db = db;
}
public async Task<bool> IsDuplicateAsync(Transaction transaction)
{
return await _db.Transactions.AnyAsync(t =>
t.Date == transaction.Date &&
t.Amount == transaction.Amount &&
t.Name == transaction.Name &&
t.Memo == transaction.Memo &&
t.AccountId == transaction.AccountId &&
t.CardId == transaction.CardId);
}
public async Task<Transaction?> GetTransactionByIdAsync(long id, bool includeRelated = false)
{
var query = _db.Transactions.AsQueryable();
if (includeRelated)
{
query = query
.Include(t => t.Card)
.ThenInclude(c => c!.Account)
.Include(t => t.Account)
.Include(t => t.TransferToAccount)
.Include(t => t.Merchant)
.Include(t => t.Receipts)
.ThenInclude(r => r.LineItems);
}
return await query.FirstOrDefaultAsync(t => t.Id == id);
}
public async Task<bool> DeleteTransactionAsync(long id)
{
var transaction = await _db.Transactions.FindAsync(id);
if (transaction == null)
return false;
_db.Transactions.Remove(transaction);
await _db.SaveChangesAsync();
return true;
}
}