mirror of
				https://github.com/bestnite/sub2clash.git
				synced 2025-11-03 20:30:35 +00:00 
			
		
		
		
	Refactor(database): use gorm+sqlite instead of bbolt Feat: Add delete short link functionality Fix: Load correct configuration template during meta config conversion
		
			
				
	
	
		
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package database
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"errors"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/bestnite/sub2clash/common"
 | 
						|
	"github.com/bestnite/sub2clash/model"
 | 
						|
	"github.com/glebarez/sqlite"
 | 
						|
	"gorm.io/gorm"
 | 
						|
	"gorm.io/gorm/logger"
 | 
						|
)
 | 
						|
 | 
						|
type Database struct {
 | 
						|
	db *gorm.DB
 | 
						|
}
 | 
						|
 | 
						|
func ConnectDB() (*Database, error) {
 | 
						|
	path := filepath.Join("data", "sub2clash.db")
 | 
						|
	if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	db, err := gorm.Open(sqlite.Open(path), &gorm.Config{
 | 
						|
		Logger: logger.Discard,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		return nil, common.NewDatabaseConnectError(err)
 | 
						|
	}
 | 
						|
 | 
						|
	if err = db.AutoMigrate(&model.ShortLink{}); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return &Database{
 | 
						|
		db: db,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *Database) FindShortLinkByID(id string) (model.ShortLink, error) {
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
						|
	defer cancel()
 | 
						|
	return gorm.G[model.ShortLink](d.db).Where("id = ?", id).First(ctx)
 | 
						|
}
 | 
						|
 | 
						|
func (d *Database) CreateShortLink(shortLink *model.ShortLink) error {
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
						|
	defer cancel()
 | 
						|
	return gorm.G[model.ShortLink](d.db).Create(ctx, shortLink)
 | 
						|
}
 | 
						|
 | 
						|
func (d *Database) UpdataShortLink(id string, name string, value any) error {
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
						|
	defer cancel()
 | 
						|
	_, err := gorm.G[model.ShortLink](d.db).Where("id = ?", id).Update(ctx, name, value)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (d *Database) CheckShortLinkIDExists(id string) (bool, error) {
 | 
						|
	_, err := d.FindShortLinkByID(id)
 | 
						|
	if err != nil {
 | 
						|
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
						|
			return false, nil
 | 
						|
		}
 | 
						|
		return false, err
 | 
						|
	}
 | 
						|
	return true, nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *Database) DeleteShortLink(id string) error {
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
 | 
						|
	defer cancel()
 | 
						|
	_, err := gorm.G[model.ShortLink](d.db).Where("id = ?", id).Delete(ctx)
 | 
						|
	return err
 | 
						|
}
 |