Add managed content and keyboard usage insights
Introduce versioned official content workflows and privacy-safe keyboard analytics, while preventing repeat DeviceCheck sign-ins from incorrectly restricting eligible accounts.
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
-- Accounts with an immutable signup-trial grant were incorrectly restricted
|
||||
-- when a later sign-in supplied a fresh ephemeral DeviceCheck token.
|
||||
UPDATE accounts AS account
|
||||
SET
|
||||
account.anti_abuse_restricted = FALSE,
|
||||
account.updated_at = CURRENT_TIMESTAMP(6)
|
||||
WHERE account.anti_abuse_restricted = TRUE
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM credit_ledger AS ledger
|
||||
WHERE ledger.user_id = account.id
|
||||
AND ledger.entry_type = 'SIGNUP_TRIAL'
|
||||
AND ledger.idempotency_key = CONCAT('internal:signup-trial:', account.id)
|
||||
);
|
||||
@@ -0,0 +1,55 @@
|
||||
-- Official content is immediately published. The singleton catalog row
|
||||
-- serializes revision changes and also protects first-write hint versions.
|
||||
CREATE TABLE official_content_catalog (
|
||||
id TINYINT UNSIGNED NOT NULL,
|
||||
revision BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
generated_at DATETIME(6) NULL,
|
||||
PRIMARY KEY (id),
|
||||
CONSTRAINT chk_official_content_catalog_singleton CHECK (id = 1)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
INSERT INTO official_content_catalog (id, revision, generated_at)
|
||||
VALUES (1, 0, NULL);
|
||||
|
||||
CREATE TABLE official_skills (
|
||||
id VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
system_image VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
sort_order INT NOT NULL,
|
||||
thinking_enabled BOOLEAN NOT NULL,
|
||||
enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at DATETIME(6) NOT NULL,
|
||||
updated_at DATETIME(6) NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY idx_official_skills_enabled_sort (enabled, sort_order, id),
|
||||
CONSTRAINT chk_official_skills_id CHECK (id LIKE 'official.%')
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
CREATE TABLE official_skill_localizations (
|
||||
skill_id VARCHAR(128) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
locale VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
name VARCHAR(120) NOT NULL,
|
||||
summary VARCHAR(500) NOT NULL,
|
||||
prompt TEXT NOT NULL,
|
||||
PRIMARY KEY (skill_id, locale),
|
||||
CONSTRAINT fk_official_skill_localizations_skill
|
||||
FOREIGN KEY (skill_id) REFERENCES official_skills (id) ON DELETE CASCADE,
|
||||
CONSTRAINT chk_official_skill_localizations_locale
|
||||
CHECK (locale IN ('zh-Hans', 'en'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
CREATE TABLE official_hint_packs (
|
||||
locale VARCHAR(8) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
generated_at DATETIME(6) NULL,
|
||||
expires_at DATETIME(6) NULL,
|
||||
interval_hours INT NULL,
|
||||
version INT UNSIGNED NOT NULL,
|
||||
cards_json MEDIUMTEXT NOT NULL,
|
||||
updated_at DATETIME(6) NOT NULL,
|
||||
PRIMARY KEY (locale),
|
||||
CONSTRAINT chk_official_hint_packs_locale CHECK (locale IN ('zh', 'en')),
|
||||
CONSTRAINT chk_official_hint_packs_interval
|
||||
CHECK (interval_hours IS NULL OR interval_hours BETWEEN 1 AND 168),
|
||||
CONSTRAINT chk_official_hint_packs_version CHECK (version >= 1),
|
||||
CONSTRAINT chk_official_hint_packs_expiry
|
||||
CHECK (expires_at IS NULL OR generated_at IS NULL OR expires_at > generated_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
@@ -0,0 +1,51 @@
|
||||
-- Privacy-minimized daily counters for text manually committed by OSGKeyboard.
|
||||
-- Raw text, key sequences, surrounding context and host application identifiers
|
||||
-- are intentionally absent.
|
||||
CREATE TABLE keyboard_usage_daily_summaries (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
installation_hash CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
client_summary_id CHAR(36) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
summary_date DATE NOT NULL,
|
||||
chinese_character_count BIGINT UNSIGNED NOT NULL,
|
||||
english_character_count BIGINT UNSIGNED NOT NULL,
|
||||
other_character_count BIGINT UNSIGNED NOT NULL,
|
||||
input_session_count BIGINT UNSIGNED NOT NULL,
|
||||
chinese_only_session_count BIGINT UNSIGNED NOT NULL,
|
||||
english_only_session_count BIGINT UNSIGNED NOT NULL,
|
||||
mixed_language_session_count BIGINT UNSIGNED NOT NULL,
|
||||
other_only_session_count BIGINT UNSIGNED NOT NULL,
|
||||
app_version VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NULL,
|
||||
os_version VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NULL,
|
||||
payload_hash CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||
received_at DATETIME(6) NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uq_keyboard_usage_installation_id (installation_hash, client_summary_id),
|
||||
UNIQUE KEY uq_keyboard_usage_installation_date (installation_hash, summary_date),
|
||||
INDEX ix_keyboard_usage_summary_date (summary_date),
|
||||
CONSTRAINT fk_keyboard_usage_installation
|
||||
FOREIGN KEY (installation_hash)
|
||||
REFERENCES product_analytics_installations (installation_hash)
|
||||
ON DELETE CASCADE,
|
||||
CONSTRAINT chk_keyboard_usage_chinese_count
|
||||
CHECK (chinese_character_count <= 1000000),
|
||||
CONSTRAINT chk_keyboard_usage_english_count
|
||||
CHECK (english_character_count <= 1000000),
|
||||
CONSTRAINT chk_keyboard_usage_other_count
|
||||
CHECK (other_character_count <= 1000000),
|
||||
CONSTRAINT chk_keyboard_usage_session_count
|
||||
CHECK (input_session_count BETWEEN 1 AND 100000),
|
||||
CONSTRAINT chk_keyboard_usage_session_partitions CHECK (
|
||||
chinese_only_session_count <= 100000
|
||||
AND english_only_session_count <= 100000
|
||||
AND mixed_language_session_count <= 100000
|
||||
AND other_only_session_count <= 100000
|
||||
AND chinese_only_session_count
|
||||
+ english_only_session_count
|
||||
+ mixed_language_session_count
|
||||
+ other_only_session_count = input_session_count
|
||||
),
|
||||
CONSTRAINT chk_keyboard_usage_characters CHECK (
|
||||
chinese_character_count + english_character_count + other_character_count
|
||||
>= input_session_count
|
||||
)
|
||||
) ENGINE = InnoDB;
|
||||
Reference in New Issue
Block a user