diff options
Diffstat (limited to 'internal/integration')
-rw-r--r-- | internal/integration/cubox/cubox.go | 70 | ||||
-rw-r--r-- | internal/integration/integration.go | 20 |
2 files changed, 90 insertions, 0 deletions
diff --git a/internal/integration/cubox/cubox.go b/internal/integration/cubox/cubox.go new file mode 100644 index 00000000..ed24b28b --- /dev/null +++ b/internal/integration/cubox/cubox.go @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Cubox API documentation: https://help.cubox.cc/save/api/ + +package cubox // import "miniflux.app/v2/internal/integration/cubox" + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "time" + + "miniflux.app/v2/internal/version" +) + +const defaultClientTimeout = 10 * time.Second + +type Client struct { + apiLink string +} + +func NewClient(apiLink string) *Client { + return &Client{apiLink: apiLink} +} + +func (c *Client) SaveLink(entryURL string) error { + if c.apiLink == "" { + return errors.New("cubox: missing API link") + } + + requestBody, err := json.Marshal(&card{ + Type: "url", + Content: entryURL, + }) + if err != nil { + return fmt.Errorf("cubox: unable to encode request body: %w", err) + } + + ctx, cancel := context.WithTimeout(context.Background(), defaultClientTimeout) + defer cancel() + + request, err := http.NewRequestWithContext(ctx, http.MethodPost, c.apiLink, bytes.NewReader(requestBody)) + if err != nil { + return fmt.Errorf("cubox: unable to create request: %w", err) + } + + request.Header.Set("Content-Type", "application/json") + request.Header.Set("User-Agent", "Miniflux/"+version.Version) + + response, err := http.DefaultClient.Do(request) + if err != nil { + return fmt.Errorf("cubox: unable to send request: %w", err) + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return fmt.Errorf("cubox: unable to save link: status=%d", response.StatusCode) + } + + return nil +} + +type card struct { + Type string `json:"type"` + Content string `json:"content"` +} diff --git a/internal/integration/integration.go b/internal/integration/integration.go index 04286776..850811c9 100644 --- a/internal/integration/integration.go +++ b/internal/integration/integration.go @@ -9,6 +9,7 @@ import ( "miniflux.app/v2/internal/config" "miniflux.app/v2/internal/integration/apprise" "miniflux.app/v2/internal/integration/betula" + "miniflux.app/v2/internal/integration/cubox" "miniflux.app/v2/internal/integration/espial" "miniflux.app/v2/internal/integration/instapaper" "miniflux.app/v2/internal/integration/linkace" @@ -322,6 +323,25 @@ func SendEntry(entry *model.Entry, userIntegrations *model.Integration) { } } + if userIntegrations.CuboxEnabled { + slog.Debug("Sending entry to Cubox", + slog.Int64("user_id", userIntegrations.UserID), + slog.Int64("entry_id", entry.ID), + slog.String("entry_url", entry.URL), + ) + + client := cubox.NewClient(userIntegrations.CuboxAPILink) + + if err := client.SaveLink(entry.URL); err != nil { + slog.Error("Unable to send entry to Cubox", + slog.Int64("user_id", userIntegrations.UserID), + slog.Int64("entry_id", entry.ID), + slog.String("entry_url", entry.URL), + slog.Any("error", err), + ) + } + } + if userIntegrations.ShioriEnabled { slog.Debug("Sending entry to Shiori", slog.Int64("user_id", userIntegrations.UserID), |