@golemio/fypr 1.1.1-dev.2368450356 → 1.1.1-dev.2387575538

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/db/example/01_display_cases.sql +4 -4
  2. package/db/example/02_information_panels.sql +4 -4
  3. package/db/example/03_obelisks.sql +4 -4
  4. package/db/example/05_totems.sql +1 -1
  5. package/db/migrations/postgresql/20260312000000-schema-updates.js +53 -0
  6. package/db/migrations/postgresql/20260316093713-add-source-created-at-index.js +53 -0
  7. package/db/migrations/postgresql/sqls/20260312000000-schema-updates-down.sql +14 -0
  8. package/db/migrations/postgresql/sqls/20260312000000-schema-updates-up.sql +14 -0
  9. package/db/migrations/postgresql/sqls/20260316093713-add-source-created-at-index-down.sql +6 -0
  10. package/db/migrations/postgresql/sqls/20260316093713-add-source-created-at-index-up.sql +17 -0
  11. package/dist/integration-engine/transformations/AbstractElementTransformation.js +1 -0
  12. package/dist/integration-engine/transformations/AbstractElementTransformation.js.map +1 -1
  13. package/dist/integration-engine/transformations/InformationPanelsTransformation.js +7 -0
  14. package/dist/integration-engine/transformations/InformationPanelsTransformation.js.map +1 -1
  15. package/dist/integration-engine/transformations/TotemsTransformation.js +2 -1
  16. package/dist/integration-engine/transformations/TotemsTransformation.js.map +1 -1
  17. package/dist/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.d.ts +13 -0
  18. package/dist/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.js +67 -0
  19. package/dist/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.js.map +1 -0
  20. package/dist/output-gateway/fypr/data-access/FyprElementRepository.d.ts +18 -0
  21. package/dist/output-gateway/fypr/data-access/FyprElementRepository.js +46 -0
  22. package/dist/output-gateway/fypr/data-access/FyprElementRepository.js.map +1 -0
  23. package/dist/output-gateway/fypr/routers/index.d.ts +1 -0
  24. package/dist/output-gateway/fypr/routers/index.js +6 -0
  25. package/dist/output-gateway/fypr/routers/index.js.map +1 -0
  26. package/dist/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.d.ts +10 -0
  27. package/dist/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.js +44 -0
  28. package/dist/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.js.map +1 -0
  29. package/dist/output-gateway/index.js +2 -3
  30. package/dist/output-gateway/index.js.map +1 -1
  31. package/dist/output-gateway/ioc/Di.d.ts +2 -0
  32. package/dist/output-gateway/ioc/Di.js +26 -0
  33. package/dist/output-gateway/ioc/Di.js.map +1 -0
  34. package/dist/output-gateway/ioc/FYPROGContainerTokens.d.ts +4 -0
  35. package/dist/output-gateway/ioc/FYPROGContainerTokens.js +12 -0
  36. package/dist/output-gateway/ioc/FYPROGContainerTokens.js.map +1 -0
  37. package/dist/output-gateway/shared/constants/element-kinds.d.ts +1 -0
  38. package/dist/output-gateway/shared/constants/element-kinds.js +6 -0
  39. package/dist/output-gateway/shared/constants/element-kinds.js.map +1 -0
  40. package/dist/output-gateway/shared/constants/index.d.ts +1 -0
  41. package/dist/output-gateway/shared/constants/index.js +18 -0
  42. package/dist/output-gateway/shared/constants/index.js.map +1 -0
  43. package/dist/schema-definitions/FyprElementTypes.d.ts +6 -0
  44. package/dist/schema-definitions/FyprElementTypes.js +3 -0
  45. package/dist/schema-definitions/FyprElementTypes.js.map +1 -0
  46. package/dist/schema-definitions/const.d.ts +44 -0
  47. package/dist/schema-definitions/const.js +17 -1
  48. package/dist/schema-definitions/const.js.map +1 -1
  49. package/dist/schema-definitions/data-sources/DBFYPRDisplayCasesJSONSchema.js +22 -71
  50. package/dist/schema-definitions/data-sources/DBFYPRDisplayCasesJSONSchema.js.map +1 -1
  51. package/dist/schema-definitions/data-sources/DBFYPRElementsJSONSchema.js +15 -45
  52. package/dist/schema-definitions/data-sources/DBFYPRElementsJSONSchema.js.map +1 -1
  53. package/dist/schema-definitions/data-sources/DBFYPRInformationPanelsJSONSchema.js +85 -281
  54. package/dist/schema-definitions/data-sources/DBFYPRInformationPanelsJSONSchema.js.map +1 -1
  55. package/dist/schema-definitions/data-sources/DBFYPRObelisksJSONSchema.js +17 -53
  56. package/dist/schema-definitions/data-sources/DBFYPRObelisksJSONSchema.js.map +1 -1
  57. package/dist/schema-definitions/data-sources/DBFYPRSignpostsJSONSchema.js +19 -59
  58. package/dist/schema-definitions/data-sources/DBFYPRSignpostsJSONSchema.js.map +1 -1
  59. package/dist/schema-definitions/data-sources/DBFYPRTotemsJSONSchema.js +59 -203
  60. package/dist/schema-definitions/data-sources/DBFYPRTotemsJSONSchema.js.map +1 -1
  61. package/dist/schema-definitions/data-sources/interfaces/IDBFYPRInformationPanel.d.ts +7 -0
  62. package/dist/schema-definitions/data-sources/interfaces/IDBFYPRTotem.d.ts +3 -1
  63. package/dist/schema-definitions/index.d.ts +34 -2
  64. package/dist/schema-definitions/index.js +34 -1
  65. package/dist/schema-definitions/index.js.map +1 -1
  66. package/dist/schema-definitions/models/AbstractElementModel.d.ts +9 -0
  67. package/dist/schema-definitions/models/AbstractElementModel.js +15 -35
  68. package/dist/schema-definitions/models/AbstractElementModel.js.map +1 -1
  69. package/dist/schema-definitions/models/DisplayCaseModel.js +20 -60
  70. package/dist/schema-definitions/models/DisplayCaseModel.js.map +1 -1
  71. package/dist/schema-definitions/models/InformationPanelModel.d.ts +7 -0
  72. package/dist/schema-definitions/models/InformationPanelModel.js +90 -261
  73. package/dist/schema-definitions/models/InformationPanelModel.js.map +1 -1
  74. package/dist/schema-definitions/models/ObeliskModel.js +15 -42
  75. package/dist/schema-definitions/models/ObeliskModel.js.map +1 -1
  76. package/dist/schema-definitions/models/SignpostModel.js +17 -48
  77. package/dist/schema-definitions/models/SignpostModel.js.map +1 -1
  78. package/dist/schema-definitions/models/TotemModel.d.ts +1 -1
  79. package/dist/schema-definitions/models/TotemModel.js +53 -177
  80. package/dist/schema-definitions/models/TotemModel.js.map +1 -1
  81. package/dist/schema-definitions/models/interfaces/IElement.d.ts +1 -0
  82. package/dist/schema-definitions/models/interfaces/IInformationPanel.d.ts +7 -0
  83. package/dist/schema-definitions/models/interfaces/ITotem.d.ts +1 -1
  84. package/docs/asyncapi.yaml +26 -0
  85. package/docs/implementation_documentation.md +67 -16
  86. package/docs/openapi-output.yaml +437 -249
  87. package/docs/translations.md +9 -1
  88. package/package.json +13 -4
@@ -24,19 +24,58 @@ tags:
24
24
  description: Data about physical (on-site) information elements of the Legible Prague system.
25
25
 
26
26
  paths:
27
- /v1/fypr/display-cases:
27
+ /v1/fypr/elements:
28
28
  get:
29
29
  tags:
30
30
  - FYPR (v1)
31
- summary: GET All Display Cases
31
+ summary: GET FYPR links to elements kinds
32
+ operationId: listFyprElementsKinds
33
+ responses:
34
+ "200":
35
+ description: OK
36
+ content:
37
+ application/json:
38
+ schema:
39
+ type: object
40
+ required:
41
+ - links
42
+ properties:
43
+ links:
44
+ type: array
45
+ items:
46
+ type: object
47
+ required:
48
+ - rel
49
+ - href
50
+ properties:
51
+ rel:
52
+ type: string
53
+ example: display-cases
54
+ description: >-
55
+ Relation name identifying the element kind.
56
+ href:
57
+ type: string
58
+ example: /v1/fypr/elements/display-cases
59
+ description: >-
60
+ Absolute path to the list endpoint for this element kind.
61
+
62
+ /v1/fypr/elements/display-cases:
63
+ get:
64
+ tags:
65
+ - FYPR (v1)
66
+ summary: GET Display Cases
32
67
  operationId: listDisplayCases
33
68
  parameters:
34
- - $ref: "#/components/parameters/limit"
35
- - $ref: "#/components/parameters/offset"
69
+ - $ref: "#/components/parameters/Limit"
70
+ - $ref: "#/components/parameters/Offset"
36
71
  responses:
37
72
  "200":
38
73
  description: OK
39
-
74
+ headers:
75
+ Last-Modified:
76
+ $ref: "#/components/headers/LastModified"
77
+ Cache-Control:
78
+ $ref: "#/components/headers/CacheControlNoCache"
40
79
  content:
41
80
  application/json:
42
81
  schema:
@@ -45,22 +84,26 @@ paths:
45
84
  $ref: "#/components/schemas/DisplayCase"
46
85
  "400":
47
86
  $ref: "#/components/responses/BadRequestError"
48
- "401":
49
- $ref: "#/components/responses/UnauthorizedError"
87
+ "413":
88
+ $ref: "#/components/responses/ContentTooLargeError"
50
89
 
51
- /v1/fypr/information-panels:
90
+ /v1/fypr/elements/information-panels:
52
91
  get:
53
92
  tags:
54
93
  - FYPR (v1)
55
- summary: GET All Information Panels
94
+ summary: GET Information Panels
56
95
  operationId: listInformationPanels
57
96
  parameters:
58
- - $ref: "#/components/parameters/limit"
59
- - $ref: "#/components/parameters/offset"
97
+ - $ref: "#/components/parameters/Limit"
98
+ - $ref: "#/components/parameters/Offset"
60
99
  responses:
61
100
  "200":
62
101
  description: OK
63
-
102
+ headers:
103
+ Last-Modified:
104
+ $ref: "#/components/headers/LastModified"
105
+ Cache-Control:
106
+ $ref: "#/components/headers/CacheControlNoCache"
64
107
  content:
65
108
  application/json:
66
109
  schema:
@@ -69,22 +112,26 @@ paths:
69
112
  $ref: "#/components/schemas/InformationPanel"
70
113
  "400":
71
114
  $ref: "#/components/responses/BadRequestError"
72
- "401":
73
- $ref: "#/components/responses/UnauthorizedError"
115
+ "413":
116
+ $ref: "#/components/responses/ContentTooLargeError"
74
117
 
75
- /v1/fypr/obelisks:
118
+ /v1/fypr/elements/obelisks:
76
119
  get:
77
120
  tags:
78
121
  - FYPR (v1)
79
- summary: GET All Obelisks
122
+ summary: GET Obelisks
80
123
  operationId: listObelisks
81
124
  parameters:
82
- - $ref: "#/components/parameters/limit"
83
- - $ref: "#/components/parameters/offset"
125
+ - $ref: "#/components/parameters/Limit"
126
+ - $ref: "#/components/parameters/Offset"
84
127
  responses:
85
128
  "200":
86
129
  description: OK
87
-
130
+ headers:
131
+ Last-Modified:
132
+ $ref: "#/components/headers/LastModified"
133
+ Cache-Control:
134
+ $ref: "#/components/headers/CacheControlNoCache"
88
135
  content:
89
136
  application/json:
90
137
  schema:
@@ -93,22 +140,26 @@ paths:
93
140
  $ref: "#/components/schemas/Obelisk"
94
141
  "400":
95
142
  $ref: "#/components/responses/BadRequestError"
96
- "401":
97
- $ref: "#/components/responses/UnauthorizedError"
143
+ "413":
144
+ $ref: "#/components/responses/ContentTooLargeError"
98
145
 
99
- /v1/fypr/signposts:
146
+ /v1/fypr/elements/signposts:
100
147
  get:
101
148
  tags:
102
149
  - FYPR (v1)
103
- summary: GET All Signposts
150
+ summary: GET Signposts
104
151
  operationId: listSignposts
105
152
  parameters:
106
- - $ref: "#/components/parameters/limit"
107
- - $ref: "#/components/parameters/offset"
153
+ - $ref: "#/components/parameters/Limit"
154
+ - $ref: "#/components/parameters/Offset"
108
155
  responses:
109
156
  "200":
110
157
  description: OK
111
-
158
+ headers:
159
+ Last-Modified:
160
+ $ref: "#/components/headers/LastModified"
161
+ Cache-Control:
162
+ $ref: "#/components/headers/CacheControlNoCache"
112
163
  content:
113
164
  application/json:
114
165
  schema:
@@ -117,22 +168,26 @@ paths:
117
168
  $ref: "#/components/schemas/Signpost"
118
169
  "400":
119
170
  $ref: "#/components/responses/BadRequestError"
120
- "401":
121
- $ref: "#/components/responses/UnauthorizedError"
171
+ "413":
172
+ $ref: "#/components/responses/ContentTooLargeError"
122
173
 
123
- /v1/fypr/totems:
174
+ /v1/fypr/elements/totems:
124
175
  get:
125
176
  tags:
126
177
  - FYPR (v1)
127
- summary: GET All Totems
178
+ summary: GET Totems
128
179
  operationId: listTotems
129
180
  parameters:
130
- - $ref: "#/components/parameters/limit"
131
- - $ref: "#/components/parameters/offset"
181
+ - $ref: "#/components/parameters/Limit"
182
+ - $ref: "#/components/parameters/Offset"
132
183
  responses:
133
184
  "200":
134
185
  description: OK
135
-
186
+ headers:
187
+ Last-Modified:
188
+ $ref: "#/components/headers/LastModified"
189
+ Cache-Control:
190
+ $ref: "#/components/headers/CacheControlNoCache"
136
191
  content:
137
192
  application/json:
138
193
  schema:
@@ -141,31 +196,337 @@ paths:
141
196
  $ref: "#/components/schemas/Totem"
142
197
  "400":
143
198
  $ref: "#/components/responses/BadRequestError"
144
- "401":
145
- $ref: "#/components/responses/UnauthorizedError"
199
+ "413":
200
+ $ref: "#/components/responses/ContentTooLargeError"
201
+
202
+ /v1/fypr/elements/{kind}/{id}:
203
+ get:
204
+ tags:
205
+ - FYPR (v1)
206
+ summary: GET FYPR element by kind and id
207
+ operationId: getFyprElementDetail
208
+ parameters:
209
+ - $ref: "#/components/parameters/Kind"
210
+ - name: id
211
+ in: path
212
+ required: true
213
+ schema:
214
+ $ref: "#/components/schemas/ElementId"
215
+ description: >-
216
+ UUID of the element to retrieve.
217
+ responses:
218
+ "200":
219
+ description: OK
220
+ headers:
221
+ Last-Modified:
222
+ $ref: "#/components/headers/LastModified"
223
+ Cache-Control:
224
+ $ref: "#/components/headers/CacheControlNoCache"
225
+ content:
226
+ application/json:
227
+ schema:
228
+ oneOf:
229
+ - $ref: "#/components/schemas/DisplayCase"
230
+ - $ref: "#/components/schemas/InformationPanel"
231
+ - $ref: "#/components/schemas/Obelisk"
232
+ - $ref: "#/components/schemas/Signpost"
233
+ - $ref: "#/components/schemas/Totem"
234
+ "400":
235
+ $ref: "#/components/responses/BadRequestError"
236
+ "404":
237
+ $ref: "#/components/responses/NotFoundError"
146
238
 
147
239
  components:
148
240
  parameters:
149
- limit:
241
+ Limit:
150
242
  name: limit
151
243
  in: query
152
244
  required: false
153
- example: 10
154
245
  schema:
155
246
  type: integer
247
+ minimum: 1
248
+ maximum: 10000
249
+ default: 100
156
250
  description: >-
157
251
  Limits number of retrieved items.
158
252
 
159
- offset:
253
+ Offset:
160
254
  name: offset
161
255
  in: query
162
256
  required: false
163
257
  example: 0
164
258
  schema:
165
259
  type: integer
166
- description: Offset for pagination. The default value is 0.
260
+ minimum: 0
261
+ default: 0
262
+ description: >-
263
+ Offset for pagination. The default value is 0.
264
+
265
+ Kind:
266
+ name: kind
267
+ in: path
268
+ required: true
269
+ schema:
270
+ type: string
271
+ enum:
272
+ - display-cases
273
+ - information-panels
274
+ - obelisks
275
+ - signposts
276
+ - totems
277
+ description: >-
278
+ Kind of the FYPR element.
279
+
280
+ headers:
281
+ LastModified:
282
+ description: Timestamp of the latest resource update.
283
+ schema:
284
+ type: string
285
+ example: "2024-08-12T12:40:30.000Z"
286
+ CacheControlNoCache:
287
+ description: Cache control directive for caching proxies
288
+ schema:
289
+ type: string
290
+ example: max-age=300, stale-while-revalidate=60
291
+
292
+ responses:
293
+ ContentTooLargeError:
294
+ description: Content too large - limit query parameter exceeds maximum (10000)
295
+ content:
296
+ application/json:
297
+ schema:
298
+ type: object
299
+ properties:
300
+ error_message:
301
+ type: string
302
+ example: "Pagination limit error"
303
+ nullable: false
304
+ error_status:
305
+ type: integer
306
+ example: 413
307
+ nullable: false
308
+ error_info:
309
+ type: string
310
+ example: "{...}"
311
+ nullable: true
312
+ required:
313
+ - error_message
314
+ - error_status
315
+
316
+ NotFoundError:
317
+ description: Not found - the requested resource does not exist
318
+ content:
319
+ application/json:
320
+ schema:
321
+ type: object
322
+ properties:
323
+ error_message:
324
+ type: string
325
+ example: "Not found"
326
+ nullable: false
327
+ error_status:
328
+ type: integer
329
+ example: 404
330
+ nullable: false
331
+ error_info:
332
+ type: string
333
+ example: "{...}"
334
+ nullable: true
335
+ required:
336
+ - error_message
337
+ - error_status
338
+
339
+ BadRequestError:
340
+ description: Bad request - invalid query parameters
341
+ content:
342
+ application/json:
343
+ schema:
344
+ type: object
345
+ properties:
346
+ error_message:
347
+ type: string
348
+ example: "Bad request"
349
+ nullable: false
350
+ error_status:
351
+ type: integer
352
+ example: 400
353
+ nullable: false
354
+ error_info:
355
+ type: string
356
+ example: "{...}"
357
+ nullable: true
358
+ required:
359
+ - error_message
360
+ - error_status
167
361
 
168
362
  schemas:
363
+ ElementId:
364
+ type: string
365
+ format: uuid
366
+ example: "1b75c16b-d5a3-40ca-8560-5a7dc011655d"
367
+ description: >-
368
+ Unique identifier for an element. UUID v4, server-generated.
369
+
370
+ ElementReadOnly:
371
+ type: object
372
+ description: >-
373
+ Server-set fields that clients can only read. All properties carry
374
+ readOnly: true. Composed via allOf into each typed element schema.
375
+ properties:
376
+ id:
377
+ allOf:
378
+ - $ref: "#/components/schemas/ElementId"
379
+ readOnly: true
380
+ description: >-
381
+ Server-generated UUID primary key. Immutable after creation.
382
+ source_created_at:
383
+ type: string
384
+ format: date-time
385
+ readOnly: true
386
+ example: "2024-01-15T08:30:00.000Z"
387
+ description: >-
388
+ Timestamp when the record was first created in the upstream CMS
389
+ (Strapi). ISO 8601 UTC. Server-set, not writable by clients.
390
+ source_updated_at:
391
+ type: string
392
+ format: date-time
393
+ readOnly: true
394
+ example: "2024-08-12T12:40:30.000Z"
395
+ description: >-
396
+ Timestamp of the most recent update in the upstream CMS (Strapi).
397
+ ISO 8601 UTC. Server-set, not writable by clients.
398
+ source_published_at:
399
+ type: string
400
+ format: date-time
401
+ readOnly: true
402
+ example: "2024-08-12T13:00:00.000Z"
403
+ description: >-
404
+ Timestamp when the record was published in the upstream CMS
405
+ (Strapi). ISO 8601 UTC. Server-set, not writable by clients.
406
+
407
+ ElementBase:
408
+ type: object
409
+ description: >-
410
+ Writable base fields shared by all FYPR element types. No id or timestamps.
411
+ Composed via allOf by each typed element schema.
412
+ required:
413
+ - document_id
414
+ - kind
415
+ properties:
416
+ document_id:
417
+ type: string
418
+ nullable: false
419
+ example: "abc123def456"
420
+ description: >-
421
+ Unique document identifier sourced from the upstream CMS (Strapi).
422
+ Used as the stable external reference for deduplication.
423
+ uid:
424
+ type: string
425
+ format: uuid
426
+ nullable: true
427
+ example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
428
+ description: >-
429
+ Optional external UUID assigned to the physical element by the
430
+ field operations team. May be null for elements not yet assigned.
431
+ kind:
432
+ type: string
433
+ nullable: false
434
+ enum:
435
+ - totem
436
+ - information_panel
437
+ - display_case
438
+ - obelisk
439
+ - signpost
440
+ example: "totem"
441
+ description: >-
442
+ Discriminator field identifying the element type. Determines which
443
+ typed schema applies (Totem, InformationPanel, DisplayCase, Obelisk,
444
+ Signpost).
445
+ name:
446
+ type: string
447
+ nullable: true
448
+ example: "Totem Palackeho namesti"
449
+ description: Human-readable name of the element. May be null.
450
+ state:
451
+ type: string
452
+ nullable: true
453
+ example: "REALIZED"
454
+ description: >-
455
+ Lifecycle state of the element (e.g. PLANNED, IN_PROGRESS,
456
+ REALIZED). Sourced from CMS. May be null.
457
+ owner:
458
+ type: string
459
+ nullable: true
460
+ example: "ROPID"
461
+ description: >-
462
+ Organization or entity that owns the element. May be null.
463
+ manager:
464
+ type: string
465
+ nullable: true
466
+ example: "THMP"
467
+ description: >-
468
+ Organization or entity that manages the element. May be null.
469
+ city_district:
470
+ type: string
471
+ nullable: true
472
+ example: "Praha 6"
473
+ description: >-
474
+ Prague city district where the element is physically located.
475
+ May be null.
476
+ lat:
477
+ type: number
478
+ format: double
479
+ nullable: true
480
+ example: 50.0755
481
+ description: >-
482
+ WGS-84 latitude coordinate of the element's installation site.
483
+ May be null if coordinates are not yet surveyed.
484
+ lon:
485
+ type: number
486
+ format: double
487
+ nullable: true
488
+ example: 14.4378
489
+ description: >-
490
+ WGS-84 longitude coordinate of the element's installation site.
491
+ May be null if coordinates are not yet surveyed.
492
+ map_link:
493
+ type: string
494
+ nullable: true
495
+ example: "https://mapy.cz/s/example"
496
+ description: >-
497
+ URL to an external map view showing the element location.
498
+ May be null.
499
+ planned_year_of_realization:
500
+ type: string
501
+ nullable: true
502
+ example: "2025"
503
+ description: >-
504
+ Year in which the element is planned to be realized or installed.
505
+ Stored as string to accommodate partial or estimated values.
506
+ May be null.
507
+ note:
508
+ type: string
509
+ nullable: true
510
+ example: "Installed near bus stop exit B."
511
+ description: >-
512
+ Free-text operational note attached to the element by field staff.
513
+ May be null.
514
+ handover:
515
+ type: boolean
516
+ nullable: true
517
+ example: true
518
+ description: >-
519
+ Indicates whether the element has been handed over to the
520
+ maintenance team. May be null if handover status is unknown.
521
+ handover_date:
522
+ type: string
523
+ format: date
524
+ nullable: true
525
+ example: "2024-08-12"
526
+ description: >-
527
+ Date on which the element was formally handed over to the
528
+ maintenance team. ISO 8601 date. May be null.
529
+
169
530
  DisplayCase:
170
531
  description: >-
171
532
  Fully composed DisplayCase schema for list responses. Combines DisplayCaseBase
@@ -327,167 +688,6 @@ components:
327
688
  Scheduled cleaning frequency for the display case (e.g. daily,
328
689
  weekly, monthly). May be null if no cleaning schedule is set.
329
690
 
330
- ElementBase:
331
- type: object
332
- description: >-
333
- Writable base fields shared by all FYPR element types. No id or timestamps.
334
- Composed via allOf by each typed element schema.
335
- required:
336
- - document_id
337
- - kind
338
- properties:
339
- document_id:
340
- type: string
341
- nullable: false
342
- example: "abc123def456"
343
- description: >-
344
- Unique document identifier sourced from the upstream CMS (Strapi).
345
- Used as the stable external reference for deduplication.
346
- uid:
347
- type: string
348
- format: uuid
349
- nullable: true
350
- example: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
351
- description: >-
352
- Optional external UUID assigned to the physical element by the
353
- field operations team. May be null for elements not yet assigned.
354
- kind:
355
- type: string
356
- nullable: false
357
- enum:
358
- - totem
359
- - information_panel
360
- - display_case
361
- - obelisk
362
- - signpost
363
- example: "totem"
364
- description: >-
365
- Discriminator field identifying the element type. Determines which
366
- typed schema applies (Totem, InformationPanel, DisplayCase, Obelisk,
367
- Signpost).
368
- name:
369
- type: string
370
- nullable: true
371
- example: "Totem Palackeho namesti"
372
- description: Human-readable name of the element. May be null.
373
- state:
374
- type: string
375
- nullable: true
376
- example: "REALIZED"
377
- description: >-
378
- Lifecycle state of the element (e.g. PLANNED, IN_PROGRESS,
379
- REALIZED). Sourced from CMS. May be null.
380
- owner:
381
- type: string
382
- nullable: true
383
- example: "ROPID"
384
- description: >-
385
- Organization or entity that owns the element. May be null.
386
- city_district:
387
- type: string
388
- nullable: true
389
- example: "Praha 6"
390
- description: >-
391
- Prague city district where the element is physically located.
392
- May be null.
393
- lat:
394
- type: number
395
- format: double
396
- nullable: true
397
- example: 50.0755
398
- description: >-
399
- WGS-84 latitude coordinate of the element's installation site.
400
- May be null if coordinates are not yet surveyed.
401
- lon:
402
- type: number
403
- format: double
404
- nullable: true
405
- example: 14.4378
406
- description: >-
407
- WGS-84 longitude coordinate of the element's installation site.
408
- May be null if coordinates are not yet surveyed.
409
- map_link:
410
- type: string
411
- nullable: true
412
- example: "https://mapy.cz/s/example"
413
- description: >-
414
- URL to an external map view showing the element location.
415
- May be null.
416
- planned_year_of_realization:
417
- type: string
418
- nullable: true
419
- example: "2025"
420
- description: >-
421
- Year in which the element is planned to be realized or installed.
422
- Stored as string to accommodate partial or estimated values.
423
- May be null.
424
- note:
425
- type: string
426
- nullable: true
427
- example: "Installed near bus stop exit B."
428
- description: >-
429
- Free-text operational note attached to the element by field staff.
430
- May be null.
431
- handover:
432
- type: boolean
433
- nullable: true
434
- example: true
435
- description: >-
436
- Indicates whether the element has been handed over to the
437
- maintenance team. May be null if handover status is unknown.
438
- handover_date:
439
- type: string
440
- format: date
441
- nullable: true
442
- example: "2024-08-12"
443
- description: >-
444
- Date on which the element was formally handed over to the
445
- maintenance team. ISO 8601 date. May be null.
446
-
447
- ElementId:
448
- type: string
449
- format: uuid
450
- example: "1b75c16b-d5a3-40ca-8560-5a7dc011655d"
451
- description: >-
452
- Unique identifier for an element. UUID v4, server-generated.
453
-
454
- ElementReadOnly:
455
- type: object
456
- description: >-
457
- Server-set fields that clients can only read. All properties carry
458
- readOnly: true. Composed via allOf into each typed element schema.
459
- properties:
460
- id:
461
- allOf:
462
- - $ref: "#/components/schemas/ElementId"
463
- readOnly: true
464
- description: >-
465
- Server-generated UUID primary key. Immutable after creation.
466
- source_created_at:
467
- type: string
468
- format: date-time
469
- readOnly: true
470
- example: "2024-01-15T08:30:00.000Z"
471
- description: >-
472
- Timestamp when the record was first created in the upstream CMS
473
- (Strapi). ISO 8601 UTC. Server-set, not writable by clients.
474
- source_updated_at:
475
- type: string
476
- format: date-time
477
- readOnly: true
478
- example: "2024-08-12T12:40:30.000Z"
479
- description: >-
480
- Timestamp of the most recent update in the upstream CMS (Strapi).
481
- ISO 8601 UTC. Server-set, not writable by clients.
482
- source_published_at:
483
- type: string
484
- format: date-time
485
- readOnly: true
486
- example: "2024-08-12T13:00:00.000Z"
487
- description: >-
488
- Timestamp when the record was published in the upstream CMS
489
- (Strapi). ISO 8601 UTC. Server-set, not writable by clients.
490
-
491
691
  InformationPanel:
492
692
  description: >-
493
693
  Fully composed information panel schema. Combines InformationPanelBase (writable
@@ -1041,6 +1241,41 @@ components:
1041
1241
  example: "SN-2024-00042"
1042
1242
  description: >-
1043
1243
  Manufacturer's serial number of the panel unit. May be null.
1244
+ producer:
1245
+ type: string
1246
+ nullable: true
1247
+ description: >-
1248
+ Name of the panel manufacturer. May be null.
1249
+ producer_contact_person:
1250
+ type: string
1251
+ nullable: true
1252
+ description: >-
1253
+ Contact person at the panel manufacturer. May be null.
1254
+ panel_technology:
1255
+ type: string
1256
+ nullable: true
1257
+ description: >-
1258
+ Display technology of the panel (e.g. LCD, e-paper). May be null.
1259
+ panel_model:
1260
+ type: string
1261
+ nullable: true
1262
+ description: >-
1263
+ Model designation of the panel unit. May be null.
1264
+ owner_contact:
1265
+ type: string
1266
+ nullable: true
1267
+ description: >-
1268
+ Contact information for the element owner. May be null.
1269
+ connectivity_internet:
1270
+ type: string
1271
+ nullable: true
1272
+ description: >-
1273
+ Internet connectivity type or provider for the panel. May be null.
1274
+ phone_number:
1275
+ type: string
1276
+ nullable: true
1277
+ description: >-
1278
+ Phone number associated with the panel's SIM or connectivity. May be null.
1044
1279
 
1045
1280
  Obelisk:
1046
1281
  description: >-
@@ -1696,13 +1931,13 @@ components:
1696
1931
  description: >-
1697
1932
  Construction or mounting type of the totem
1698
1933
  (e.g. STANDALONE, POLE_MOUNTED, WALL_MOUNTED). May be null.
1699
- price_without_vat:
1934
+ production_price_without_vat:
1700
1935
  type: number
1701
1936
  format: double
1702
1937
  nullable: true
1703
1938
  example: 320000.00
1704
1939
  description: >-
1705
- Total purchase price of this totem unit, excluding VAT
1940
+ Total production price of this totem unit, excluding VAT
1706
1941
  (Czech crowns). May be null.
1707
1942
  serial_number:
1708
1943
  type: string
@@ -1711,50 +1946,3 @@ components:
1711
1946
  description: >-
1712
1947
  Manufacturer's serial number of this totem unit.
1713
1948
  May be null.
1714
-
1715
- responses:
1716
- BadRequestError:
1717
- description: Bad request - invalid query parameters
1718
- content:
1719
- application/json:
1720
- schema:
1721
- type: object
1722
- properties:
1723
- error_message:
1724
- type: string
1725
- example: "Bad request"
1726
- nullable: false
1727
- error_status:
1728
- type: integer
1729
- example: 400
1730
- nullable: false
1731
- error_info:
1732
- type: string
1733
- example: "{...}"
1734
- nullable: true
1735
- required:
1736
- - error_message
1737
- - error_status
1738
-
1739
- UnauthorizedError:
1740
- description: API key is missing or invalid
1741
- headers:
1742
- WWW_Authenticate:
1743
- schema:
1744
- type: string
1745
- content:
1746
- application/json:
1747
- schema:
1748
- type: object
1749
- properties:
1750
- error_message:
1751
- type: string
1752
- example: "Unauthorized. Failed to authenticate user."
1753
- nullable: false
1754
- error_status:
1755
- type: integer
1756
- example: 401
1757
- nullable: false
1758
- required:
1759
- - error_message
1760
- - error_status