feat: migrate prosapp_web_app from Firebase to NestJS API

- Replace Firebase Auth with JWT stored in SharedPreferences
- Replace Firestore with REST API calls via new ApiService
- Replace Firebase Storage with POST /storage/upload
- Remove firebase_auth, firebase_core, cloud_firestore,
  firebase_storage, firebase_messaging, google_sign_in deps
- Add api_service.dart as central HTTP client

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-17 13:19:28 -05:00
co-authored by Claude Sonnet 4.6
parent 1c20d0c0cd
commit b95e0630de
45 changed files with 2531 additions and 5865 deletions
+68 -106
View File
@@ -1,6 +1,6 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/services/api_service.dart';
final uid = AuthenticationRepository.instance.getCurrentUserUid();
@@ -22,10 +22,7 @@ class EventoService {
bool userScored,
) async {
try {
DateTime ahora = DateTime.now();
final eventId =
await FirebaseFirestore.instance.collection('services').add({
final Map<String, dynamic> result = await ApiService.instance.post('/services', {
'user_id': uid,
'title': title,
'description': description,
@@ -38,41 +35,27 @@ class EventoService {
'latitude': latitude,
'longitude': longitude,
'status': status,
'Timestamp': ahora,
'tarifa': tarifa ?? 0,
'professional_scored': professionalScored,
'user_scored': userScored,
}).then((value) {
FirebaseFirestore.instance.collection('users').doc(uid).update({
'services': FieldValue.arrayUnion([value.id])
});
return value.id;
});
return eventId;
return result['id']?.toString();
} catch (e) {
print('Evento $e');
return null;
}
return null;
}
}
Future<List<Event>> getByProId(String day) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
// .where('professional_id', isEqualTo: uid)
.where('day', isEqualTo: day.toString())
.where('status', isEqualTo: 'aprobado')
// .orderBy('Timestamp', descending: true)
.get();
final List<dynamic> data = await ApiService.instance
.get('/services?day=$day&status=aprobado');
List<Event> eventos = [];
for (var element in snapshot.docs) {
final event = Event.fromJson(element.data());
event.scoresModel = await ScoresModel.scoreTo(event.userId, false, false);
event.id = element.id;
for (var element in data) {
final event = Event.fromJson(element as Map<String, dynamic>);
event.scoresModel =
await ScoresModel.scoreTo(event.userId, false, false);
eventos.add(event);
}
return eventos;
@@ -84,42 +67,36 @@ Future<List<Event>> getByProId(String day) async {
Future<List<Event>> getByProIdAll(String state1, String state2) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
.where('professional_id', isEqualTo: uid)
.where('status', whereIn: [state1, state2]).get();
final List<dynamic> data = await ApiService.instance
.get('/services?professionalId=$uid&status=$state1,$state2');
List<Event> eventos = [];
for (var element in snapshot.docs) {
final event = Event.fromJson(element.data());
event.scoresModel = await ScoresModel.scoreTo(event.userId, false, false);
event.id = element.id;
for (var element in data) {
final event = Event.fromJson(element as Map<String, dynamic>);
event.scoresModel =
await ScoresModel.scoreTo(event.userId, false, false);
eventos.add(event);
}
return eventos;
} catch (e) {
print('Error getByProId $e');
print('Error getByProIdAll $e');
return [];
}
}
Future<List<Event>> getByUserIdAll(String state1, String state2) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
.where('user_id', isEqualTo: uid)
.where('status', whereIn: [state1, state2]).get();
final List<dynamic> data = await ApiService.instance
.get('/services?userId=$uid&status=$state1,$state2');
List<Event> eventos = [];
for (var element in snapshot.docs) {
final event = Event.fromJson(element.data());
event.scoresModel = await ScoresModel.scoreTo(event.userId, false, false);
event.id = element.id;
for (var element in data) {
final event = Event.fromJson(element as Map<String, dynamic>);
event.scoresModel =
await ScoresModel.scoreTo(event.userId, false, false);
eventos.add(event);
}
return eventos;
} catch (e) {
print('Error getByUserId $e');
print('Error getByUserIdAll $e');
return [];
}
}
@@ -142,7 +119,7 @@ class Event {
int? tarifa;
bool professionalScored;
bool userScored;
Timestamp? timeStamp;
DateTime? timeStamp;
Event({
this.id,
@@ -165,94 +142,79 @@ class Event {
});
factory Event.fromJson(Map<String, dynamic> json) {
DateTime? ts;
final raw = json['Timestamp'] ?? json['created_at'];
if (raw is String) ts = DateTime.tryParse(raw);
return Event(
id: json['id'] ?? '',
title: json['title'],
id: json['id']?.toString() ?? '',
title: json['title'] ?? '',
description: json['description'],
day: json['day'],
range1Hour1: json['range1Hour1'],
day: json['day'] ?? '',
range1Hour1: json['range1Hour1'] ?? '',
range1Hour2: json['range1Hour2'],
userId: json['user_id'],
professionalId: json['professional_id'],
userId: json['user_id'] ?? '',
professionalId: json['professional_id'] ?? '',
ubicacion: json['ubicacion'] ?? '',
address: json['address'] ?? '',
longitud: json['longitude'] ?? 0,
latitud: json['latitude'] ?? 0,
status: json['status'],
timeStamp: json['Timestamp'] ?? 0,
tarifa: json['tarifas'] ?? 0,
professionalScored: json['professional_scored'],
userScored: json['user_scored'],
longitud: (json['longitude'] ?? 0).toDouble(),
latitud: (json['latitude'] ?? 0).toDouble(),
status: json['status'] ?? 'pendiente',
timeStamp: ts,
tarifa: json['tarifa'] ?? json['tarifas'] ?? 0,
professionalScored: json['professional_scored'] ?? false,
userScored: json['user_scored'] ?? false,
);
}
static Future<Event> getEventById(String uid) async {
static Future<Event> getEventById(String eventId) async {
try {
final snapshot = await FirebaseFirestore.instance
.collection('services')
.doc(uid)
.get();
final Map<String, dynamic>? data = snapshot.data();
return Event.fromJson(data!);
final Map<String, dynamic> data =
await ApiService.instance.get('/services/$eventId');
return Event.fromJson(data);
} catch (e) {
print('Error getting user: $e');
print('Error getting event: $e');
return Event(
title: '', day: '', range1Hour1: '', userId: '', professionalId: '');
}
}
static Future<List<Event>> getEventsAllById(String uid) async {
static Future<List<Event>> getEventsAllById(String proId) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
.where('professional_id', isEqualTo: uid)
.get();
List<Event> eventos = [];
for (var element in snapshot.docs) {
eventos.add(Event.fromJson(element.data()));
}
return eventos;
final List<dynamic> data =
await ApiService.instance.get('/services?professionalId=$proId');
return data
.map((e) => Event.fromJson(e as Map<String, dynamic>))
.toList();
} catch (e) {
print('Error getByProId $e');
print('Error getEventsAllById $e');
return [];
}
}
static Future<List<Event>> getEventsAllByIdAndStatus(String uid) async {
static Future<List<Event>> getEventsAllByIdAndStatus(String proId) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
.where('professional_id', isEqualTo: uid)
.where('status', whereIn: ['aprobado', 'pendiente']).get();
List<Event> eventos = [];
for (var element in snapshot.docs) {
eventos.add(Event.fromJson(element.data()));
}
return eventos;
final List<dynamic> data = await ApiService.instance
.get('/services?professionalId=$proId&status=aprobado,pendiente');
return data
.map((e) => Event.fromJson(e as Map<String, dynamic>))
.toList();
} catch (e) {
print('Error getByProId $e');
print('Error getEventsAllByIdAndStatus $e');
return [];
}
}
static Future<List<Event>> getEventsAllByIdStatus(
String uid, String state) async {
String proId, String state) async {
try {
var snapshot = await FirebaseFirestore.instance
.collection('services')
.where('professional_id', isEqualTo: uid)
.where('status', isEqualTo: state)
.get();
List<Event> eventos = [];
for (var element in snapshot.docs) {
eventos.add(Event.fromJson(element.data()));
}
return eventos;
final List<dynamic> data = await ApiService.instance
.get('/services?professionalId=$proId&status=$state');
return data
.map((e) => Event.fromJson(e as Map<String, dynamic>))
.toList();
} catch (e) {
print('Error getByProId $e');
print('Error getEventsAllByIdStatus $e');
return [];
}
}