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
+9 -11
View File
@@ -1,5 +1,3 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -33,7 +31,7 @@ class _ScoreScreenState extends State<ScoreScreen> {
super.initState();
_userInfoFuture = _getUserAndProfessionalInfo(widget.service);
isProfessional =
FirebaseAuth.instance.currentUser!.uid == widget.service.userId
ApiUserRepository.currentUserId ?? '' == widget.service.userId
? true
: false;
@@ -304,33 +302,33 @@ class _ScoreScreenState extends State<ScoreScreen> {
return FilledButton(
onPressed: () {
final CommentEntity comment = widget.service.userId ==
FirebaseAuth.instance.currentUser!.uid
ApiUserRepository.currentUserId ?? ''
? CommentEntity(
serviceId: widget.service.id!,
authorId:
FirebaseAuth.instance.currentUser!.uid,
ApiUserRepository.currentUserId ?? '',
isFromUser: true,
score: _rating,
destinationId: widget.service.professionalId,
content: commentController.text.trim(),
createdAt: Timestamp.now(),
createdAt: DateTime.now().toIso8601String(),
)
: CommentEntity(
serviceId: widget.service.id!,
authorId:
FirebaseAuth.instance.currentUser!.uid,
ApiUserRepository.currentUserId ?? '',
isFromUser: false,
score: _rating,
destinationId: widget.service.userId,
content: commentController.text.trim(),
createdAt: Timestamp.now(),
createdAt: DateTime.now().toIso8601String(),
);
BlocProvider.of<ScoreBloc>(context)
.add(SendScoreEvent(comment: comment));
if (widget.service.userId ==
FirebaseAuth.instance.currentUser!.uid) {
ApiUserRepository.currentUserId ?? '') {
context.read<ServiceBloc>().add(
UpdateProfessionalScored(widget.service.id!));
} else {
@@ -392,11 +390,11 @@ class _ScoreScreenState extends State<ScoreScreen> {
Future<List<dynamic>> _getUserAndProfessionalInfo(
ServiceEntity service) async {
final userRepo = FirebaseUserRepository(FirebaseAuth.instance);
final userRepo = Injector.appInstance.get<UserRepository>();
final MyUser? userInfo;
if (FirebaseAuth.instance.currentUser!.uid == service.userId) {
if (ApiUserRepository.currentUserId ?? '' == service.userId) {
userInfo = await userRepo.getMyUser(service.professionalId);
} else {
userInfo = await userRepo.getMyUser(service.userId);