This commit is contained in:
stefanodvx 2025-04-14 13:05:43 +02:00
parent 264c97183e
commit 3faede7b1c
74 changed files with 6228 additions and 1 deletions

65
database/main.go Normal file
View file

@ -0,0 +1,65 @@
package database
import (
"govd/models"
"fmt"
"log"
"os"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
func Start() {
host := os.Getenv("DB_HOST")
port := os.Getenv("DB_PORT")
user := os.Getenv("DB_USER")
password := os.Getenv("DB_PASSWORD")
dbname := os.Getenv("DB_NAME")
connectionString := fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
user, password, host, port, dbname,
)
db, err := gorm.Open(mysql.Open(connectionString), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
NowFunc: func() time.Time {
utc, _ := time.LoadLocation("Europe/Rome")
return time.Now().In(utc)
},
})
if err != nil {
log.Fatalf("failed to connect to database: %v", err)
}
DB = db
sqlDB, err := DB.DB()
if err != nil {
log.Fatalf("failed to get database connection: %v", err)
}
err = sqlDB.Ping()
if err != nil {
log.Fatalf("failed to ping database: %v", err)
}
err = migrateDatabase()
if err != nil {
log.Fatalf("failed to migrate database: %v", err)
}
}
func migrateDatabase() error {
err := DB.AutoMigrate(
&models.Media{},
&models.MediaFormat{},
&models.GroupSettings{},
&models.User{},
)
if err != nil {
return err
}
return nil
}

60
database/media.go Normal file
View file

@ -0,0 +1,60 @@
package database
import (
"fmt"
"govd/models"
"gorm.io/gorm"
)
func GetDefaultMedias(
extractorCodeName string,
contentID string,
) ([]*models.Media, error) {
var mediaList []*models.Media
err := DB.
Where(&models.Media{
ExtractorCodeName: extractorCodeName,
ContentID: contentID,
}).
Preload("Format", "is_default = ?", true).
Find(&mediaList).
Error
if err != nil {
return nil, fmt.Errorf("failed to get stored media list: %w", err)
}
return mediaList, nil
}
func StoreMedia(
extractorCodeName string,
contentID string,
media *models.Media,
) error {
return DB.Transaction(func(tx *gorm.DB) error {
if err := tx.Where(models.Media{
ExtractorCodeName: extractorCodeName,
ContentID: contentID,
}).FirstOrCreate(&media).Error; err != nil {
return fmt.Errorf("failed to get or create media: %w", err)
}
if media.Format != nil {
format := media.Format
format.MediaID = media.ID
if err := tx.Where(models.MediaFormat{
MediaID: format.MediaID,
FormatID: format.FormatID,
Type: format.Type,
}).FirstOrCreate(format).Error; err != nil {
return fmt.Errorf("failed to get or create format: %w", err)
}
}
return nil
})
}

37
database/settings.go Normal file
View file

@ -0,0 +1,37 @@
package database
import (
"govd/models"
)
func GetGroupSettings(
chatID int64,
) (*models.GroupSettings, error) {
var groupSettings models.GroupSettings
err := DB.
Where(&models.GroupSettings{
ChatID: chatID,
}).
FirstOrCreate(&groupSettings).
Error
if err != nil {
return nil, err
}
return &groupSettings, nil
}
func UpdateGroupSettings(
chatID int64,
settings *models.GroupSettings,
) error {
err := DB.
Where(&models.GroupSettings{
ChatID: chatID,
}).
Updates(settings).
Error
if err != nil {
return err
}
return nil
}

52
database/stats.go Normal file
View file

@ -0,0 +1,52 @@
package database
import "govd/models"
func GetMediaCount() (int64, error) {
var count int64
err := DB.
Model(&models.Media{}).
Count(&count).
Error
if err != nil {
return 0, err
}
return count, nil
}
func GetUsersCount() (int64, error) {
var count int64
err := DB.
Model(&models.User{}).
Count(&count).
Error
if err != nil {
return 0, err
}
return count, nil
}
func GetGroupsCount() (int64, error) {
var count int64
err := DB.
Model(&models.GroupSettings{}).
Count(&count).
Error
if err != nil {
return 0, err
}
return count, nil
}
func GetDailyUserCount() (int64, error) {
var count int64
err := DB.
Model(&models.User{}).
Where("DATE(last_used) = DATE(NOW())").
Count(&count).
Error
if err != nil {
return 0, err
}
return count, nil
}

38
database/user.go Normal file
View file

@ -0,0 +1,38 @@
package database
import "govd/models"
func GetUser(
userID int64,
) (*models.User, error) {
var user models.User
err := DB.
Where(&models.User{
UserID: userID,
}).
FirstOrCreate(&user).
Error
if err != nil {
return nil, err
}
go UpdateUserStatus(userID)
return &user, nil
}
func UpdateUserStatus(
userID int64,
) error {
err := DB.
Model(&models.User{}).
Where(&models.User{
UserID: userID,
}).
Updates(&models.User{
LastUsed: DB.NowFunc(),
}).
Error
if err != nil {
return err
}
return nil
}