refactor: save current workspace state including FinlyticAnalyzer fixes, FinlyticApp trade route alignment, and DTO audit documentation

This commit is contained in:
2026-08-12 18:30:42 +02:00
parent a9553e9fbf
commit 3d8af3940b
163 changed files with 3421 additions and 1751 deletions
@@ -1,6 +1,5 @@
import 'package:finlytic_app/core/network/api_client.dart';
import 'package:finlytic_app/features/search/models/search_result_model.dart';
import 'package:finlytic_app/core/utils/asset_utils.dart';
class SearchRepository {
final ApiClient apiClient;
@@ -9,15 +8,12 @@ class SearchRepository {
Future<List<SearchResultModel>> searchAssets(String query) async {
try {
final res = await apiClient.get('/api/v1/assets/search', queryParameters: {'q': query});
final res = await apiClient
.get('/api/v1/assets/search', queryParameters: {'q': query});
if (res.statusCode == 200 && res.data != null) {
final list = res.data as List;
final results = list.map((json) => SearchResultModel.fromJson(json)).toList();
for (final item in results) {
if (item.isinCode.isNotEmpty && item.displayName.isNotEmpty) {
AssetUtils.registerAsset(item.isinCode, item.displayName, item.image);
}
}
final results =
list.map((json) => SearchResultModel.fromJson(json)).toList();
return results;
}
return [];
@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../core/network/api_client.dart';
import '../../../core/theme/app_theme.dart';
import '../../../core/utils/asset_utils.dart';
import '../../../core/widgets/asset_logo_widget.dart';
import '../../../core/widgets/shimmer_loading.dart';
import '../../../shared/widgets/favorite_star_button.dart';
@@ -138,13 +137,9 @@ class _AssetSearchDialogContentState extends State<_AssetSearchDialogContent> {
itemBuilder: (context, index) {
final item = results[index];
final assetName = item.displayName;
final isinCode = item.isinCode;
final isin = item.isin;
if (isinCode.isNotEmpty && assetName.isNotEmpty) {
AssetUtils.registerAsset(isinCode, assetName, item.image);
}
final targetId = isinCode.isNotEmpty ? isinCode : assetName;
final targetId = isin.isNotEmpty ? isin : assetName;
return ListTile(
leading: AssetLogoWidget(
@@ -153,8 +148,8 @@ class _AssetSearchDialogContentState extends State<_AssetSearchDialogContent> {
size: 36,
),
title: Text(assetName, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 14)),
subtitle: isinCode.isNotEmpty
? Text('ISIN: $isinCode', style: TextStyle(color: activeTheme.textMuted, fontSize: 11))
subtitle: isin.isNotEmpty
? Text('ISIN: $isin', style: TextStyle(color: activeTheme.textMuted, fontSize: 11))
: null,
trailing: SizedBox(
width: 40,
@@ -171,7 +166,8 @@ class _AssetSearchDialogContentState extends State<_AssetSearchDialogContent> {
context,
MaterialPageRoute(
builder: (_) => AssetDetailScreen(
symbol: assetName,
isin: isin,
name: assetName,
apiClient: widget.apiClient,
),
),