Permite adjuntar archivos a tareas desde Telegram
Antes solo facturas y documentos de proyecto consumían el adjunto
pendiente de Telegram; crear_tarea/asignar_tarea lo ignoraban. Agrega
adjuntar_documento_tarea: si el usuario manda un archivo junto con una
instrucción de tarea ("asigna esto a Natalia"), el agente crea/resuelve
la tarea y guarda el archivo como comentario adjunto, visible igual que
un adjunto subido desde /app/tareas.
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
|
||||
@@ -65,6 +68,53 @@ func AsignarTarea(id uint, asignadoID *uint) (*models.Tarea, error) {
|
||||
return full, nil
|
||||
}
|
||||
|
||||
// AdjuntarDocumentoTarea guarda como comentario de una tarea el archivo (PDF/foto)
|
||||
// que el usuario acaba de enviar por Telegram en este chat. Reutiliza el mismo
|
||||
// formato de "archivos" (JSON) que ya usa el comentario web (AddComentario), para
|
||||
// que el archivo aparezca igual en /app/tareas sin importar de dónde se subió.
|
||||
func AdjuntarDocumentoTarea(chatID int64, tareaID uint, comentario string) (*models.TareaComentario, error) {
|
||||
if tareaID == 0 {
|
||||
return nil, fmt.Errorf("id de tarea requerido")
|
||||
}
|
||||
tarea, err := models.GetTareaByID(tareaID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("tarea no encontrada: %w", err)
|
||||
}
|
||||
att, ok := PopTelegramAttachment(chatID)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no hay ningún documento pendiente en este chat; pide al usuario que lo envíe de nuevo")
|
||||
}
|
||||
if comentario == "" {
|
||||
comentario = fmt.Sprintf("Archivo adjunto vía Telegram: %s", att.OriginalName)
|
||||
}
|
||||
|
||||
dir := fmt.Sprintf("uploads/tareas/%d", tareaID)
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
_ = os.Remove(att.Path)
|
||||
return nil, fmt.Errorf("no se pudo crear el directorio: %w", err)
|
||||
}
|
||||
ext := filepath.Ext(att.OriginalName)
|
||||
finalPath := filepath.Join(dir, fmt.Sprintf("%d_telegram%s", time.Now().UnixMilli(), ext))
|
||||
if err := os.Rename(att.Path, finalPath); err != nil {
|
||||
return nil, fmt.Errorf("no se pudo guardar el archivo: %w", err)
|
||||
}
|
||||
|
||||
archivosJSON, _ := json.Marshal([]map[string]string{
|
||||
{"nombre": att.OriginalName, "ruta": finalPath},
|
||||
})
|
||||
|
||||
c := &models.TareaComentario{
|
||||
TareaID: tareaID,
|
||||
Contenido: comentario,
|
||||
Archivos: string(archivosJSON),
|
||||
}
|
||||
if err := models.CreateComentario(c); err != nil {
|
||||
return nil, fmt.Errorf("no se pudo guardar el comentario: %w", err)
|
||||
}
|
||||
go NotificarTareaComentario(tarea, comentario)
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func cambioAsignado(a, b *uint) bool {
|
||||
if a == nil && b == nil {
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user