//go:build mysql // +build mysql package mysql // ensureIMFileReviewTables installs async file safety review state in the // currently selected tenant database. Tenant databases intentionally do not // carry tenant_id columns. func ensureIMFileReviewTables(exec sqlExecutor) error { statements := []string{ `CREATE TABLE IF NOT EXISTS im_file_review_tasks ( id BIGINT NOT NULL, task_id VARCHAR(64) NOT NULL, file_id BIGINT NOT NULL, user_id BIGINT NOT NULL DEFAULT 0, task_type VARCHAR(32) NOT NULL, provider VARCHAR(64) NOT NULL, storage_provider VARCHAR(32) NOT NULL DEFAULT '', object_name VARCHAR(2048) NOT NULL DEFAULT '', mime_type VARCHAR(255) NOT NULL DEFAULT '', file_size BIGINT NOT NULL DEFAULT 0, provider_task_id VARCHAR(128) NOT NULL DEFAULT '', status VARCHAR(16) NOT NULL DEFAULT 'pending', risk_level VARCHAR(32) NOT NULL DEFAULT '', risk_labels JSON, result_json JSON, error_code VARCHAR(64) NOT NULL DEFAULT '', error_message VARCHAR(512) NOT NULL DEFAULT '', attempts INT NOT NULL DEFAULT 0, next_retry_at DATETIME(3), completed_at DATETIME(3), created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY(id), UNIQUE INDEX uk_im_file_review_tasks_task(task_id), UNIQUE INDEX uk_im_file_review_tasks_file_provider(file_id, task_type, provider), INDEX idx_im_file_review_tasks_pending(status, next_retry_at, id), INDEX idx_im_file_review_tasks_file(file_id), INDEX idx_im_file_review_tasks_object(storage_provider, object_name(191)), INDEX idx_im_file_review_tasks_provider_task(provider, provider_task_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci`, } for _, statement := range statements { if _, err := exec.Exec(statement); err != nil { return err } } return nil }