refactor(gorm): remove ...At fields from model

This commit is contained in:
Anhgelus Morhtuuzh 2025-05-13 13:15:59 +02:00
parent d38c57b830
commit 6b6c775ab3
Signed by: anhgelus
GPG key ID: CAD341EFA92DDDE5
5 changed files with 29 additions and 99 deletions

View file

@ -4,32 +4,21 @@ import (
"fmt"
"github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils"
"gorm.io/gorm"
)
type Copaing struct {
gorm.Model
DiscordID string `gorm:"not null"`
//XP []CopaingXP
XP uint `gorm:"default:0"`
GuildID string `gorm:"not null"`
ID uint `gorm:"primarykey"`
DiscordID string `gorm:"not null"`
XP []CopaingXP `gorm:"constraint:OnDelete:SET NULL;"`
GuildID string `gorm:"not null"`
}
type leftCopaing struct {
ID uint
StopDelete chan<- interface{}
type CopaingXP struct {
ID uint `gorm:"primarykey"`
XP uint `gorm:"default:0"`
CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"`
}
//type CopaingXP struct {
// gorm.Model
// XP uint `gorm:"default:0"`
// CopaingID uint
//}
var (
leftCopaingsMap = map[string]*leftCopaing{}
)
const (
LastEvent = "last_event"
AlreadyRemoved = "already_removed"
@ -52,50 +41,11 @@ func GetCopaing(discordID string, guildID string) *Copaing {
}
func (c *Copaing) Load() error {
// check if user left in the past 48 hours
k := c.GuildID + ":" + c.DiscordID
l, ok := leftCopaingsMap[k]
if !ok || l == nil {
// if not, common first or create
return gokord.DB.Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).FirstOrCreate(c).Error
}
// else, getting last data
tmp := Copaing{
Model: gorm.Model{
ID: c.ID,
},
DiscordID: c.DiscordID,
GuildID: c.GuildID,
}
if err := gokord.DB.Unscoped().Find(&tmp).Error; err != nil {
// if error, avoid getting old data and use new one
utils.SendAlert(
"user/member.go - Getting user in soft delete", err.Error(),
"discord_id", c.DiscordID,
"guild_id", c.DiscordID,
"last_id", l.ID,
)
return gokord.DB.Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).FirstOrCreate(c).Error
}
// resetting internal data
tmp.Model = gorm.Model{}
l.StopDelete <- true
leftCopaingsMap[k] = nil
// creating new data
err := gokord.DB.Create(&tmp).Error
if err != nil {
return err
}
// delete old data
if err = gokord.DB.Unscoped().Delete(&tmp).Error; err != nil {
utils.SendAlert(
"user/member.go - Deleting user in soft delete", err.Error(),
"discord_id", c.DiscordID,
"guild_id", c.DiscordID,
"last_id", l.ID,
)
}
return nil
return gokord.DB.
Where("discord_id = ? and guild_id = ?", c.DiscordID, c.GuildID).
Preload("XP").
FirstOrCreate(c).
Error
}
func (c *Copaing) Save() error {
@ -105,3 +55,7 @@ func (c *Copaing) Save() error {
func (c *Copaing) GenKey(key string) string {
return fmt.Sprintf("%s:%s:%s", c.GuildID, c.DiscordID, key)
}
func (c *Copaing) Delete() error {
return gokord.DB.Where("guild_id = ? AND discord_id = ?", c.GuildID, c.DiscordID).Delete(c).Error
}

View file

@ -10,7 +10,6 @@ import (
"github.com/anhgelus/les-copaings-bot/exp"
"github.com/bwmarrin/discordgo"
"github.com/redis/go-redis/v9"
"gorm.io/gorm"
"math"
"strconv"
"time"
@ -105,20 +104,20 @@ func (c *Copaing) AddXPAlreadyRemoved(xp uint) uint {
utils.SendAlert("user/xp.go - Getting redis client (set)", err.Error())
return 0
}
exp := xp + c.XPAlreadyRemoved()
err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), exp, 0).Err()
nxp := xp + c.XPAlreadyRemoved()
err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), nxp, 0).Err()
if err != nil {
utils.SendAlert(
"user/xp.go - Setting already removed",
err.Error(),
"exp already removed",
exp,
nxp,
"base_key",
c.GenKey(""),
)
return 0
}
return exp
return nxp
}
func (c *Copaing) XPAlreadyRemoved() uint {
@ -159,27 +158,3 @@ func (c *Copaing) XPAlreadyRemoved() uint {
}
return uint(xp)
}
func (c *Copaing) Reset() {
gokord.DB.Where("guild_id = ? AND discord_id = ?", c.GuildID, c.DiscordID).Delete(c)
}
func (c *Copaing) AfterDelete(db *gorm.DB) error {
id := c.ID
dID := c.DiscordID
gID := c.GuildID
k := c.GuildID + ":" + c.DiscordID
ch := utils.NewTimer(48*time.Hour, func(stop chan<- interface{}) {
if err := db.Unscoped().Where("id = ?", id).Delete(c).Error; err != nil {
utils.SendAlert(
"user/xp.go - Removing user from database", err.Error(),
"discord_id", dID,
"guild_id", gID,
)
}
stop <- true
leftCopaingsMap[k] = nil
})
leftCopaingsMap[k] = &leftCopaing{id, ch}
return nil
}