package database import ( "fmt" "gorm.io/gorm" "gorm.io/driver/mysql" log "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/internal/logger" "gogs.veloe.link/toomanysugar/GoEthemineTelegramBot/cmd/settings" ) type ConnectionProperties struct { User string Pass string Host string Db string } type Connection struct { GormDb *gorm.DB DbOpenStr string ConnProperties ConnectionProperties } func (c *Connection) Init() { c.ConnProperties.User = settings.DbUser() c.ConnProperties.Pass = settings.DbPassword() c.ConnProperties.Host = settings.DbHost() c.ConnProperties.Db = settings.DbName() c.DbOpenStr = fmt.Sprintf("%s:%s@tcp(%s)/%s", c.ConnProperties.User, c.ConnProperties.Pass, c.ConnProperties.Host, c.ConnProperties.Db) log.LogInfo.Println("Connecting with:") log.LogInfo.Println(c.DbOpenStr) gormDb, err := gorm.Open(mysql.Open(c.DbOpenStr), &gorm.Config{}) if err != nil { log.LogError.Println("failed to connect database") log.LogError.Println(err) } else { log.LogInfo.Println("Connected to database using gorm") } c.GormDb = gormDb } func (c *Connection) LatestWorkerRecord(worker string) (lastWorkerRecord Worker, err error) { result := c.GormDb. Where("worker = ?", worker). Order("time desc"). Limit(1). Find(&lastWorkerRecord) return lastWorkerRecord, result.Error } func (c *Connection) LatestMinerRecord(wallet string) (lastMinerRecord Miner, err error) { result := c.GormDb. Where("wallet = ?", wallet). Order("time desc"). Limit(1). Find(&lastMinerRecord) return lastMinerRecord, result.Error } func (c *Connection) ChatsWithWallet(wallet string) (ChatIds []int64, err error) { result := c.GormDb.Model(&User{}). Where("wallet = ?", wallet). Select("DISTINCT(chat_id)"). Scan(&ChatIds) return ChatIds, result.Error } func (c *Connection) IsWorkerRowExists(worker string, time int64) (exists bool, err error) { var rowsCount int64 result := c.GormDb.Model(&Worker{}). Where("worker = ? and time = ?", worker, time). Count(&rowsCount) if result.Error != nil { return false , result.Error } if rowsCount != 0 { return true, nil } return false, nil } // List of unique, not empty wallets in user table func (c *Connection) UniqueWallets() (wallets []string, err error) { result := c.GormDb.Model(&User{}). Not("wallet = ?", ""). Select("DISTINCT(wallet)"). Scan(&wallets) return wallets, result.Error }