package services import ( "database/sql" "os" "path/filepath" _ "modernc.org/sqlite" ) const ( appConfigDirName = "cmbone" databaseFileName = "cmbone.db" ) type SuiStore struct { DB *sql.DB } func getSafeDBPath() (string, error) { configDir, err := os.UserConfigDir() if err != nil { return "", err } appDir := filepath.Join(configDir, appConfigDirName) err = os.MkdirAll(appDir, 0755) if err != nil { return "", err } return filepath.Join(appDir, databaseFileName), nil } func NewSuiStore() (*SuiStore, error) { dbPath, err := getSafeDBPath() if err != nil { return nil, err } db, err := sql.Open("sqlite", dbPath) if err != nil { return nil, err } err = Migrate(db) if err != nil { _ = db.Close() return nil, err } return &SuiStore{DB: db}, nil } func (cs *SuiStore) Close() { if cs != nil && cs.DB != nil { _ = cs.DB.Close() } } func (cs *SuiStore) Start() error { // 这里可以初始化数据库或其它启动逻辑 return nil } func (cs *SuiStore) Stop() error { cs.Close() return nil } func Migrate(db *sql.DB) error { _, err := db.Exec(` CREATE TABLE IF NOT EXISTS hotkeys ( id INTEGER PRIMARY KEY AUTOINCREMENT, keycode INTEGER NOT NULL, modifiers INTEGER NOT NULL, description TEXT, target TEXT ); CREATE TABLE IF NOT EXISTS appconfig ( id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT UNIQUE, type TEXT, value TEXT, description TEXT, state INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS auth_sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT NOT NULL, username TEXT NOT NULL, provider TEXT NOT NULL, token TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL, active INTEGER NOT NULL DEFAULT 1 ); CREATE TABLE IF NOT EXISTS audit_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, actor TEXT NOT NULL, action TEXT NOT NULL, target_type TEXT NOT NULL, target_id TEXT NOT NULL, detail TEXT NOT NULL, created_at TEXT NOT NULL ); `) if err != nil { return err } return initDefaultData(db) } func initDefaultData(db *sql.DB) error { if _, err := db.Exec(defaultAppConfigSQL()); err != nil { return err } if _, err := db.Exec(defaultHotkeysSQL()); err != nil { return err } return nil }