diff --git a/internal/file/handlers.go b/internal/file/handlers.go index f10c6f2..d662050 100644 --- a/internal/file/handlers.go +++ b/internal/file/handlers.go @@ -2,8 +2,10 @@ package file import ( "ResendIt/internal/config" + "ResendIt/internal/notify" "ResendIt/internal/util" "fmt" + "log" "net/http" "path/filepath" "strconv" @@ -22,6 +24,7 @@ type Handler struct { type ConfigService interface { GetIntDefault(key string, def int) int GetInt64Default(key string, def int64) int64 + GetStringDefault(key string, def string) string } func NewHandler(s *Service, cfg ConfigService) *Handler { @@ -79,6 +82,20 @@ func (h *Handler) Upload(c *gin.Context) { return } + enabled := h.configService.GetIntDefault(config.KeyUseNtfy, config.DefaultUseNtfy) + if enabled == 1 { + ntfyURL := h.configService.GetStringDefault(config.KeyNtfyUrl, "") + topic := h.configService.GetStringDefault(config.KeyNtfyTopic, config.DefaultNtfyTopic) + + go func() { + title := "ReSendit: new upload" + msg := fmt.Sprintf("%s (%s)\nID: %s", record.Filename, util.HumanSize(record.Size), record.ID) + if err := notify.Publish(ntfyURL, topic, title, msg); err != nil { + log.Printf("ntfy publish failed: %v", err) + } + }() + } + c.JSON(http.StatusOK, gin.H{ "id": record.ID, "deletion_id": record.DeletionID, diff --git a/internal/notify/ntfy.go b/internal/notify/ntfy.go new file mode 100644 index 0000000..dbb2c81 --- /dev/null +++ b/internal/notify/ntfy.go @@ -0,0 +1,36 @@ +package notify + +import ( + "fmt" + "net/http" + "strings" + "time" +) + +func Publish(ntfyURL, topic, title, message string) error { + ntfyURL = strings.TrimRight(ntfyURL, "/") + if ntfyURL == "" || topic == "" { + return nil // nothing configured + } + + req, err := http.NewRequest("POST", ntfyURL+"/"+topic, strings.NewReader(message)) + if err != nil { + return err + } + if title != "" { + req.Header.Set("Title", title) + } + req.Header.Set("Content-Type", "text/plain; charset=utf-8") + + client := &http.Client{Timeout: 3 * time.Second} + res, err := client.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + if res.StatusCode >= 300 { + return fmt.Errorf("ntfy returned %s", res.Status) + } + return nil +}