[
  {
    "type": "alter_table",
    "description": "Spec 050 Kiosk API v1: add stores.configUpdatedAt. Config-version source for the /api/v1/config ETag and the config_changed write-through broadcast. NULL = never bumped (clients treat as cold). Only hoursLastUpdated existed before and it only tracks hours edits.",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'stores' AND COLUMN_NAME = 'configUpdatedAt'",
    "sql": "ALTER TABLE `stores` ADD COLUMN `configUpdatedAt` DATETIME NULL DEFAULT NULL COMMENT 'Spec 050: last time any kiosk-facing store config changed; drives /api/v1/config ETag + config_changed event. NULL = never bumped.'"
  },
  {
    "type": "alter_table",
    "description": "Spec 050 Kiosk API v1: add stores.pollEnabled. Server-side toggle for the feedback poll the redesigned kiosk app shows (was device-only SQLite before). Default 0 = poll off, preserving current behavior for every existing store.",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'stores' AND COLUMN_NAME = 'pollEnabled'",
    "sql": "ALTER TABLE `stores` ADD COLUMN `pollEnabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Spec 050: show the kiosk feedback poll. 0 = off (default).'"
  },
  {
    "type": "alter_table",
    "description": "Spec 050 Kiosk API v1: add stores.pollOptions JSON. Server-side source for the feedback poll question + answers, authored in store-config admin. Shape { en:[prompt, ...answers], es:[prompt, ...answers] }, <=8 answers per language. NULL = no options authored yet (assembler seeds per-brand defaults).",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'stores' AND COLUMN_NAME = 'pollOptions'",
    "sql": "ALTER TABLE `stores` ADD COLUMN `pollOptions` JSON DEFAULT NULL COMMENT 'Spec 050: feedback poll prompt+answers as { en:[prompt,...answers], es:[...] }, <=8 answers/lang. NULL = unauthored.'"
  },
  {
    "type": "create_table",
    "description": "Spec 050 Kiosk API v1: per-tablet device registry. One row per provisioned kiosk tablet, keyed unique on (typeNum, tabletId) for upsert. Holds device metadata and a revokedAt for per-tablet revocation. Lives in kiosk_buykiosk (store/kiosk domain) rather than kiosk_users because devices are store-scoped, not user-scoped (no users FK).",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'kioskDevices'",
    "sql": "CREATE TABLE `kioskDevices` (\n  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n  `typeNum` VARCHAR(10) NOT NULL COMMENT 'Store identifier the device is bound to',\n  `tabletId` VARCHAR(64) NOT NULL COMMENT 'Client-supplied tablet identifier from provisioning',\n  `deviceName` VARCHAR(255) DEFAULT NULL COMMENT 'Friendly device name',\n  `deviceFingerprint` VARCHAR(255) DEFAULT NULL COMMENT 'Optional device fingerprint hash',\n  `lastSeenAt` DATETIME DEFAULT NULL COMMENT 'Last successful token exchange/refresh',\n  `revokedAt` DATETIME DEFAULT NULL COMMENT 'When the device was revoked; NULL = active',\n  `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_typeNum_tabletId` (`typeNum`, `tabletId`),\n  KEY `idx_typeNum` (`typeNum`),\n  KEY `idx_revokedAt` (`revokedAt`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Spec 050: per-tablet device registry for Kiosk API v1'"
  },
  {
    "type": "create_table",
    "description": "Spec 050 Kiosk API v1: device-scoped refresh tokens (mirrors oauthRefreshTokens but device- not user-scoped). Stores only the SHA-256 hash of the raw refresh token. FK to kioskDevices for cascade cleanup on device deletion. Rotated on every /api/v1/auth/refresh.",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'kioskDeviceTokens'",
    "sql": "CREATE TABLE `kioskDeviceTokens` (\n  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n  `deviceId` INT UNSIGNED NOT NULL COMMENT 'FK to kioskDevices.id',\n  `tokenHash` CHAR(64) NOT NULL COMMENT 'SHA-256 hash of the raw refresh token',\n  `expiresAt` DATETIME NOT NULL COMMENT 'Refresh-token expiration',\n  `lastUsedAt` DATETIME DEFAULT NULL COMMENT 'Last time this token was exchanged',\n  `revokedAt` DATETIME DEFAULT NULL COMMENT 'When revoked (rotation or device revoke); NULL = active',\n  `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_tokenHash` (`tokenHash`),\n  KEY `idx_deviceId` (`deviceId`),\n  KEY `idx_deviceExpires` (`deviceId`, `expiresAt`),\n  KEY `idx_revokedAt` (`revokedAt`),\n  CONSTRAINT `fk_kioskDeviceTokens_device` FOREIGN KEY (`deviceId`) REFERENCES `kioskDevices` (`id`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Spec 050: device-scoped refresh tokens for Kiosk API v1'"
  }
]
