feat: add Node.js/Express API with real data from Desk CRM

-  API completa em /api com TypeScript
-  Google Calendar integration (pessoal + profissional)
-  Queries diretas à BD: tasks, leads, projectos, billing, pipeline
-  Endpoints: /api/dashboard, /api/monitor, /api/health
-  Vite proxy configurado (/api → localhost:3001)
-  App.tsx usa /api/dashboard (não mais dados mock)
-  Migração completa do PHP (index.php + monitor.php)
-  CHANGELOG.md criado para tracking
-  Scripts npm: dev (paralelo), dev:api, dev:ui, start

Dependencies:
- express, cors, mysql2, googleapis
- concurrently, tsx (dev)

Breaking: PHP backend será descontinuado
See: CHANGELOG.md, api/README.md

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-04 03:26:24 +00:00
parent 6d7280566e
commit a766f3a765
13 changed files with 935 additions and 5 deletions

40
api/server.ts Normal file
View File

@@ -0,0 +1,40 @@
/**
* Express API Server
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
*/
import express from 'express'
import cors from 'cors'
import dashboardRouter from './routes/dashboard.js'
import monitorRouter from './routes/monitor.js'
const app = express()
const PORT = process.env.API_PORT || 3001
// Middleware
app.use(cors({
origin: process.env.FRONTEND_URL || 'http://localhost:5173',
credentials: true
}))
app.use(express.json())
// Health check
app.get('/api/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() })
})
// Routes
app.use('/api/dashboard', dashboardRouter)
app.use('/api/monitor', monitorRouter)
// Error handling
app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => {
console.error('Server error:', err)
res.status(500).json({ error: 'Internal server error' })
})
// Start server
app.listen(PORT, () => {
console.log(`🚀 API Server running on http://localhost:${PORT}`)
console.log(`📊 Dashboard: http://localhost:${PORT}/api/dashboard`)
console.log(`🔍 Monitor: http://localhost:${PORT}/api/monitor`)
})