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.