package handlers import ( "context" "net/http" "github.com/gin-gonic/gin" "switchboard-core/notifications" "switchboard-core/store" ) // AdminEmailHandler handles admin SMTP configuration and test endpoints. type AdminEmailHandler struct { stores store.Stores } // NewAdminEmailHandler creates a new admin email handler. func NewAdminEmailHandler(s store.Stores) *AdminEmailHandler { return &AdminEmailHandler{stores: s} } // TestEmail sends a test email to the requesting admin's email address. // POST /api/v1/admin/notifications/test-email func (h *AdminEmailHandler) TestEmail(c *gin.Context) { userID := getUserID(c) if userID == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "authentication required"}) return } user, err := h.stores.Users.GetByID(c.Request.Context(), userID) if err != nil || user == nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load user"}) return } if user.Email == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "no email address configured for your account"}) return } // Load current SMTP config cfg, err := notifications.LoadSMTPConfig(h.stores.GlobalConfig, nil) if err != nil || cfg == nil { c.JSON(http.StatusBadRequest, gin.H{"error": "SMTP not configured: " + err.Error()}) return } transport := notifications.NewEmailTransport(*cfg) if transport == nil { c.JSON(http.StatusBadRequest, gin.H{"error": "SMTP configuration is incomplete"}) return } // Get instance name instanceName := "Chat Switchboard" if branding, err := h.stores.GlobalConfig.Get(context.Background(), "branding"); err == nil { if name, ok := branding["instance_name"].(string); ok && name != "" { instanceName = name } } subject := "[" + instanceName + "] Test Email" htmlBody := `
This is a test email from your Chat Switchboard instance.
If you received this, your SMTP configuration is working correctly.
` textBody := instanceName + " — Test Email\n\nThis is a test email. Your SMTP configuration is working correctly." if err := transport.Send(c.Request.Context(), user.Email, subject, htmlBody, textBody); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "send failed: " + err.Error()}) return } c.JSON(http.StatusOK, gin.H{"ok": true, "sent_to": user.Email}) }