38 lines
1.8 KiB
Go
38 lines
1.8 KiB
Go
//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
|
|
}
|