panorama.yaml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. # yaml-language-server: $schema=https://schemas.sourcemeta.com/openapi/v3.1/schema/2025-09-15.json
  2. openapi: 3.1.0
  3. info:
  4. title: Edison Next Panorama - Integration API
  5. description: |-
  6. API standard di integrazione di *Edison Next Panorama* con sistemi esterni
  7. contact:
  8. name: API Support
  9. email: support@panorama.edisonnext.it
  10. version: 0.9.4
  11. license:
  12. name: © 2025 - 2030 Copyright Edison Next Spa. All rights reserved
  13. url: https://edisonnext.it
  14. externalDocs:
  15. description: Edison Next Panorama - Specifiche di Integrazione v.1.0
  16. url: https://panorama.edisonnext.it/
  17. # security di default (richiesta anche per accedere ai dati in lettura)
  18. security:
  19. - panorama_consumer_api_key: []
  20. #servers:
  21. # - url: https://panorama.edisonnext.it/api/v1
  22. # description: Main (production) API server
  23. # - url: <Here staging API server>
  24. # description: Staging API server
  25. # - url: <Here development API server>
  26. # description: Development API server
  27. tags:
  28. - name: Data Source
  29. description: operations for data sources
  30. - name: Type
  31. description: operations for data types
  32. - name: Entity
  33. description: operations to browse and manage entities
  34. - name: Device
  35. description: Operations about Devices
  36. paths:
  37. /type:
  38. get:
  39. summary: Restituisce i Tipi di Entità definiti
  40. tags: [Type]
  41. operationId: getTypes
  42. responses:
  43. '200':
  44. description: successful operation
  45. content:
  46. application/json:
  47. schema:
  48. type: array
  49. items:
  50. $ref: '#/components/schemas/Type'
  51. post:
  52. summary: Crea un nuovo Tipo di Entità (admin only)
  53. tags: [Type]
  54. security:
  55. - panorama_administrator_api_key: []
  56. requestBody:
  57. required: true
  58. content:
  59. application/json:
  60. schema:
  61. $ref: '#/components/schemas/Type'
  62. responses:
  63. '201':
  64. description: Tipo creato
  65. '422':
  66. description: Tipo non valido
  67. /type/{id}:
  68. get:
  69. summary: Restituisce un singolo Tipo di Entità
  70. operationId: getType
  71. tags: [Type]
  72. parameters:
  73. - in: path
  74. name: id
  75. required: true
  76. schema:
  77. type: string
  78. responses:
  79. '200':
  80. description: Tipo trovato
  81. content:
  82. application/json:
  83. schema:
  84. $ref: '#/components/schemas/Type'
  85. '404':
  86. description: Tipo non trovato
  87. put:
  88. summary: Modifica un Tipo esistente (admin only)
  89. tags: [Type]
  90. security:
  91. - panorama_administrator_api_key: []
  92. parameters:
  93. - in: path
  94. name: id
  95. required: true
  96. schema:
  97. type: string
  98. requestBody:
  99. required: true
  100. content:
  101. application/json:
  102. schema:
  103. $ref: '#/components/schemas/Type'
  104. responses:
  105. '200':
  106. description: Tipo aggiornato
  107. '404':
  108. description: Tipo non trovato
  109. '422':
  110. description: Tipo non valido
  111. delete:
  112. summary: Elimina un Tipo (senza istanze di elementi) esistente (admin only)
  113. tags: [Type]
  114. security:
  115. - panorama_administrator_api_key: []
  116. parameters:
  117. - in: path
  118. name: id
  119. required: true
  120. schema:
  121. type: string
  122. responses:
  123. '204':
  124. description: Tipo eliminato
  125. '404':
  126. description: Tipo non trovato
  127. /source:
  128. get:
  129. summary: Restituisce le fonti dati disponibili
  130. tags: [Data Source]
  131. responses:
  132. '200':
  133. description: successful operation
  134. content:
  135. application/json:
  136. schema:
  137. type: array
  138. items:
  139. $ref: '#/components/schemas/Source'
  140. post:
  141. summary: Aggiunge una Fonte Dati (admin only)
  142. tags: [Data Source]
  143. security:
  144. - panorama_administrator_api_key: []
  145. requestBody:
  146. required: true
  147. content:
  148. application/json:
  149. schema:
  150. $ref: '#/components/schemas/Source'
  151. responses:
  152. '201':
  153. description: Fonte Dati creata
  154. '422':
  155. description: Fonte Dati non valida
  156. /source/{id}:
  157. put:
  158. summary: Modifica una sorgente dati esistente (admin only)
  159. tags: [Data Source]
  160. security:
  161. - panorama_administrator_api_key: []
  162. parameters:
  163. - in: path
  164. name: id
  165. required: true
  166. schema:
  167. type: string
  168. requestBody:
  169. required: true
  170. content:
  171. application/json:
  172. schema:
  173. $ref: '#/components/schemas/Source'
  174. responses:
  175. '200':
  176. description: Data Source aggiornata
  177. '404':
  178. description: Data Source non trovata
  179. '422':
  180. description: Data Source non valida
  181. delete:
  182. summary: Elimina una sorgente dati (vuota) esistente (admin only)
  183. tags: [Data Source]
  184. security:
  185. - panorama_administrator_api_key: []
  186. parameters:
  187. - in: path
  188. name: id
  189. required: true
  190. schema:
  191. type: string
  192. responses:
  193. '204':
  194. description: Sorgente Dati eliminata
  195. /terminology:
  196. get:
  197. summary: Restituisce le Nomenclature definite
  198. tags: [Type]
  199. operationId: getTerminologies
  200. responses:
  201. '200':
  202. description: successful operation
  203. content:
  204. application/json:
  205. schema:
  206. type: array
  207. items:
  208. $ref: '#/components/schemas/Terminology'
  209. post:
  210. summary: Crea una nuova Nomenclatura (admin only)
  211. tags: [Type]
  212. security:
  213. - panorama_administrator_api_key: []
  214. requestBody:
  215. required: true
  216. content:
  217. application/json:
  218. schema:
  219. $ref: '#/components/schemas/Terminology'
  220. responses:
  221. '201':
  222. description: Nomenclatura creata
  223. '422':
  224. description: Nomenclatura non valida
  225. /terminology/{id}:
  226. get:
  227. summary: Restituisce una singola Nomenclatura
  228. tags: [Type]
  229. parameters:
  230. - in: path
  231. name: id
  232. required: true
  233. schema:
  234. type: string
  235. responses:
  236. '200':
  237. description: Tipo trovato
  238. content:
  239. application/json:
  240. schema:
  241. $ref: '#/components/schemas/Type'
  242. '404':
  243. description: Nomenclatura non trovata
  244. put:
  245. summary: Modifica una Nomenclatura esistente (admin only)
  246. tags: [Type]
  247. security:
  248. - panorama_administrator_api_key: []
  249. parameters:
  250. - in: path
  251. name: id
  252. required: true
  253. schema:
  254. type: string
  255. requestBody:
  256. required: true
  257. content:
  258. application/json:
  259. schema:
  260. $ref: '#/components/schemas/Terminology'
  261. responses:
  262. '200':
  263. description: Nomenclatura aggiornata
  264. '404':
  265. description: Nomenclatura non trovata
  266. '422':
  267. description: Nomenclatura non valida
  268. delete:
  269. summary: Elimina una Nomenclatura (senza riferimenti in qualche tipo) esistente (admin only)
  270. tags: [Type]
  271. security:
  272. - panorama_administrator_api_key: []
  273. parameters:
  274. - in: path
  275. name: id
  276. required: true
  277. schema:
  278. type: string
  279. responses:
  280. '204':
  281. description: Nomenclatura eliminata
  282. '404':
  283. description: Nomenclatura non trovata
  284. /entity:
  285. get:
  286. summary: Ricerca di entità
  287. tags: [Entity]
  288. parameters:
  289. - name: type
  290. in: query
  291. description: Filter by entity type
  292. required: false
  293. explode: true
  294. schema:
  295. type: string
  296. - name: source
  297. in: query
  298. description: Filter by data source
  299. required: false
  300. explode: true
  301. schema:
  302. type: string
  303. - name: state
  304. in: query
  305. description: Filter by entity state
  306. required: false
  307. explode: true
  308. schema:
  309. type: string
  310. responses:
  311. '200':
  312. description: Lista di entità
  313. content:
  314. application/json:
  315. schema:
  316. type: array
  317. items:
  318. $ref: '#/components/schemas/Entity'
  319. post:
  320. summary: Crea una nuova entità
  321. tags: [Entity]
  322. security:
  323. - panorama_provider_api_key: []
  324. requestBody:
  325. required: true
  326. content:
  327. application/json:
  328. schema:
  329. $ref: '#/components/schemas/Entity'
  330. responses:
  331. '422':
  332. description: Entità non valida
  333. '201':
  334. description: Entità creata
  335. /entity/{id}:
  336. get:
  337. summary: Ottiene una singola entità
  338. operationId: getEntity
  339. tags: [Entity]
  340. parameters:
  341. - in: path
  342. name: id
  343. required: true
  344. schema:
  345. type: string
  346. responses:
  347. '200':
  348. description: Entità trovata
  349. content:
  350. application/json:
  351. schema:
  352. $ref: '#/components/schemas/Entity'
  353. '404':
  354. description: Entità non trovata
  355. put:
  356. summary: Modifica un'entità esistente (escluso lo stato)
  357. tags: [Entity]
  358. security:
  359. - panorama_provider_api_key: []
  360. parameters:
  361. - in: path
  362. name: id
  363. required: true
  364. schema:
  365. type: string
  366. requestBody:
  367. required: true
  368. content:
  369. application/json:
  370. schema:
  371. $ref: '#/components/schemas/Entity'
  372. responses:
  373. '200':
  374. description: Entità aggiornata
  375. '404':
  376. description: Entità non trovata
  377. '422':
  378. description: Entità non valida
  379. delete:
  380. summary: Elimina un'entità
  381. tags: [Entity]
  382. security:
  383. - panorama_provider_api_key: []
  384. parameters:
  385. - in: path
  386. name: id
  387. required: true
  388. schema:
  389. type: string
  390. responses:
  391. '204':
  392. description: Entità eliminata
  393. '404':
  394. description: Entità non trovata
  395. /state/{id}:
  396. put:
  397. summary: Modifica lo stato di un'Entità
  398. tags: [Entity]
  399. security:
  400. - panorama_provider_api_key: []
  401. parameters:
  402. - in: path
  403. name: id
  404. required: true
  405. schema:
  406. type: string
  407. requestBody:
  408. required: true
  409. content:
  410. application/json:
  411. schema:
  412. type: string
  413. responses:
  414. '200':
  415. description: Stato Entità aggiornato
  416. '422':
  417. description: Stato Entità non valido
  418. '404':
  419. description: Entità non trovata
  420. /history/{id}:
  421. get:
  422. summary: Ottiene la storia delle variazioni di stato di un'Entità
  423. tags: [Entity]
  424. parameters:
  425. - in: path
  426. name: id
  427. description: l'ID dell'entità di cui ottenere la storia
  428. required: true
  429. schema:
  430. type: string
  431. responses:
  432. '200':
  433. description: Entità trovata
  434. content:
  435. application/json:
  436. schema:
  437. type: array
  438. items:
  439. type: object
  440. properties:
  441. timestamp:
  442. type: string
  443. format: date-time
  444. state:
  445. type: string
  446. examples: ['off', '22°C']
  447. '404':
  448. description: Entità non trovata
  449. /device:
  450. get:
  451. summary: Elenco di tutti i dispositivi
  452. tags: [Device]
  453. responses:
  454. '200':
  455. description: Lista di dispositivi
  456. content:
  457. application/json:
  458. schema:
  459. type: array
  460. items:
  461. $ref: '#/components/schemas/Device'
  462. /device/{id}:
  463. get:
  464. summary: Ottiene informazioni su un singolo dispositivo
  465. tags: [Device]
  466. parameters:
  467. - in: path
  468. name: id
  469. required: true
  470. schema:
  471. type: string
  472. responses:
  473. '200':
  474. description: Dispositivo trovato
  475. content:
  476. application/json:
  477. schema:
  478. $ref: '#/components/schemas/Device'
  479. '404':
  480. description: Dispositivo non trovato
  481. components:
  482. schemas:
  483. Terminology:
  484. type: object
  485. description: Nomenclatura di riferimento per i Tipi di Entità. Può essere interna o esterna (schema.gov.it, UCUM, Google Knowledge Graph)
  486. required: [id, name, syntax]
  487. properties:
  488. id:
  489. type: string
  490. format: uri
  491. description: Identificativo univoco della Nomenclatura (terminology)
  492. examples:
  493. - http://dati.beniculturali.it/cis
  494. name:
  495. type: string
  496. description: Nome canonico della Nomenclatura
  497. description:
  498. type: string
  499. description: Descrizione della Nomenclatura
  500. documentation:
  501. type: string
  502. format: uri
  503. description: Link alla documentazione della Nomenclatura
  504. examples:
  505. - 'https://schema.gov.it/'
  506. subject:
  507. type: string
  508. description: Soggetto titolare del Tipo
  509. examples:
  510. - 'Ministero per i Beni e le Attività Culturali'
  511. uri:
  512. type: string
  513. format: uri
  514. description: URI autoritativa della Nomenclatura
  515. examples:
  516. - http://dati.beniculturali.it/cis
  517. Type:
  518. type: object
  519. description: Tipi di entità, comprensivi di riferimento al nomenclatore e definizione della struttura del payload specifico
  520. required: [id, name, syntax]
  521. properties:
  522. id:
  523. type: string
  524. format: uri
  525. description: Identificativo univoco del Tipo di Entità
  526. examples:
  527. - http://dati.beniculturali.it/cis/CulturalInstituteOrSite
  528. name:
  529. type: string
  530. description: Nome canonico del Tipo di Entità
  531. examples:
  532. - Istituti e Luoghi Della Cultura Italiani (musei, biblioteche, cinema, ecc)
  533. native:
  534. type: boolean
  535. description: Se il Tipo è nativo di piattaforma o importato
  536. readOnly: true
  537. default: false
  538. # stateType:
  539. # $ref: '#/components/schemas/State'
  540. syntax:
  541. type: string
  542. format: json
  543. description: Definizione (JSON-LD) della sintassi del Tipo di Entità
  544. examples:
  545. - {
  546. "@context": "https://json-ld.org/contexts/person.jsonld",
  547. "@id": "http://dbpedia.org/resource/John_Lennon",
  548. "name": "John Lennon",
  549. "born": "1940-10-09",
  550. "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
  551. }
  552. terminology:
  553. $ref: '#/components/schemas/Terminology'
  554. examples:
  555. - http://dati.beniculturali.it/cis
  556. uri:
  557. type: string
  558. format: uri
  559. description: URI autoritativo del Tipo (se non nativo)
  560. examples:
  561. - http://dati.beniculturali.it/cis/CulturalInstituteOrSite
  562. # State:
  563. # type: object
  564. # description: Definisce una possibile rappresentazione della situazione attuale nel «divenire» delle Entità di un certo Tipo
  565. # examples:
  566. # - Aperto o Chiuso
  567. # - Acceso o Spento
  568. # - (StatoSemaforo) Rosso, Giallo, Verde, Lampeggiante, Spento
  569. # - TemperaturaAmbiente - la temperatura attuale di un ambiente in gradi centigradi
  570. # properties:
  571. # id:
  572. # type: string
  573. # format: uri
  574. # description: ID univoco del Tipo di Stato
  575. # name:
  576. # type: string
  577. # description: Nome canonico del Tipo di Stato
  578. # uom:
  579. # type: string
  580. # description: Unità di misura (per grandezze scalari)
  581. # kind:
  582. # type: string
  583. # description: La tipologia elementare del Tipo di Stato (grandezza con unità di misura, stringa, eccetera)
  584. # examples:
  585. # - Enumeration
  586. # - Number
  587. # - String
  588. Entity:
  589. type: object
  590. description: rappresenta un generico oggetto urbano, è di uno specifico Tipo, afferisce a una Sorgente Dati, ha uno Stato dinamico, è dotato di proprietà type-specific, può avere un Device associato, è tipicamente geo-localizzabile
  591. required: [id, type, source, createdDate, updatedDate]
  592. properties:
  593. id:
  594. type: string
  595. format: uri
  596. description: ID univoco dell'Entità sulla piattaforma
  597. examples: [20738]
  598. name:
  599. type: string
  600. description: Nome canonico dell'Entità sulla piattaforma
  601. examples:
  602. - Antiquarium e Acquedotto romano di Trieste
  603. geometry:
  604. type: object
  605. description: Coordinate geografiche dell'Entità
  606. properties:
  607. lat:
  608. type: Number
  609. description: Latitudine dell'Entità
  610. examples: [45.61809]
  611. long:
  612. type: Number
  613. description: Longitudine dell'Entità
  614. examples: [13.827805]
  615. type:
  616. $ref: '#/components/schemas/Type'
  617. parent:
  618. $ref: '#/components/schemas/Entity'
  619. source:
  620. $ref: '#/components/schemas/Source'
  621. externalId:
  622. type: string
  623. description: Identificativo dell'Entità nel sistema sorgente
  624. examples:
  625. - http://dati.beniculturali.it/mibact/luoghi/resource/CISNameInTime/20738
  626. state:
  627. type: object
  628. description: Stato dell'entità
  629. properties:
  630. value:
  631. type: string
  632. # description: Valore dello stato (determinato da Type.stateType)
  633. description: Valore dello stato
  634. timestamp:
  635. type: string
  636. format: date-time
  637. description: Data/ora dello stato
  638. # validity:
  639. # type: object
  640. # properties:
  641. # from:
  642. # type: string
  643. # format: date-time
  644. # description: Inizio validità
  645. # to:
  646. # type: string
  647. # format: date-time
  648. # description: Fine validità
  649. payload:
  650. type: object
  651. description: Attributi personalizzati in base al tipo di entità
  652. additionalProperties: true
  653. examples:
  654. - { chiusura: 'Lunedì|Giovedì|Domenica' }
  655. deviceId:
  656. description: Device associato all'entità
  657. $ref: '#/components/schemas/Device'
  658. createdDate:
  659. type: string
  660. format: date-time
  661. readOnly: true
  662. description: Data e ora di creazione dell'entità (timestamp ISO 8601)
  663. updatedDate:
  664. type: string
  665. format: date-time
  666. readOnly: true
  667. description: Data e ora dell'ultima modifica all'entità, escluse le modifiche di stato (timestamp ISO 8601)
  668. Source:
  669. type: object
  670. description: Fonte dati, interna o esterna, relativa a un soggetto alimentante
  671. properties:
  672. id:
  673. type: string
  674. format: uri
  675. description: ID univoco della Fonte Dati
  676. examples:
  677. - 'fvg_ispfor_tsgo'
  678. - 'fvg_ispfor'
  679. name:
  680. type: string
  681. description: Nome canonico della Fonte Dati
  682. examples:
  683. - 'Ministero per i Beni e le Attività Culturali'
  684. - 'Vincolo idrogeologico. L. 3267/1923 Comune di Trieste'
  685. - 'Ispettorati forestali'
  686. - 'Recupero energetico di biogas da digestione anaerobica o da discarica R1 (BDAD)'
  687. - 'Area golenale'
  688. - 'Copertura 2019 della banda larga in Italia secondo i criteri di rilevazione DESI 2020'
  689. internal:
  690. type: boolean
  691. description: Indica se la fonte dati è nativa della piattaforma o meno
  692. readOnly: true
  693. default: false
  694. organization:
  695. type: string
  696. description: Organizzazione di riferimento (ovvero soggetto alimentante) per la Fonte Dati
  697. examples:
  698. - 'Ministero per i Beni e le Attività Culturali'
  699. - 'Regione Autonoma Friuli Venezia Giulia - ISPETTORATO FORESTALE DI TRIESTE E GORIZIA'
  700. - 'RAFVG - DC Risorse agroalimentari, forestali e ittiche - Area foreste e territorio'
  701. - 'Regione Autonoma Friuli Venezia Giulia - SERVIZIO DISCIPLINA GESTIONE RIFIUTI E SITI INQUINATI'
  702. - 'Regione Autonoma Friuli Venezia Giulia - SERVIZIO GEOLOGICO'
  703. - 'Autorità per le Garanzie nelle Comunicazioni - AGCOM'
  704. processor:
  705. type: string
  706. description: Organizzazione che gestisce tecnicamente la Fonte Dati
  707. examples:
  708. - 'Insiel S.p.A.'
  709. - 'Regione autonoma Friuli Venezia Giulia'
  710. required: [id, name, organization, internal]
  711. Device:
  712. type: object
  713. description: Dispositivo IoT gestito nativamente in piattaforma
  714. required: [id, fk_firmware_id, fk_tenant_code, fk_device_service_id, created_date, updated_date]
  715. properties:
  716. id:
  717. type: string
  718. format: uri
  719. description: Identificativo univoco del dispositivo
  720. serial:
  721. type: string
  722. description: Seriale del dispositivo
  723. fk_firmware_id:
  724. type: string
  725. format: uri
  726. description: Identificativo univoco del firmware del dispositivo
  727. fk_tenant_code:
  728. type: string
  729. format: uri
  730. description: Identificativo univoco del tenant appartenente il dispositivo
  731. fk_device_service_id:
  732. type: string
  733. format: uri
  734. description: Identificativo univoco del servizio
  735. decrypt_key:
  736. type: string
  737. description: Chiave di decrypting del dispositivo
  738. auth_key:
  739. type: string
  740. description: Chiave di authentication del dispositivo
  741. logical_device_name:
  742. type: string
  743. description: Logical device name del dispositivo
  744. mac_address:
  745. type: string
  746. description: Mac address del dispositivo
  747. createdDate:
  748. type: string
  749. format: date-time
  750. description: Data di creazione
  751. updatedDate:
  752. type: string
  753. format: date-time
  754. description: Ultimo aggiornamento
  755. securitySchemes:
  756. panorama_auth:
  757. type: oauth2
  758. flows:
  759. implicit:
  760. authorizationUrl: https://panorama.edisonnext.it/oauth/authorize
  761. scopes:
  762. "write:entities": Panorama data provider
  763. "read:entities": Panorama data consumer
  764. "write:types": Panorama tenant administrator
  765. panorama_consumer_api_key:
  766. type: apiKey
  767. name: consumerApiKey
  768. in: header
  769. panorama_provider_api_key:
  770. type: apiKey
  771. name: providerApiKey
  772. in: header
  773. panorama_administrator_api_key:
  774. type: apiKey
  775. name: administratorApiKey
  776. in: header