- soporte: el webhook de correo entrante era público sin ninguna validación; ahora exige una API key (query ?key= o header) comparada en tiempo constante. Además evita tickets duplicados por reintentos del proveedor (dedup por Message-Id) y enhebra respuestas del mismo remitente en vez de abrir un ticket nuevo por cada correo. - contabilidad: marcar una cuenta por cobrar/pagar como pagada ahora crea y vincula la Transaccion correspondiente (antes el dashboard de ingresos/ egresos nunca reflejaba esos pagos). Se corrige además que actualizar una cuenta por cobrar borraba su transaccion_id en cada PUT. - tareas: se activa por defecto el canal Telegram para tarea_asignada (estaba apagado desde el seed original) y se agrega un flujo real de vinculación de Telegram para el staff interno (código temporal + verificación), igual al que ya existía para los usuarios del portal — sin esto el chat_id de cada usuario había que pegarlo a mano y la notificación nunca llegaba. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
59 lines
2.0 KiB
Go
59 lines
2.0 KiB
Go
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
|
|
}
|