1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-30 19:22:11 +00:00

feat(integration): add tags option for karakeep integration

fix missing comma

Move tags attachment to own function
This commit is contained in:
Christian Frommert 2025-09-28 20:37:05 +02:00
parent 8adcaed29e
commit 6ed12151d2
28 changed files with 143 additions and 17 deletions

View file

@ -1348,4 +1348,11 @@ var migrations = [...]func(tx *sql.Tx) error{
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return err return err
}, },
func(tx *sql.Tx) (err error) {
sql := `
ALTER TABLE integrations ADD COLUMN karakeep_tags text default '';
`
_, err = tx.Exec(sql)
return err
},
} }

View file

@ -457,14 +457,20 @@ func SendEntry(entry *model.Entry, userIntegrations *model.Integration) {
if userIntegrations.KarakeepEnabled { if userIntegrations.KarakeepEnabled {
slog.Debug("Sending entry to Karakeep", slog.Debug("Sending entry to Karakeep",
slog.Int64("user_id", userIntegrations.UserID), slog.Int64("user_id", userIntegrations.UserID),
slog.String("user_tags", userIntegrations.KarakeepTags),
slog.Int64("entry_id", entry.ID), slog.Int64("entry_id", entry.ID),
slog.String("entry_url", entry.URL), slog.String("entry_url", entry.URL),
) )
client := karakeep.NewClient(userIntegrations.KarakeepAPIKey, userIntegrations.KarakeepURL) client := karakeep.NewClient(
userIntegrations.KarakeepAPIKey,
userIntegrations.KarakeepURL,
userIntegrations.KarakeepTags,
)
if err := client.SaveURL(entry.URL); err != nil { if err := client.SaveURL(entry.URL); err != nil {
slog.Error("Unable to send entry to Karakeep", slog.Error("Unable to send entry to Karakeep",
slog.Int64("user_id", userIntegrations.UserID), slog.Int64("user_id", userIntegrations.UserID),
slog.String("user_tags", userIntegrations.KarakeepTags),
slog.Int64("entry_id", entry.ID), slog.Int64("entry_id", entry.ID),
slog.String("entry_url", entry.URL), slog.String("entry_url", entry.URL),
slog.Any("error", err), slog.Any("error", err),

View file

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"strings"
"time" "time"
"miniflux.app/v2/internal/version" "miniflux.app/v2/internal/version"
@ -16,9 +17,15 @@ import (
const defaultClientTimeout = 10 * time.Second const defaultClientTimeout = 10 * time.Second
type errorResponse struct { type Client struct {
Code string `json:"code"` wrapped *http.Client
Error string `json:"error"` apiEndpoint string
apiToken string
tags string
}
type tagItem struct {
TagName string `json:"tagName"`
} }
type saveURLPayload struct { type saveURLPayload struct {
@ -26,14 +33,75 @@ type saveURLPayload struct {
URL string `json:"url"` URL string `json:"url"`
} }
type Client struct { type saveURLResponse struct {
wrapped *http.Client ID string `json:"id"`
apiEndpoint string
apiToken string
} }
func NewClient(apiToken string, apiEndpoint string) *Client { type attachTagsPayload struct {
return &Client{wrapped: &http.Client{Timeout: defaultClientTimeout}, apiEndpoint: apiEndpoint, apiToken: apiToken} Tags []tagItem `json:"tags"`
}
type errorResponse struct {
Code string `json:"code"`
Error string `json:"error"`
}
func NewClient(apiToken string, apiEndpoint string, tags string) *Client {
return &Client{wrapped: &http.Client{Timeout: defaultClientTimeout}, apiEndpoint: apiEndpoint, apiToken: apiToken, tags: tags}
}
func (c *Client) attachTags(entryID string) error {
if c.tags == "" {
return nil
}
tagItems := make([]tagItem, 0)
for tag := range strings.SplitSeq(c.tags, ",") {
if trimmedTag := strings.TrimSpace(tag); trimmedTag != "" {
tagItems = append(tagItems, tagItem{TagName: trimmedTag})
}
}
if len(tagItems) == 0 {
return nil
}
tagRequestBody, err := json.Marshal(&attachTagsPayload{
Tags: tagItems,
})
if err != nil {
return fmt.Errorf("karakeep: unable to encode tag request body: %v", err)
}
tagRequest, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/%s/tags", c.apiEndpoint, entryID), bytes.NewReader(tagRequestBody))
if err != nil {
return fmt.Errorf("karakeep: unable to create tag request: %v", err)
}
tagRequest.Header.Set("Authorization", "Bearer "+c.apiToken)
tagRequest.Header.Set("Content-Type", "application/json")
tagRequest.Header.Set("User-Agent", "Miniflux/"+version.Version)
tagResponse, err := c.wrapped.Do(tagRequest)
if err != nil {
return fmt.Errorf("karakeep: unable to send tag request: %v", err)
}
defer tagResponse.Body.Close()
if tagResponse.StatusCode != http.StatusOK && tagResponse.StatusCode != http.StatusCreated {
tagResponseBody, err := io.ReadAll(tagResponse.Body)
if err != nil {
return fmt.Errorf("karakeep: failed to parse tag response: %s", err)
}
var errResponse errorResponse
if err := json.Unmarshal(tagResponseBody, &errResponse); err != nil {
return fmt.Errorf("karakeep: unable to parse tag error response: status=%d body=%s", tagResponse.StatusCode, string(tagResponseBody))
}
return fmt.Errorf("karakeep: failed to attach tags: status=%d errorcode=%s %s", tagResponse.StatusCode, errResponse.Code, errResponse.Error)
}
return nil
} }
func (c *Client) SaveURL(entryURL string) error { func (c *Client) SaveURL(entryURL string) error {
@ -77,5 +145,18 @@ func (c *Client) SaveURL(entryURL string) error {
return fmt.Errorf("karakeep: failed to save URL: status=%d errorcode=%s %s", resp.StatusCode, errResponse.Code, errResponse.Error) return fmt.Errorf("karakeep: failed to save URL: status=%d errorcode=%s %s", resp.StatusCode, errResponse.Code, errResponse.Error)
} }
var response saveURLResponse
if err := json.Unmarshal(responseBody, &response); err != nil {
return fmt.Errorf("karakeep: unable to parse response: %v", err)
}
if response.ID == "" {
return fmt.Errorf("karakeep: unable to get ID from response")
}
if err := c.attachTags(response.ID); err != nil {
return fmt.Errorf("karakeep: unable to attach tags: %v", err)
}
return nil return nil
} }

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Artikel in Karakeep speichern", "form.integration.karakeep_activate": "Artikel in Karakeep speichern",
"form.integration.karakeep_api_key": "Karakeep-API-Schlüssel", "form.integration.karakeep_api_key": "Karakeep-API-Schlüssel",
"form.integration.karakeep_url": "Karakeep-API-Endpunkt", "form.integration.karakeep_url": "Karakeep-API-Endpunkt",
"form.integration.karakeep_tags": "Karakeep-Tags",
"form.integration.linkace_activate": "Artikel in LinkAce speichern", "form.integration.linkace_activate": "Artikel in LinkAce speichern",
"form.integration.linkace_api_key": "LinkAce-API-Schlüssel", "form.integration.linkace_api_key": "LinkAce-API-Schlüssel",
"form.integration.linkace_check_disabled": "Linkprüfung deaktivieren", "form.integration.linkace_check_disabled": "Linkprüfung deaktivieren",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Αποθήκευση άρθρων στο Karakeep", "form.integration.karakeep_activate": "Αποθήκευση άρθρων στο Karakeep",
"form.integration.karakeep_api_key": "Κλειδί API Karakeep", "form.integration.karakeep_api_key": "Κλειδί API Karakeep",
"form.integration.karakeep_url": "Τελικό σημείο Karakeep API", "form.integration.karakeep_url": "Τελικό σημείο Karakeep API",
"form.integration.karakeep_tags": "Ετικέτες Karakeep",
"form.integration.linkace_activate": "Αποθήκευση καταχωρήσεων στο LinkAce", "form.integration.linkace_activate": "Αποθήκευση καταχωρήσεων στο LinkAce",
"form.integration.linkace_api_key": "Κλειδί API LinkAce", "form.integration.linkace_api_key": "Κλειδί API LinkAce",
"form.integration.linkace_check_disabled": "Απενεργοποίηση ελέγχου συνδέσμου", "form.integration.linkace_check_disabled": "Απενεργοποίηση ελέγχου συνδέσμου",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Save entries to Karakeep", "form.integration.karakeep_activate": "Save entries to Karakeep",
"form.integration.karakeep_api_key": "Karakeep API key", "form.integration.karakeep_api_key": "Karakeep API key",
"form.integration.karakeep_url": "Karakeep API Endpoint", "form.integration.karakeep_url": "Karakeep API Endpoint",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Save entries to LinkAce", "form.integration.linkace_activate": "Save entries to LinkAce",
"form.integration.linkace_api_key": "LinkAce API key", "form.integration.linkace_api_key": "LinkAce API key",
"form.integration.linkace_check_disabled": "Disable link check", "form.integration.linkace_check_disabled": "Disable link check",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Enviar artículos a Karakeep", "form.integration.karakeep_activate": "Enviar artículos a Karakeep",
"form.integration.karakeep_api_key": "Clave de API de Karakeep", "form.integration.karakeep_api_key": "Clave de API de Karakeep",
"form.integration.karakeep_url": "Acceso API de Karakeep", "form.integration.karakeep_url": "Acceso API de Karakeep",
"form.integration.karakeep_tags": "Etiquetas de Karakeep",
"form.integration.linkace_activate": "Guardar artículos en LinkAce", "form.integration.linkace_activate": "Guardar artículos en LinkAce",
"form.integration.linkace_api_key": "Clave API de LinkAce", "form.integration.linkace_api_key": "Clave API de LinkAce",
"form.integration.linkace_check_disabled": "Deshabilitar la comprobación de enlace", "form.integration.linkace_check_disabled": "Deshabilitar la comprobación de enlace",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Tallenna artikkelit Karakeepiin", "form.integration.karakeep_activate": "Tallenna artikkelit Karakeepiin",
"form.integration.karakeep_api_key": "Karakeep API-avain", "form.integration.karakeep_api_key": "Karakeep API-avain",
"form.integration.karakeep_url": "Karakeep API-päätepiste", "form.integration.karakeep_url": "Karakeep API-päätepiste",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Save entries to LinkAce", "form.integration.linkace_activate": "Save entries to LinkAce",
"form.integration.linkace_api_key": "LinkAce API key", "form.integration.linkace_api_key": "LinkAce API key",
"form.integration.linkace_check_disabled": "Disable link check", "form.integration.linkace_check_disabled": "Disable link check",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Sauvegarder les articles vers Karakeep", "form.integration.karakeep_activate": "Sauvegarder les articles vers Karakeep",
"form.integration.karakeep_api_key": "Clé d'API de Karakeep", "form.integration.karakeep_api_key": "Clé d'API de Karakeep",
"form.integration.karakeep_url": "URL de l'API de Karakeep", "form.integration.karakeep_url": "URL de l'API de Karakeep",
"form.integration.karakeep_tags": "Libellés Karakeep",
"form.integration.linkace_activate": "Enregistrer les entrées vers LinkAce", "form.integration.linkace_activate": "Enregistrer les entrées vers LinkAce",
"form.integration.linkace_api_key": "Clé d'API LinkAce", "form.integration.linkace_api_key": "Clé d'API LinkAce",
"form.integration.linkace_check_disabled": "Désactiver la vérification des liens", "form.integration.linkace_check_disabled": "Désactiver la vérification des liens",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Save entries to Karakeep", "form.integration.karakeep_activate": "Save entries to Karakeep",
"form.integration.karakeep_api_key": "Karakeep API key", "form.integration.karakeep_api_key": "Karakeep API key",
"form.integration.karakeep_url": "Karakeep API Endpoint", "form.integration.karakeep_url": "Karakeep API Endpoint",
"form.integration.karakeep_tags": "Karakeep Labels",
"form.integration.linkace_activate": "Save entries to LinkAce", "form.integration.linkace_activate": "Save entries to LinkAce",
"form.integration.linkace_api_key": "LinkAce API key", "form.integration.linkace_api_key": "LinkAce API key",
"form.integration.linkace_check_disabled": "Disable link check", "form.integration.linkace_check_disabled": "Disable link check",

View file

@ -238,6 +238,7 @@
"form.integration.karakeep_activate": "Simpan artikel ke Karakeep", "form.integration.karakeep_activate": "Simpan artikel ke Karakeep",
"form.integration.karakeep_api_key": "Kunci API Karakeep", "form.integration.karakeep_api_key": "Kunci API Karakeep",
"form.integration.karakeep_url": "Titik URL API Karakeep", "form.integration.karakeep_url": "Titik URL API Karakeep",
"form.integration.karakeep_tags": "Tanda di Karakeep",
"form.integration.linkace_activate": "Simpan artikel ke LinkAce", "form.integration.linkace_activate": "Simpan artikel ke LinkAce",
"form.integration.linkace_api_key": "Kunci API LinkAce", "form.integration.linkace_api_key": "Kunci API LinkAce",
"form.integration.linkace_check_disabled": "Matikan pemeriksaan tautan", "form.integration.linkace_check_disabled": "Matikan pemeriksaan tautan",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Salva gli articoli su Karakeep", "form.integration.karakeep_activate": "Salva gli articoli su Karakeep",
"form.integration.karakeep_api_key": "API key dell'account Karakeep", "form.integration.karakeep_api_key": "API key dell'account Karakeep",
"form.integration.karakeep_url": "Endpoint dell'API di Karakeep", "form.integration.karakeep_url": "Endpoint dell'API di Karakeep",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Salva gli articoli su LinkAce", "form.integration.linkace_activate": "Salva gli articoli su LinkAce",
"form.integration.linkace_api_key": "API key dell'account LinkAce", "form.integration.linkace_api_key": "API key dell'account LinkAce",
"form.integration.linkace_check_disabled": "Disabilita i controlli", "form.integration.linkace_check_disabled": "Disabilita i controlli",

View file

@ -238,6 +238,7 @@
"form.integration.karakeep_activate": "Karakeep に記事を保存する", "form.integration.karakeep_activate": "Karakeep に記事を保存する",
"form.integration.karakeep_api_key": "Karakeep の API key", "form.integration.karakeep_api_key": "Karakeep の API key",
"form.integration.karakeep_url": "Karakeep の API Endpoint", "form.integration.karakeep_url": "Karakeep の API Endpoint",
"form.integration.karakeep_tags": "Karakeep の Tags",
"form.integration.linkace_activate": "Save entries to LinkAce", "form.integration.linkace_activate": "Save entries to LinkAce",
"form.integration.linkace_api_key": "LinkAce API key", "form.integration.linkace_api_key": "LinkAce API key",
"form.integration.linkace_check_disabled": "Disable link check", "form.integration.linkace_check_disabled": "Disable link check",

View file

@ -238,6 +238,7 @@
"form.integration.karakeep_activate": "Pó-chûn siau-sit kàu Karakeep", "form.integration.karakeep_activate": "Pó-chûn siau-sit kàu Karakeep",
"form.integration.karakeep_api_key": "Karakeep API só-sî", "form.integration.karakeep_api_key": "Karakeep API só-sî",
"form.integration.karakeep_url": "Karakeep API thâu", "form.integration.karakeep_url": "Karakeep API thâu",
"form.integration.karakeep_tags": "Karakeep khan-á",
"form.integration.linkace_activate": "Pó-chûn siau-sit kàu LinkAce", "form.integration.linkace_activate": "Pó-chûn siau-sit kàu LinkAce",
"form.integration.linkace_api_key": "LinkAce API só-sî", "form.integration.linkace_api_key": "LinkAce API só-sî",
"form.integration.linkace_check_disabled": "Thêng iōng liân-kiat kiám-cha", "form.integration.linkace_check_disabled": "Thêng iōng liân-kiat kiám-cha",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Artikelen opslaan in Karakeep", "form.integration.karakeep_activate": "Artikelen opslaan in Karakeep",
"form.integration.karakeep_api_key": "Karakeep API-sleutel", "form.integration.karakeep_api_key": "Karakeep API-sleutel",
"form.integration.karakeep_url": "Karakeep URL", "form.integration.karakeep_url": "Karakeep URL",
"form.integration.karakeep_tags": "Karakeep tags",
"form.integration.linkace_activate": "Artikelen opslaan in LinkAce", "form.integration.linkace_activate": "Artikelen opslaan in LinkAce",
"form.integration.linkace_api_key": "LinkAce API-sleutel", "form.integration.linkace_api_key": "LinkAce API-sleutel",
"form.integration.linkace_check_disabled": "Koppelingcontrole uitschakelen", "form.integration.linkace_check_disabled": "Koppelingcontrole uitschakelen",

View file

@ -244,6 +244,7 @@
"form.integration.karakeep_activate": "Zapisuj wpisy w Karakeep", "form.integration.karakeep_activate": "Zapisuj wpisy w Karakeep",
"form.integration.karakeep_api_key": "Klucz API do Karakeep", "form.integration.karakeep_api_key": "Klucz API do Karakeep",
"form.integration.karakeep_url": "Punkt końcowy API Karakeep", "form.integration.karakeep_url": "Punkt końcowy API Karakeep",
"form.integration.karakeep_tags": "Znaczniki Karakeep",
"form.integration.linkace_activate": "Zapisuj wpisy w LinkAce", "form.integration.linkace_activate": "Zapisuj wpisy w LinkAce",
"form.integration.linkace_api_key": "Klucz API do LinkAce", "form.integration.linkace_api_key": "Klucz API do LinkAce",
"form.integration.linkace_check_disabled": "Wyłącz sprawdzanie łączy", "form.integration.linkace_check_disabled": "Wyłącz sprawdzanie łączy",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Salvar itens no Karakeep", "form.integration.karakeep_activate": "Salvar itens no Karakeep",
"form.integration.karakeep_api_key": "Chave de API do Karakeep", "form.integration.karakeep_api_key": "Chave de API do Karakeep",
"form.integration.karakeep_url": "Endpoint de API do Karakeep", "form.integration.karakeep_url": "Endpoint de API do Karakeep",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Salvar itens no LinkAce", "form.integration.linkace_activate": "Salvar itens no LinkAce",
"form.integration.linkace_api_key": "Chave de API do LinkAce", "form.integration.linkace_api_key": "Chave de API do LinkAce",
"form.integration.linkace_check_disabled": "Desativar verificação de link", "form.integration.linkace_check_disabled": "Desativar verificação de link",

View file

@ -244,6 +244,7 @@
"form.integration.karakeep_activate": "Salvare înregistrări în Karakeep", "form.integration.karakeep_activate": "Salvare înregistrări în Karakeep",
"form.integration.karakeep_api_key": "Cheie API Karakeep", "form.integration.karakeep_api_key": "Cheie API Karakeep",
"form.integration.karakeep_url": "Punct acces API Karakeep", "form.integration.karakeep_url": "Punct acces API Karakeep",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Salvează intrările în LinkAce", "form.integration.linkace_activate": "Salvează intrările în LinkAce",
"form.integration.linkace_api_key": "Cheie API LinkAce", "form.integration.linkace_api_key": "Cheie API LinkAce",
"form.integration.linkace_check_disabled": "Dezactivează verificarea link-urilor", "form.integration.linkace_check_disabled": "Dezactivează verificarea link-urilor",

View file

@ -244,6 +244,7 @@
"form.integration.karakeep_activate": "Сохранять статьи в Karakeep", "form.integration.karakeep_activate": "Сохранять статьи в Karakeep",
"form.integration.karakeep_api_key": "API-ключ Karakeep", "form.integration.karakeep_api_key": "API-ключ Karakeep",
"form.integration.karakeep_url": "Конечная точка Karakeep API", "form.integration.karakeep_url": "Конечная точка Karakeep API",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Сохранять статьи в LinkAce", "form.integration.linkace_activate": "Сохранять статьи в LinkAce",
"form.integration.linkace_api_key": "API-ключ LinkAce", "form.integration.linkace_api_key": "API-ключ LinkAce",
"form.integration.linkace_check_disabled": "Отключить проверку ссылок", "form.integration.linkace_check_disabled": "Отключить проверку ссылок",

View file

@ -241,6 +241,7 @@
"form.integration.karakeep_activate": "Makaleleri Karakeep'a kaydet", "form.integration.karakeep_activate": "Makaleleri Karakeep'a kaydet",
"form.integration.karakeep_api_key": "Karakeep API anahtarı", "form.integration.karakeep_api_key": "Karakeep API anahtarı",
"form.integration.karakeep_url": "Karakeep API Uç Noktası", "form.integration.karakeep_url": "Karakeep API Uç Noktası",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Makaleleri LinkAce'e kaydet", "form.integration.linkace_activate": "Makaleleri LinkAce'e kaydet",
"form.integration.linkace_api_key": "LinkAce API anahtarı", "form.integration.linkace_api_key": "LinkAce API anahtarı",
"form.integration.linkace_check_disabled": "Link kontrolünü devre dışı bırak", "form.integration.linkace_check_disabled": "Link kontrolünü devre dışı bırak",

View file

@ -244,6 +244,7 @@
"form.integration.karakeep_activate": "Зберігати статті до Karakeep", "form.integration.karakeep_activate": "Зберігати статті до Karakeep",
"form.integration.karakeep_api_key": "Ключ API Karakeep", "form.integration.karakeep_api_key": "Ключ API Karakeep",
"form.integration.karakeep_url": "Karakeep API Endpoint", "form.integration.karakeep_url": "Karakeep API Endpoint",
"form.integration.karakeep_tags": "Karakeep Tags",
"form.integration.linkace_activate": "Save entries to LinkAce", "form.integration.linkace_activate": "Save entries to LinkAce",
"form.integration.linkace_api_key": "LinkAce API key", "form.integration.linkace_api_key": "LinkAce API key",
"form.integration.linkace_check_disabled": "Disable link check", "form.integration.linkace_check_disabled": "Disable link check",

View file

@ -238,6 +238,7 @@
"form.integration.karakeep_activate": "保存条目到 Karakeep", "form.integration.karakeep_activate": "保存条目到 Karakeep",
"form.integration.karakeep_api_key": "Karakeep API 密钥", "form.integration.karakeep_api_key": "Karakeep API 密钥",
"form.integration.karakeep_url": "Karakeep API 端点", "form.integration.karakeep_url": "Karakeep API 端点",
"form.integration.karakeep_tags": "Karakeep 标签",
"form.integration.linkace_activate": "保存条目到 LinkAce", "form.integration.linkace_activate": "保存条目到 LinkAce",
"form.integration.linkace_api_key": "LinkAce API 密钥", "form.integration.linkace_api_key": "LinkAce API 密钥",
"form.integration.linkace_check_disabled": "禁用链接检查", "form.integration.linkace_check_disabled": "禁用链接检查",

View file

@ -238,6 +238,7 @@
"form.integration.karakeep_activate": "儲存文章到 Karakeep", "form.integration.karakeep_activate": "儲存文章到 Karakeep",
"form.integration.karakeep_api_key": "Karakeep API 金鑰", "form.integration.karakeep_api_key": "Karakeep API 金鑰",
"form.integration.karakeep_url": "Karakeep API 端點", "form.integration.karakeep_url": "Karakeep API 端點",
"form.integration.karakeep_tags": "Karakeep 標籤",
"form.integration.linkace_activate": "儲存文章到 LinkAce", "form.integration.linkace_activate": "儲存文章到 LinkAce",
"form.integration.linkace_api_key": "LinkAce API 金鑰", "form.integration.linkace_api_key": "LinkAce API 金鑰",
"form.integration.linkace_check_disabled": "停用連結檢查", "form.integration.linkace_check_disabled": "停用連結檢查",

View file

@ -100,6 +100,7 @@ type Integration struct {
KarakeepEnabled bool KarakeepEnabled bool
KarakeepAPIKey string KarakeepAPIKey string
KarakeepURL string KarakeepURL string
KarakeepTags string
RaindropEnabled bool RaindropEnabled bool
RaindropToken string RaindropToken string
RaindropCollectionID string RaindropCollectionID string

View file

@ -222,6 +222,7 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
karakeep_enabled, karakeep_enabled,
karakeep_api_key, karakeep_api_key,
karakeep_url, karakeep_url,
karakeep_tags,
linktaco_enabled, linktaco_enabled,
linktaco_api_token, linktaco_api_token,
linktaco_org_slug, linktaco_org_slug,
@ -348,6 +349,7 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
&integration.KarakeepEnabled, &integration.KarakeepEnabled,
&integration.KarakeepAPIKey, &integration.KarakeepAPIKey,
&integration.KarakeepURL, &integration.KarakeepURL,
&integration.KarakeepTags,
&integration.LinktacoEnabled, &integration.LinktacoEnabled,
&integration.LinktacoAPIToken, &integration.LinktacoAPIToken,
&integration.LinktacoOrgSlug, &integration.LinktacoOrgSlug,
@ -483,14 +485,15 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
karakeep_enabled=$110, karakeep_enabled=$110,
karakeep_api_key=$111, karakeep_api_key=$111,
karakeep_url=$112, karakeep_url=$112,
linktaco_enabled=$113, karakeep_tags=$113,
linktaco_api_token=$114, linktaco_enabled=$114,
linktaco_org_slug=$115, linktaco_api_token=$115,
linktaco_tags=$116, linktaco_org_slug=$116,
linktaco_visibility=$117, linktaco_tags=$117,
archiveorg_enabled=$118 linktaco_visibility=$118,
archiveorg_enabled=$119
WHERE WHERE
user_id=$119 user_id=$120
` `
_, err := s.db.Exec( _, err := s.db.Exec(
query, query,
@ -606,6 +609,7 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
integration.KarakeepEnabled, integration.KarakeepEnabled,
integration.KarakeepAPIKey, integration.KarakeepAPIKey,
integration.KarakeepURL, integration.KarakeepURL,
integration.KarakeepTags,
integration.LinktacoEnabled, integration.LinktacoEnabled,
integration.LinktacoAPIToken, integration.LinktacoAPIToken,
integration.LinktacoOrgSlug, integration.LinktacoOrgSlug,

View file

@ -420,6 +420,9 @@
<label for="form-karakeep-url">{{ t "form.integration.karakeep_url" }}</label> <label for="form-karakeep-url">{{ t "form.integration.karakeep_url" }}</label>
<input type="url" name="karakeep_url" id="form-karakeep-url" value="{{ .form.KarakeepURL }}" placeholder="https://try.karakeep.app/api/v1/bookmarks" spellcheck="false"> <input type="url" name="karakeep_url" id="form-karakeep-url" value="{{ .form.KarakeepURL }}" placeholder="https://try.karakeep.app/api/v1/bookmarks" spellcheck="false">
<label for="form-karakeep-tags">{{ t "form.integration.karakeep_tags" }}</label>
<input type="text" name="karakeep_tags" id="form-karakeep-tags" value="{{ .form.KarakeepTags }}" placeholder="miniflux, new" spellcheck="false">
<div class="buttons"> <div class="buttons">
<button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button> <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
</div> </div>

View file

@ -103,6 +103,7 @@ type IntegrationForm struct {
KarakeepEnabled bool KarakeepEnabled bool
KarakeepAPIKey string KarakeepAPIKey string
KarakeepURL string KarakeepURL string
KarakeepTags string
RaindropEnabled bool RaindropEnabled bool
RaindropToken string RaindropToken string
RaindropCollectionID string RaindropCollectionID string
@ -222,6 +223,7 @@ func (i IntegrationForm) Merge(integration *model.Integration) {
integration.KarakeepEnabled = i.KarakeepEnabled integration.KarakeepEnabled = i.KarakeepEnabled
integration.KarakeepAPIKey = i.KarakeepAPIKey integration.KarakeepAPIKey = i.KarakeepAPIKey
integration.KarakeepURL = i.KarakeepURL integration.KarakeepURL = i.KarakeepURL
integration.KarakeepTags = i.KarakeepTags
integration.RaindropEnabled = i.RaindropEnabled integration.RaindropEnabled = i.RaindropEnabled
integration.RaindropToken = i.RaindropToken integration.RaindropToken = i.RaindropToken
integration.RaindropCollectionID = i.RaindropCollectionID integration.RaindropCollectionID = i.RaindropCollectionID
@ -344,6 +346,7 @@ func NewIntegrationForm(r *http.Request) *IntegrationForm {
KarakeepEnabled: r.FormValue("karakeep_enabled") == "1", KarakeepEnabled: r.FormValue("karakeep_enabled") == "1",
KarakeepAPIKey: r.FormValue("karakeep_api_key"), KarakeepAPIKey: r.FormValue("karakeep_api_key"),
KarakeepURL: r.FormValue("karakeep_url"), KarakeepURL: r.FormValue("karakeep_url"),
KarakeepTags: r.FormValue("karakeep_tags"),
RaindropEnabled: r.FormValue("raindrop_enabled") == "1", RaindropEnabled: r.FormValue("raindrop_enabled") == "1",
RaindropToken: r.FormValue("raindrop_token"), RaindropToken: r.FormValue("raindrop_token"),
RaindropCollectionID: r.FormValue("raindrop_collection_id"), RaindropCollectionID: r.FormValue("raindrop_collection_id"),

View file

@ -116,6 +116,7 @@ func (h *handler) showIntegrationPage(w http.ResponseWriter, r *http.Request) {
KarakeepEnabled: integration.KarakeepEnabled, KarakeepEnabled: integration.KarakeepEnabled,
KarakeepAPIKey: integration.KarakeepAPIKey, KarakeepAPIKey: integration.KarakeepAPIKey,
KarakeepURL: integration.KarakeepURL, KarakeepURL: integration.KarakeepURL,
KarakeepTags: integration.KarakeepTags,
RaindropEnabled: integration.RaindropEnabled, RaindropEnabled: integration.RaindropEnabled,
RaindropToken: integration.RaindropToken, RaindropToken: integration.RaindropToken,
RaindropCollectionID: integration.RaindropCollectionID, RaindropCollectionID: integration.RaindropCollectionID,