panorama.yaml 22 KB

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