@reveldigital/mcp-graphql-proxy 2.1.0 → 2.3.0

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.
@@ -341,6 +341,23 @@ type Query {
341
341
  order: [AdHawkDeviceMediaImpressionsSortInput!] @cost(weight: "10")
342
342
  ): [AdHawkDeviceMediaImpressions] @cost(weight: "10")
343
343
  """
344
+ Gets alert rules for the authenticated account.
345
+
346
+
347
+ **Returns:**
348
+ List of alert rules
349
+ """
350
+ alertRule(
351
+ "Filter by specific alert rule IDs (encrypted)"
352
+ id: [String!]
353
+ "Filter by organization ID (encrypted)"
354
+ orgId: String
355
+ "Maximum number of items to return"
356
+ limit: Int
357
+ where: AlertRuleFilterInput @cost(weight: "10")
358
+ order: [AlertRuleSortInput!] @cost(weight: "10")
359
+ ): [AlertRule] @cost(weight: "10")
360
+ """
344
361
  Gets alerts for the authenticated account.
345
362
 
346
363
 
@@ -395,6 +412,20 @@ type Query {
395
412
  where: AuditEventFilterInput @cost(weight: "10")
396
413
  order: [AuditEventSortInput!] @cost(weight: "10")
397
414
  ): [AuditEvent!]! @cost(weight: "10")
415
+ """
416
+ Fetches a normalized dataset from a registered connector data source through the broker.
417
+ The caller never sends SQL; it references a datasetId on a
418
+ datasourceId plus validated params. The tenant is
419
+ resolved from the caller's API key / bearer, never supplied by the caller.
420
+ """
421
+ connectorData(
422
+ "The registered data source identifier."
423
+ datasourceId: String
424
+ "The registered dataset identifier on that source."
425
+ datasetId: String
426
+ "Optional validated parameters for the dataset (JSON object)."
427
+ params: [Any]
428
+ ): ConnectorData @cost(weight: "10")
398
429
  "Lists data tables in the account, with optional group filtering."
399
430
  dataTables(
400
431
  "Optional group ID to filter by"
@@ -438,6 +469,10 @@ type Query {
438
469
  inRange value is between from and to (inclusive)
439
470
  outOfRange value is outside [from, to]
440
471
 
472
+ Set operators (require a non-empty `values` array):
473
+ in value matches one of the entries in `values`
474
+ notIn value matches none of the entries in `values`
475
+
441
476
  No-value operators (no `value` / `from` / `to`):
442
477
  isEmpty column is null / empty string
443
478
  isNotEmpty column has a value
@@ -465,6 +500,7 @@ type Query {
465
500
  {"price": {"op": "gte", "value": 25}}
466
501
  {"name": {"op": "contains", "value": "pizza"}}
467
502
  {"score": {"op": "inRange", "from": 0, "to": 100}}
503
+ {"category": {"op": "in", "values": ["Entree", "Dessert"]}}
468
504
  {"deletedAt": {"op": "isEmpty"}}
469
505
  {"publishAt": {"op": "beforeNow"}}
470
506
 
@@ -623,6 +659,17 @@ type Query {
623
659
  }
624
660
 
625
661
  type Mutation {
662
+ """
663
+ Create a new alert rule.
664
+ Example: An AI agent creates a rule that fires when a lobby display goes offline.
665
+ """
666
+ createAlertRule(input: AlertRuleInput): AlertRuleMutationResult
667
+ @cost(weight: "10")
668
+ "Update an existing alert rule."
669
+ updateAlertRule(input: AlertRuleInput): AlertRuleMutationResult
670
+ @cost(weight: "10")
671
+ "Delete an alert rule."
672
+ deleteAlertRule(id: String): AlertRuleMutationResult @cost(weight: "10")
626
673
  """
627
674
  Create a new data table with the specified column schema.
628
675
  Example: Create a menu board table with columns for item name, price, description, and image.
@@ -779,6 +826,60 @@ type Mutation {
779
826
  """
780
827
  reorderPlaylistSources(input: ReorderPlaylistSourcesInput): PlaylistMutationResult
781
828
  @cost(weight: "10")
829
+ """
830
+ Update a template's properties (name, tags, dimensions, colors, etc.).
831
+ Example: AI adjusts template dimensions to optimize for a new display resolution.
832
+ """
833
+ updateTemplate(input: UpdateTemplateInput): TemplateMutationResult
834
+ @cost(weight: "10")
835
+ """
836
+ Add a new module to a template.
837
+ Example: AI adds a new weather module to show real-time conditions in the corner.
838
+ """
839
+ addTemplateModule(input: AddTemplateModuleInput): ModuleMutationResult
840
+ @cost(weight: "10")
841
+ """
842
+ Update a module within a template.
843
+ Example: AI repositions a module based on engagement analytics, or changes the assigned playlist.
844
+ """
845
+ updateTemplateModule(input: UpdateTemplateModuleInput): ModuleMutationResult
846
+ @cost(weight: "10")
847
+ """
848
+ Remove a module from a template.
849
+ Example: AI removes an underperforming ad module to optimize content flow.
850
+ """
851
+ removeTemplateModule(input: RemoveTemplateModuleInput): ModuleMutationResult
852
+ @cost(weight: "10")
853
+ """
854
+ Reorder modules within a template by updating their sequence/z-order.
855
+ Example: AI reorders modules to bring important content to the front based on viewer engagement.
856
+ """
857
+ reorderTemplateModules(input: ReorderTemplateModulesInput): TemplateMutationResult
858
+ @cost(weight: "10")
859
+ """
860
+ Batch update multiple modules in a template at once.
861
+ Example: AI repositions all modules to create a new layout optimized for viewer attention.
862
+ """
863
+ batchUpdateTemplateModules(input: BatchUpdateTemplateModulesInput): BatchModuleMutationResult
864
+ @cost(weight: "10")
865
+ """
866
+ Set all options for a module (replaces existing options).
867
+ Example: AI configures a weather module with location, units, and API key settings.
868
+ """
869
+ setModuleOptions(input: SetModuleOptionsInput): ModuleMutationResult
870
+ @cost(weight: "10")
871
+ """
872
+ Add or update a single module option.
873
+ Example: AI updates the refresh interval for a web module.
874
+ """
875
+ upsertModuleOption(input: UpsertModuleOptionInput): ModuleOptionMutationResult
876
+ @cost(weight: "10")
877
+ """
878
+ Remove a module option by name.
879
+ Example: AI removes an outdated configuration setting from a module.
880
+ """
881
+ removeModuleOption(input: RemoveModuleOptionInput): ModuleOptionMutationResult
882
+ @cost(weight: "10")
782
883
  }
783
884
 
784
885
  "Aggregated audience metrics for a device over a time period"
@@ -1229,6 +1330,67 @@ type AlertDevice {
1229
1330
  name: String
1230
1331
  }
1231
1332
 
1333
+ "Full alert rule model. An alert rule defines the conditions that trigger alerts."
1334
+ type AlertRule {
1335
+ "The alert rule id (encrypted)"
1336
+ id: String
1337
+ "The name of the alert rule"
1338
+ name: String
1339
+ """
1340
+ The rule set configuration as a JSON string. See AlertRuleInput.ruleSet for the full
1341
+ schema, supported condition types, operators, and value semantics.
1342
+ """
1343
+ ruleSet: String
1344
+ """
1345
+ Indicates whether the alert rule is currently enabled and will be evaluated.
1346
+ When false, the rule is stored but never triggers alerts.
1347
+ """
1348
+ isEnabled: Boolean
1349
+ "The look-back / evaluation period, in minutes, used by time-window based conditions."
1350
+ period: Int
1351
+ """
1352
+ A legacy scalar threshold value retained for backward compatibility. Thresholds for new
1353
+ rules are expressed inside the rule set (AlertRuleInput.ruleSet) via each item's "value" instead.
1354
+ """
1355
+ threshold: Int
1356
+ "Optional HTTPS webhook URL that is invoked (HTTP POST) when the rule triggers."
1357
+ webhookUrl: String
1358
+ """
1359
+ When true, the rule is evaluated against every device in the account and
1360
+ DeviceIds is empty. When false, only DeviceIds are evaluated.
1361
+ """
1362
+ allDevices: Boolean
1363
+ """
1364
+ When true, all users in the account are notified and UserIds is empty.
1365
+ When false, only the users in UserIds are notified.
1366
+ """
1367
+ allUsers: Boolean
1368
+ "The date and time the alert rule was created"
1369
+ createdOn: DateTime
1370
+ "The date and time the alert rule was last updated"
1371
+ updatedOn: DateTime
1372
+ """
1373
+ The devices explicitly associated with the rule (encrypted ids).
1374
+ Empty when AllDevices is true.
1375
+ """
1376
+ deviceIds: [String]
1377
+ """
1378
+ The users explicitly notified by the rule (encrypted ids).
1379
+ Empty when AllUsers is true.
1380
+ """
1381
+ userIds: [String]
1382
+ }
1383
+
1384
+ "Result from an alert rule mutation."
1385
+ type AlertRuleMutationResult {
1386
+ "Whether the operation was successful."
1387
+ success: Boolean!
1388
+ "The created or updated alert rule."
1389
+ alertRule: AlertRule
1390
+ "Error message if the operation failed."
1391
+ error: String
1392
+ }
1393
+
1232
1394
  "Alert rule summary (minimal info included with alerts)"
1233
1395
  type AlertRuleSummary {
1234
1396
  "The alert rule id (encrypted)"
@@ -1299,6 +1461,18 @@ type BatchDeleteDataTableRowsResult {
1299
1461
  error: String
1300
1462
  }
1301
1463
 
1464
+ "Result from batch updating multiple modules."
1465
+ type BatchModuleMutationResult {
1466
+ "Total number of modules attempted."
1467
+ totalModules: Int!
1468
+ "Number of successful updates."
1469
+ successCount: Int!
1470
+ "Number of failed updates."
1471
+ failureCount: Int!
1472
+ "Per-module results."
1473
+ results: [ModuleMutationResult]
1474
+ }
1475
+
1302
1476
  type BatchRowResultModel {
1303
1477
  rowId: String
1304
1478
  success: Boolean!
@@ -1393,6 +1567,12 @@ type BulkCommandResult {
1393
1567
  results: [CommandResult]
1394
1568
  }
1395
1569
 
1570
+ "Describes a single column in a ConnectorData result."
1571
+ type ColumnMeta {
1572
+ name: String
1573
+ type: String
1574
+ }
1575
+
1396
1576
  "Result from sending commands to a device."
1397
1577
  type CommandResult {
1398
1578
  "Whether the command was successfully queued."
@@ -1420,6 +1600,25 @@ type Condition {
1420
1600
  value4: String
1421
1601
  }
1422
1602
 
1603
+ """
1604
+ A normalized, source-agnostic dataset returned by the connector broker. The same shape
1605
+ carries SQL rows, HTTP-JSON rows and RSS items alike. Mirrors the broker HTTP contract
1606
+ (POST {BrokerUrl}/v1/connector-data).
1607
+ """
1608
+ type ConnectorData {
1609
+ "The columns, in row order."
1610
+ columns: [ColumnMeta]
1611
+ """
1612
+ Row-major data; each row is an array of cell values aligned to Columns.
1613
+ Exposed through the JSON scalar so arbitrary SQL/JSON/RSS cell values flow through.
1614
+ """
1615
+ rows: [[Any]]
1616
+ "Epoch milliseconds at which the broker last fetched the underlying data."
1617
+ fetchedAt: Long!
1618
+ "True when the broker served a cached copy while revalidating (stale-while-revalidate)."
1619
+ stale: Boolean!
1620
+ }
1621
+
1423
1622
  "Result from creating media from a URL."
1424
1623
  type CreateMediaResult {
1425
1624
  "Whether the upload was successful."
@@ -1482,8 +1681,12 @@ type DataTableRowModel {
1482
1681
  data: Any
1483
1682
  updatedAt: DateTime!
1484
1683
  """
1485
- Optimistic concurrency token. Pass this value back as `eTag` in
1486
- `updateDataTableRow` to ensure the row hasn't been changed since you read it.
1684
+ Optimistic concurrency token. To ensure the row hasn't changed since you read it,
1685
+ send this value back as the If-Match request header on the REST
1686
+ updateDataTableRow (HTTP PUT) call, or as the eTag input field on
1687
+ the GraphQL updateDataTableRow mutation. A stale token results in
1688
+ 409 Conflict (REST) or a mutation error (GraphQL). Note: the REST endpoint does
1689
+ not read an eTag body property — it uses the If-Match header.
1487
1690
  """
1488
1691
  eTag: String
1489
1692
  }
@@ -1760,28 +1963,73 @@ type Media {
1760
1963
  }
1761
1964
 
1762
1965
  """
1763
- Represents a module (zone/region) within a template layout.
1764
- Modules define rectangular areas on screen where content from playlists is displayed.
1966
+ Represents a module (also called a zone or region) within a template layout.
1967
+ Modules/zones define rectangular areas on screen where content from playlists is displayed.
1968
+ The terms "module" and "zone" are used interchangeably throughout the API.
1765
1969
  """
1766
1970
  type Module {
1767
- "Module id"
1971
+ "Module/zone unique identifier"
1768
1972
  id: String
1769
- "Module name"
1973
+ "Module/zone name"
1770
1974
  name: String
1771
- "Module type"
1975
+ "Module/zone type (e.g., 'Playlist', 'Clock', 'Weather', 'Ticker', 'Web')"
1772
1976
  type: String
1773
- "Left position"
1977
+ "Left position in pixels from the top-left corner of the template"
1774
1978
  left: Int
1775
- "Top position"
1979
+ "Top position in pixels from the top-left corner of the template"
1776
1980
  top: Int
1777
- "Width"
1981
+ "Width of the module/zone in pixels"
1778
1982
  width: Int
1779
- "Height"
1983
+ "Height of the module/zone in pixels"
1780
1984
  height: Int
1781
- "Playlist assigned to this module"
1985
+ """
1986
+ Playlist ID assigned to this module/zone.
1987
+ Determines what content is displayed in this area of the screen.
1988
+ """
1782
1989
  playlistId: String
1783
- "Sequence or Z-Order"
1990
+ """
1991
+ Sequence or Z-order for overlapping modules/zones.
1992
+ Higher values appear in front of lower values.
1993
+ """
1784
1994
  sequence: Int
1995
+ """
1996
+ Module/zone configuration options (key-value pairs).
1997
+ Used to store type-specific settings like timezone for Clock zones, location for Weather zones, etc.
1998
+ """
1999
+ options: [ModuleOption]
2000
+ }
2001
+
2002
+ "Result from a module mutation within a template."
2003
+ type ModuleMutationResult {
2004
+ "Whether the operation was successful."
2005
+ success: Boolean!
2006
+ "The created or updated module."
2007
+ module: Module
2008
+ "Error message if the operation failed."
2009
+ error: String
2010
+ }
2011
+
2012
+ """
2013
+ Represents a configuration option for a module/zone (key-value pair).
2014
+ Module/zone options store settings specific to each module/zone type.
2015
+ """
2016
+ type ModuleOption {
2017
+ "Module/zone option unique identifier"
2018
+ id: String
2019
+ "Option name/key (e.g., 'timezone', 'location', 'refresh_interval')"
2020
+ name: String
2021
+ "Option value (stored as string, parse as needed for the specific option)"
2022
+ value: String
2023
+ }
2024
+
2025
+ "Result from a module option mutation."
2026
+ type ModuleOptionMutationResult {
2027
+ "Whether the operation was successful."
2028
+ success: Boolean!
2029
+ "The created or updated module option."
2030
+ option: ModuleOption
2031
+ "Error message if the operation failed."
2032
+ error: String
1785
2033
  }
1786
2034
 
1787
2035
  """
@@ -2126,12 +2374,26 @@ type Template {
2126
2374
  width: Int
2127
2375
  "Height"
2128
2376
  height: Int
2129
- "Orientation (Landscape, Portrait, Landscape Reversed, Portrait Reversed)"
2377
+ "Display orientation: Landscape, Portrait, Landscape Reversed, or Portrait Reversed"
2130
2378
  orientation: Int
2131
- "Modules or zones"
2379
+ """
2380
+ Collection of modules/zones that define content areas within this template.
2381
+ Each module/zone represents a rectangular region where content from a playlist is displayed.
2382
+ The terms "module" and "zone" are used interchangeably.
2383
+ """
2132
2384
  modules: [Module]
2133
2385
  }
2134
2386
 
2387
+ "Result from a template mutation."
2388
+ type TemplateMutationResult {
2389
+ "Whether the operation was successful."
2390
+ success: Boolean!
2391
+ "The updated template."
2392
+ template: Template
2393
+ "Error message if the operation failed."
2394
+ error: String
2395
+ }
2396
+
2135
2397
  "Result from updating media metadata."
2136
2398
  type UpdateMediaResult {
2137
2399
  "Whether the operation was successful."
@@ -2211,6 +2473,14 @@ input AddPlaylistSourceInput {
2211
2473
  position: Int
2212
2474
  }
2213
2475
 
2476
+ "Input for adding a module to a template."
2477
+ input AddTemplateModuleInput {
2478
+ "The template ID to add the module to."
2479
+ templateId: String
2480
+ "The module to add."
2481
+ module: ModuleInput
2482
+ }
2483
+
2214
2484
  "Aggregated audience metrics for a device over a time period"
2215
2485
  input AdHawkAudienceMetricsFilterInput {
2216
2486
  and: [AdHawkAudienceMetricsFilterInput!]
@@ -3113,6 +3383,142 @@ input AlertFilterInput {
3113
3383
  isActive: BooleanOperationFilterInput
3114
3384
  }
3115
3385
 
3386
+ "Full alert rule model. An alert rule defines the conditions that trigger alerts."
3387
+ input AlertRuleFilterInput {
3388
+ and: [AlertRuleFilterInput!]
3389
+ or: [AlertRuleFilterInput!]
3390
+ "The alert rule id (encrypted)"
3391
+ id: StringOperationFilterInput
3392
+ "The name of the alert rule"
3393
+ name: StringOperationFilterInput
3394
+ """
3395
+ The rule set configuration as a JSON string. See AlertRuleInput.ruleSet for the full
3396
+ schema, supported condition types, operators, and value semantics.
3397
+ """
3398
+ ruleSet: StringOperationFilterInput
3399
+ """
3400
+ Indicates whether the alert rule is currently enabled and will be evaluated.
3401
+ When false, the rule is stored but never triggers alerts.
3402
+ """
3403
+ isEnabled: BooleanOperationFilterInput
3404
+ "The look-back / evaluation period, in minutes, used by time-window based conditions."
3405
+ period: IntOperationFilterInput
3406
+ """
3407
+ A legacy scalar threshold value retained for backward compatibility. Thresholds for new
3408
+ rules are expressed inside the rule set (AlertRuleInput.ruleSet) via each item's "value" instead.
3409
+ """
3410
+ threshold: IntOperationFilterInput
3411
+ "Optional HTTPS webhook URL that is invoked (HTTP POST) when the rule triggers."
3412
+ webhookUrl: StringOperationFilterInput
3413
+ """
3414
+ When true, the rule is evaluated against every device in the account and
3415
+ DeviceIds is empty. When false, only DeviceIds are evaluated.
3416
+ """
3417
+ allDevices: BooleanOperationFilterInput
3418
+ """
3419
+ When true, all users in the account are notified and UserIds is empty.
3420
+ When false, only the users in UserIds are notified.
3421
+ """
3422
+ allUsers: BooleanOperationFilterInput
3423
+ "The date and time the alert rule was created"
3424
+ createdOn: DateTimeOperationFilterInput
3425
+ "The date and time the alert rule was last updated"
3426
+ updatedOn: DateTimeOperationFilterInput
3427
+ """
3428
+ The devices explicitly associated with the rule (encrypted ids).
3429
+ Empty when AllDevices is true.
3430
+ """
3431
+ deviceIds: ListStringOperationFilterInput
3432
+ """
3433
+ The users explicitly notified by the rule (encrypted ids).
3434
+ Empty when AllUsers is true.
3435
+ """
3436
+ userIds: ListStringOperationFilterInput
3437
+ }
3438
+
3439
+ "GraphQL input for creating or updating an alert rule."
3440
+ input AlertRuleInput {
3441
+ "The alert rule id (encrypted). Required for update, omitted for create."
3442
+ id: String
3443
+ "The name of the alert rule."
3444
+ name: String
3445
+ """
3446
+ The rule set configuration, supplied as a JSON string (serialized JSON, not a nested object).
3447
+ A rule set is an array of condition groups combined with logical AND; the items within each group
3448
+ are combined with logical OR. Each item is { "type", "op", "value" }: "type" (required, case-sensitive)
3449
+ is one of TimeOffline, LastUpdate, MemoryUsage, CpuUsage, DiskUsage, NoContent, BytesTxDay, BytesRxDay,
3450
+ BytesTotalDay, BytesTxPeriod, BytesRxPeriod, BytesTotalPeriod, ClockSkew, DisplayDetected, BatteryVoltage,
3451
+ BatteryPercentage, or SystemTemperature; "op" (optional) is EQ, NE, GT, LT, GTE, or LTE (defaults to EQ);
3452
+ "value" (required) is a non-empty array of numbers. Example:
3453
+ [{"items":[{"type":"CpuUsage","op":"GTE","value":[90]}]}]. Invalid rule sets are rejected. Null or empty
3454
+ leaves the rule unevaluated.
3455
+ """
3456
+ ruleSet: String
3457
+ "Indicates if the alert rule is enabled."
3458
+ isEnabled: Boolean
3459
+ """
3460
+ The look-back / evaluation period, in minutes, used by time-window based conditions
3461
+ such as NoContent. Ignored by conditions that read the current value.
3462
+ """
3463
+ period: Int
3464
+ """
3465
+ A legacy scalar threshold value retained for backward compatibility. New rules should
3466
+ express thresholds inside RuleSet via each item's "value" instead.
3467
+ """
3468
+ threshold: Int
3469
+ "Optional webhook URL that is invoked when the rule triggers."
3470
+ webhookUrl: String
3471
+ "If true, the rule applies to all devices in the account."
3472
+ allDevices: Boolean
3473
+ "If true, the rule notifies all users in the account."
3474
+ allUsers: Boolean
3475
+ "The devices to associate with the rule (encrypted ids). Ignored when AllDevices is true."
3476
+ deviceIds: [String]
3477
+ "The users to notify (encrypted ids). Ignored when AllUsers is true."
3478
+ userIds: [String]
3479
+ }
3480
+
3481
+ "Full alert rule model. An alert rule defines the conditions that trigger alerts."
3482
+ input AlertRuleSortInput {
3483
+ "The alert rule id (encrypted)"
3484
+ id: SortEnumType @cost(weight: "10")
3485
+ "The name of the alert rule"
3486
+ name: SortEnumType @cost(weight: "10")
3487
+ """
3488
+ The rule set configuration as a JSON string. See AlertRuleInput.ruleSet for the full
3489
+ schema, supported condition types, operators, and value semantics.
3490
+ """
3491
+ ruleSet: SortEnumType @cost(weight: "10")
3492
+ """
3493
+ Indicates whether the alert rule is currently enabled and will be evaluated.
3494
+ When false, the rule is stored but never triggers alerts.
3495
+ """
3496
+ isEnabled: SortEnumType @cost(weight: "10")
3497
+ "The look-back / evaluation period, in minutes, used by time-window based conditions."
3498
+ period: SortEnumType @cost(weight: "10")
3499
+ """
3500
+ A legacy scalar threshold value retained for backward compatibility. Thresholds for new
3501
+ rules are expressed inside the rule set (AlertRuleInput.ruleSet) via each item's "value" instead.
3502
+ """
3503
+ threshold: SortEnumType @cost(weight: "10")
3504
+ "Optional HTTPS webhook URL that is invoked (HTTP POST) when the rule triggers."
3505
+ webhookUrl: SortEnumType @cost(weight: "10")
3506
+ """
3507
+ When true, the rule is evaluated against every device in the account and
3508
+ DeviceIds is empty. When false, only DeviceIds are evaluated.
3509
+ """
3510
+ allDevices: SortEnumType @cost(weight: "10")
3511
+ """
3512
+ When true, all users in the account are notified and UserIds is empty.
3513
+ When false, only the users in UserIds are notified.
3514
+ """
3515
+ allUsers: SortEnumType @cost(weight: "10")
3516
+ "The date and time the alert rule was created"
3517
+ createdOn: SortEnumType @cost(weight: "10")
3518
+ "The date and time the alert rule was last updated"
3519
+ updatedOn: SortEnumType @cost(weight: "10")
3520
+ }
3521
+
3116
3522
  "Alert rule summary (minimal info included with alerts)"
3117
3523
  input AlertRuleSummaryFilterInput {
3118
3524
  and: [AlertRuleSummaryFilterInput!]
@@ -3262,6 +3668,14 @@ input BatchDeleteDataTableRowsInput {
3262
3668
  rowIds: [String]
3263
3669
  }
3264
3670
 
3671
+ "Input for batch updating multiple modules in a template."
3672
+ input BatchUpdateTemplateModulesInput {
3673
+ "The template ID."
3674
+ templateId: String
3675
+ "List of module updates to apply."
3676
+ modules: [UpdateTemplateModuleInput]
3677
+ }
3678
+
3265
3679
  """
3266
3680
  Represents Bluetooth Low Energy (BLE) beacon configuration for a device.
3267
3681
  Beacons enable proximity-based interactions, allowing mobile devices to detect nearby digital signage
@@ -3956,6 +4370,13 @@ input ListFilterInputTypeOfModuleFilterInput {
3956
4370
  any: Boolean @cost(weight: "10")
3957
4371
  }
3958
4372
 
4373
+ input ListFilterInputTypeOfModuleOptionFilterInput {
4374
+ all: ModuleOptionFilterInput @cost(weight: "10")
4375
+ none: ModuleOptionFilterInput @cost(weight: "10")
4376
+ some: ModuleOptionFilterInput @cost(weight: "10")
4377
+ any: Boolean @cost(weight: "10")
4378
+ }
4379
+
3959
4380
  input ListFilterInputTypeOfScheduleDeviceFilterInput {
3960
4381
  all: ScheduleDeviceFilterInput @cost(weight: "10")
3961
4382
  none: ScheduleDeviceFilterInput @cost(weight: "10")
@@ -4148,30 +4569,96 @@ input MediaSortInput {
4148
4569
  }
4149
4570
 
4150
4571
  """
4151
- Represents a module (zone/region) within a template layout.
4152
- Modules define rectangular areas on screen where content from playlists is displayed.
4572
+ Represents a module (also called a zone or region) within a template layout.
4573
+ Modules/zones define rectangular areas on screen where content from playlists is displayed.
4574
+ The terms "module" and "zone" are used interchangeably throughout the API.
4153
4575
  """
4154
4576
  input ModuleFilterInput {
4155
4577
  and: [ModuleFilterInput!]
4156
4578
  or: [ModuleFilterInput!]
4157
- "Module id"
4579
+ "Module/zone unique identifier"
4158
4580
  id: StringOperationFilterInput
4159
- "Module name"
4581
+ "Module/zone name"
4160
4582
  name: StringOperationFilterInput
4161
- "Module type"
4583
+ "Module/zone type (e.g., 'Playlist', 'Clock', 'Weather', 'Ticker', 'Web')"
4162
4584
  type: StringOperationFilterInput
4163
- "Left position"
4585
+ "Left position in pixels from the top-left corner of the template"
4164
4586
  left: IntOperationFilterInput
4165
- "Top position"
4587
+ "Top position in pixels from the top-left corner of the template"
4166
4588
  top: IntOperationFilterInput
4167
- "Width"
4589
+ "Width of the module/zone in pixels"
4168
4590
  width: IntOperationFilterInput
4169
- "Height"
4591
+ "Height of the module/zone in pixels"
4170
4592
  height: IntOperationFilterInput
4171
- "Playlist assigned to this module"
4593
+ """
4594
+ Playlist ID assigned to this module/zone.
4595
+ Determines what content is displayed in this area of the screen.
4596
+ """
4172
4597
  playlistId: StringOperationFilterInput
4173
- "Sequence or Z-Order"
4598
+ """
4599
+ Sequence or Z-order for overlapping modules/zones.
4600
+ Higher values appear in front of lower values.
4601
+ """
4174
4602
  sequence: IntOperationFilterInput
4603
+ """
4604
+ Module/zone configuration options (key-value pairs).
4605
+ Used to store type-specific settings like timezone for Clock zones, location for Weather zones, etc.
4606
+ """
4607
+ options: ListFilterInputTypeOfModuleOptionFilterInput
4608
+ }
4609
+
4610
+ "Input for a module within a template - used when adding modules."
4611
+ input ModuleInput {
4612
+ "Module name."
4613
+ name: String
4614
+ "Module type (e.g., 'Playlist', 'Clock', 'Weather', 'Ticker', 'Web')."
4615
+ type: String
4616
+ "Left position in pixels."
4617
+ left: Int
4618
+ "Top position in pixels."
4619
+ top: Int
4620
+ "Width in pixels."
4621
+ width: Int
4622
+ "Height in pixels."
4623
+ height: Int
4624
+ "Playlist ID assigned to this module."
4625
+ playlistId: String
4626
+ "Z-order/sequence for overlapping modules."
4627
+ sequence: Int
4628
+ }
4629
+
4630
+ """
4631
+ Represents a configuration option for a module/zone (key-value pair).
4632
+ Module/zone options store settings specific to each module/zone type.
4633
+ """
4634
+ input ModuleOptionFilterInput {
4635
+ and: [ModuleOptionFilterInput!]
4636
+ or: [ModuleOptionFilterInput!]
4637
+ "Module/zone option unique identifier"
4638
+ id: StringOperationFilterInput
4639
+ "Option name/key (e.g., 'timezone', 'location', 'refresh_interval')"
4640
+ name: StringOperationFilterInput
4641
+ "Option value (stored as string, parse as needed for the specific option)"
4642
+ value: StringOperationFilterInput
4643
+ }
4644
+
4645
+ """
4646
+ Request model for creating or updating a module/zone option.
4647
+ Used to set configuration values for specific module/zone types.
4648
+ """
4649
+ input ModuleOptionRequestInput {
4650
+ "Option name/key (e.g., 'timezone', 'location', 'url')"
4651
+ name: String
4652
+ "Option value (string representation that will be parsed based on the option type)"
4653
+ value: String
4654
+ }
4655
+
4656
+ "Represents a module ID and its new sequence number for reordering."
4657
+ input ModuleSequenceInput {
4658
+ "The module ID."
4659
+ moduleId: String
4660
+ "The new sequence/z-order value."
4661
+ sequence: Int!
4175
4662
  }
4176
4663
 
4177
4664
  input NullableOfAdHawkAgeRangeOperationFilterInput {
@@ -4401,6 +4888,24 @@ input PlaylistTypeOperationFilterInput {
4401
4888
  nin: [PlaylistType!] @cost(weight: "10")
4402
4889
  }
4403
4890
 
4891
+ "Input for removing a module option by name."
4892
+ input RemoveModuleOptionInput {
4893
+ "The template ID."
4894
+ templateId: String
4895
+ "The module ID."
4896
+ moduleId: String
4897
+ "The option name to remove."
4898
+ optionName: String
4899
+ }
4900
+
4901
+ "Input for removing a module from a template."
4902
+ input RemoveTemplateModuleInput {
4903
+ "The template ID containing the module."
4904
+ templateId: String
4905
+ "The module ID to remove."
4906
+ moduleId: String
4907
+ }
4908
+
4404
4909
  "Input for reordering rows in a data table."
4405
4910
  input ReorderDataTableRowsInput {
4406
4911
  "The table ID containing the rows."
@@ -4417,6 +4922,14 @@ input ReorderPlaylistSourcesInput {
4417
4922
  sourceIds: [String]
4418
4923
  }
4419
4924
 
4925
+ "Input for reordering modules within a template."
4926
+ input ReorderTemplateModulesInput {
4927
+ "The template ID."
4928
+ templateId: String
4929
+ "List of module IDs with their new sequence numbers."
4930
+ moduleSequences: [ModuleSequenceInput]
4931
+ }
4932
+
4420
4933
  "Input for rolling back a row to a previous version."
4421
4934
  input RollbackDataTableRowInput {
4422
4935
  "The table ID containing the row."
@@ -4647,6 +5160,16 @@ input ScheduleTypeOperationFilterInput {
4647
5160
  nin: [ScheduleType!] @cost(weight: "10")
4648
5161
  }
4649
5162
 
5163
+ "Input for setting all options for a module (replaces existing)."
5164
+ input SetModuleOptionsInput {
5165
+ "The template ID."
5166
+ templateId: String
5167
+ "The module ID."
5168
+ moduleId: String
5169
+ "List of options to set (replaces all existing options)."
5170
+ options: [ModuleOptionRequestInput]
5171
+ }
5172
+
4650
5173
  """
4651
5174
  Represents a content item within a playlist. A source defines what content to display
4652
5175
  and for how long. Sources can reference media files, templates, embedded playlists, URLs, or other content types.
@@ -4764,9 +5287,13 @@ input TemplateFilterInput {
4764
5287
  width: IntOperationFilterInput
4765
5288
  "Height"
4766
5289
  height: IntOperationFilterInput
4767
- "Orientation (Landscape, Portrait, Landscape Reversed, Portrait Reversed)"
5290
+ "Display orientation: Landscape, Portrait, Landscape Reversed, or Portrait Reversed"
4768
5291
  orientation: IntOperationFilterInput
4769
- "Modules or zones"
5292
+ """
5293
+ Collection of modules/zones that define content areas within this template.
5294
+ Each module/zone represents a rectangular region where content from a playlist is displayed.
5295
+ The terms "module" and "zone" are used interchangeably.
5296
+ """
4770
5297
  modules: ListFilterInputTypeOfModuleFilterInput
4771
5298
  }
4772
5299
 
@@ -4801,7 +5328,7 @@ input TemplateSortInput {
4801
5328
  width: SortEnumType @cost(weight: "10")
4802
5329
  "Height"
4803
5330
  height: SortEnumType @cost(weight: "10")
4804
- "Orientation (Landscape, Portrait, Landscape Reversed, Portrait Reversed)"
5331
+ "Display orientation: Landscape, Portrait, Landscape Reversed, or Portrait Reversed"
4805
5332
  orientation: SortEnumType @cost(weight: "10")
4806
5333
  }
4807
5334
 
@@ -4889,6 +5416,62 @@ input UpdatePlaylistSourceInput {
4889
5416
  source: SourceInput
4890
5417
  }
4891
5418
 
5419
+ "Input for updating a template's properties."
5420
+ input UpdateTemplateInput {
5421
+ "The template ID to update."
5422
+ templateId: String
5423
+ "Template name."
5424
+ name: String
5425
+ "Group ID to assign the template to."
5426
+ groupId: String
5427
+ "Tags (newline-delimited values stored in Description field)."
5428
+ tags: String
5429
+ "Template script for custom logic."
5430
+ script: String
5431
+ "Background color (e.g., '#000000')."
5432
+ backColor: String
5433
+ "Template width in pixels."
5434
+ width: Int
5435
+ "Template height in pixels."
5436
+ height: Int
5437
+ "Display orientation (0=Landscape, 1=Portrait, 2=Landscape Reversed, 3=Portrait Reversed)."
5438
+ orientation: Int
5439
+ }
5440
+
5441
+ "Input for updating an existing module within a template."
5442
+ input UpdateTemplateModuleInput {
5443
+ "The template ID containing the module."
5444
+ templateId: String
5445
+ "The module ID to update."
5446
+ moduleId: String
5447
+ "Module name."
5448
+ name: String
5449
+ "Module type."
5450
+ type: String
5451
+ "Left position in pixels."
5452
+ left: Int
5453
+ "Top position in pixels."
5454
+ top: Int
5455
+ "Width in pixels."
5456
+ width: Int
5457
+ "Height in pixels."
5458
+ height: Int
5459
+ "Playlist ID assigned to this module."
5460
+ playlistId: String
5461
+ "Z-order/sequence."
5462
+ sequence: Int
5463
+ }
5464
+
5465
+ "Input for upserting (create or update) a single module option."
5466
+ input UpsertModuleOptionInput {
5467
+ "The template ID."
5468
+ templateId: String
5469
+ "The module ID."
5470
+ moduleId: String
5471
+ "The option to create or update (matched by name)."
5472
+ option: ModuleOptionRequestInput
5473
+ }
5474
+
4892
5475
  "User model"
4893
5476
  input UserFilterInput {
4894
5477
  and: [UserFilterInput!]