feat: migrate prosappco from Firebase to NestJS REST API (Fase 2)

- Replace all Firebase* repositories with Api* repositories using HTTP + SharedPreferences JWT
- Remove Firebase.initializeApp() and firebase_messaging background handler from main.dart
- Update DI (app_di.dart) to inject Api* repositories instead of Firebase* ones
- Replace all Timestamp/cloud_firestore usage with ISO 8601 String dates
- Stub PhoneVerificationService (Firebase phone OTP → backend OTP when implemented)
- Add ApiService singleton with JWT management in lib/services/
- Legacy firebase_*_repository.dart files preserved for Fase 4 cleanup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-17 16:53:11 -05:00
co-authored by Claude Sonnet 4.6
parent 726cf12fd2
commit 733384091c
65 changed files with 1404 additions and 389 deletions
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -173,13 +174,13 @@ class _ProfessionalListScreenState extends State<ProfessionalListScreen> {
.toLowerCase()
.contains(removeDiacritics(_searchController.text.toLowerCase())))
.where((user) =>
user.myUser.id != FirebaseAuth.instance.currentUser!.uid)
user.myUser.id != ApiUserRepository.currentUserId ?? '')
.where(
(user) => user.professionalInfo.profession == _selectedProfession)
.toList();
// } else {
// filteredUsers = state.users
// // .where((user) => user.myUser.id != FirebaseAuth.instance.currentUser!.uid)
// // .where((user) => user.myUser.id != ApiUserRepository.currentUserId ?? '')
// .toList();
// }
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -28,7 +29,7 @@ class _ProfessionalPendingServiceListScreenState
serviceBloc = Injector.appInstance.get<ServiceBloc>();
serviceBloc.add(LoadPendingServicesForProfessional(FirebaseAuth.instance.currentUser!.uid));
serviceBloc.add(LoadPendingServicesForProfessional(ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -25,7 +26,7 @@ class _ProfessionalScoreListScreenState
scoreBloc = Injector.appInstance.get<ScoreBloc>();
scoreBloc.add(LoadScoresForProfessionalEvent(
userId: FirebaseAuth.instance.currentUser!.uid));
userId: ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -29,7 +30,7 @@ class _ProfessionalServiceHistoryListScreenState
serviceBloc = Injector.appInstance.get<ServiceBloc>();
serviceBloc.add(LoadServicesHistoryForProfessional(
FirebaseAuth.instance.currentUser!.uid));
ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -28,7 +29,7 @@ class _ProfessionalServiceListScreenState
serviceBloc = Injector.appInstance.get<ServiceBloc>();
serviceBloc.add(LoadServicesForProfessional(FirebaseAuth.instance.currentUser!.uid));
serviceBloc.add(LoadServicesForProfessional(ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -24,7 +25,7 @@ class _UserScoreListScreenState extends State<UserScoreListScreen> {
scoreBloc = Injector.appInstance.get<ScoreBloc>();
scoreBloc.add(
LoadScoresForUserEvent(userId: FirebaseAuth.instance.currentUser!.uid));
LoadScoresForUserEvent(userId: ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -29,7 +30,7 @@ class _UserServiceHistoryListScreenState
serviceBloc = Injector.appInstance.get<ServiceBloc>();
serviceBloc.add(
LoadServicesHistoryForUser(FirebaseAuth.instance.currentUser!.uid));
LoadServicesHistoryForUser(ApiUserRepository.currentUserId ?? ''));
}
@override
@@ -1,4 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -27,7 +28,7 @@ class _UserServiceListScreenState extends State<UserServiceListScreen> {
serviceBloc = Injector.appInstance.get<ServiceBloc>();
serviceBloc
.add(LoadServicesForUser(FirebaseAuth.instance.currentUser!.uid));
.add(LoadServicesForUser(ApiUserRepository.currentUserId ?? ''));
}
@override