Pyrite ENMenu Scarica l'alpha
Indice della documentazione

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

CampoValoriSignificato
idlettere minuscole, numeri e trattiniIdentificativo stabile dell'app. Se manca, il motore usa il nome della cartella; è meglio che i due coincidano.
name obbligatoriotestoIl nome mostrato nel portale e nella console.
descriptiontestoUna riga di spiegazione sotto il nome, nel portale.
kind obbligatoriostatic, pocketbase, pocketbase-cronIl tipo di app. Vedi i valori di kind.
accesspublic, loginpublic: aperta a tutti. login: entra solo chi ha un accesso. Se il campo manca vale login.
port obbligatorioda 1024 a 64000La 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.
versionper esempio 0.1.0La versione del codice dell'app. È informativa: chi consegna un'app la aumenta a ogni consegna.
ownertestoIl gruppo o la persona di riferimento.
colorcolore esadecimale, per esempio #126a61Il 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.
memoryLimitMBnumero intero, in MBLimite 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.
authoggettoSolo per le app PocketBase con login: come il motore crea gli utenti dentro l'app e dove scrive il ruolo. Vedi la sezione auth.
toolselenco, 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.
toolAccessoggettoQuali 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 4Quanti 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, imagesoggettiLe 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.
importoggetto, 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

ValoreCosa vuol dire
staticSolo pagine, servite dal motore dalla cartella release\public. Nessuna istanza e nessun database.
pocketbaseUn'istanza PocketBase tutta per l'app, con pagine, hook, migrazioni e dati propri.
pocketbase-cronCome 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.

CampoSignificato
collectionLa raccolta degli utenti dell'app. Se manca vale users.
roleFieldIl 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).
rolesI 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.
defaultRoleIl livello base: il ruolo che riceve chi entra per la prima volta. Deve essere uno dei ruoli; se manca, è il meno potente.
extraCampi 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.

PercorsoCosa fa
/__platform/portalRimanda al portale. È il collegamento da usare per il pulsante «Portale» dentro le app.
/__platform/infoRisponde in JSON con identificativo e nome dell'app e indirizzo del portale.
/__platform/sso, /__platform/sso.jsServono all'accesso unico. Il motore aggiunge da solo lo script alle pagine delle app PocketBase con login.
/__platform/logoutRimanda 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:

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: