Benvenuto nella documentazione dell'API di InCrowd, una piattaforma innovativa di crowdsourcing per proposte e iniziative cittadine.
L'API InCrowd fornisce accesso completo alla piattaforma per:
Funzionalità principali:
L'API utilizza autenticazione JWT
POST /api/auth/login o POST /api/auth/googleAuthorization: Bearer <your-jwt-token>
Il JWT contiene i seguenti claim:
userId: ID univoco dell'utente nel databaseemail: Email dell'utente per identificazioneuserType: Tipo utente (privato, ente, operatore, admin)Parametrizzazione: La sicurezza è parametrizzabile tramite variabile di ambiente ENABLE_SECURITY_CONTROLS
Requisiti minimi per le password sono:
Tutte le risposte seguono il formato standardizzato:
{
"data": {
// Dati della risposta (opzionale)
},
"message": "Messaggio descrittivo specifico",
"error": {
// Dettagli errore (solo presente in caso di errore)
}
}
Gli amministratori hanno accesso esclusivo alla gestione degli account operatori:
/api/operatori)IMPORTANTE: Gli admin sono limitati alla gestione degli account operatori e non hanno accesso alle funzionalità di moderazione. Questo è un design di sicurezza intenzionale.
Gli operatori gestiscono la moderazione e la gestione utenti:
/api/proposte/pending)/api/proposte/commenti)/api/user)IMPORTANTE: Solo gli operatori possono moderare proposte e vedere commenti globali. Gli admin non hanno accesso a queste funzionalità per mantenere la separazione dei ruoli.
Gli utenti normali gestiscono solo i propri contenuti:
L'API espone un modello utente unico con user_type che può essere:
"privato": Cittadino privato"ente": Ente/organizzazioneArchitettura Backend:
Privato e Ente)user_typeCredenziali condivisoL'API fornisce diversi schemi utente in base al contesto d'uso:
| Schema | Utilizzo | Dati Inclusi | Accesso |
|---|---|---|---|
UserBase |
Schema base comune | Dati pubblici essenziali | Tutti |
UserSearchResult |
Ricerche e profili pubblici | Dati base + email condizionale | Pubblico/Operatori |
UserComplete |
Profilo personale | Dati completi + credenziali sicure | Solo proprietario |
UserForOperators |
Gestione amministrativa | Dati completi + sensibili | Solo operatori |
UserFollowInfo |
Liste follow | Dati base senza contatori | Pubblico |
Sicurezza dei Dati:
Il modello Credenziali gestisce l'autenticazione per tutti i tipi di utente:
Intercambiabilità: Password e OAuth sono intercambiabili:
La visibilità dei dati utente varia in base al ruolo dell'utente che fa la richiesta:
| Campo | Pubblico | Autenticato | Operatore |
|---|---|---|---|
nome, biografia, fotoProfilo, createdAt |
✅ Sempre | ✅ Sempre | ✅ Sempre |
cognome (privati) |
✅ Sempre | ✅ Sempre | ✅ Sempre |
nome_org (enti) |
✅ Sempre | ✅ Sempre | ✅ Sempre |
email |
❌ Mai | ❌ Mai | ✅ Sempre |
codiceFiscale |
❌ Mai | ❌ Mai | ✅ Sempre |
Esempi di utilizzo:
/api/user/search, /api/user/{id}): Dati base senza email/codice fiscale/api/user/me): Dati completi con credenziali sicure/api/user): Dati completi con email e codice fiscaleNota: I limiti sono applicati separatamente per profilo e proposte, ma entrambi sono 5MB.
Messaggio di benvenuto dell'API con controlli di sicurezza configurabili.
Controlli Configurabili:
ENABLE_SECURITY_CONTROLS: Abilita/disabilita controlli password (default: true)JWT_SECRET: Chiave segreta per firma JWT (obbligatoria)ADMIN_EMAIL e ADMIN_PASSWORD: Credenziali admin specialiFunzionalità:
{- "message": "Benvenuti nelle API di InCrowd"
}Autentica un utente e restituisce JWT token
| email required | string <email> |
| password required | string |
{- "password": "Password123!"
}{- "data": {
- "token": "eyJhbGciOiJIUzI1NiIs...",
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U",
- "updatedAt": "2024-01-20T15:45:00.000Z"
}
}, - "message": "Login completato con successo"
}Autentica un utente tramite Google OAuth e restituisce JWT token.
Flusso:
idToken da Google Sign-InidToken a questo endpointneedsRegistration: trueCasi d'uso:
| idToken required | string ID token ottenuto da Google Sign-In |
{- "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFiYzFm..."
}{- "data": {
- "token": "eyJhbGciOiJIUzI1NiIs...",
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U",
- "updatedAt": "2024-01-20T15:45:00.000Z"
}
}, - "message": "Login Google completato con successo"
}Collega un account Google esistente all'utente autenticato.
Requisiti:
Flusso:
idToken da GoogleidToken a questo endpoint| idToken required | string ID token ottenuto da Google Sign-In |
{- "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFiYzFm..."
}{- "message": "Account Google collegato con successo"
}Imposta la password per utenti (privati ed enti) che non ne hanno una.
IMPORTANTE: Questo endpoint NON permette di cambiare una password esistente. È utilizzato solo per impostare una password per utenti che si sono registrati tramite Google OAuth e non hanno ancora impostato una password tradizionale.
Requisiti:
Casi d'uso:
| newPassword required | string Nuova password da impostare. Deve rispettare i requisiti di sicurezza |
{- "newPassword": "NewPassword456!"
}{- "data": {
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U",
- "updatedAt": "2024-01-20T15:45:00.000Z"
}
}, - "message": "Password impostata con successo"
}Recupera tutti gli utenti (solo per operatori).
Accesso: Solo operatori autenticati (NO admin) Dati inclusi: Nome, biografia, foto profilo, email, codice fiscale Sicurezza: Include dati sensibili non visibili agli utenti pubblici Utilizzo: Per gestione amministrativa e moderazione
IMPORTANTE: Gli admin non possono accedere a questo endpoint per vedere i dati utente. Gli admin possono solo gestire gli account operatori. Questa è una limitazione di sicurezza intenzionale per mantenere la separazione dei ruoli.
Per vedere i dati utente come admin:
/api/operatori{- "data": {
- "users": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U"
}
], - "total": 150
}, - "message": "Utenti recuperati con successo"
}Crea un nuovo utente (privato o ente) con validazione dei dati.
Campi obbligatori per tutti:
Campi specifici per privati:
| user_type required | string Enum: "privato" "ente" |
| nome required | string Nome visualizzato, può essere il nome di una persona o un'organizzazione |
| cognome | string Obbligatorio per user_type='privato' |
| codiceFiscale required | string |
| biografia | string |
| email required | string <email> |
| password required | string Deve rispettare i requisiti di sicurezza |
| fotoProfilo | string <binary> Immagine profilo (max 5MB) |
{- "data": {
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "email": "[email protected]"
}
}, - "message": "Utente creato con successo"
}Recupera il profilo completo dell'utente autenticato
{- "data": {
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U",
- "updatedAt": "2024-01-20T15:45:00.000Z"
}
}, - "message": "Profilo recuperato con successo"
}Aggiorna il profilo dell'utente autenticato
| nome | string Nome visualizzato, può essere il nome di una persona o un'organizzazione |
| cognome | string Solo per utenti privati |
| biografia | string |
| fotoProfilo | string <binary> Nuova immagine profilo (max 5MB) |
{- "data": {
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "codiceFiscale": "RSSMRA80A01H501U",
- "updatedAt": "2024-01-20T15:45:00.000Z"
}
}, - "message": "Profilo aggiornato con successo"
}Cerca utenti per nome, cognome o biografia.
Sicurezza:
Esempi di ricerca:
?q=Mario - Cerca "Mario" in tutti i campi?q=Comune&user_type=ente - Cerca "Comune" solo negli enti?q=sviluppatore - Cerca "sviluppatore" in tutti i campi| q required | string >= 2 characters Example: q=Mario Query di ricerca (minimo 2 caratteri) |
| user_type | string Enum: "privato" "ente" Example: user_type=privato Filtra per tipo utente |
{- "data": {
- "users": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "cognome": "Rossi",
- "biografia": "Sviluppatore",
- "email": "[email protected]"
}, - {
- "_id": "64a1b2c3d4e5f678901235",
- "user_type": "ente",
- "nome": "Comune di Trento",
- "biografia": "Amministrazione comunale",
- "email": "[email protected]"
}
], - "total": 2
}, - "message": "Ricerca completata"
}Recupera i dettagli di un utente specifico.
Sicurezza:
Esempi di risposta per diversi tipi:
| id required | string Example: 64a1b2c3d4e5f678901234 |
Nota: email è visibile solo agli operatori
{- "data": {
- "user": {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "cognome": "Rossi",
- "biografia": "Sviluppatore software",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z"
}
}, - "message": "Utente recuperato con successo"
}Recupera tutte le proposte approvate pubblicamente.
Filtri applicati:
Campi inclusi:
{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 50
}, - "message": "Proposte recuperate con successo"
}Crea una nuova proposta con upload immagine opzionale.
Accesso: Solo utenti autenticati (privati ed enti) Upload: Immagine opzionale (max 5MB, formati: JPEG, PNG, GIF, WebP) Stato iniziale: "bozza" (richiede approvazione operatore) Validazioni: Titolo e descrizione obbligatori
| titolo required | string Titolo della proposta |
| descrizione required | string Descrizione dettagliata |
| categoria required | string Enum: "cultura" "concerti" "mostreInstallazioni" "sport" "workshopCorsi" "conferenze" Categoria della proposta (obbligatoria) |
object | |
| dataIpotetica | string <date-time> Data ipotetica di realizzazione |
| foto | string <binary> Immagine della proposta (max 5MB, JPEG/PNG/GIF/WebP) |
{- "data": {
- "proposta": {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
}, - "message": "Proposta creata con successo"
}Recupera tutti i commenti da tutte le proposte (solo operatori).
Accesso: Solo operatori autenticati (NO admin) Ordinamento: Per data commento (più recenti prima) Dati inclusi: Proposta (titolo, ID) e utente (nome, cognome)
IMPORTANTE: Gli admin non possono accedere a questo endpoint per vedere commenti globali. Gli admin possono solo gestire gli account operatori. Questa è una limitazione di sicurezza intenzionale per mantenere la separazione dei ruoli.
Per vedere commenti globali come admin:
/api/operatori{- "data": {
- "commenti": [
- {
- "_id": "string",
- "contenuto": "string",
- "dataOra": "2019-08-24T14:15:22Z",
- "proposta": {
- "_id": "string",
- "titolo": "string"
}, - "utente": {
- "_id": "string",
- "nome": "string",
- "cognome": "string"
}
}
]
}, - "message": "Tutti i commenti"
}Recupera tutte le proposte dell'utente autenticato.
Accesso: Solo utenti autenticati (privati ed enti) Filtri: Tutti gli stati (bozza, pubblicata, in_corso, completata, respinta) Ordinamento: Per data di creazione (più recenti prima)
{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 15
}, - "message": "Proposte utente recuperate"
}Recupera le proposte approvate degli utenti seguiti dall'utente corrente.
Accesso: Solo utenti autenticati Filtri: Solo proposte approvate Ordinamento: Per data di creazione (più recenti prima) Limitazioni: Solo proposte di utenti attualmente seguiti
{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 25
}, - "message": "Proposte utenti seguiti recuperate"
}Cerca proposte per testo, categoria, città o stato.
Parametri di ricerca:
q: Testo libero (titolo, descrizione)categoria: Filtra per categoria specificacitta: Filtra per cittàstato: Filtra per stato (bozza, pubblicata, in_corso, completata, respinta)sortBy: Ordinamento (createdAt, listaHyper, titolo)sortOrder: Direzione ordinamento (asc, desc)Accesso: Pubblico senza autenticazione Filtri: Solo proposte approvate
| q | string Example: q=parco Testo di ricerca libera |
| categoria | string Example: categoria=Ambiente Categoria specifica |
| citta | string Example: citta=Gardolo Città specifica |
| stato | string Enum: "bozza" "pubblicata" "in_corso" "completata" "respinta" Example: stato=pubblicata Stato della proposta |
| sortBy | string Enum: "createdAt" "listaHyper" "titolo" Example: sortBy=createdAt Campo per ordinamento |
| sortOrder | string Enum: "asc" "desc" Example: sortOrder=desc Direzione ordinamento |
{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 12
}, - "message": "Ricerca completata"
}Recupera le proposte approvate di un utente specifico.
Accesso: Pubblico senza autenticazione Filtri: Solo proposte approvate Ordinamento: Per data di creazione (più recenti prima) Utente: Può essere privato o ente (identificato automaticamente)
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente (privato o ente) |
{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 8
}, - "message": "Proposte utente recuperate"
}Recupera le proposte in attesa di approvazione (solo operatori).
Accesso: Solo operatori autenticati (NO admin) Stato: Solo proposte con stato "bozza" Ordinamento: Per data di creazione (più recenti prima) Utilizzo: Per moderazione e revisione proposte
IMPORTANTE: Gli admin non possono accedere a questo endpoint per moderare proposte. Gli admin possono solo gestire gli account operatori. Questa è una limitazione di sicurezza intenzionale per mantenere la separazione dei ruoli.
Per moderare proposte come admin:
/api/operatori{- "data": {
- "proposte": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
], - "total": 5
}, - "message": "Proposte in attesa recuperate"
}Recupera i dettagli completi di una proposta specifica.
Accesso: Pubblico senza autenticazione O proprietario autenticato Dati inclusi: Tutti i campi della proposta, proponente, commenti Stato: Solo proposte approvate sono visibili pubblicamente Sicurezza: Il proprietario può vedere le proprie proposte indipendentemente dallo stato (in_approvazione, rifiutata, etc.)
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
{- "data": {
- "proposta": {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
}, - "message": "Proposta recuperata con successo"
}Elimina una proposta e tutti i suoi commenti.
Accesso: Solo il proponente, operatori o admin Validazioni: Proposta deve esistere e appartenere all'utente Sicurezza: Solo il proprietario può eliminare le proprie proposte
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
{- "message": "Proposta eliminata con successo"
}Aggiunge o rimuove l'utente corrente dalla lista hype della proposta.
Accesso: Solo utenti autenticati (privati ed enti) Funzionamento: Se l'utente è già nella lista, viene rimosso; altrimenti viene aggiunto Risultato: Lista hype aggiornata (il contatore è calcolato lato frontend)
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
{- "data": {
- "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "message": "Hype aggiornato"
}
}Recupera tutti i commenti di una proposta specifica.
Accesso: Pubblico senza autenticazione Ordinamento: Per data commento (più recenti prima) Dati inclusi: Contenuto, data, utente (nome, cognome)
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
{- "data": {
- "commenti": [
- {
- "_id": "string",
- "contenuto": "string",
- "dataOra": "2019-08-24T14:15:22Z",
- "utente": {
- "_id": "string",
- "nome": "string",
- "cognome": "string"
}
}
], - "total": 8
}, - "message": "Commenti recuperati"
}Aggiunge un nuovo commento a una proposta.
Accesso: Solo utenti autenticati (privati ed enti) Validazioni: Contenuto obbligatorio e non vuoto Stato: Solo proposte approvate possono ricevere commenti
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
| contenuto required | string Testo del commento |
{- "contenuto": "Ottima idea! Sostengo questa proposta"
}{- "data": {
- "commento": {
- "_id": "string",
- "contenuto": "string",
- "dataOra": "2019-08-24T14:15:22Z"
}
}, - "message": "Commento aggiunto con successo"
}Aggiorna lo stato di una proposta (moderazione).
Accesso: Solo operatori e admin Stati possibili: bozza, pubblicata, in_corso, completata, respinta Commento: Opzionale per spiegare il cambio di stato
| id required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
| stato required | string Enum: "bozza" "pubblicata" "in_corso" "completata" "respinta" Nuovo stato della proposta |
| commento | string Commento opzionale per il cambio di stato |
{- "stato": "pubblicata",
- "commento": "Proposta approvata e pubblicata"
}{- "data": {
- "proposta": {
- "_id": "64a1b2c3d4e5f678901234",
- "titolo": "Corso di cucina molecolare",
- "descrizione": "Proposta per la creazione di un corso di cucina molecolare",
- "proponenteID": "64a1b2c3d4e5f678901235",
- "categoria": "Corsi e workshop",
- "foto": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "listaHyper": [
- "64a1b2c3d4e5f678901236",
- "64a1b2c3d4e5f678901237"
], - "stato": "approvata",
- "luogo": {
- "via": "Via Belenzani, 1",
- "citta": "Trento",
- "cap": "38121",
- "provincia": "TN"
}, - "dataIpotetica": "2024-06-15T10:00:00.000Z",
- "createdAt": "2024-01-15T10:30:00.000Z"
}
}, - "message": "Stato proposta aggiornato"
}Elimina un commento specifico da una proposta.
Accesso: Solo il creatore del commento o operatori/admin Validazioni: Commento deve esistere e appartenere alla proposta Sicurezza: Solo il proprietario può eliminare i propri commenti
| propostaId required | string Example: 64a1b2c3d4e5f678901234 ID della proposta |
| commentoId required | string Example: 64a1b2c3d4e5f678901235 ID del commento |
{- "message": "Commento eliminato con successo"
}Segue un utente specifico (privato o ente).
Accesso: Solo utenti autenticati (privati ed enti) Validazioni: Utente da seguire deve esistere e non essere già seguito Risultato: Relazione di follow creata (il contatore è calcolato lato frontend)
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente da seguire |
{- "message": "Utente seguito con successo"
}Smette di seguire un utente specifico.
Accesso: Solo utenti autenticati Validazioni: Relazione di follow deve esistere Risultato: Relazione di follow rimossa (il contatore è calcolato lato frontend)
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente da smettere di seguire |
{- "message": "Follow rimosso con successo"
}Recupera la lista dei follower di un utente specifico.
Accesso: Pubblico senza autenticazione Dati inclusi: ID e dati base degli utenti follower Ordinamento: Per data di follow (più recenti prima) Nota: I contatori followersCount e followingCount sono calcolati lato frontend tramite array.length
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente |
{- "data": {
- "followers": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "userType": "privato"
}
], - "total": 15
}, - "message": "Followers recuperati"
}Recupera la lista degli utenti seguiti da un utente specifico.
Accesso: Pubblico senza autenticazione Dati inclusi: ID e dati base degli utenti seguiti Ordinamento: Per data di follow (più recenti prima) Nota: I contatori followersCount e followingCount sono calcolati lato frontend tramite array.length
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente |
{- "data": {
- "following": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "user_type": "privato",
- "nome": "Mario",
- "biografia": "Descrizione del profilo",
- "fotoProfilo": {
- "data": "iVBORw0KGgoAAAANSUhEUgAA...",
- "contentType": "image/jpeg"
}, - "createdAt": "2024-01-15T10:30:00.000Z",
- "cognome": "Rossi",
- "userType": "privato"
}
], - "total": 8
}, - "message": "Following recuperati"
}Verifica se l'utente corrente segue un utente specifico.
Accesso: Solo utenti autenticati Risultato: Boolean che indica se l'utente è seguito Utilizzo: Per mostrare stato pulsante follow/unfollow Nota: I contatori followersCount e followingCount sono calcolati lato frontend tramite array.length
| userId required | string Example: 64a1b2c3d4e5f678901234 ID dell'utente da verificare |
{- "data": {
- "isFollowing": true
}, - "message": "Status follow verificato"
}{- "data": {
- "operatori": [
- {
- "_id": "64a1b2c3d4e5f678901234",
- "nome": "Luigi",
- "cognome": "Verdi",
- "createdAt": "2024-01-10T09:20:00.000Z"
}
]
}, - "message": "Operatori recuperati con successo"
}Crea un nuovo operatore (solo admin)
| nome required | string |
| email required | string <email> |
| password required | string |
{- "nome": "Luigi",
- "password": "OperatorePass123!"
}{- "data": {
- "operatore": {
- "_id": "64a1b2c3d4e5f678901234",
- "nome": "Luigi",
- "cognome": "Verdi",
- "createdAt": "2024-01-10T09:20:00.000Z"
}
}, - "message": "Operatore creato con successo"
}