Documentazione · riferimento
La scheda app.json
Ogni app ha nella sua cartella un file app.json. Il motore lo legge a ogni avvio per sapere come trattare l'app. Dalla console del motore la modifica un Proprietario, nella scheda Configurazione dell'app.
01 /Un esempio
La scheda dell'app di esempio «Parts price list» (Listino ricambi), quella dello standard per gli agenti: un'app PocketBase con login, due ruoli e lo strumento di import. I nomi tecnici sono in inglese, come chiede lo standard; nome e descrizione sono quelli che vedono le persone.
{
"id": "parts-pricelist",
"name": "Parts price list",
"description": "Prices of the spare parts in the warehouse, updated from the supplier's Excel or CSV file.",
"kind": "pocketbase",
"access": "login",
"port": 8105,
"version": "0.1.0",
"owner": "Spare parts warehouse",
"auth": {
"collection": "users",
"roleField": "role",
"roles": ["manager", "storekeeper"],
"defaultRole": "storekeeper"
},
"tools": ["import"]
}
Un'app statica, fatta solo di pagine e aperta a tutti, ha una scheda più corta:
{
"id": "guida-officina",
"name": "Guida dell'officina",
"kind": "static",
"access": "public",
"port": 8106,
"version": "0.1.0",
"owner": "Officina"
}
02 /I campi
| Campo | Valori | Significato |
|---|---|---|
id | lettere minuscole, numeri e trattini | Identificativo stabile dell'app. Se manca, il motore usa il nome della cartella; è meglio che i due coincidano. |
name obbligatorio | testo | Il nome mostrato nel portale e nella console. |
description | testo | Una riga di spiegazione sotto il nome, nel portale. |
kind obbligatorio | static, pocketbase, pocketbase-cron | Il tipo di app. Vedi i valori di kind. |
access | public, login | public: aperta a tutti. login: entra solo chi ha un accesso. Se il campo manca vale login. |
port obbligatorio | da 1024 a 64000 | La porta pubblica dell'app, diversa da quella di ogni altra app e da quella del motore. Il motore usa anche la porta pubblica più 1000 come porta interna (8101 diventa 9101), quindi anche quella deve essere libera. Cambiarla dalla console riavvia l'app da sola. La porta è una richiesta: chi carica l'app può sceglierne un'altra se questa è occupata o chiusa dal firewall di Windows, e il motore scrive quella scelta nell'app.json installato. Dopo l'installazione la porta è di chi gestisce Pyrite: un aggiornamento dell'app non la cambia mai. |
version | per esempio 0.1.0 | La versione del codice dell'app. È informativa: chi consegna un'app la aumenta a ogni consegna. |
owner | testo | Il gruppo o la persona di riferimento. |
color | colore esadecimale, per esempio #126a61 | Il colore dell'app. Il motore lo registra, ma il portale non lo usa: il colore di una tessera si sceglie nella console, pagina «Home del portale»; se non lo scegli, le tessere prendono i colori in ordine. |
memoryLimitMB | numero intero, in MB | Limite di memoria per il processo di un'app PocketBase. Su Windows è indicativo: spinge il processo a contenersi ma non lo ferma se lo supera. Cambiarlo dalla console riavvia l'app. |
auth | oggetto | Solo per le app PocketBase con login: come il motore crea gli utenti dentro l'app e dove scrive il ruolo. Vedi la sezione auth. |
tools | elenco, per esempio ["import"] | Gli strumenti del motore che gli script dell'app possono usare, come l'import di Excel e CSV. Si attivano anche dalla console, nella scheda Configurazione dell'app (riquadro «Strumenti del motore»); l'elenco degli strumenti è nella pagina «Strumenti» della console e nello standard per gli agenti. |
toolAccess | oggetto | Quali strumenti possono usare le pagine dell'app, e chi (pages, minRole, destructiveRole, collections, maxRows, guests, recipes, snapshots, keyFields…). Di serie le pagine non possono usare nessuno strumento. |
toolJobs | { "heavy": 1 }, da 1 a 4 | Quanti lavori lunghi avviati dalle pagine girano insieme; di serie 1. |
concurrency | "strict" (di serie), "warn", "off" | La protezione dalle modifiche concorrenti: due persone che cambiano lo stesso record insieme non si sovrascrivono. Con "warn" le modifiche passano e il motore conta quelle che "strict" fermerebbe; "off" toglie la protezione. |
numbering, history, images | oggetti | Le regole degli strumenti numerazioni, storico delle modifiche e foto (per campo, collezione.campo). |
network | { "allow": ["api.example.com"] } | Gli indirizzi che gli script dell'app possono chiamare (allow: in https; allowHttp: anche in http, solo per sistemi interni). Senza network gli script non chiamano nessun indirizzo. Nella scheda «Rete in uscita» dell'app l'amministratore può metterla in modo «Avvisa»: passa tutto e il motore conta quello che bloccherebbe. |
import | oggetto, per esempio { "consoleCollections": ["suppliers", "orders"] } | Le sole raccolte in cui la scheda «Importa» della console può importare e annullare; [] = nessuna; senza, tutte. Serve a un'app che tiene i dati in ordine con le sue rotte o i suoi hook (spostamenti, storici, stati). |
03 /I valori di kind
| Valore | Cosa vuol dire |
|---|---|
static | Solo pagine, servite dal motore dalla cartella release\public. Nessuna istanza e nessun database. |
pocketbase | Un'istanza PocketBase tutta per l'app, con pagine, hook, migrazioni e dati propri. |
pocketbase-cron | Come pocketbase, con attività programmate definite negli hook. Il motore la avvia allo stesso modo; i lavori pianificati si controllano dalla pagina «Lavori pianificati» della console. «Nuova app» nella console crea solo i primi due tipi. |
04 /La sezione auth
Serve alle app PocketBase con accesso login. Quando una persona entra dal portale, il motore crea o aggiorna dentro l'app un utente con la stessa email. Alla prima entrata gli scrive il livello base; poi il ruolo si gestisce dentro l'app (e dalla console, scheda «Accessi e ruoli»). La sezione auth dice al motore dove farlo.
| Campo | Significato |
|---|---|
collection | La raccolta degli utenti dell'app. Se manca vale users. |
roleField | Il campo dell'utente che contiene il ruolo: il motore ci scrive il livello base alla prima entrata e la scheda «Accessi e ruoli» lo cambia. Senza questo campo i ruoli non si possono assegnare (non ha un valore predefinito). |
roles | I ruoli possibili, dal più al meno potente. Il ruolo non dipende dai gruppi: i gruppi decidono solo chi entra, il ruolo si gestisce dentro l'app. |
defaultRole | Il livello base: il ruolo che riceve chi entra per la prima volta. Deve essere uno dei ruoli; se manca, è il meno potente. |
extra | Campi fissi che il motore scrive sull'utente a ogni accesso. Serve di rado: le app nuove non ne hanno bisogno. |
Nell'app di esempio i ruoli sono due, manager (responsabile) e storekeeper (magazziniere), e il campo del ruolo si chiama role; chi entra la prima volta è storekeeper:
"auth": {
"collection": "users",
"roleField": "role",
"roles": ["manager", "storekeeper"],
"defaultRole": "storekeeper"
}
Il campo del ruolo lo crea una migrazione dell'app, con gli stessi valori di roles. Se in seguito si aggiunge un ruolo alla scheda, il motore lo aggiunge anche ai valori ammessi da quel campo; un ruolo tolto dalla scheda resta ammesso, così chi lo ha continua a entrare, ma la console non lo propone più.
Quando crei dalla console un'app PocketBase con login e ruoli, il motore scrive da solo la sezione auth e aggiunge il campo role agli utenti dell'app.
05 /Dove va il codice
apps\<id>\
├── app.json la scheda
├── app.json.prima la versione precedente, dopo una modifica dalla console
├── release\ il codice, sostituibile senza toccare i dati
│ ├── public\ pagine di un'app statica
│ ├── pb_public\ pagine di un'app PocketBase
│ ├── pb_hooks\ hook (JavaScript di PocketBase)
│ └── pb_migrations\ migrazioni dello schema
├── state\
│ └── pb_data\ i dati: non fanno parte del pacchetto
└── logs\ output del processo
Un'app statica ha solo app.json e release\public.
06 /Percorsi riservati del motore
Su ogni porta di app il motore risponde da sé ad alcuni percorsi. Il codice dell'app non deve usarli per altro.
| Percorso | Cosa fa |
|---|---|
/__platform/portal | Rimanda al portale. È il collegamento da usare per il pulsante «Portale» dentro le app. |
/__platform/info | Risponde in JSON con identificativo e nome dell'app e indirizzo del portale. |
/__platform/sso, /__platform/sso.js | Servono all'accesso unico. Il motore aggiunge da solo lo script alle pagine delle app PocketBase con login. |
/__platform/logout | Rimanda al portale per l'uscita. |
/_/ | Rimanda alla console del motore, alla scheda Dati dell'app, dove si gestiscono i suoi dati. |
Le chiamate da amministratore PocketBase sulle porte delle app (/api/collections/_superusers/…) vengono respinte: l'amministrazione passa dalla console del motore.
07 /Cosa controlla il motore
Il motore legge le schede all'avvio e quando un Proprietario preme «Rileggi cartelle». Una scheda non viene usata se:
- il file non è JSON valido;
- il file ha due chiavi uguali a meno delle maiuscole e delle minuscole (per esempio
portePort); kindnon è uno dei tre valori ammessi;- manca
name; portnon è compresa tra 1024 e 64000, oppure la porta pubblica o quella interna è già usata da un'altra app, dal motore o da un altro programma;defaultRolenon è uno dei ruoli.
Per una cartella nuova valgono anche i controlli di «Nuova app»: identificativo da 3 a 32 caratteri, non riservato e non già usato da un'altra app. Se access ha un valore diverso da public e login, l'app si tratta con login.
Un'app già registrata non si spegne per una scheda sbagliata: resta com'era, con l'ultima scheda buona, e il motore lo segnala. Si disattiva solo se la sua cartella non c'è più. Gli avvisi compaiono nel messaggio di «Rileggi cartelle» e nello Storico del motore. Quando crei un'app dalla console il motore controlla anche il formato dei ruoli: lettere minuscole, numeri e trattino basso.
08 /Regole per chi costruisce un'app
Le regole complete, con gli esempi di codice e la lista dei controlli prima della consegna, sono nello standard per gli agenti. In breve:
- Niente indirizzi o porte scritti nel codice. Si usano percorsi relativi e, per tornare al portale,
/__platform/portal. - Il pacchetto contiene solo codice: niente
pb_data, niente dati reali, niente account di prova. - Lo schema dei dati cambia con le migrazioni, mai cancellando
pb_data. - I dati si proteggono con le regole lato server, cioè le API rules di PocketBase. Nascondere un pulsante non protegge niente.
- Gli utenti non devono poter modificare il proprio ruolo: lo blocca il motore. Il ruolo lo cambia l'amministratore dalla console (un Proprietario o un Admin che gestisce l'app) o, se l'app lo prevede, chi ha il ruolo più alto.
- Le app con login non hanno bisogno di una pagina di registrazione né di un pulsante «Esci»: entrata e uscita passano dal portale.