panorama.yaml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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.1
  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: Type
  29. description: operations for data types
  30. - name: Data Catalog
  31. description: operations for data catalogs
  32. - name: Entity Browse
  33. description: operations to browse entities and their state
  34. - name: Entity
  35. description: operations to manage entities (data provider only)
  36. - name: Device
  37. description: Operations about Devices
  38. paths:
  39. /type:
  40. get:
  41. summary: Restituisce i Tipi di Entità definiti
  42. tags: [Type]
  43. operationId: getTypes
  44. responses:
  45. '200':
  46. description: successful operation
  47. content:
  48. application/json:
  49. schema:
  50. type: array
  51. items:
  52. $ref: '#/components/schemas/Type'
  53. post:
  54. summary: Crea un nuovo Tipo di Entità (admin only)
  55. tags: [Type]
  56. # security:
  57. # - panorama_administrator_api_key: []
  58. requestBody:
  59. required: true
  60. content:
  61. application/json:
  62. schema:
  63. $ref: '#/components/schemas/Type'
  64. responses:
  65. '201':
  66. description: Tipo creato
  67. /type/{id}:
  68. get:
  69. summary: Restituisce un singolo Tipo di Entità
  70. tags: [Type]
  71. parameters:
  72. - in: path
  73. name: id
  74. required: true
  75. schema:
  76. type: string
  77. responses:
  78. '200':
  79. description: Tipo trovato
  80. content:
  81. application/json:
  82. schema:
  83. $ref: '#/components/schemas/Type'
  84. '404':
  85. description: Tipo non trovato
  86. put:
  87. summary: Modifica un Tipo esistente (admin only)
  88. tags: [Type]
  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. /catalog:
  108. get:
  109. summary: Restituisce i Cataloghi disponibili
  110. tags: [Data Catalog]
  111. operationId: getCatalogs
  112. parameters:
  113. - name: sources
  114. in: query
  115. description: Sources to filter by
  116. required: false
  117. explode: true
  118. schema:
  119. type: array
  120. items:
  121. type: string
  122. responses:
  123. '200':
  124. description: successful operation
  125. content:
  126. application/json:
  127. schema:
  128. type: array
  129. items:
  130. $ref: '#/components/schemas/Catalog'
  131. post:
  132. summary: Crea un nuovo Catalogo Dati (admin only)
  133. tags: [Data Catalog]
  134. requestBody:
  135. required: true
  136. content:
  137. application/json:
  138. schema:
  139. $ref: '#/components/schemas/Catalog'
  140. responses:
  141. '201':
  142. description: Catalogo creato
  143. /catalog/{id}:
  144. get:
  145. summary: Restituisce un singolo Catalogo Dati
  146. tags: [Data Catalog]
  147. parameters:
  148. - in: path
  149. name: id
  150. required: true
  151. schema:
  152. type: string
  153. responses:
  154. '200':
  155. description: Catalogo trovato
  156. content:
  157. application/json:
  158. schema:
  159. $ref: '#/components/schemas/Catalog'
  160. '404':
  161. description: Catalogo non trovato
  162. put:
  163. summary: Modifica un Catalogo esistente (admin only)
  164. tags: [Data Catalog]
  165. parameters:
  166. - in: path
  167. name: id
  168. required: true
  169. schema:
  170. type: string
  171. requestBody:
  172. required: true
  173. content:
  174. application/json:
  175. schema:
  176. $ref: '#/components/schemas/Catalog'
  177. responses:
  178. '200':
  179. description: Catalogo aggiornato
  180. delete:
  181. summary: Elimina un catalogo vuoto esistente (admin only)
  182. tags: [Data Catalog]
  183. /source:
  184. get:
  185. summary: Restituisce le fonti dati disponibili
  186. tags: [Data Catalog]
  187. responses:
  188. '200':
  189. description: successful operation
  190. content:
  191. application/json:
  192. schema:
  193. type: array
  194. items:
  195. $ref: '#/components/schemas/Source'
  196. post:
  197. summary: Aggiunge una Fonte Dati (admin only)
  198. tags: [Data Catalog]
  199. /source/{id}:
  200. put:
  201. summary: Modifica una sorgente dati esistente (admin only)
  202. tags: [Data Catalog]
  203. delete:
  204. summary: Elimina una sorgente dati (vuota) esistente (admin only)
  205. tags: [Data Catalog]
  206. /terminology:
  207. get:
  208. summary: Restituisce le Nomenclature definite
  209. tags: [Type]
  210. operationId: getTerminologies
  211. responses:
  212. '200':
  213. description: successful operation
  214. content:
  215. application/json:
  216. schema:
  217. type: array
  218. items:
  219. $ref: '#/components/schemas/Terminology'
  220. post:
  221. summary: Crea una nuova Nomenclatura (admin only)
  222. tags: [Type]
  223. requestBody:
  224. required: true
  225. content:
  226. application/json:
  227. schema:
  228. $ref: '#/components/schemas/Terminology'
  229. responses:
  230. '201':
  231. description: Nomenclatura creata
  232. /terminology/{id}:
  233. get:
  234. summary: Restituisce una singola Nomenclatura
  235. tags: [Type]
  236. put:
  237. summary: Modifica una Nomenclatura esistente (admin only)
  238. tags: [Type]
  239. delete:
  240. summary: Elimina una Nomenclatura (senza riferimenti in qualche tipo) esistente (admin only)
  241. tags: [Type]
  242. /entity:
  243. get:
  244. summary: Ricerca di entità
  245. tags: [Entity Browse]
  246. parameters:
  247. - name: type
  248. in: query
  249. description: Filter by entity type
  250. required: false
  251. explode: true
  252. schema:
  253. type: string
  254. - name: catalog
  255. in: query
  256. description: Filter by data catalog
  257. required: false
  258. explode: true
  259. schema:
  260. type: string
  261. - name: state
  262. in: query
  263. description: Filter by entity state
  264. required: false
  265. explode: true
  266. schema:
  267. type: string
  268. responses:
  269. '200':
  270. description: Lista di entità
  271. content:
  272. application/json:
  273. schema:
  274. type: array
  275. items:
  276. $ref: '#/components/schemas/Entity'
  277. post:
  278. summary: Crea una nuova entità
  279. tags: [Entity]
  280. requestBody:
  281. required: true
  282. content:
  283. application/json:
  284. schema:
  285. $ref: '#/components/schemas/Entity'
  286. responses:
  287. '201':
  288. description: Entità creata
  289. /entity/{id}:
  290. get:
  291. summary: Ottiene una singola entità
  292. tags: [Entity Browse]
  293. parameters:
  294. - in: path
  295. name: id
  296. required: true
  297. schema:
  298. type: string
  299. responses:
  300. '200':
  301. description: Entità trovata
  302. content:
  303. application/json:
  304. schema:
  305. $ref: '#/components/schemas/Entity'
  306. '404':
  307. description: Entità non trovata
  308. put:
  309. summary: Modifica un'entità esistente (escluso lo stato)
  310. tags: [Entity]
  311. parameters:
  312. - in: path
  313. name: id
  314. required: true
  315. schema:
  316. type: string
  317. requestBody:
  318. required: true
  319. content:
  320. application/json:
  321. schema:
  322. $ref: '#/components/schemas/Entity'
  323. responses:
  324. '200':
  325. description: Entità aggiornata
  326. delete:
  327. summary: Elimina un'entità
  328. tags: [Entity]
  329. parameters:
  330. - in: path
  331. name: id
  332. required: true
  333. schema:
  334. type: string
  335. responses:
  336. '204':
  337. description: Entità eliminata
  338. /state/{id}:
  339. put:
  340. summary: Modifica lo stato di un'Entità
  341. tags: [Entity]
  342. parameters:
  343. - in: path
  344. name: id
  345. required: true
  346. schema:
  347. type: string
  348. requestBody:
  349. required: true
  350. content:
  351. application/json:
  352. schema:
  353. type: string
  354. responses:
  355. '200':
  356. description: Stato Entità aggiornato
  357. /history/{id}:
  358. get:
  359. summary: Ottiene la storia delle variazioni di stato di un'Entità
  360. tags: [Entity Browse]
  361. parameters:
  362. - in: path
  363. name: id
  364. description: l'ID dell'entità di cui ottenere la storia
  365. required: true
  366. schema:
  367. type: string
  368. responses:
  369. '200':
  370. description: Entità trovata
  371. content:
  372. application/json:
  373. schema:
  374. type: array
  375. items:
  376. type: object
  377. properties:
  378. timestamp:
  379. type: string
  380. format: date-time
  381. state:
  382. type: string
  383. examples: ['off', '22°C']
  384. '404':
  385. description: Entità non trovata
  386. /device:
  387. get:
  388. summary: Elenco di tutti i dispositivi
  389. tags: [Device]
  390. responses:
  391. '200':
  392. description: Lista di dispositivi
  393. content:
  394. application/json:
  395. schema:
  396. type: array
  397. items:
  398. $ref: '#/components/schemas/Device'
  399. /device/{id}:
  400. get:
  401. summary: Ottiene informazioni su un singolo dispositivo
  402. tags: [Device]
  403. parameters:
  404. - in: path
  405. name: id
  406. required: true
  407. schema:
  408. type: string
  409. responses:
  410. '200':
  411. description: Dispositivo trovato
  412. content:
  413. application/json:
  414. schema:
  415. $ref: '#/components/schemas/Device'
  416. '404':
  417. description: Dispositivo non trovato
  418. components:
  419. schemas:
  420. Terminology:
  421. type: object
  422. description: Nomenclatura di riferimento per i Tipi di Entità. Può essere interna o esterna (schema.gov.it, UCUM, Google Knowledge Graph)
  423. required: [id, name, syntax]
  424. properties:
  425. id:
  426. type: string
  427. format: uri
  428. description: Identificativo univoco della Nomenclatura (terminology)
  429. name:
  430. type: string
  431. description: Nome canonico della Nomenclatura
  432. description:
  433. type: string
  434. description: Descrizione della Nomenclatura
  435. documentation:
  436. type: string
  437. format: uri
  438. description: Link alla documentazione della Nomenclatura
  439. examples:
  440. - 'https://schema.gov.it/'
  441. uri:
  442. type: string
  443. format: uri
  444. description: URI autoritativa della Nomenclatura
  445. examples:
  446. - http://dati.beniculturali.it/cis
  447. Type:
  448. type: object
  449. description: Tipi di entità, comprensivi di riferimento al nomenclatore e definizione della struttura del payload specifico
  450. required: [id, name, syntax]
  451. properties:
  452. id:
  453. type: string
  454. format: uri
  455. description: Identificativo univoco del Tipo di Entità
  456. name:
  457. type: string
  458. description: Nome canonico del Tipo di Entità
  459. stateType:
  460. $ref: '#/components/schemas/Type'
  461. syntax:
  462. type: string
  463. format: json
  464. description: Definizione (JSON-LD) della sintassi del Tipo di Entità
  465. terminology:
  466. $ref: '#/components/schemas/Terminology'
  467. State:
  468. type: object
  469. description: Definisce una possibile rappresentazione della situazione attuale nel «divenire» delle Entità di un certo Tipo
  470. examples:
  471. - ElectronicDeviceState - Acceso o Spento
  472. - StatoSemaforo - Rosso, Giallo, Verde, Lampeggiante, Spento
  473. - TemperaturaAmbiente - la temperatura attuale di un ambiente in gradi centigradi
  474. properties:
  475. id:
  476. type: string
  477. format: uri
  478. description: ID univoco del Tipo di Stato
  479. name:
  480. type: string
  481. description: Nome canonico del Tipo di Stato
  482. kind:
  483. type: string
  484. description: La tipologia elementare del Tipo di Stato (grandezza con unità di misura, stringa, eccetera)
  485. Entity:
  486. type: object
  487. description: rappresenta un generico oggetto urbano, è di uno specifico tipo, afferisce a un catalogo, ha uno stato dinamico, è dotato di proprietà type-specific, è tipicamente geo-localizzabile
  488. required: [id, type, state, createdDate, updatedDate]
  489. properties:
  490. id:
  491. type: string
  492. format: uri
  493. description: URI univoco dell’Entità sulla piattaforma
  494. type:
  495. $ref: '#/components/schemas/Type'
  496. parent:
  497. $ref: '#/components/schemas/Entity'
  498. externalId:
  499. type: string
  500. description: Identificativo dell’Entità nel sistema sorgente
  501. state:
  502. type: object
  503. description: Stato dell’entità
  504. properties:
  505. value:
  506. type: string
  507. description: Valore dello stato (determinato da Type.stateType)
  508. timestamp:
  509. type: string
  510. format: date-time
  511. description: Data/ora dello stato
  512. validity:
  513. type: object
  514. properties:
  515. from:
  516. type: string
  517. format: date-time
  518. description: Inizio validità
  519. to:
  520. type: string
  521. format: date-time
  522. description: Fine validità
  523. payload:
  524. type: object
  525. description: Attributi personalizzati in base al tipo di entità
  526. additionalProperties: true
  527. deviceId:
  528. description: Device associato all'entità
  529. $ref: '#/components/schemas/Device'
  530. createdDate:
  531. type: string
  532. format: date-time
  533. description: Data e ora di creazione dell'entità (timestamp ISO 8601)
  534. updatedDate:
  535. type: string
  536. format: date-time
  537. description: Data e ora dell’ultima modifica all'entità, escluse le modifiche di stato (timestamp ISO 8601)
  538. Source:
  539. type: object
  540. description: Fonte dati, interna o esterna, relativa a un soggetto alimentante
  541. properties:
  542. id:
  543. type: string
  544. format: uri
  545. description: ID univoco della Fonte Dati
  546. name:
  547. type: string
  548. description: Nome canonico della Fonte Dati
  549. internal:
  550. type: boolean
  551. description: Indica se la fonte dati è nativa della piattaforma o meno
  552. default: false
  553. organization:
  554. type: string
  555. description: Organizzazione di riferimento (ovvero soggetto alimentante) per la Fonte Dati
  556. required: [id, name, organization, internal]
  557. Catalog:
  558. type: object
  559. description: Catalogo Dati (Data Catalog) fornito da una Fonte Dati
  560. properties:
  561. id:
  562. type: string
  563. format: uri
  564. description: ID univoco del Catalogo Dati
  565. name:
  566. type: string
  567. description: Nome canonico del Catalogo Dati
  568. source:
  569. description: Fonte Dati di afferenza
  570. $ref: '#/components/schemas/Source'
  571. required: [id, name, source]
  572. Device:
  573. type: object
  574. description: Dispositivo IoT gestito nativamente in piattaforma
  575. required: [id, fk_firmware_id, fk_tenant_code, fk_device_service_id, created_date, updated_date]
  576. properties:
  577. id:
  578. type: string
  579. format: uri
  580. description: Identificativo univoco del dispositivo
  581. serial:
  582. type: string
  583. description: Seriale del dispositivo
  584. fk_firmware_id:
  585. type: string
  586. format: uri
  587. description: Identificativo univoco del firmware del dispositivo
  588. fk_tenant_code:
  589. type: string
  590. format: uri
  591. description: Identificativo univoco del tenant appartenente il dispositivo
  592. fk_device_service_id:
  593. type: string
  594. format: uri
  595. description: Identificativo univoco del servizio
  596. decrypt_key:
  597. type: string
  598. description: Chiave di decrypting del dispositivo
  599. auth_key:
  600. type: string
  601. description: Chiave di authentication del dispositivo
  602. logical_device_name:
  603. type: string
  604. description: Logical device name del dispositivo
  605. mac_address:
  606. type: string
  607. description: Mac address del dispositivo
  608. createdDate:
  609. type: string
  610. format: date-time
  611. description: Data di creazione
  612. updatedDate:
  613. type: string
  614. format: date-time
  615. description: Ultimo aggiornamento
  616. securitySchemes:
  617. panorama_auth:
  618. type: oauth2
  619. flows:
  620. implicit:
  621. authorizationUrl: https://panorama.edisonnext.it/oauth/authorize
  622. scopes:
  623. "write:entities": Panorama data provider
  624. "read:entities": Panorama data consumer
  625. "write:types": Panorama tenant administrator
  626. panorama_consumer_api_key:
  627. type: apiKey
  628. name: consumerApiKey
  629. in: header
  630. panorama_provider_api_key:
  631. type: apiKey
  632. name: providerApiKey
  633. in: header
  634. panorama_administrator_api_key:
  635. type: apiKey
  636. name: administratorApiKey
  637. in: header