From 4c1496fd28d570a17e531d763b48136a87054aa2 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 1 Jul 2023 15:16:01 +0000
Subject: [PATCH 01/21] =?UTF-8?q?=F0=9F=8E=89=20Initial=20Notion=20Support?=
=?UTF-8?q?=20=E2=9E=95=20http=20patch=20with=20json=20=E2=9E=95=20http=20?=
=?UTF-8?q?custom=20headers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
database/migrations.go | 10 ++++
http/client/client.go | 33 ++++++++++-
integration/integration.go | 14 +++++
integration/notion/notion.go | 68 ++++++++++++++++++++++
integration/notion/wrapper.go | 16 +++++
model/integration.go | 4 ++
storage/integration.go | 30 +++++++++-
template/templates/views/integrations.html | 18 ++++++
ui/form/integration.go | 12 ++++
ui/integration_show.go | 4 ++
10 files changed, 203 insertions(+), 6 deletions(-)
create mode 100644 integration/notion/notion.go
create mode 100644 integration/notion/wrapper.go
diff --git a/database/migrations.go b/database/migrations.go
index edf926dcc5e..d9b03bbc586 100644
--- a/database/migrations.go
+++ b/database/migrations.go
@@ -668,4 +668,14 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
+ func(tx *sql.Tx) (err error) {
+ sql := `
+ ALTER TABLE integrations ADD COLUMN notion_enabled bool default 'f';
+ ALTER TABLE integrations ADD COLUMN notion_token text default '';
+ ALTER TABLE integrations ADD COLUMN notion_page_id text default '';
+ ALTER TABLE integrations ADD COLUMN notion_url text default '';
+ `
+ _, err = tx.Exec(sql)
+ return err
+ },
}
diff --git a/http/client/client.go b/http/client/client.go
index cb9669441a7..f1a3f4d42a5 100644
--- a/http/client/client.go
+++ b/http/client/client.go
@@ -45,9 +45,9 @@ type Client struct {
requestPassword string
requestUserAgent string
requestCookie string
-
- useProxy bool
- doNotFollowRedirects bool
+ customHeaders map[string]string
+ useProxy bool
+ doNotFollowRedirects bool
ClientTimeout int
ClientMaxBodySize int64
@@ -112,6 +112,12 @@ func (c *Client) WithAuthorization(authorization string) *Client {
return c
}
+// WithCustomHeaders defines custom HTTP headers.
+func (c *Client) WithCustomHeaders(customHeaders map[string]string) *Client {
+ c.customHeaders = customHeaders
+ return c
+}
+
// WithCacheHeaders defines caching headers.
func (c *Client) WithCacheHeaders(etagHeader, lastModifiedHeader string) *Client {
c.requestEtagHeader = etagHeader
@@ -184,6 +190,22 @@ func (c *Client) PostJSON(data interface{}) (*Response, error) {
return c.executeRequest(request)
}
+// PatchJSON performs a Patch HTTP request with a JSON payload.
+func (c *Client) PatchJSON(data interface{}) (*Response, error) {
+ b, err := json.Marshal(data)
+ if err != nil {
+ return nil, err
+ }
+
+ request, err := c.buildRequest(http.MethodPatch, bytes.NewReader(b))
+ if err != nil {
+ return nil, err
+ }
+
+ request.Header.Add("Content-Type", "application/json")
+ return c.executeRequest(request)
+}
+
func (c *Client) executeRequest(request *http.Request) (*Response, error) {
defer timer.ExecutionTime(time.Now(), fmt.Sprintf("[HttpClient] inputURL=%s", c.inputURL))
@@ -337,6 +359,11 @@ func (c *Client) buildHeaders() http.Header {
if c.requestCookie != "" {
headers.Add("Cookie", c.requestCookie)
}
+ if len(c.customHeaders) != 0 {
+ for key, value := range c.customHeaders {
+ headers.Add(key, value)
+ }
+ }
headers.Add("Connection", "close")
return headers
diff --git a/integration/integration.go b/integration/integration.go
index 898380a1edb..121afc7d495 100644
--- a/integration/integration.go
+++ b/integration/integration.go
@@ -10,6 +10,7 @@ import (
"miniflux.app/integration/instapaper"
"miniflux.app/integration/linkding"
"miniflux.app/integration/matrixbot"
+ "miniflux.app/integration/notion"
"miniflux.app/integration/nunuxkeeper"
"miniflux.app/integration/pinboard"
"miniflux.app/integration/pocket"
@@ -63,6 +64,19 @@ func SendEntry(entry *model.Entry, integration *model.Integration) {
}
}
+ if integration.NotionEnabled {
+ logger.Debug("[Integration] Sending Entry #%d %q for User #%d to Notion", entry.ID, entry.URL, integration.UserID)
+
+ client := notion.NewClient(
+ integration.NotionURL,
+ integration.NotionToken,
+ integration.NotionPageID,
+ )
+ if err := client.AddEntry(entry.URL, entry.Title); err != nil {
+ logger.Error("[Integration] UserID #%d: %v", integration.UserID, err)
+ }
+ }
+
if integration.NunuxKeeperEnabled {
logger.Debug("[Integration] Sending Entry #%d %q for User #%d to NunuxKeeper", entry.ID, entry.URL, integration.UserID)
diff --git a/integration/notion/notion.go b/integration/notion/notion.go
new file mode 100644
index 00000000000..b287243016a
--- /dev/null
+++ b/integration/notion/notion.go
@@ -0,0 +1,68 @@
+package notion
+
+import (
+ "fmt"
+ "net/url"
+
+ "miniflux.app/http/client"
+)
+
+// Client represents a Notion client.
+type Client struct {
+ baseURL string
+ token string
+ pageID string
+}
+
+// NewClient returns a new Notion client.
+func NewClient(baseURL, token string, pageID string) *Client {
+ return &Client{baseURL, token, pageID}
+}
+
+func (c *Client) AddEntry(entryURL string, entryTitle string) error {
+ if c.baseURL == "" || c.token == "" || c.pageID == "" {
+ return fmt.Errorf("notion: missing credentials")
+ }
+ endpoint, err := getAPIEndpoint(c.baseURL, "/v1/blocks/"+c.pageID+"/children")
+ if err != nil {
+ return fmt.Errorf("notion: unable to get token endpoint: %v", err)
+ }
+
+ clt := client.New(endpoint)
+ block := &Data{
+ Children: []Block{
+ {
+ Object: "block",
+ Type: "bookmark",
+ Bookmark: Bookmark{
+ Caption: []interface{}{},
+ URL: entryURL,
+ },
+ },
+ },
+ }
+ clt.WithAuthorization("Bearer " + c.token)
+ customHeaders := map[string]string{
+ "Notion-Version": "2022-06-28",
+ }
+ clt.WithCustomHeaders(customHeaders)
+ response, error := clt.PatchJSON(block)
+ if error != nil {
+ return fmt.Errorf("notion: unable to post entry: %v", err)
+ }
+
+ if response.HasServerFailure() {
+ return fmt.Errorf("notion: request failed, status=%d", response.StatusCode)
+ }
+ return nil
+
+}
+
+func getAPIEndpoint(baseURL, path string) (string, error) {
+ u, err := url.Parse(baseURL)
+ if err != nil {
+ return "", fmt.Errorf("notion: invalid API endpoint: %v", err)
+ }
+ u.Path = path
+ return u.String(), nil
+}
diff --git a/integration/notion/wrapper.go b/integration/notion/wrapper.go
new file mode 100644
index 00000000000..70f6bebf1eb
--- /dev/null
+++ b/integration/notion/wrapper.go
@@ -0,0 +1,16 @@
+package notion
+
+type Data struct {
+ Children []Block `json:"children"`
+}
+
+type Block struct {
+ Object string `json:"object"`
+ Type string `json:"type"`
+ Bookmark Bookmark `json:"bookmark"`
+}
+
+type Bookmark struct {
+ Caption []interface{} `json:"caption"` // Assuming the "caption" field can have different types
+ URL string `json:"url"`
+}
diff --git a/model/integration.go b/model/integration.go
index bab15ca0ae4..7dc4a74f266 100644
--- a/model/integration.go
+++ b/model/integration.go
@@ -30,6 +30,10 @@ type Integration struct {
NunuxKeeperEnabled bool
NunuxKeeperURL string
NunuxKeeperAPIKey string
+ NotionEnabled bool
+ NotionURL string
+ NotionToken string
+ NotionPageID string
EspialEnabled bool
EspialURL string
EspialAPIKey string
diff --git a/storage/integration.go b/storage/integration.go
index 367905de61a..8dd3e9272ff 100644
--- a/storage/integration.go
+++ b/storage/integration.go
@@ -131,6 +131,10 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
wallabag_client_secret,
wallabag_username,
wallabag_password,
+ notion_enabled,
+ notion_token,
+ notion_page_id,
+ notion_url,
nunux_keeper_enabled,
nunux_keeper_url,
nunux_keeper_api_key,
@@ -181,6 +185,10 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
&integration.WallabagClientSecret,
&integration.WallabagUsername,
&integration.WallabagPassword,
+ &integration.NotionEnabled,
+ &integration.NotionToken,
+ &integration.NotionPageID,
+ &integration.NotionURL,
&integration.NunuxKeeperEnabled,
&integration.NunuxKeeperURL,
&integration.NunuxKeeperAPIKey,
@@ -267,7 +275,11 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_user=$39,
matrix_bot_password=$40,
matrix_bot_url=$41,
- matrix_bot_chat_id=$42
+ matrix_bot_chat_id=$42,
+ notion_enabled=$44,
+ notion_token=$45,
+ notion_page_id=$46,
+ notion_url=$47
WHERE
user_id=$43
`
@@ -315,6 +327,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.MatrixBotPassword,
integration.MatrixBotURL,
integration.MatrixBotChatID,
+ integration.NotionEnabled,
+ integration.NotionToken,
+ integration.NotionPageID,
+ integration.NotionURL,
integration.UserID,
)
} else {
@@ -363,7 +379,11 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_user=$39,
matrix_bot_password=$40,
matrix_bot_url=$41,
- matrix_bot_chat_id=$42
+ matrix_bot_chat_id=$42,
+ notion_enabled=$44,
+ notion_token=$45,
+ notion_page_id=$46,
+ notion_url=$47
WHERE
user_id=$43
`
@@ -412,6 +432,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.MatrixBotURL,
integration.MatrixBotChatID,
integration.UserID,
+ integration.NotionEnabled,
+ integration.NotionToken,
+ integration.NotionPageID,
+ integration.NotionURL,
)
}
@@ -432,7 +456,7 @@ func (s *Storage) HasSaveEntry(userID int64) (result bool) {
WHERE
user_id=$1
AND
- (pinboard_enabled='t' OR instapaper_enabled='t' OR wallabag_enabled='t' OR nunux_keeper_enabled='t' OR espial_enabled='t' OR pocket_enabled='t' OR linkding_enabled='t')
+ (pinboard_enabled='t' OR instapaper_enabled='t' OR wallabag_enabled='t' OR notion_enabled='t' OR nunux_keeper_enabled='t' OR espial_enabled='t' OR pocket_enabled='t' OR linkding_enabled='t')
`
if err := s.db.QueryRow(query, userID).Scan(&result); err != nil {
result = false
diff --git a/template/templates/views/integrations.html b/template/templates/views/integrations.html
index e4890ae16d5..a6f902e58fb 100644
--- a/template/templates/views/integrations.html
+++ b/template/templates/views/integrations.html
@@ -142,7 +142,25 @@
Wallabag
+ Notion
+
Nunux Keeper
-
+
From 7af1759efc9b93af87188975cab52e7ec706b238 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Tue, 4 Jul 2023 09:54:25 +0000
Subject: [PATCH 07/21] =?UTF-8?q?=E2=9E=95=20add=20missing=20translations?=
=?UTF-8?q?=20keys=20for=20other=20locales=20=E2=9C=8D=EF=B8=8F=20get=20ri?=
=?UTF-8?q?d=20of=20notionURL=20cause=20it's=20not=20changing=20for=20the?=
=?UTF-8?q?=20time=20being?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
database/migrations.go | 2 --
http/client/client.go | 7 ++---
integration/integration.go | 1 -
integration/notion/notion.go | 33 +++++++---------------
locale/translations/de_DE.json | 3 ++
locale/translations/el_EL.json | 3 ++
locale/translations/en_US.json | 1 -
locale/translations/es_ES.json | 3 ++
locale/translations/fi_FI.json | 3 ++
locale/translations/fr_FR.json | 1 -
locale/translations/hi_IN.json | 3 ++
locale/translations/id_ID.json | 3 ++
locale/translations/it_IT.json | 3 ++
locale/translations/ja_JP.json | 3 ++
locale/translations/nl_NL.json | 3 ++
locale/translations/pl_PL.json | 3 ++
locale/translations/pt_BR.json | 3 ++
locale/translations/ru_RU.json | 3 ++
locale/translations/tr_TR.json | 3 ++
locale/translations/uk_UA.json | 3 ++
locale/translations/zh_CN.json | 3 ++
locale/translations/zh_TW.json | 3 ++
model/integration.go | 1 -
storage/integration.go | 10 ++-----
template/templates/views/integrations.html | 3 --
ui/form/integration.go | 3 --
ui/integration_show.go | 1 -
27 files changed, 63 insertions(+), 48 deletions(-)
diff --git a/database/migrations.go b/database/migrations.go
index 9acc3f3d8ce..e7f806cd5da 100644
--- a/database/migrations.go
+++ b/database/migrations.go
@@ -707,13 +707,11 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
-
func(tx *sql.Tx) (err error) {
sql := `
ALTER TABLE integrations ADD COLUMN notion_enabled bool default 'f';
ALTER TABLE integrations ADD COLUMN notion_token text default '';
ALTER TABLE integrations ADD COLUMN notion_page_id text default '';
- ALTER TABLE integrations ADD COLUMN notion_url text default '';
`
_, err = tx.Exec(sql)
return err
diff --git a/http/client/client.go b/http/client/client.go
index d74a093689c..46388998118 100644
--- a/http/client/client.go
+++ b/http/client/client.go
@@ -358,10 +358,9 @@ func (c *Client) buildHeaders() http.Header {
if c.requestCookie != "" {
headers.Add("Cookie", c.requestCookie)
}
- if len(c.customHeaders) != 0 {
- for key, value := range c.customHeaders {
- headers.Add(key, value)
- }
+
+ for key, value := range c.customHeaders {
+ headers.Add(key, value)
}
headers.Add("Connection", "close")
diff --git a/integration/integration.go b/integration/integration.go
index e8dd86062fd..96f02305559 100644
--- a/integration/integration.go
+++ b/integration/integration.go
@@ -67,7 +67,6 @@ func SendEntry(entry *model.Entry, integration *model.Integration) {
logger.Debug("[Integration] Sending Entry #%d %q for User #%d to Notion", entry.ID, entry.URL, integration.UserID)
client := notion.NewClient(
- integration.NotionURL,
integration.NotionToken,
integration.NotionPageID,
)
diff --git a/integration/notion/notion.go b/integration/notion/notion.go
index b287243016a..bbece4a2969 100644
--- a/integration/notion/notion.go
+++ b/integration/notion/notion.go
@@ -1,34 +1,30 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
package notion
import (
"fmt"
- "net/url"
"miniflux.app/http/client"
)
// Client represents a Notion client.
type Client struct {
- baseURL string
- token string
- pageID string
+ token string
+ pageID string
}
// NewClient returns a new Notion client.
-func NewClient(baseURL, token string, pageID string) *Client {
- return &Client{baseURL, token, pageID}
+func NewClient(baseURL, token string) *Client {
+ return &Client{baseURL, token}
}
func (c *Client) AddEntry(entryURL string, entryTitle string) error {
- if c.baseURL == "" || c.token == "" || c.pageID == "" {
+ if c.token == "" || c.pageID == "" {
return fmt.Errorf("notion: missing credentials")
}
- endpoint, err := getAPIEndpoint(c.baseURL, "/v1/blocks/"+c.pageID+"/children")
- if err != nil {
- return fmt.Errorf("notion: unable to get token endpoint: %v", err)
- }
-
- clt := client.New(endpoint)
+ clt := client.New("https://api.notion.com" + "/v1/blocks/" + c.pageID + "/children")
block := &Data{
Children: []Block{
{
@@ -48,7 +44,7 @@ func (c *Client) AddEntry(entryURL string, entryTitle string) error {
clt.WithCustomHeaders(customHeaders)
response, error := clt.PatchJSON(block)
if error != nil {
- return fmt.Errorf("notion: unable to post entry: %v", err)
+ return fmt.Errorf("notion: unable to patch entry: %v", error)
}
if response.HasServerFailure() {
@@ -57,12 +53,3 @@ func (c *Client) AddEntry(entryURL string, entryTitle string) error {
return nil
}
-
-func getAPIEndpoint(baseURL, path string) (string, error) {
- u, err := url.Parse(baseURL)
- if err != nil {
- return "", fmt.Errorf("notion: invalid API endpoint: %v", err)
- }
- u.Path = path
- return u.String(), nil
-}
diff --git a/locale/translations/de_DE.json b/locale/translations/de_DE.json
index 5a001d4e2e9..0ef14f91d1f 100644
--- a/locale/translations/de_DE.json
+++ b/locale/translations/de_DE.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client-Secret",
"form.integration.wallabag_username": "Wallabag Benutzername",
"form.integration.wallabag_password": "Wallabag Passwort",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Artikel in Nunux Keeper speichern",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API-Endpunkt",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-Schlüssel",
diff --git a/locale/translations/el_EL.json b/locale/translations/el_EL.json
index acfca6110fb..6527fed3027 100644
--- a/locale/translations/el_EL.json
+++ b/locale/translations/el_EL.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag Μυστικό Πελάτη",
"form.integration.wallabag_username": "Όνομα Χρήστη Wallabag",
"form.integration.wallabag_password": "Wallabag Κωδικός Πρόσβασης",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Αποθήκευση άρθρων στο Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Τελικό σημείο Nunux Keeper API",
"form.integration.nunux_keeper_api_key": "Κλειδί API Nunux Keeper",
diff --git a/locale/translations/en_US.json b/locale/translations/en_US.json
index 8824562c3bd..d278bfdb605 100644
--- a/locale/translations/en_US.json
+++ b/locale/translations/en_US.json
@@ -352,7 +352,6 @@
"form.integration.wallabag_username": "Wallabag Username",
"form.integration.wallabag_password": "Wallabag Password",
"form.integration.notion_activate": "Save entries to Notion",
- "form.integration.notion_endpoint": "Notion API Endpoint",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Save entries to Nunux Keeper",
diff --git a/locale/translations/es_ES.json b/locale/translations/es_ES.json
index d1b9fcc5056..e69e56d4abb 100644
--- a/locale/translations/es_ES.json
+++ b/locale/translations/es_ES.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Secreto de cliente de Wallabag",
"form.integration.wallabag_username": "Nombre de usuario de Wallabag",
"form.integration.wallabag_password": "Contraseña de Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Enviar artículos a Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Acceso API de Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Clave de API de Nunux Keeper",
diff --git a/locale/translations/fi_FI.json b/locale/translations/fi_FI.json
index 554fe01486f..16b6bb39cd1 100644
--- a/locale/translations/fi_FI.json
+++ b/locale/translations/fi_FI.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client Secret",
"form.integration.wallabag_username": "Wallabag-käyttäjätunnus",
"form.integration.wallabag_password": "Wallabag-salasana",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Tallenna artikkelit Nunux Keeperiin",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API-päätepiste",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-avain",
diff --git a/locale/translations/fr_FR.json b/locale/translations/fr_FR.json
index 18575465a3a..c1e6975d1f3 100644
--- a/locale/translations/fr_FR.json
+++ b/locale/translations/fr_FR.json
@@ -352,7 +352,6 @@
"form.integration.wallabag_username": "Nom d'utilisateur de Wallabag",
"form.integration.wallabag_password": "Mot de passe de Wallabag",
"form.integration.notion_activate": "Sauvegarder les articles vers Notion",
- "form.integration.notion_endpoint": "URL de l'API de Notion",
"form.integration.notion_page_id": "l'identifiant de la page Notion",
"form.integration.notion_token": "Jeton d'accès de l'API de Notion",
"form.integration.nunux_keeper_activate": "Sauvegarder les articles vers Nunux Keeper",
diff --git a/locale/translations/hi_IN.json b/locale/translations/hi_IN.json
index dbe6107df0f..7e0b2f545f3 100644
--- a/locale/translations/hi_IN.json
+++ b/locale/translations/hi_IN.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "वालाबैग क्लाइंट सीक्रेट",
"form.integration.wallabag_username": "वालाबैग उपयोगकर्ता नाम",
"form.integration.wallabag_password": "वालाबैग पासवर्ड",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "विषय-वस्तु को ननक्स कीपर में सहेजें",
"form.integration.nunux_keeper_endpoint": "ननक्स कीपर एपीआई समापन बिंदु",
"form.integration.nunux_keeper_api_key": "ननक्स कीपर एपीआई कुंजी",
diff --git a/locale/translations/id_ID.json b/locale/translations/id_ID.json
index 3fa277fbc4f..4e4a8a3957b 100644
--- a/locale/translations/id_ID.json
+++ b/locale/translations/id_ID.json
@@ -348,6 +348,9 @@
"form.integration.wallabag_client_secret": "Rahasia Klien Wallabag",
"form.integration.wallabag_username": "Nama Pengguna Wallabag",
"form.integration.wallabag_password": "Kata Sandi Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Simpan artikel ke Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Titik URL API Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Kunci API Nunux Keeper",
diff --git a/locale/translations/it_IT.json b/locale/translations/it_IT.json
index 31876b79d1b..d30b7f660fd 100644
--- a/locale/translations/it_IT.json
+++ b/locale/translations/it_IT.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Client secret dell'account Wallabag",
"form.integration.wallabag_username": "Nome utente dell'account Wallabag",
"form.integration.wallabag_password": "Password dell'account Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Salva gli articoli su Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Endpoint dell'API di Nunux Keeper",
"form.integration.nunux_keeper_api_key": "API key dell'account Nunux Keeper",
diff --git a/locale/translations/ja_JP.json b/locale/translations/ja_JP.json
index 4d4ba13080b..782d6e2d182 100644
--- a/locale/translations/ja_JP.json
+++ b/locale/translations/ja_JP.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag の Client Secret",
"form.integration.wallabag_username": "Wallabag のユーザー名",
"form.integration.wallabag_password": "Wallabag のパスワード",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Nunux Keeper に記事を保存する",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper の API Endpoint",
"form.integration.nunux_keeper_api_key": "Nunux Keeper の API key",
diff --git a/locale/translations/nl_NL.json b/locale/translations/nl_NL.json
index 102d1359f4d..3fb32dbeda7 100644
--- a/locale/translations/nl_NL.json
+++ b/locale/translations/nl_NL.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client-Secret",
"form.integration.wallabag_username": "Wallabag gebruikersnaam",
"form.integration.wallabag_password": "Wallabag wachtwoord",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Opslaan naar Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper URL",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-sleutel",
diff --git a/locale/translations/pl_PL.json b/locale/translations/pl_PL.json
index d22775bfdd0..6f32532e1d6 100644
--- a/locale/translations/pl_PL.json
+++ b/locale/translations/pl_PL.json
@@ -353,6 +353,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client Secret",
"form.integration.wallabag_username": "Login do Wallabag",
"form.integration.wallabag_password": "Hasło do Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Zapisz artykuly do Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper URL",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API key",
diff --git a/locale/translations/pt_BR.json b/locale/translations/pt_BR.json
index ac8b2059405..f5ee949d588 100644
--- a/locale/translations/pt_BR.json
+++ b/locale/translations/pt_BR.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Segredo do cliente (Client Secret) do Wallabag",
"form.integration.wallabag_username": "Nome de usuário do Wallabag",
"form.integration.wallabag_password": "Senha do Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Salvar itens no Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Endpoint de API do Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Chave de API do Nunux Keeper",
diff --git a/locale/translations/ru_RU.json b/locale/translations/ru_RU.json
index 7df14c039bd..82eb0481af9 100644
--- a/locale/translations/ru_RU.json
+++ b/locale/translations/ru_RU.json
@@ -353,6 +353,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client Secret",
"form.integration.wallabag_username": "Имя пользователя Wallabag",
"form.integration.wallabag_password": "Пароль Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Сохранять статьи в Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Конечная точка Nunux Keeper API",
"form.integration.nunux_keeper_api_key": "API-ключ Nunux Keeper",
diff --git a/locale/translations/tr_TR.json b/locale/translations/tr_TR.json
index 78cbdbe970d..641efcb493f 100644
--- a/locale/translations/tr_TR.json
+++ b/locale/translations/tr_TR.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client Secret",
"form.integration.wallabag_username": "Wallabag Kullanıcı Adı",
"form.integration.wallabag_password": "Wallabag Parolası",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Makaleleri Nunux Keeper'a kaydet",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Uç Noktası",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API anahtarı",
diff --git a/locale/translations/uk_UA.json b/locale/translations/uk_UA.json
index 4e06b6e50ff..42be13f7dbb 100644
--- a/locale/translations/uk_UA.json
+++ b/locale/translations/uk_UA.json
@@ -350,6 +350,9 @@
"form.integration.wallabag_client_secret": "Wallabag Client Secret",
"form.integration.wallabag_username": "Ім’я користувача Wallabag",
"form.integration.wallabag_password": "Пароль Wallabag",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "Зберігати статті до Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
"form.integration.nunux_keeper_api_key": "Ключ API Nunux Keeper",
diff --git a/locale/translations/zh_CN.json b/locale/translations/zh_CN.json
index e333885ef27..e96e964a2fb 100644
--- a/locale/translations/zh_CN.json
+++ b/locale/translations/zh_CN.json
@@ -349,6 +349,9 @@
"form.integration.wallabag_client_secret": "Wallabag 客户端 Secret",
"form.integration.wallabag_username": "Wallabag 用户名",
"form.integration.wallabag_password": "Wallabag 密码",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "保存文章到 Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API 端点",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API 密钥",
diff --git a/locale/translations/zh_TW.json b/locale/translations/zh_TW.json
index 1ef1e2b13c9..0330664e1f2 100644
--- a/locale/translations/zh_TW.json
+++ b/locale/translations/zh_TW.json
@@ -351,6 +351,9 @@
"form.integration.wallabag_client_secret": "Wallabag 客戶端 Secret",
"form.integration.wallabag_username": "Wallabag 使用者名稱",
"form.integration.wallabag_password": "Wallabag 密碼",
+ "form.integration.notion_activate": "Save entries to Notion",
+ "form.integration.notion_page_id": "Notion Page ID",
+ "form.integration.notion_token": "Notion Secret Token",
"form.integration.nunux_keeper_activate": "儲存文章到 Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API 端點",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API 金鑰",
diff --git a/model/integration.go b/model/integration.go
index c8d83763d37..50abd7fc17d 100644
--- a/model/integration.go
+++ b/model/integration.go
@@ -30,7 +30,6 @@ type Integration struct {
NunuxKeeperURL string
NunuxKeeperAPIKey string
NotionEnabled bool
- NotionURL string
NotionToken string
NotionPageID string
EspialEnabled bool
diff --git a/storage/integration.go b/storage/integration.go
index e7ee2bc3b27..f65aff6e09e 100644
--- a/storage/integration.go
+++ b/storage/integration.go
@@ -133,7 +133,6 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
notion_enabled,
notion_token,
notion_page_id,
- notion_url,
nunux_keeper_enabled,
nunux_keeper_url,
nunux_keeper_api_key,
@@ -188,7 +187,6 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
&integration.NotionEnabled,
&integration.NotionToken,
&integration.NotionPageID,
- &integration.NotionURL,
&integration.NunuxKeeperEnabled,
&integration.NunuxKeeperURL,
&integration.NunuxKeeperAPIKey,
@@ -280,8 +278,7 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_chat_id=$43,
notion_enabled=$45,
notion_token=$46,
- notion_page_id=$47,
- notion_url=$48
+ notion_page_id=$47
WHERE
user_id=$44
`
@@ -333,7 +330,6 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionEnabled,
integration.NotionToken,
integration.NotionPageID,
- integration.NotionURL,
integration.UserID,
)
} else {
@@ -386,8 +382,7 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_chat_id=$43,
notion_enabled=$45,
notion_token=$46,
- notion_page_id=$47,
- notion_url=$48
+ notion_page_id=$47
WHERE
user_id=$44
`
@@ -440,7 +435,6 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionEnabled,
integration.NotionToken,
integration.NotionPageID,
- integration.NotionURL,
)
}
diff --git a/template/templates/views/integrations.html b/template/templates/views/integrations.html
index c47595e6c70..afc47bef801 100644
--- a/template/templates/views/integrations.html
+++ b/template/templates/views/integrations.html
@@ -148,9 +148,6 @@
Notion
{{ t "form.integration.notion_activate" }}
-
-
-
diff --git a/ui/form/integration.go b/ui/form/integration.go
index b1552a55221..95c07f142e4 100644
--- a/ui/form/integration.go
+++ b/ui/form/integration.go
@@ -32,7 +32,6 @@ type IntegrationForm struct {
WallabagUsername string
WallabagPassword string
NotionEnabled bool
- NotionURL string
NotionPageID string
NotionToken string
NunuxKeeperEnabled bool
@@ -83,7 +82,6 @@ func (i IntegrationForm) Merge(integration *model.Integration) {
integration.NotionEnabled = i.NotionEnabled
integration.NotionPageID = i.NotionPageID
integration.NotionToken = i.NotionToken
- integration.NotionURL = i.NotionURL
integration.NunuxKeeperEnabled = i.NunuxKeeperEnabled
integration.NunuxKeeperURL = i.NunuxKeeperURL
integration.NunuxKeeperAPIKey = i.NunuxKeeperAPIKey
@@ -135,7 +133,6 @@ func NewIntegrationForm(r *http.Request) *IntegrationForm {
NotionEnabled: r.FormValue("notion_enabled") == "1",
NotionPageID: r.FormValue("notion_page_id"),
NotionToken: r.FormValue("notion_token"),
- NotionURL: r.FormValue("notion_url"),
NunuxKeeperEnabled: r.FormValue("nunux_keeper_enabled") == "1",
NunuxKeeperURL: r.FormValue("nunux_keeper_url"),
NunuxKeeperAPIKey: r.FormValue("nunux_keeper_api_key"),
diff --git a/ui/integration_show.go b/ui/integration_show.go
index 01bfa4d0734..eac49da6edf 100644
--- a/ui/integration_show.go
+++ b/ui/integration_show.go
@@ -49,7 +49,6 @@ func (h *handler) showIntegrationPage(w http.ResponseWriter, r *http.Request) {
NotionEnabled: integration.NotionEnabled,
NotionPageID: integration.NotionPageID,
NotionToken: integration.NotionToken,
- NotionURL: integration.NotionURL,
NunuxKeeperEnabled: integration.NunuxKeeperEnabled,
NunuxKeeperURL: integration.NunuxKeeperURL,
NunuxKeeperAPIKey: integration.NunuxKeeperAPIKey,
From ef6e6a7e4bc785f3c94b801abe5b57072d6297e4 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Tue, 4 Jul 2023 09:57:39 +0000
Subject: [PATCH 08/21] =?UTF-8?q?=E2=9C=8D=EF=B8=8F=20combine=20resource?=
=?UTF-8?q?=20with=20endpoint=20url?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
integration/notion/notion.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/integration/notion/notion.go b/integration/notion/notion.go
index bbece4a2969..c5fee668949 100644
--- a/integration/notion/notion.go
+++ b/integration/notion/notion.go
@@ -24,7 +24,7 @@ func (c *Client) AddEntry(entryURL string, entryTitle string) error {
if c.token == "" || c.pageID == "" {
return fmt.Errorf("notion: missing credentials")
}
- clt := client.New("https://api.notion.com" + "/v1/blocks/" + c.pageID + "/children")
+ clt := client.New("https://api.notion.com/v1/blocks/" + c.pageID + "/children")
block := &Data{
Children: []Block{
{
From 41fbf1e24eba851bd6d5b6edd5fafb983d89c2ba Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Tue, 4 Jul 2023 10:08:21 +0000
Subject: [PATCH 09/21] =?UTF-8?q?=E2=9C=8D=EF=B8=8F=20fix=20new=20client?=
=?UTF-8?q?=20params?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
integration/notion/notion.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/integration/notion/notion.go b/integration/notion/notion.go
index c5fee668949..01844a955eb 100644
--- a/integration/notion/notion.go
+++ b/integration/notion/notion.go
@@ -16,8 +16,8 @@ type Client struct {
}
// NewClient returns a new Notion client.
-func NewClient(baseURL, token string) *Client {
- return &Client{baseURL, token}
+func NewClient(token, pageID string) *Client {
+ return &Client{token, pageID}
}
func (c *Client) AddEntry(entryURL string, entryTitle string) error {
From 4a430c6e29fe176f2b7bab4e18065b395a6f3964 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Thu, 6 Jul 2023 09:55:25 +0200
Subject: [PATCH 10/21] add license lines
---
integration/notion/wrapper.go | 3 +++
1 file changed, 3 insertions(+)
diff --git a/integration/notion/wrapper.go b/integration/notion/wrapper.go
index 70f6bebf1eb..d37633c02f8 100644
--- a/integration/notion/wrapper.go
+++ b/integration/notion/wrapper.go
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
package notion
type Data struct {
From 8a7a7a390e3c67b8e4acaec5049c4cb2fe23cdda Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Fri, 7 Jul 2023 19:17:26 +0000
Subject: [PATCH 11/21] remove unnecessary trailing newline (whitespace)
---
integration/notion/notion.go | 1 -
1 file changed, 1 deletion(-)
diff --git a/integration/notion/notion.go b/integration/notion/notion.go
index 01844a955eb..16f29dc3535 100644
--- a/integration/notion/notion.go
+++ b/integration/notion/notion.go
@@ -51,5 +51,4 @@ func (c *Client) AddEntry(entryURL string, entryTitle string) error {
return fmt.Errorf("notion: request failed, status=%d", response.StatusCode)
}
return nil
-
}
From 097cb8d0711c78e6f21369b629b76374ae12cc8f Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 8 Jul 2023 22:32:35 +0000
Subject: [PATCH 12/21] =?UTF-8?q?=F0=9F=8E=89=20support=20apprise=20to=20p?=
=?UTF-8?q?ush=20entries/entry=20via=20different=20messaging=20services=20?=
=?UTF-8?q?=E2=9E=95=20add=20apprise=20service=20container=20to=20dev=20co?=
=?UTF-8?q?ntainer=20=E2=9C=8D=EF=B8=8F=20update=20locale=20=E2=9E=95=20ch?=
=?UTF-8?q?eck=20if=20apprise=20host=20in=20reachable?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.devcontainer/docker-compose.yml | 4 +
database/migrations.go | 9 +++
integration/apprise/apprise.go | 86 ++++++++++++++++++++++
integration/apprise/wrapper.go | 9 +++
integration/integration.go | 25 +++++++
locale/translations/de_DE.json | 3 +
locale/translations/el_EL.json | 3 +
locale/translations/en_US.json | 3 +
locale/translations/es_ES.json | 3 +
locale/translations/fi_FI.json | 3 +
locale/translations/fr_FR.json | 3 +
locale/translations/hi_IN.json | 3 +
locale/translations/id_ID.json | 3 +
locale/translations/it_IT.json | 3 +
locale/translations/ja_JP.json | 3 +
locale/translations/nl_NL.json | 3 +
locale/translations/pl_PL.json | 3 +
locale/translations/pt_BR.json | 3 +
locale/translations/ru_RU.json | 3 +
locale/translations/tr_TR.json | 3 +
locale/translations/uk_UA.json | 3 +
locale/translations/zh_CN.json | 3 +
locale/translations/zh_TW.json | 3 +
model/integration.go | 3 +
storage/integration.go | 26 ++++++-
template/templates/views/integrations.html | 15 ++++
ui/form/integration.go | 9 +++
ui/integration_show.go | 3 +
28 files changed, 239 insertions(+), 4 deletions(-)
create mode 100644 integration/apprise/apprise.go
create mode 100644 integration/apprise/wrapper.go
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 05e28c9db50..f65edf15fef 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -23,5 +23,9 @@ services:
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- 5432:5432
+ apprise:
+ image: caronc/apprise:latest
+ restart: unless-stopped
+ hostname: apprise
volumes:
postgres-data: null
diff --git a/database/migrations.go b/database/migrations.go
index e7f806cd5da..777f2ef6ad8 100644
--- a/database/migrations.go
+++ b/database/migrations.go
@@ -716,4 +716,13 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
+ func(tx *sql.Tx) (err error) {
+ sql := `
+ ALTER TABLE integrations ADD COLUMN apprise_enabled bool default 'f';
+ ALTER TABLE integrations ADD COLUMN apprise_url text default '';
+ ALTER TABLE integrations ADD COLUMN apprise_services_url text default '';
+ `
+ _, err = tx.Exec(sql)
+ return err
+ },
}
diff --git a/integration/apprise/apprise.go b/integration/apprise/apprise.go
new file mode 100644
index 00000000000..525945aadfe
--- /dev/null
+++ b/integration/apprise/apprise.go
@@ -0,0 +1,86 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package apprise
+
+import (
+ "fmt"
+ "net"
+ "strings"
+ "time"
+
+ "miniflux.app/http/client"
+ "miniflux.app/model"
+)
+
+// Client represents a Apprise client.
+type Client struct {
+ servicesURL string
+ baseURL string
+}
+
+// NewClient returns a new Apprise client.
+func NewClient(serviceURL, baseURL string) *Client {
+ return &Client{serviceURL, baseURL}
+}
+
+// PushEntry pushes entries to apprise
+func (c *Client) PushEntries(entries model.Entries) error {
+ if c.baseURL == "" || c.servicesURL == "" {
+ return fmt.Errorf("apprise: missing credentials")
+ }
+ timeout := time.Duration(1 * time.Second)
+ _, err := net.DialTimeout("tcp", c.baseURL, timeout)
+ if err != nil {
+ clt := client.New(c.baseURL + "/notify")
+ message := ""
+ for _, entry := range entries {
+ message = message + entry.Title + "-" + entry.URL + "\n"
+ }
+ data := &Data{
+ Urls: c.servicesURL,
+ Body: message,
+ }
+ response, error := clt.PostJSON(data)
+ if error != nil {
+ return fmt.Errorf("apprise: ending message failed: %v", error)
+ }
+
+ if response.HasServerFailure() {
+ return fmt.Errorf("apprise: request failed, status=%d", response.StatusCode)
+ }
+ } else {
+ return fmt.Errorf("%s %s %s", c.baseURL, "responding on port:", strings.Split(c.baseURL, ":")[1])
+ }
+
+ return nil
+}
+
+// PushEntry pushes entry to apprise
+func (c *Client) PushEntry(entry *model.Entry) error {
+ if c.baseURL == "" || c.servicesURL == "" {
+ return fmt.Errorf("apprise: missing credentials")
+ }
+ timeout := time.Duration(1 * time.Second)
+ _, err := net.DialTimeout("tcp", c.baseURL, timeout)
+ if err != nil {
+ clt := client.New(c.baseURL + "/notify")
+ message := entry.Title + "-" + entry.URL + "\n"
+ data := &Data{
+ Urls: c.servicesURL,
+ Body: message,
+ }
+ response, error := clt.PostJSON(data)
+ if error != nil {
+ return fmt.Errorf("apprise: ending message failed: %v", error)
+ }
+
+ if response.HasServerFailure() {
+ return fmt.Errorf("apprise: request failed, status=%d", response.StatusCode)
+ }
+ } else {
+ return fmt.Errorf("%s %s %s", c.baseURL, "responding on port:", strings.Split(c.baseURL, ":")[1])
+ }
+
+ return nil
+}
diff --git a/integration/apprise/wrapper.go b/integration/apprise/wrapper.go
new file mode 100644
index 00000000000..8b8bac7da5f
--- /dev/null
+++ b/integration/apprise/wrapper.go
@@ -0,0 +1,9 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package apprise
+
+type Data struct {
+ Urls string `json:"urls"`
+ Body string `json:"body"`
+}
diff --git a/integration/integration.go b/integration/integration.go
index 96f02305559..b620c4b8573 100644
--- a/integration/integration.go
+++ b/integration/integration.go
@@ -5,6 +5,7 @@ package integration // import "miniflux.app/integration"
import (
"miniflux.app/config"
+ "miniflux.app/integration/apprise"
"miniflux.app/integration/espial"
"miniflux.app/integration/instapaper"
"miniflux.app/integration/linkding"
@@ -135,6 +136,18 @@ func PushEntries(entries model.Entries, integration *model.Integration) {
logger.Error("[Integration] push entries to matrix bot failed: %v", err)
}
}
+ if integration.AppriseEnabled {
+ logger.Debug("[Integration] Sending %d entries for User #%d to apprise", len(entries), integration.UserID)
+
+ client := apprise.NewClient(
+ integration.AppriseServicesURL,
+ integration.AppriseURL,
+ )
+ err := client.PushEntries(entries)
+ if err != nil {
+ logger.Error("[Integration] push entry to apprise failed: %v", err)
+ }
+ }
}
// PushEntry pushes an entry to third-party providers during feed refreshes.
@@ -147,4 +160,16 @@ func PushEntry(entry *model.Entry, integration *model.Integration) {
logger.Error("[Integration] push entry to telegram bot failed: %v", err)
}
}
+ if integration.AppriseEnabled {
+ logger.Debug("[Integration] Sending Entry %q for User #%d to apprise", entry.URL, integration.UserID)
+
+ client := apprise.NewClient(
+ integration.AppriseServicesURL,
+ integration.AppriseURL,
+ )
+ err := client.PushEntry(entry)
+ if err != nil {
+ logger.Error("[Integration] push entry to apprise failed: %v", err)
+ }
+ }
}
diff --git a/locale/translations/de_DE.json b/locale/translations/de_DE.json
index 0ef14f91d1f..541a90bb540 100644
--- a/locale/translations/de_DE.json
+++ b/locale/translations/de_DE.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Artikel in Nunux Keeper speichern",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API-Endpunkt",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-Schlüssel",
diff --git a/locale/translations/el_EL.json b/locale/translations/el_EL.json
index 6527fed3027..49fd3bc15ef 100644
--- a/locale/translations/el_EL.json
+++ b/locale/translations/el_EL.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Αποθήκευση άρθρων στο Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Τελικό σημείο Nunux Keeper API",
"form.integration.nunux_keeper_api_key": "Κλειδί API Nunux Keeper",
diff --git a/locale/translations/en_US.json b/locale/translations/en_US.json
index d278bfdb605..a3c3e8d2218 100644
--- a/locale/translations/en_US.json
+++ b/locale/translations/en_US.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Save entries to Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API key",
diff --git a/locale/translations/es_ES.json b/locale/translations/es_ES.json
index e69e56d4abb..720eb3fe77a 100644
--- a/locale/translations/es_ES.json
+++ b/locale/translations/es_ES.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Enviar artículos a Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Acceso API de Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Clave de API de Nunux Keeper",
diff --git a/locale/translations/fi_FI.json b/locale/translations/fi_FI.json
index 16b6bb39cd1..0d0fb7a5bb6 100644
--- a/locale/translations/fi_FI.json
+++ b/locale/translations/fi_FI.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Tallenna artikkelit Nunux Keeperiin",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API-päätepiste",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-avain",
diff --git a/locale/translations/fr_FR.json b/locale/translations/fr_FR.json
index c1e6975d1f3..7620b813591 100644
--- a/locale/translations/fr_FR.json
+++ b/locale/translations/fr_FR.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Sauvegarder les articles vers Notion",
"form.integration.notion_page_id": "l'identifiant de la page Notion",
"form.integration.notion_token": "Jeton d'accès de l'API de Notion",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Sauvegarder les articles vers Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "URL de l'API de Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Clé d'API de Nunux Keeper",
diff --git a/locale/translations/hi_IN.json b/locale/translations/hi_IN.json
index 7e0b2f545f3..97d13cade2b 100644
--- a/locale/translations/hi_IN.json
+++ b/locale/translations/hi_IN.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "विषय-वस्तु को ननक्स कीपर में सहेजें",
"form.integration.nunux_keeper_endpoint": "ननक्स कीपर एपीआई समापन बिंदु",
"form.integration.nunux_keeper_api_key": "ननक्स कीपर एपीआई कुंजी",
diff --git a/locale/translations/id_ID.json b/locale/translations/id_ID.json
index 4e4a8a3957b..e85ef7d4609 100644
--- a/locale/translations/id_ID.json
+++ b/locale/translations/id_ID.json
@@ -351,6 +351,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Simpan artikel ke Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Titik URL API Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Kunci API Nunux Keeper",
diff --git a/locale/translations/it_IT.json b/locale/translations/it_IT.json
index d30b7f660fd..87ba0a788ca 100644
--- a/locale/translations/it_IT.json
+++ b/locale/translations/it_IT.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Salva gli articoli su Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Endpoint dell'API di Nunux Keeper",
"form.integration.nunux_keeper_api_key": "API key dell'account Nunux Keeper",
diff --git a/locale/translations/ja_JP.json b/locale/translations/ja_JP.json
index 782d6e2d182..9f610282f68 100644
--- a/locale/translations/ja_JP.json
+++ b/locale/translations/ja_JP.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Nunux Keeper に記事を保存する",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper の API Endpoint",
"form.integration.nunux_keeper_api_key": "Nunux Keeper の API key",
diff --git a/locale/translations/nl_NL.json b/locale/translations/nl_NL.json
index 3fb32dbeda7..ac49aeb48b2 100644
--- a/locale/translations/nl_NL.json
+++ b/locale/translations/nl_NL.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Opslaan naar Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper URL",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API-sleutel",
diff --git a/locale/translations/pl_PL.json b/locale/translations/pl_PL.json
index 6f32532e1d6..91f310b2d2c 100644
--- a/locale/translations/pl_PL.json
+++ b/locale/translations/pl_PL.json
@@ -356,6 +356,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Zapisz artykuly do Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper URL",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API key",
diff --git a/locale/translations/pt_BR.json b/locale/translations/pt_BR.json
index f5ee949d588..f40eb310335 100644
--- a/locale/translations/pt_BR.json
+++ b/locale/translations/pt_BR.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Salvar itens no Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Endpoint de API do Nunux Keeper",
"form.integration.nunux_keeper_api_key": "Chave de API do Nunux Keeper",
diff --git a/locale/translations/ru_RU.json b/locale/translations/ru_RU.json
index 82eb0481af9..837edb1cd33 100644
--- a/locale/translations/ru_RU.json
+++ b/locale/translations/ru_RU.json
@@ -356,6 +356,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Сохранять статьи в Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Конечная точка Nunux Keeper API",
"form.integration.nunux_keeper_api_key": "API-ключ Nunux Keeper",
diff --git a/locale/translations/tr_TR.json b/locale/translations/tr_TR.json
index 641efcb493f..3bf5be0361b 100644
--- a/locale/translations/tr_TR.json
+++ b/locale/translations/tr_TR.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Makaleleri Nunux Keeper'a kaydet",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Uç Noktası",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API anahtarı",
diff --git a/locale/translations/uk_UA.json b/locale/translations/uk_UA.json
index 42be13f7dbb..688096cfbb3 100644
--- a/locale/translations/uk_UA.json
+++ b/locale/translations/uk_UA.json
@@ -353,6 +353,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "Зберігати статті до Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
"form.integration.nunux_keeper_api_key": "Ключ API Nunux Keeper",
diff --git a/locale/translations/zh_CN.json b/locale/translations/zh_CN.json
index e96e964a2fb..3765259413a 100644
--- a/locale/translations/zh_CN.json
+++ b/locale/translations/zh_CN.json
@@ -352,6 +352,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "保存文章到 Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API 端点",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API 密钥",
diff --git a/locale/translations/zh_TW.json b/locale/translations/zh_TW.json
index 0330664e1f2..9b29f9ee42e 100644
--- a/locale/translations/zh_TW.json
+++ b/locale/translations/zh_TW.json
@@ -354,6 +354,9 @@
"form.integration.notion_activate": "Save entries to Notion",
"form.integration.notion_page_id": "Notion Page ID",
"form.integration.notion_token": "Notion Secret Token",
+ "form.integration.apprise_activate": "Push entries to Apprise",
+ "form.integration.apprise_url": "Apprise API URL",
+ "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
"form.integration.nunux_keeper_activate": "儲存文章到 Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API 端點",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API 金鑰",
diff --git a/model/integration.go b/model/integration.go
index 50abd7fc17d..9de5d536d8a 100644
--- a/model/integration.go
+++ b/model/integration.go
@@ -52,4 +52,7 @@ type Integration struct {
MatrixBotPassword string
MatrixBotURL string
MatrixBotChatID string
+ AppriseEnabled bool
+ AppriseURL string
+ AppriseServicesURL string
}
diff --git a/storage/integration.go b/storage/integration.go
index f65aff6e09e..ba263432a82 100644
--- a/storage/integration.go
+++ b/storage/integration.go
@@ -155,7 +155,10 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
matrix_bot_user,
matrix_bot_password,
matrix_bot_url,
- matrix_bot_chat_id
+ matrix_bot_chat_id,
+ apprise_enabled,
+ apprise_url,
+ apprise_services_url
FROM
integrations
WHERE
@@ -210,6 +213,9 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
&integration.MatrixBotPassword,
&integration.MatrixBotURL,
&integration.MatrixBotChatID,
+ &integration.AppriseEnabled,
+ &integration.AppriseURL,
+ &integration.AppriseServicesURL,
)
switch {
case err == sql.ErrNoRows:
@@ -278,7 +284,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_chat_id=$43,
notion_enabled=$45,
notion_token=$46,
- notion_page_id=$47
+ notion_page_id=$47,
+ apprise_enabled=$48,
+ apprise_url=$49,
+ apprise_services_url=$50
WHERE
user_id=$44
`
@@ -330,6 +339,9 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionEnabled,
integration.NotionToken,
integration.NotionPageID,
+ integration.AppriseEnabled,
+ integration.AppriseURL,
+ integration.AppriseServicesURL,
integration.UserID,
)
} else {
@@ -382,7 +394,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_chat_id=$43,
notion_enabled=$45,
notion_token=$46,
- notion_page_id=$47
+ notion_page_id=$47,
+ apprise_enabled=$48,
+ apprise_url=$49,
+ apprise_services_url=$50
WHERE
user_id=$44
`
@@ -435,6 +450,9 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionEnabled,
integration.NotionToken,
integration.NotionPageID,
+ integration.AppriseEnabled,
+ integration.AppriseURL,
+ integration.AppriseServicesURL,
)
}
@@ -455,7 +473,7 @@ func (s *Storage) HasSaveEntry(userID int64) (result bool) {
WHERE
user_id=$1
AND
- (pinboard_enabled='t' OR instapaper_enabled='t' OR wallabag_enabled='t' OR notion_enabled='t' OR nunux_keeper_enabled='t' OR espial_enabled='t' OR pocket_enabled='t' OR linkding_enabled='t')
+ (pinboard_enabled='t' OR instapaper_enabled='t' OR wallabag_enabled='t' OR notion_enabled='t' OR nunux_keeper_enabled='t' OR espial_enabled='t' OR pocket_enabled='t' OR linkding_enabled='t' OR apprise_enabled='t')
`
if err := s.db.QueryRow(query, userID).Scan(&result); err != nil {
result = false
diff --git a/template/templates/views/integrations.html b/template/templates/views/integrations.html
index afc47bef801..41ce8939086 100644
--- a/template/templates/views/integrations.html
+++ b/template/templates/views/integrations.html
@@ -218,7 +218,22 @@ Linkding
+ Apprise
+
Telegram Bot
-
+
From a756ef49b68ebc6d4147b2216d1920994d516d1d Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 8 Jul 2023 22:44:39 +0000
Subject: [PATCH 14/21] =?UTF-8?q?=F0=9F=98=83fix=20conflicts?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
storage/integration.go | 7 -------
1 file changed, 7 deletions(-)
diff --git a/storage/integration.go b/storage/integration.go
index 4f94306201a..ba263432a82 100644
--- a/storage/integration.go
+++ b/storage/integration.go
@@ -284,14 +284,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
matrix_bot_chat_id=$43,
notion_enabled=$45,
notion_token=$46,
-<<<<<<< HEAD
notion_page_id=$47,
apprise_enabled=$48,
apprise_url=$49,
apprise_services_url=$50
-=======
- notion_page_id=$47
->>>>>>> origin
WHERE
user_id=$44
`
@@ -343,12 +339,9 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionEnabled,
integration.NotionToken,
integration.NotionPageID,
-<<<<<<< HEAD
integration.AppriseEnabled,
integration.AppriseURL,
integration.AppriseServicesURL,
-=======
->>>>>>> origin
integration.UserID,
)
} else {
From 38cf76ab1dc7a0a5bfb6b47b8b2f7a3a16b46a5d Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sun, 9 Jul 2023 15:00:01 +0000
Subject: [PATCH 15/21] using markdown format
---
integration/apprise/apprise.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/integration/apprise/apprise.go b/integration/apprise/apprise.go
index 525945aadfe..82951d3295e 100644
--- a/integration/apprise/apprise.go
+++ b/integration/apprise/apprise.go
@@ -35,7 +35,7 @@ func (c *Client) PushEntries(entries model.Entries) error {
clt := client.New(c.baseURL + "/notify")
message := ""
for _, entry := range entries {
- message = message + entry.Title + "-" + entry.URL + "\n"
+ message = message + "[" + entry.Title + "]" + "(" + entry.URL + ")" + "\n\n"
}
data := &Data{
Urls: c.servicesURL,
@@ -65,7 +65,7 @@ func (c *Client) PushEntry(entry *model.Entry) error {
_, err := net.DialTimeout("tcp", c.baseURL, timeout)
if err != nil {
clt := client.New(c.baseURL + "/notify")
- message := entry.Title + "-" + entry.URL + "\n"
+ message := "[" + entry.Title + "]" + "(" + entry.URL + ")" + "\n\n"
data := &Data{
Urls: c.servicesURL,
Body: message,
From 1ddff9bd4c33c3b207810e725f528ac158d6fec9 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Mon, 10 Jul 2023 19:08:02 +0000
Subject: [PATCH 16/21] =?UTF-8?q?=E2=9C=8D=EF=B8=8F=20typo=20servicesURL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
integration/apprise/apprise.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/integration/apprise/apprise.go b/integration/apprise/apprise.go
index 82951d3295e..6b3dde6af9a 100644
--- a/integration/apprise/apprise.go
+++ b/integration/apprise/apprise.go
@@ -20,8 +20,8 @@ type Client struct {
}
// NewClient returns a new Apprise client.
-func NewClient(serviceURL, baseURL string) *Client {
- return &Client{serviceURL, baseURL}
+func NewClient(servicesURL, baseURL string) *Client {
+ return &Client{servicesURL, baseURL}
}
// PushEntry pushes entries to apprise
From 4b6357564a0e70bbea13970bbb953b7482b8c419 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 29 Jul 2023 19:58:45 +0000
Subject: [PATCH 17/21] =?UTF-8?q?Revert=20"=E2=9C=8D=EF=B8=8F=20typo=20ser?=
=?UTF-8?q?vicesURL"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 1ddff9bd4c33c3b207810e725f528ac158d6fec9.
---
integration/apprise/apprise.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/integration/apprise/apprise.go b/integration/apprise/apprise.go
index 6b3dde6af9a..82951d3295e 100644
--- a/integration/apprise/apprise.go
+++ b/integration/apprise/apprise.go
@@ -20,8 +20,8 @@ type Client struct {
}
// NewClient returns a new Apprise client.
-func NewClient(servicesURL, baseURL string) *Client {
- return &Client{servicesURL, baseURL}
+func NewClient(serviceURL, baseURL string) *Client {
+ return &Client{serviceURL, baseURL}
}
// PushEntry pushes entries to apprise
From 63f67eb363b7e2e589e40a3b66486a530768a1b1 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 29 Jul 2023 20:04:35 +0000
Subject: [PATCH 18/21] fix(golang-linter): `gofmt`-ed with `-s`
---
database/migrations.go | 3 +--
storage/integration.go | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/database/migrations.go b/database/migrations.go
index 48701ce717f..2bc806c7657 100644
--- a/database/migrations.go
+++ b/database/migrations.go
@@ -724,7 +724,6 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
-
func(tx *sql.Tx) (err error) {
sql := `
ALTER TABLE integrations ADD COLUMN apprise_enabled bool default 'f';
@@ -733,5 +732,5 @@ var migrations = []func(tx *sql.Tx) error{
`
_, err = tx.Exec(sql)
return err
- },
+ },
}
diff --git a/storage/integration.go b/storage/integration.go
index 079abb7e827..21e3a2cb353 100644
--- a/storage/integration.go
+++ b/storage/integration.go
@@ -341,7 +341,7 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.NotionPageID,
integration.ReadwiseEnabled,
integration.ReadwiseAPIKey,
- integration.AppriseEnabled,
+ integration.AppriseEnabled,
integration.AppriseURL,
integration.AppriseServicesURL,
integration.UserID,
From c1c535852f87db6c6ee14200da83d9018b6cf187 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 29 Jul 2023 20:19:07 +0000
Subject: [PATCH 19/21] enhance(integration-view): add tooltip to guide user
setting up right services urls format
---
locale/translations/en_US.json | 2 +-
template/templates/views/integrations.html | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/locale/translations/en_US.json b/locale/translations/en_US.json
index aa88fbc9cd2..7c14437988b 100644
--- a/locale/translations/en_US.json
+++ b/locale/translations/en_US.json
@@ -356,7 +356,7 @@
"form.integration.notion_token": "Notion Secret Token",
"form.integration.apprise_activate": "Push entries to Apprise",
"form.integration.apprise_url": "Apprise API URL",
- "form.integration.apprise_services_url": "Apprise services urls seperated by comma",
+ "form.integration.apprise_services_url": "Apprise Services URLs (seperated by comma)",
"form.integration.nunux_keeper_activate": "Save entries to Nunux Keeper",
"form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
"form.integration.nunux_keeper_api_key": "Nunux Keeper API key",
diff --git a/template/templates/views/integrations.html b/template/templates/views/integrations.html
index 4e20e9115f7..96cddd3e99d 100644
--- a/template/templates/views/integrations.html
+++ b/template/templates/views/integrations.html
@@ -243,7 +243,11 @@
Apprise
-
+
From cd29c0e1296173842cc895f4b9e079e44ab3a0d6 Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Sat, 29 Jul 2023 20:22:05 +0000
Subject: [PATCH 20/21] add(services-urls-field): placeholder
---
template/templates/views/integrations.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/template/templates/views/integrations.html b/template/templates/views/integrations.html
index 96cddd3e99d..0712eb9a85e 100644
--- a/template/templates/views/integrations.html
+++ b/template/templates/views/integrations.html
@@ -248,7 +248,7 @@
Apprise
{{ icon "external-link" }}
-
+
From 828c8873b4485319d232645ab0cab5a1fd02f46f Mon Sep 17 00:00:00 2001
From: Jean Khawand <22157081+jeankhawand@users.noreply.github.com>
Date: Mon, 31 Jul 2023 15:46:48 +0000
Subject: [PATCH 21/21] fix(entries-push): discovered some messaging services
limit payload size will go for pushEntry
---
integration/apprise/apprise.go | 32 --------------------------------
integration/integration.go | 12 ------------
2 files changed, 44 deletions(-)
diff --git a/integration/apprise/apprise.go b/integration/apprise/apprise.go
index 82951d3295e..62cfc941ee0 100644
--- a/integration/apprise/apprise.go
+++ b/integration/apprise/apprise.go
@@ -24,38 +24,6 @@ func NewClient(serviceURL, baseURL string) *Client {
return &Client{serviceURL, baseURL}
}
-// PushEntry pushes entries to apprise
-func (c *Client) PushEntries(entries model.Entries) error {
- if c.baseURL == "" || c.servicesURL == "" {
- return fmt.Errorf("apprise: missing credentials")
- }
- timeout := time.Duration(1 * time.Second)
- _, err := net.DialTimeout("tcp", c.baseURL, timeout)
- if err != nil {
- clt := client.New(c.baseURL + "/notify")
- message := ""
- for _, entry := range entries {
- message = message + "[" + entry.Title + "]" + "(" + entry.URL + ")" + "\n\n"
- }
- data := &Data{
- Urls: c.servicesURL,
- Body: message,
- }
- response, error := clt.PostJSON(data)
- if error != nil {
- return fmt.Errorf("apprise: ending message failed: %v", error)
- }
-
- if response.HasServerFailure() {
- return fmt.Errorf("apprise: request failed, status=%d", response.StatusCode)
- }
- } else {
- return fmt.Errorf("%s %s %s", c.baseURL, "responding on port:", strings.Split(c.baseURL, ":")[1])
- }
-
- return nil
-}
-
// PushEntry pushes entry to apprise
func (c *Client) PushEntry(entry *model.Entry) error {
if c.baseURL == "" || c.servicesURL == "" {
diff --git a/integration/integration.go b/integration/integration.go
index e5a71ee2b84..7e53531396a 100644
--- a/integration/integration.go
+++ b/integration/integration.go
@@ -149,18 +149,6 @@ func PushEntries(entries model.Entries, integration *model.Integration) {
logger.Error("[Integration] push entries to matrix bot failed: %v", err)
}
}
- if integration.AppriseEnabled {
- logger.Debug("[Integration] Sending %d entries for User #%d to apprise", len(entries), integration.UserID)
-
- client := apprise.NewClient(
- integration.AppriseServicesURL,
- integration.AppriseURL,
- )
- err := client.PushEntries(entries)
- if err != nil {
- logger.Error("[Integration] push entry to apprise failed: %v", err)
- }
- }
}
// PushEntry pushes an entry to third-party providers during feed refreshes.