Files
SaveAny-Bot/database/db.go
krau 9ed2c425be feat(i18n): Enhance internationalization support and error handling messages
- Added i18n keys for various error and info messages related to task management, user handling, and storage operations.
- Updated error messages in the watch and task handling commands to use i18n for better localization.
- Refactored error handling in the database initialization and user synchronization processes to provide clearer messages.
- Improved logging messages for better clarity and consistency across the application.
- Added comprehensive documentation for AI collaboration and project structure in the repository.
2025-12-19 16:01:36 +08:00

85 lines
2.2 KiB
Go

package database
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
"github.com/charmbracelet/log"
"github.com/krau/SaveAny-Bot/config"
"gorm.io/gorm"
glogger "gorm.io/gorm/logger"
)
var db *gorm.DB
func Init(ctx context.Context) {
logger := log.FromContext(ctx)
if err := os.MkdirAll(filepath.Dir(config.C().DB.Path), 0755); err != nil {
logger.Fatal("Failed to create data directory: ", err)
}
var err error
db, err = gorm.Open(GetDialect(config.C().DB.Path), &gorm.Config{
Logger: glogger.New(logger, glogger.Config{
Colorful: true,
SlowThreshold: time.Second * 5,
LogLevel: glogger.Error,
IgnoreRecordNotFoundError: true,
ParameterizedQueries: true,
}),
PrepareStmt: true,
})
if err != nil {
logger.Fatal("Failed to open database: ", err)
}
logger.Debug("Database connected")
if err := db.AutoMigrate(&User{}, &Dir{}, &Rule{}, &WatchChat{}); err != nil {
logger.Fatal("Database migration failed; if upgrading from an old version, try deleting the database file and retrying", "error", err)
}
if err := syncUsers(ctx); err != nil {
logger.Fatal("Failed to sync users:", err)
}
logger.Debug("Database migrated")
logger.Info("Database initialized")
}
func syncUsers(ctx context.Context) error {
logger := log.FromContext(ctx)
dbUsers, err := GetAllUsers(ctx)
if err != nil {
return fmt.Errorf("failed to get users: %w", err)
}
dbUserMap := make(map[int64]User)
for _, u := range dbUsers {
dbUserMap[u.ChatID] = u
}
cfgUserMap := make(map[int64]struct{})
for _, u := range config.C().Users {
cfgUserMap[u.ID] = struct{}{}
}
for cfgID := range cfgUserMap {
if _, exists := dbUserMap[cfgID]; !exists {
if err := CreateUser(ctx, cfgID); err != nil {
return fmt.Errorf("failed to create user %d: %w", cfgID, err)
}
logger.Infof("Created user from config: %d", cfgID)
}
}
for dbID, dbUser := range dbUserMap {
if _, exists := cfgUserMap[dbID]; !exists {
if err := DeleteUser(ctx, &dbUser); err != nil {
return fmt.Errorf("failed to delete user %d: %w", dbID, err)
}
logger.Infof("Deleted user not present in config: %d", dbID)
}
}
return nil
}