rooting-future / docs /N8N_SETUP_PROMPT.md
mtornani's picture
Initial HF Spaces deployment (clean branch without large binaries)
38f9c15
|
Raw History Blame Contribute Delete
9.33 kB

Prompt per Configurare n8n con Rooting Future

Contesto Sistema

Ho già implementato l'infrastruttura lato Flask. Ecco gli endpoint disponibili:

Endpoints n8n (Webhook receivers)

POST /api/n8n/questionnaire     - Riceve questionario compilato
POST /api/n8n/generate/{id}     - Triggera generazione piano
GET  /api/n8n/status/{id}       - Polling stato questionario
POST /api/n8n/callback          - Callback generico per notifiche

Endpoints Auth

POST /api/auth/register         - Registra nuovo club + admin
POST /api/auth/login            - Login utente
POST /api/auth/refresh          - Refresh token JWT
GET  /api/auth/me               - Info utente corrente (richiede Bearer token)

Endpoints Protetti

GET  /api/club/questionnaires   - Lista questionari del club (richiede auth)
GET  /api/admin/clubs           - Lista club (solo super_admin)
GET  /api/admin/users           - Lista utenti (solo super_admin)
GET  /api/questionnaire/schema  - Schema JSON del questionario

Configurazione Sicurezza

  • Header firma webhook: X-N8N-Signature (HMAC-SHA256)
  • Secret: variabile ambiente N8N_WEBHOOK_SECRET
  • JWT Secret: variabile ambiente JWT_SECRET
  • In development mode, la firma webhook è opzionale

PROMPT PER n8n / AI

Devo configurare n8n (localhost:5678) per integrarsi con un'app Flask (localhost:5000) che genera piani strategici per club calcistici.

L'INFRASTRUTTURA FLASK È GIÀ PRONTA. Devo solo creare i workflow n8n.

## ENDPOINTS FLASK DISPONIBILI

### Ricezione Questionario
POST http://localhost:5000/api/n8n/questionnaire
Headers: Content-Type: application/json
Body:
{
    "club_name": "AC Example",
    "category": "Serie B",
    "questionnaire_data": {
        "anagrafica": {
            "nome_ufficiale": "...",
            "anno_fondazione": 1920,
            ...
        },
        "sportiva": {...},
        "infrastrutture": {...},
        "finanze": {...},
        "marketing": {...},
        "obiettivi": {...}
    }
}

Response:
{
    "success": true,
    "questionnaire_id": "abc123",
    "club_id": "xyz789",
    "status": "submitted",
    "next_step": "/api/n8n/generate/abc123"
}

### Trigger Generazione
POST http://localhost:5000/api/n8n/generate/{questionnaire_id}
Response: parametri per chiamare /api/generate

### Polling Stato
GET http://localhost:5000/api/n8n/status/{questionnaire_id}
Response: {"status": "submitted|processing|completed"}

### Schema Questionario
GET http://localhost:5000/api/questionnaire/schema
Response: JSON schema con sezioni e campi del questionario

## WORKFLOW DA CREARE

### WORKFLOW 1: Raccolta Questionario
Trigger: Webhook (n8n espone URL per form esterno)
Steps:
1. Ricevi dati da form (Google Forms, Tally, Typeform, o form custom)
2. Valida e normalizza i dati
3. Invia a Flask: POST /api/n8n/questionnaire
4. Salva questionnaire_id per tracking
5. Invia email conferma al club
6. Notifica admin (Slack/Email)

### WORKFLOW 2: Generazione Piano
Trigger: Webhook o Schedule (dopo validazione manuale)
Steps:
1. Ricevi questionnaire_id
2. Chiama POST /api/n8n/generate/{id}
3. Usa i parametri per chiamare POST /api/generate
4. Attendi completamento (polling /api/n8n/status/{id})
5. Quando completed, invia notifica al club

### WORKFLOW 3: Registrazione Nuovo Club
Trigger: Webhook per form registrazione
Steps:
1. Ricevi dati registrazione
2. POST /api/auth/register con:
   - club_name, category, colors
   - admin_email, admin_password
3. Salva tokens
4. Email benvenuto con link dashboard

### WORKFLOW 4: Notifiche Stato
Trigger: Schedule (ogni 5 minuti) o Webhook interno
Steps:
1. Loop su questionari in stato "processing"
2. Per ogni uno, GET /api/n8n/status/{id}
3. Se status cambiato, invia notifica appropriata

## NODI n8n RICHIESTI

Per ogni workflow, specifica:
1. Tipo nodo (Webhook, HTTP Request, Gmail, IF, Set, etc.)
2. Configurazione completa
3. Connessioni tra nodi
4. Gestione errori

## OUTPUT RICHIESTO

1. JSON esportabile per ogni workflow (Import in n8n)
2. Istruzioni configurazione credenziali Gmail/Slack
3. Variabili ambiente da settare
4. Test cases per verificare funzionamento

Schema Questionario (per Form Builder)

Disponibile su: GET /api/questionnaire/schema

{
    "version": "1.0",
    "sections": [
        {
            "id": "anagrafica",
            "title": "Anagrafica Club",
            "fields": [
                {"id": "nome_ufficiale", "label": "Nome Ufficiale", "type": "text", "required": true},
                {"id": "anno_fondazione", "label": "Anno Fondazione", "type": "number"},
                {"id": "categoria", "label": "Categoria", "type": "select", "options": ["Serie A", "Serie B", "Serie C", "Serie D", "Eccellenza", "Promozione"]},
                {"id": "regione", "label": "Regione", "type": "text"},
                {"id": "citta", "label": "Città", "type": "text"},
                {"id": "colori_sociali", "label": "Colori Sociali", "type": "text"}
            ]
        },
        {
            "id": "sportiva",
            "title": "Area Sportiva",
            "fields": [
                {"id": "dimensione_rosa", "label": "Dimensione Rosa Prima Squadra", "type": "number"},
                {"id": "eta_media", "label": "Età Media Rosa", "type": "number"},
                {"id": "settore_giovanile", "label": "Settore Giovanile Attivo", "type": "boolean"},
                {"id": "categorie_giovanili", "label": "Categorie Giovanili", "type": "text"},
                {"id": "staff_tecnico", "label": "Numero Staff Tecnico", "type": "number"}
            ]
        },
        {
            "id": "infrastrutture",
            "title": "Infrastrutture",
            "fields": [
                {"id": "nome_stadio", "label": "Nome Stadio", "type": "text"},
                {"id": "capienza_stadio", "label": "Capienza Stadio", "type": "number"},
                {"id": "proprieta_stadio", "label": "Proprietà", "type": "select", "options": ["Proprietà", "Concessione", "Affitto"]},
                {"id": "centro_sportivo", "label": "Centro Sportivo Dedicato", "type": "boolean"},
                {"id": "numero_campi", "label": "Numero Campi Allenamento", "type": "number"}
            ]
        },
        {
            "id": "finanze",
            "title": "Dati Finanziari",
            "fields": [
                {"id": "fatturato_annuo", "label": "Fatturato Annuo (€)", "type": "number"},
                {"id": "monte_ingaggi", "label": "Monte Ingaggi (€)", "type": "number"},
                {"id": "debiti", "label": "Debiti Totali (€)", "type": "number"},
                {"id": "sponsor_principale", "label": "Sponsor Principale", "type": "text"},
                {"id": "ricavi_stadio", "label": "Ricavi da Stadio (€)", "type": "number"}
            ]
        },
        {
            "id": "marketing",
            "title": "Marketing e Tifoseria",
            "fields": [
                {"id": "abbonati", "label": "Numero Abbonati", "type": "number"},
                {"id": "media_spettatori", "label": "Media Spettatori Casa", "type": "number"},
                {"id": "follower_social", "label": "Follower Social Totali", "type": "number"},
                {"id": "merchandising", "label": "Ricavi Merchandising (€)", "type": "number"}
            ]
        },
        {
            "id": "obiettivi",
            "title": "Obiettivi Strategici",
            "fields": [
                {"id": "obiettivo_sportivo_1y", "label": "Obiettivo Sportivo Anno 1", "type": "text"},
                {"id": "obiettivo_sportivo_3y", "label": "Obiettivo Sportivo Anno 3", "type": "text"},
                {"id": "priorita_investimento", "label": "Priorità Investimento", "type": "select", "options": ["Stadio", "Settore Giovanile", "Prima Squadra", "Marketing", "Infrastrutture"]},
                {"id": "sfide_principali", "label": "Sfide Principali", "type": "textarea"}
            ]
        }
    ]
}

Test Manuale Endpoints

# Test schema questionario
curl http://localhost:5000/api/questionnaire/schema

# Test invio questionario
curl -X POST http://localhost:5000/api/n8n/questionnaire \
  -H "Content-Type: application/json" \
  -d '{
    "club_name": "Test FC",
    "category": "Serie D",
    "questionnaire_data": {
        "anagrafica": {"nome_ufficiale": "Test FC", "citta": "Roma"},
        "sportiva": {"dimensione_rosa": 25},
        "infrastrutture": {"capienza_stadio": 5000},
        "finanze": {"fatturato_annuo": 500000},
        "marketing": {"abbonati": 1000},
        "obiettivi": {"obiettivo_sportivo_1y": "Playoff"}
    }
}'

# Test registrazione
curl -X POST http://localhost:5000/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "club_name": "Test FC",
    "category": "Serie D",
    "admin_email": "admin@testfc.com",
    "admin_password": "password123"
}'

# Test login
curl -X POST http://localhost:5000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "admin@testfc.com",
    "password": "password123"
}'

Prossimi Step

  1. Apri n8n: http://localhost:5678
  2. Crea nuovo workflow
  3. Usa il prompt sopra per far generare i workflow da AI
  4. Importa i JSON generati
  5. Configura credenziali (Gmail, Slack se necessario)
  6. Testa con curl o form di prova