Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 101 additions & 3 deletions FinTrack/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,111 @@
using System.Windows;
using CommunityToolkit.Mvvm.Messaging;
using FinTrack.Core;
using FinTrack.Services;
using FinTrack.Services.Api;
using FinTrack.ViewModels;
using FinTrack.Views;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using System.Windows;

namespace FinTrack
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
private readonly IHost _host;

public App()
{
_host = Host.CreateDefaultBuilder()
.UseSerilog((context, services, configuration) =>
{
configuration.ReadFrom.Configuration(context.Configuration);
})
.ConfigureServices((context, services) =>
{
ConfigureServices(services);
})
.Build();

SetupGlobalExceptionHandling();
}

private void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IMessenger>(WeakReferenceMessenger.Default);

services.AddSingleton<MainWindow>();
services.AddSingleton<AuthenticatorWindow>();

services.AddSingleton<MainViewModel>();
services.AddSingleton<LoginViewModel>();

services.AddTransient<TopBarViewModel>();
services.AddTransient<BottomBarViewModel>();

services.AddTransient<RegisterViewModel>();
services.AddTransient<OtpVerificationViewModel>();
services.AddTransient<ForgotPasswordViewModel>();
services.AddTransient<ApplicationRecognizeSlideViewModel>();
services.AddTransient<AuthenticatorViewModel>();
services.AddTransient<DashboardViewModel>();
services.AddTransient<BudgetViewModel>();
services.AddTransient<AccountViewModel>();
services.AddTransient<TransactionsViewModel>();
services.AddTransient<ReportsViewModel>();
services.AddTransient<FinBotViewModel>();
services.AddTransient<CurrenciesViewModel>();
services.AddTransient<DebtViewModel>();
services.AddTransient<SettingsViewModel>();
services.AddTransient<FeedbackViewModel>();
services.AddTransient<NotificationViewModel>();

services.AddSingleton<IAuthService, AuthService>();
services.AddSingleton<ISecureTokenStorage, SecureTokenStorage>();
services.AddSingleton<IApiService, ApiService>();
}

protected override async void OnStartup(StartupEventArgs e)
{
await _host.StartAsync();

var logger = _host.Services.GetRequiredService<ILogger<App>>();
logger.LogInformation("Uygulama başlatıldı ve Host çalışıyor.");

var window = _host.Services.GetRequiredService<AuthenticatorWindow>();
window.Show();

base.OnStartup(e);
new LoginWindow().Show();
}

private void SetupGlobalExceptionHandling()
{
DispatcherUnhandledException += (sender, e) =>
{
var logger = _host.Services.GetRequiredService<ILogger<App>>();
logger.LogCritical(e.Exception, "YAKALANAMAYAN UI HATASI!");

MessageBox.Show("Beklenmedik bir hata oluştu. Uygulama kapanacak. Detaylar log dosyasına yazıldı.", "Kritik Hata", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true;
Shutdown();
};

AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
var logger = _host.Services.GetRequiredService<ILogger<App>>();
logger.LogCritical(e.ExceptionObject as Exception, "YAKALANAMAYAN ARKA PLAN HATASI!");
};
}

protected override async void OnExit(ExitEventArgs e)
{
using (_host)
{
await _host.StopAsync(TimeSpan.FromSeconds(5));
}
base.OnExit(e);
}
}
}
9 changes: 9 additions & 0 deletions FinTrack/Core/ISecureTokenStorage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace FinTrack.Core
{
public interface ISecureTokenStorage
{
void SaveToken(string token);
string? GetToken();
void ClearToken();
}
}
2 changes: 1 addition & 1 deletion FinTrack/Core/SecureTokenStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace FinTrack.Core
{
public class SecureTokenStorage
public class SecureTokenStorage : ISecureTokenStorage
{
private readonly string _filePath;

Expand Down
31 changes: 31 additions & 0 deletions FinTrack/Core/TokenValidator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.IdentityModel.Tokens.Jwt;

namespace FinTrack.Core
{
public static class TokenValidator
{
public static bool IsTokenValid(string token)
{
if (string.IsNullOrWhiteSpace(token))
{
return false;
}

var tokenHanler = new JwtSecurityTokenHandler();

try
{
var jwtToken = tokenHanler.ReadJwtToken(token);

var expiration = jwtToken.ValidTo;

return expiration > DateTime.UtcNow;
}
catch (Exception ex)
{
Console.WriteLine($"Token validation failed: {ex.Message}");
return false;
}
}
}
}
12 changes: 12 additions & 0 deletions FinTrack/Dtos/UserProfileDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace FinTrack.Dtos
{
public class UserProfileDto
{
public int Id { get; set; }
public string UserName { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
public string ProfilePicture { get; set; } = string.Empty;
public string Role { get; set; } = string.Empty;
public string MembershipType { get; set; } = string.Empty;
}
}
13 changes: 13 additions & 0 deletions FinTrack/Enums/AccountType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace FinTrack.Enums
{
public enum AccountType
{
Checking,
Savings,
CreditCard,
Cash,
Investment,
Loan,
Other,
} // Kontrol, Tasarruf, Kredi Kartı, Nakit, Yatırım, Kredi, Diğer
}
4 changes: 4 additions & 0 deletions FinTrack/Enums/TransactionType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
namespace FinTrack.Enums
{
public enum TransactionType { Income, Expense }
}
6 changes: 6 additions & 0 deletions FinTrack/FinTrack.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,14 @@
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.12.1" />
</ItemGroup>

<ItemGroup>
Expand Down
4 changes: 4 additions & 0 deletions FinTrack/Messages/LoginSuccessMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
namespace FinTrack.Messages
{
public class LoginSuccessMessage { }
}
6 changes: 6 additions & 0 deletions FinTrack/Messages/NavigationMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace FinTrack.Messages
{
public class LoginSuccessMessag
Copy link

Copilot AI Jul 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The class name is missing the final 'e'. Rename LoginSuccessMessag to LoginSuccessMessage to match usage elsewhere.

Suggested change
public class LoginSuccessMessag
public class LoginSuccessMessage

Copilot uses AI. Check for mistakes.
{
}
}
14 changes: 2 additions & 12 deletions FinTrack/Models/AccountModel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
using FinTrack.Enums;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FinTrack.Models
Expand Down Expand Up @@ -48,15 +49,4 @@ public class AccountModel

public virtual ICollection<TransactionModel> Transactions { get; set; } = new List<TransactionModel>();
}

public enum AccountType
{
Checking,
Savings,
CreditCard,
Cash,
Investment,
Loan,
Other,
} // Kontrol, Tasarruf, Kredi Kartı, Nakit, Yatırım, Kredi, Diğer
}
12 changes: 12 additions & 0 deletions FinTrack/Models/Dashboard/AccountDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Windows.Media;

namespace FinTrack.Models.Dashboard
{
public class AccountDashboard
{
public string Name { get; set; } = string.Empty;
public double Percentage { get; set; }
public string Balance { get; set; } = string.Empty;
public Brush ProgressBarBrush { get; set; } = Brushes.Transparent;
}
}
13 changes: 13 additions & 0 deletions FinTrack/Models/Dashboard/BudgetDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Windows.Media;

namespace FinTrack.Models.Dashboard
{
public class BudgetDashboard
{
public string Name { get; set; } = string.Empty;
public string DueDate { get; set; } = string.Empty;
public string Amount { get; set; } = string.Empty;
public string RemainingTime { get; set; } = string.Empty;
public Brush StatusBrush { get; set; } = Brushes.Transparent;
}
}
15 changes: 15 additions & 0 deletions FinTrack/Models/Dashboard/CurrencyRateDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace FinTrack.Models.Dashboard
{
public class CurrencyRateDashboard
{
public string FromCurrencyFlagUrl { get; set; } = string.Empty;
public string FromCurrencyCountry { get; set; } = string.Empty;
public string FromCurrencyName { get; set; } = string.Empty;
public string FromCurrencyAmount { get; set; } = string.Empty;
public string ToCurrencyFlagUrl { get; set; } = string.Empty;
public string ToCurrencyCountry { get; set; } = string.Empty;
public string ToCurrencyName { get; set; } = string.Empty;
public string ToCurrencyAmount { get; set; } = string.Empty;
public double ToCurrencyImageHeight { get; set; } = 20;
}
}
16 changes: 16 additions & 0 deletions FinTrack/Models/Dashboard/DebtDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace FinTrack.Models.Dashboard
{
public class DebtDashboard
{
public string LenderName { get; set; } = string.Empty;
public string LenderIconPath { get; set; } = string.Empty;
public string BorrowerName { get; set; } = string.Empty;
public string BorrowerIconPath { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public string StatusBrush { get; set; } = string.Empty;
Copy link

Copilot AI Jul 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

StatusBrush is a string but XAML binds it to a Brush (BorderBrush). Change this property to type Brush or provide a converter to avoid runtime type mismatch.

Suggested change
public string StatusBrush { get; set; } = string.Empty;
public System.Windows.Media.Brush StatusBrush { get; set; } = System.Windows.Media.Brushes.Transparent;

Copilot uses AI. Check for mistakes.
public string Amount { get; set; } = string.Empty;
public string CreationDate { get; set; } = string.Empty;
public string DueDate { get; set; } = string.Empty;
public string ReviewDate { get; set; } = string.Empty;
}
}
10 changes: 10 additions & 0 deletions FinTrack/Models/Dashboard/MembershipDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace FinTrack.Models.Dashboard
{
public class MembershipDashboard
{
public string Level { get; set; } = string.Empty;
public string StartDate { get; set; } = string.Empty;
public string RenewalDate { get; set; } = string.Empty;
public string Price { get; set; } = string.Empty;
}
}
9 changes: 9 additions & 0 deletions FinTrack/Models/Dashboard/ReportDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace FinTrack.Models.Dashboard
{
public class ReportDashboard
{
public string Name { get; set; } = string.Empty;
public string IconPath { get; set; } = "/Assets/Icons/report.png";
public string[] Formats { get; set; } = { "PDF", "WORD", "TEXT", "XML", "EXCEL", "MD" };
}
}
15 changes: 15 additions & 0 deletions FinTrack/Models/Dashboard/TransactionDashboard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using FinTrack.Enums;
using System.Windows.Media;

namespace FinTrack.Models.Dashboard
{
public class TransactionDashboard
{
public string DateText { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Amount { get; set; } = string.Empty;
public string Category { get; set; } = string.Empty;
public TransactionType Type { get; set; } = TransactionType.Expense;
public Brush DateBadgeBrush => Type == TransactionType.Income ? Brushes.Green : Brushes.Red;
}
}
Loading
Loading