package models import ( "crypto/rand" "fmt" "github.com/sujit-baniya/fiber-boilerplate/app" "gorm.io/gorm" ) // TelegramStaffToken almacena un código de verificación temporal para que un // usuario interno (staff) vincule su Telegram y reciba notificaciones personales // (ej: tareas asignadas), igual que TelegramPortalToken pero para Users. type TelegramStaffToken struct { gorm.Model UserID uint `json:"user_id" gorm:"column:user_id;uniqueIndex"` Token string `json:"token" gorm:"column:token;uniqueIndex;size:8"` } func (TelegramStaffToken) TableName() string { return "telegram_staff_tokens" } // GenerateTelegramStaffToken genera (o renueva) el código de vinculación para el usuario. func GenerateTelegramStaffToken(userID uint) (*TelegramStaffToken, error) { app.Http.Database.DB.Unscoped().Where("user_id = ?", userID).Delete(&TelegramStaffToken{}) b := make([]byte, 3) if _, err := rand.Read(b); err != nil { return nil, fmt.Errorf("no se pudo generar token: %w", err) } token := fmt.Sprintf("%06X", b) t := &TelegramStaffToken{UserID: userID, Token: token} if err := app.Http.Database.DB.Create(t).Error; err != nil { return nil, err } return t, nil } // GetTelegramStaffTokenByUser devuelve el token vigente de un usuario interno. func GetTelegramStaffTokenByUser(userID uint) (*TelegramStaffToken, error) { var t TelegramStaffToken err := app.Http.Database.DB.Where("user_id = ?", userID).First(&t).Error if err != nil { return nil, err } return &t, nil } // DeleteTelegramStaffToken elimina el token de un usuario (tras vincular correctamente). func DeleteTelegramStaffToken(userID uint) { app.Http.Database.DB.Unscoped().Where("user_id = ?", userID).Delete(&TelegramStaffToken{}) } // UpdateUserTelegramChatID vincula el chat_id de Telegram al usuario interno. func UpdateUserTelegramChatID(userID uint, chatID string) error { return app.Http.Database.DB.Model(&Users{}).Where("id = ?", userID). Update("telegram_chat_id", chatID).Error }