mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-10-26 09:11:01 +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
|
|
}
|