160 lines
7.1 KiB
Go
160 lines
7.1 KiB
Go
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,
|
|
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 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`
|