using Microsoft.EntityFrameworkCore; using MoneyMap.Data; using MoneyMap.Models; namespace MoneyMap.Services; /// /// Service for retrieving reference/lookup data used in dropdowns and filters. /// public interface IReferenceDataService { /// /// Gets all distinct categories from transactions, sorted alphabetically. /// Task> GetAvailableCategoriesAsync(); /// /// Gets all merchants, sorted by name. /// Task> GetAvailableMerchantsAsync(); /// /// Gets all cards with optional account information included. /// Task> GetAvailableCardsAsync(bool includeAccount = true); /// /// Gets all accounts, sorted by institution and last4. /// Task> GetAvailableAccountsAsync(); } public class ReferenceDataService : IReferenceDataService { private readonly MoneyMapContext _db; public ReferenceDataService(MoneyMapContext db) { _db = db; } public async Task> GetAvailableCategoriesAsync() { return await _db.Transactions .Select(t => t.Category ?? "") .Where(c => !string.IsNullOrWhiteSpace(c)) .Distinct() .OrderBy(c => c) .ToListAsync(); } public async Task> GetAvailableMerchantsAsync() { return await _db.Merchants .OrderBy(m => m.Name) .ToListAsync(); } public async Task> GetAvailableCardsAsync(bool includeAccount = true) { var query = _db.Cards.AsQueryable(); if (includeAccount) { query = query.Include(c => c.Account); } return await query .OrderBy(c => c.Owner) .ThenBy(c => c.Last4) .ToListAsync(); } public async Task> GetAvailableAccountsAsync() { return await _db.Accounts .OrderBy(a => a.Institution) .ThenBy(a => a.Last4) .ToListAsync(); } }