Files
soft_usite/pkg/models/telegram_staff_token.go
Lizandro GDandClaude Sonnet 5 d2bf699b60 fix: seguridad del webhook de soporte, pagos en contabilidad y Telegram para tareas
- 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>
2026-08-03 01:25:17 +00:00

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
}