package storage import "context" func (r *MySQLRepository) EnsureSchema(ctx context.Context) error { return execAll(ctx, r.db, []string{ `CREATE TABLE IF NOT EXISTS dashboard_cdc_checkpoint ( service_name varchar(64) NOT NULL, binlog_file varchar(255) NOT NULL, binlog_pos int unsigned NOT NULL, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (service_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`, `CREATE TABLE IF NOT EXISTS dashboard_cdc_event_dedup ( event_key varchar(255) NOT NULL, source varchar(128) NOT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (event_key), KEY idx_dashboard_cdc_event_dedup_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`, `CREATE TABLE IF NOT EXISTS dashboard_cdc_user_country ( user_id bigint NOT NULL, sys_origin varchar(50) NOT NULL, country_code varchar(30) NOT NULL, country_name varchar(100) NOT NULL, is_deleted tinyint(1) NOT NULL DEFAULT 0, user_created_at datetime NULL, user_updated_at datetime NULL, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (user_id), KEY idx_dashboard_cdc_user_country_origin_country (sys_origin, country_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`, createDailyMetricTable, createDailyUserMetricTable, createPeriodMetricTable, createPeriodUserMetricTable, createGamePeriodMetricTable, createGamePeriodUserMetricTable, }) } const createDailyMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_daily_metric ( id bigint NOT NULL AUTO_INCREMENT, stat_date date NOT NULL, date_number int NOT NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, country_new_user bigint NOT NULL DEFAULT 0, new_user_recharge decimal(20,2) NOT NULL DEFAULT 0, official_recharge decimal(20,2) NOT NULL DEFAULT 0, mifapay_recharge decimal(20,2) NOT NULL DEFAULT 0, google_recharge decimal(20,2) NOT NULL DEFAULT 0, dealer_recharge decimal(20,2) NOT NULL DEFAULT 0, salary_exchange decimal(20,2) NOT NULL DEFAULT 0, lucky_gift_total_flow decimal(20,2) NOT NULL DEFAULT 0, lucky_gift_user bigint NOT NULL DEFAULT 0, lucky_gift_payout decimal(20,2) NOT NULL DEFAULT 0, game_total_flow decimal(20,2) NOT NULL DEFAULT 0, game_user bigint NOT NULL DEFAULT 0, game_payout decimal(20,2) NOT NULL DEFAULT 0, refreshed_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_daily_origin_country (stat_date, sys_origin, country_code), KEY idx_daily_origin_date (sys_origin, stat_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` const createDailyUserMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_daily_user_metric ( id bigint NOT NULL AUTO_INCREMENT, stat_date date NOT NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, user_id bigint NOT NULL, metric_type varchar(32) NOT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_daily_user_metric (stat_date, sys_origin, country_code, user_id, metric_type), KEY idx_daily_user_metric (sys_origin, user_id, metric_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` const createPeriodMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_period_metric ( id bigint NOT NULL AUTO_INCREMENT, period_type varchar(16) NOT NULL, period_key varchar(32) NOT NULL, stat_timezone varchar(64) NOT NULL DEFAULT 'Asia/Riyadh', period_name varchar(64) NOT NULL, period_start_date date NULL, period_end_date date NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, country_new_user bigint NOT NULL DEFAULT 0, new_user_recharge decimal(20,2) NOT NULL DEFAULT 0, official_recharge decimal(20,2) NOT NULL DEFAULT 0, mifapay_recharge decimal(20,2) NOT NULL DEFAULT 0, google_recharge decimal(20,2) NOT NULL DEFAULT 0, dealer_recharge decimal(20,2) NOT NULL DEFAULT 0, salary_exchange decimal(20,2) NOT NULL DEFAULT 0, lucky_gift_total_flow decimal(20,2) NOT NULL DEFAULT 0, lucky_gift_user bigint NOT NULL DEFAULT 0, lucky_gift_payout decimal(20,2) NOT NULL DEFAULT 0, game_total_flow decimal(20,2) NOT NULL DEFAULT 0, game_user bigint NOT NULL DEFAULT 0, game_payout decimal(20,2) NOT NULL DEFAULT 0, refreshed_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_period_origin_country (period_type, period_key, stat_timezone, sys_origin, country_code), KEY idx_origin_period (sys_origin, stat_timezone, period_type, period_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` const createPeriodUserMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_period_user_metric ( id bigint NOT NULL AUTO_INCREMENT, period_type varchar(16) NOT NULL, period_key varchar(32) NOT NULL, stat_timezone varchar(64) NOT NULL DEFAULT 'Asia/Riyadh', period_name varchar(64) NOT NULL, period_start_date date NULL, period_end_date date NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, user_id bigint NOT NULL, metric_type varchar(32) NOT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_period_user_metric (period_type, period_key, stat_timezone, sys_origin, country_code, user_id, metric_type), KEY idx_origin_user_metric (sys_origin, stat_timezone, user_id, metric_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` const createGamePeriodMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_game_period_metric ( id bigint NOT NULL AUTO_INCREMENT, period_type varchar(16) NOT NULL, period_key varchar(32) NOT NULL, stat_timezone varchar(64) NOT NULL DEFAULT 'Asia/Riyadh', period_name varchar(64) NOT NULL, period_start_date date NULL, period_end_date date NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, game_provider varchar(32) NOT NULL, game_id varchar(128) NOT NULL, game_name varchar(256) NOT NULL, consume_amount decimal(20,2) NOT NULL DEFAULT 0, payout_amount decimal(20,2) NOT NULL DEFAULT 0, profit_amount decimal(20,2) NOT NULL DEFAULT 0, user_count bigint NOT NULL DEFAULT 0, order_count bigint NOT NULL DEFAULT 0, refreshed_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_game_period (sys_origin, stat_timezone, period_type, period_key, country_code, game_provider, game_id), KEY idx_game_period_game (sys_origin, stat_timezone, period_type, period_key, game_provider, game_id, country_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` const createGamePeriodUserMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_game_period_user_metric ( id bigint NOT NULL AUTO_INCREMENT, period_type varchar(16) NOT NULL, period_key varchar(32) NOT NULL, stat_timezone varchar(64) NOT NULL DEFAULT 'Asia/Riyadh', period_name varchar(64) NOT NULL, period_start_date date NULL, period_end_date date NULL, sys_origin varchar(50) NOT NULL, country_code varchar(64) NOT NULL, country_name varchar(128) NOT NULL, game_provider varchar(32) NOT NULL, game_id varchar(128) NOT NULL, user_id bigint NOT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_game_period_user (period_type, period_key, stat_timezone, sys_origin, country_code, game_provider, game_id, user_id), KEY idx_game_user (sys_origin, stat_timezone, user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`