ProsApp Migration

Arquitectura completa del ecosistema ProsApp · Firebase → NestJS + PostgreSQL

Backend NestJS Admin Next.js Flutter Mobile Flutter Web

Arquitectura

Clientes
prosappco (Flutter/Bloc)
prosapp_web_app (Flutter/Provider)
API
NestJS · api/v1 · JWT
WebSocket Socket.IO
Swagger /docs
Admin
Next.js + shadcn/ui (NUEVO)
dashpro (Laravel · LEGACY)
Base de datos: PostgreSQL 16 en Coolify · 15 tablas · Prisma ORM

Backend NestJS

Módulos y Endpoints

MóduloEndpointsAuth
Authregister, login, phone, me3 público · 3 JWT
Usersme, update, fcm-token3 JWT
Professionalslist, pending, approve, deny, request, schedules2 público · 7 JWT
Servicescreate, list, history, calendar, status1 público · 9 JWT
Commentscreate, scores, reputation3 público · 1 JWT
Chatstart, message, list + WebSocket4 JWT
Locationscountries, regions, cities3 público
Professionslist1 público
Settingsglobal settings1 público
Storageupload (multer)JWT

Stack

Framework NestJS 11.1.24
ORM Prisma 7.8.0
Auth Passport + JWT (7d)
WS Socket.IO
Docs Swagger /docs
Puerto 3000 · prefijo /api/v1

WebSocket Gateway

connection Auth JWT → sala user:{id}
sendMessage { chatId, content }
joinChat Sala chat:{id}
newMessage Emitido a ambos participantes

Admin Panel Next.js

Rutas

RutaFunción
/loginLogin JWT (email + password)
/Dashboard con stats en vivo
/usersTabla de usuarios con búsqueda
/professionalsActivos / Pendientes · aprobar/rechazar
/servicesLista con filtro por estado
/professionsCRUD (agregar, eliminar)
/citiesPaís → Región → Ciudad
/settingsVer JSON configuración global

Stack

Framework Next.js 16.2.7
Estilos Tailwind v4 + shadcn/ui
Iconos Lucide React
Toast Sonner
Auth JWT vía localStorage
API URL NEXT_PUBLIC_API_URL

Componentes UI instalados

button card table tabs select input badge avatar dropdown-menu sheet sonner

Apps Flutter

MÓVIL

prosappco

Versión 1.0.14+14
SDK Dart >=2.19.3
State Bloc 8.1.4
DI Injector
Routing BlocBuilder implícito
Archivos ~167 Dart · ~18,923 LOC
Firebase Auth, Firestore, Storage, Messaging, Functions

8 Repositorios Locales

user professional service chat score city profession setting

14 BLoCs

authentication my_user profile professional professional_profile professional_list chat notification score service setting sign_up / sign_in auth
WEB

prosapp_web_app

Versión 1.0.0+1
SDK Dart >=3.4.1
State Provider (ChangeNotifier)
Routing Fluro (28 rutas)
Archivos ~95 Dart · ~11,164 LOC
Firebase Auth, Firestore, Storage

18 Providers

auth professional professionals services calendar_services chat cities professions professional_detail professional_form profile_form settings score sidemenu login_form / register_form / phone_form / email_form

prosapp/ (Landing Page)

HTML estático + Tailwind CDN + Alpine.js. Sin backend. Sin cambios necesarios.

1 archivo (398 líneas) · 7 imágenes · Sin dependencias npm

Base de Datos PostgreSQL

Conexión

Host: 46.202.93.92:5432
Database: prosapp
User: prosapp_user

15 Tablas

users
professionals
services
comments
chats
messages
professions
specializations
schedules
payment_methods
reputations
countries
regions
cities
settings

Relaciones Clave

users 1:1 professionals
Un usuario puede ser profesional
professional 1:N services
Un profesional tiene muchos servicios
users 1:N services (como cliente)
Un usuario puede solicitar servicios
chats 1:N messages (cascade)
Un chat tiene muchos mensajes

Enums

service_status: pending, accepted, denied, active, cancelled, completed, self_booked
service_location: office, delivery

Triggers

update_reputation() — actualiza reputación al insertar/actualizar comments

Issues Críticos (11)

🔴
C-1 · Chat FK violation
chat.service.ts usa prof.id (PK professionals) en vez del userId. Causa violación de FK en runtime.
🔴
C-2 · .env commiteado
Credenciales de BD en .env dentro del repo. Mover a Coolify y agregar a .gitignore.
🔴
C-3 · Storage no-op
POST /storage/upload no persiste archivos. Solo devuelve una URL construida.
🔴
C-4 · Sin migraciones Prisma
No existe prisma/migrations/. Los cambios de schema no tienen tracking.
🟠
C-5 · Sin paginación
Todos los findMany sin skip/take. Performance issues con datos reales.
🔴
C-6 · Admin sin auth guard
AuthGuard definido pero no conectado. Todas las rutas del admin son públicas.
🔴
C-7 / C-8 · FCM Key hardcodeada
prosappco y prosapp_web_app tienen la server key de Firebase Cloud Messaging en texto plano en el cliente.
🔴
C-9 · dd() kills execution
dashpro: ShowSettings.php:223 y MenuController.php:106 tienen dd() que detienen la ejecución.
🔴
C-10 · /confirmar sin auth
dashpro: ruta de aprobación de servicios accesible sin autenticación.
🟠
C-11 · MongoDB creds hardcodeadas
dashpro/config/database.php contiene usuario y password de MongoDB Atlas en texto plano.

Estado de Tareas (utasker)

✅ Completadas (10)

#1 Corregir pubspec.yaml prosappco (3 null versions)
#2 Agregar http a prosapp_web_app pubspec.yaml
#3 Eliminar propsapp_web_app (duplicado)
#4 Eliminar comment_entity copy.dart
#5 Verificar http en prosappco (ya estaba)
#6 Fix Firebase credentials filename en dashpro
#7-11 Plan de migración creado
#12-15 Fases de migración registradas

🔴 Críticas Pendientes (6)

16 Fix chat FK: usar professionalUserId en vez de prof.id
17 Agregar .env a .gitignore y mover credenciales a Coolify
18 Implementar storage real en lugar de no-op
19 Crear migraciones Prisma (prisma migrate dev)
20 Agregar paginación a todos los findMany
21 Conectar AuthGuard en layout del admin panel

⏳ Pendientes (5)

#7 MongoDB creds hardcodeadas en config/database.php
#8 dd() en MenuController rompe ruta /noti
#9 Migrar prosapp_web_app (Provider → API)
#10 Migrar prosappco (Bloc + 8 repos → API)
#11 Migrar dashpro a PostgreSQL + NestJS

Plan de Migración

FASE 1

Completar Backend

✅ Fix C-1 (chat FK) · C-4 (migraciones) · C-5 (paginación)
✅ Implementar storage real · Health check · Rate limiting
⬜ Deploy en Coolify
FASE 2

Asegurar Admin Panel

✅ Conectar AuthGuard (C-6) · `.env.example`
✅ Estados de carga/error · Páginas de detalle
⬜ Deploy en Coolify
FASE 3

Migrar prosapp_web_app

API service layer → Migrar 18 providers → JWT → Storage → WebSockets
FASE 4

Migrar prosappco

Reescribir 8 repositorios → Migrar auth + storage + push → Reemplazar snapshots
FASE 5

Retirar dashpro

Verificar paridad → Crear módulos faltantes en admin nuevo → Dar de baja → Eliminar Firebase
ProsApp Migration · 2026-06-02 · Backend NestJS + PostgreSQL · Admin Next.js + shadcn/ui