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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
1127d944c7
commit
d2bf699b60
@@ -0,0 +1,58 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user