package email import ( "bytes" "fmt" "github.com/tuusuario/go-sync-service/internal/domain/ports" "html/template" "strings" "time" ) // TaskTplData contiene los datos que se inyectarán en la plantilla HTML de la notificación de tarea. // Se usan como {{.Campo}} dentro del template. type TaskTplData struct { AppName string Nombre string TareaNombre string Descripcion string FechaVencimiento string ErrorDescripcion string FechaError string LinkTarea string LogoURL string Direccion string Telefono string EmailContacto string Year int ColorHeaderBG string ColorAccent string ColorFooterText string ColorFooterMuted string ColorBodyBG string } type Branding struct { AppName string LogoURL string ColorHeaderBG string ColorAccent string ColorFooterText string ColorFooterMuted string ColorBodyBG string Direccion string Telefono string EmailContacto string Year int } // Código del parámetro en tu tabla `parametros` que guarda la PLANTILLA HTML para la tarea. // Ej: SELECT valor FROM parametros WHERE codigo = 'EMAIL_TEMPLATE_TASK'; const ParamEmailTaskTemplate = "EMAIL_TEMPLATE_TASK" // BuildTaskSubject arma el asunto con el nombre de la app. func BuildTaskSubject(appName string) string { appName = strings.TrimSpace(appName) if appName == "" { return "Tarea asignada" } return fmt.Sprintf("[%s] Tarea asignada", appName) } // RenderTaskEmailHTML recibe la plantilla HTML (tplStr) y los datos (data) para la notificación de tarea. // Si tplStr viene vacío, usa DefaultTaskTemplate como fallback. func RenderTaskEmailHTML(tplStr string, data TaskTplData) (string, error) { if strings.TrimSpace(tplStr) == "" { tplStr = DefaultErrorSyncTemplate } tpl, err := template.New("email_task").Parse(tplStr) if err != nil { return "", fmt.Errorf("parse template: %w", err) } var buf bytes.Buffer if err := tpl.Execute(&buf, data); err != nil { return "", fmt.Errorf("execute template: %w", err) } return buf.String(), nil } func LoadBrandingAsignation(cfg ports.RedisConfigProvider, appName string) Branding { get := func(key, def string) string { if cfg == nil { return def } v, _ := cfg.GetString("parametros:" + key) v = strings.TrimSpace(v) if v == "" { return def } return v } if strings.TrimSpace(appName) == "" { appName = get("EMAIL_APP_NAME", appName) } return Branding{ AppName: appName, LogoURL: get("EMAIL_LOGO_URL", ""), ColorHeaderBG: get("EMAIL_COLOR_HEADER_BG", "#0e1a2b"), ColorAccent: get("EMAIL_COLOR_ACCENT", "#CBA135"), ColorFooterText: get("EMAIL_COLOR_FOOTER_TEXT", "#ffffff"), ColorFooterMuted: get("EMAIL_COLOR_FOOTER_MUTED", "#bfc6d1"), ColorBodyBG: get("EMAIL_COLOR_BODY_BG", "#f4f6f8"), Direccion: get("EMAIL_FOOTER_ADDRESS", ""), Telefono: get("EMAIL_FOOTER_PHONE", ""), EmailContacto: get("EMAIL_FOOTER_EMAIL", ""), Year: time.Now().Year(), } } // --- Plantilla por defecto para la notificación de tarea (Go template con {{.Campo}}) --- const DefaultErrorSyncTemplate = `