# Specifiche per realizzazione almanacco digitale degli eventi
## Riepilogo
La proposta verte sulla realizzazione di una piattaforma in grado di organizzare in modo facilmente fruibile gli eventi realizzati in città.
Gli eventi potranno essere descritti da coordinate geografiche e temporali e da eventuali link esterni.
## Descrizione delle funzionalità
* Gli eventi saranno descritti dalle seguenti informazioni
* Nome
* Tipologia
* Artista o organizzatore o responsabile (singolo o multiplo)
* Luogo (singolo o multiplo)
* Data (singola o multipla)
* Orario (singolo o multiplo)
* Descrizione
* Link di informazioni
* Link di prenotazione
* Tag (singolo o multiplo)
* I dati degli eventi potranno essere immagazzinati in un database OpenData per favorirne l'utilizzo da parte di altre iniziative.
La piattaforma Yucca potrebbe essere il backend ottimale.
* Gli eventi potranno essere inseriti da organizzatori accreditati.
L'accreditamento dovrà essere legato ad un metodo di identificazione del facente richiesta, per esempio tramite SPID/CIE.
* L'inserimento degli eventi potrà essere moderato da alcuni amministratori.
Gli eventi non ancora moderati potranno essere inseriti in un database collaterale in attesa di moderazione.
* La fruizione degli eventi dovrà avvenire tramite una webapp client-side.
L'applicazione dovrà essere eseguita localmente sui device degli utenti.
Le informazioni necessarie alla webapp (immagazzinate localmente sul suo device e non condivise in uscita) sono:
* Coordinate di geolocalizzazione del device (GPS o altro in background)
* Orario del giorno e data
* Tag sottoscritti dall'utente
* Dati personali per semplificare la prenotazione di biglietti e posti
La webapp utilizzerà tali informazioni internamente per filtrare l'elenco degli eventi scaricati dal database pubblico al fine di offrire all'utente:
* Un elenco di tutti gli eventi
* Un elenco degli eventi pertinenti ai tag sottoscritti
* Notifiche riguardanti gli eventi in procinto di iniziare nei dintorni (triangolazione con coordinate e ora)
Gli elenchi degli eventi (quello globale e quello basato sui tag) potranno essere visualizzati in due modalità distinte:
* **Modalità geografica:** una mappa Open Street Map o similare con indicatori ciccabili degli eventi.
* **Modalità cronologica:** un calendario per data ed orario con brevi descrizioni, a scorrimento continuo verticale.
## Specifiche tecniche e schemi
### Diagramma di relazione
```mermaid
erDiagram
Database_buffer ||--o{ Evento : contiene
Organizzatori }o--|| Database_buffer : popolano
Moderatori }o--|| Database_buffer : leggono
Moderatori }o--|| Database_pubblico : popolano
Database_pubblico ||--o{ Evento : contiene
Utente ||--|| Webapp : configura
Webapp }o--|| Database_pubblico : legge
Webapp ||--|| Mappa : genera
Webapp ||--|| Calendario : genera
Webapp ||--o{ Notifica : invia
```
### Diagramma di sequenza
```mermaid
sequenceDiagram
Organizzatore->>Database buffer: inserimento nuovo evento
Database buffer->>Moderatore: moderazione nuovi eventi
alt accettato
Moderatore->>Database pubblico: pubblicazione evento
end
Database pubblico->>Webapp: lettura del database
loop
Webapp->>Elenco eventi: creazione
activate Elenco eventi
Webapp->>Elenco eventi filtrati: creazione
activate Elenco eventi filtrati
end
alt app aperta
par
activate Mappa
Elenco eventi->>Mappa: rendering
Elenco eventi filtrati->>Mappa: rendering
and
activate Calendario
Elenco eventi->>Calendario: rendering
Elenco eventi filtrati->>Calendario: rendering
end
end
Webapp->>Notifiche: generazione e invio
Notifiche->>Utente: ricezione
Mappa->>Utente: consultazione
Calendario->>Utente: consultazione
deactivate Elenco eventi
deactivate Elenco eventi filtrati
deactivate Mappa
deactivate Calendario
```
### Diagramma delle classi
```mermaid
classDiagram
class Evento {
string name
string type
List~string~ organisers
List~string~ places
List~date_type~ dates
string description
string info_url
string book_url
List~string~ tags
uint ID
}
class Webapp {
coord_type current_location
date_type current_date
int location_range
date_interval date_range
List~string~ subscribed_tags
List~uint~ fav_IDs
}
```