Skip to content

Commit cd052a0

Browse files
committed
feat(integration): Add linkwarden collection ID support
1 parent 86fca5d commit cd052a0

28 files changed

+80
-15
lines changed

internal/database/migrations.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,4 +1373,11 @@ var migrations = [...]func(tx *sql.Tx) error{
13731373
_, err = tx.Exec(sql)
13741374
return err
13751375
},
1376+
func(tx *sql.Tx) (err error) {
1377+
sql := `
1378+
ALTER TABLE integrations ADD COLUMN linkwarden_collection_id int;
1379+
`
1380+
_, err = tx.Exec(sql)
1381+
return err
1382+
},
13761383
}

internal/integration/integration.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,17 +275,20 @@ func SendEntry(entry *model.Entry, userIntegrations *model.Integration) {
275275
slog.Int64("user_id", userIntegrations.UserID),
276276
slog.Int64("entry_id", entry.ID),
277277
slog.String("entry_url", entry.URL),
278+
slog.Any("collection_id", userIntegrations.LinkwardenCollectionId),
278279
)
279280

280281
client := linkwarden.NewClient(
281282
userIntegrations.LinkwardenURL,
282283
userIntegrations.LinkwardenAPIKey,
284+
userIntegrations.LinkwardenCollectionId,
283285
)
284286
if err := client.CreateBookmark(entry.URL, entry.Title); err != nil {
285287
slog.Error("Unable to send entry to Linkwarden",
286288
slog.Int64("user_id", userIntegrations.UserID),
287289
slog.Int64("entry_id", entry.ID),
288290
slog.String("entry_url", entry.URL),
291+
slog.Any("collection_id", userIntegrations.LinkwardenCollectionId),
289292
slog.Any("error", err),
290293
)
291294
}

internal/integration/linkwarden/linkwarden.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
"errors"
1010
"fmt"
11+
"io"
1112
"net/http"
1213
"time"
1314

@@ -18,12 +19,23 @@ import (
1819
const defaultClientTimeout = 10 * time.Second
1920

2021
type Client struct {
21-
baseURL string
22-
apiKey string
22+
baseURL string
23+
apiKey string
24+
collectionId *int64
2325
}
2426

25-
func NewClient(baseURL, apiKey string) *Client {
26-
return &Client{baseURL: baseURL, apiKey: apiKey}
27+
type linkwardenCollection struct {
28+
Id *int64 `json:"id"`
29+
}
30+
31+
type linkwardenRequest struct {
32+
URL string `json:"url"`
33+
Name string `json:"name"`
34+
Collection linkwardenCollection `json:"collection,omitempty"`
35+
}
36+
37+
func NewClient(baseURL, apiKey string, collectionId *int64) *Client {
38+
return &Client{baseURL: baseURL, apiKey: apiKey, collectionId: collectionId}
2739
}
2840

2941
func (c *Client) CreateBookmark(entryURL, entryTitle string) error {
@@ -36,10 +48,16 @@ func (c *Client) CreateBookmark(entryURL, entryTitle string) error {
3648
return fmt.Errorf(`linkwarden: invalid API endpoint: %v`, err)
3749
}
3850

39-
requestBody, err := json.Marshal(map[string]string{
40-
"url": entryURL,
41-
"name": entryTitle,
42-
})
51+
payload := linkwardenRequest{
52+
URL: entryURL,
53+
Name: entryTitle,
54+
}
55+
56+
if c.collectionId != nil {
57+
payload.Collection = linkwardenCollection{Id: c.collectionId}
58+
}
59+
60+
requestBody, err := json.Marshal(payload)
4361

4462
if err != nil {
4563
return fmt.Errorf("linkwarden: unable to encode request body: %v", err)
@@ -61,8 +79,13 @@ func (c *Client) CreateBookmark(entryURL, entryTitle string) error {
6179
}
6280
defer response.Body.Close()
6381

82+
responseBody, err := io.ReadAll(response.Body)
83+
if err != nil {
84+
return fmt.Errorf("linkwarden: unable to read response body: %v", err)
85+
}
86+
6487
if response.StatusCode >= 400 {
65-
return fmt.Errorf("linkwarden: unable to create link: url=%s status=%d", apiEndpoint, response.StatusCode)
88+
return fmt.Errorf("linkwarden: unable to create link: status=%d body=%s", response.StatusCode, string(responseBody))
6689
}
6790

6891
return nil

internal/locale/translations/de_DE.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Artikel in Linkwarden speichern",
267267
"form.integration.linkwarden_api_key": "Linkwarden-API-Schlüssel",
268268
"form.integration.linkwarden_endpoint": "Linkwarden-Base-URL",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Neue Artikel in Matrix übertragen",
270271
"form.integration.matrix_bot_chat_id": "ID des Matrix-Raums",
271272
"form.integration.matrix_bot_password": "Passwort für Matrix-Benutzer",
@@ -629,4 +630,4 @@
629630
"time_elapsed.yesterday": "gestern",
630631
"tooltip.keyboard_shortcuts": "Tastenkürzel: %s",
631632
"tooltip.logged_user": "Angemeldet als %s"
632-
}
633+
}

internal/locale/translations/el_EL.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Αποθήκευση άρθρων στο Linkwarden",
267267
"form.integration.linkwarden_api_key": "Κλειδί API Linkwarden",
268268
"form.integration.linkwarden_endpoint": "URL βάσης Linkwarden",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Μεταφορά νέων άρθρων στο Matrix",
270271
"form.integration.matrix_bot_chat_id": "Αναγνωριστικό της αίθουσας Matrix",
271272
"form.integration.matrix_bot_password": "Κωδικός πρόσβασης για τον χρήστη Matrix",

internal/locale/translations/en_US.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Save entries to Linkwarden",
267267
"form.integration.linkwarden_api_key": "Linkwarden API key",
268268
"form.integration.linkwarden_endpoint": "Linkwarden Base URL",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Push new entries to Matrix",
270271
"form.integration.matrix_bot_chat_id": "ID of Matrix Room",
271272
"form.integration.matrix_bot_password": "Password for Matrix user",
@@ -629,4 +630,4 @@
629630
"time_elapsed.yesterday": "yesterday",
630631
"tooltip.keyboard_shortcuts": "Keyboard Shortcut: %s",
631632
"tooltip.logged_user": "Logged in as %s"
632-
}
633+
}

internal/locale/translations/es_ES.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Enviar artículos a Linkwarden",
267267
"form.integration.linkwarden_api_key": "Clave de API de Linkwarden",
268268
"form.integration.linkwarden_endpoint": "URL base de Linkwarden",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Transferir nuevos artículos a Matrix",
270271
"form.integration.matrix_bot_chat_id": "ID de la sala de Matrix",
271272
"form.integration.matrix_bot_password": "Contraseña para el usuario de Matrix",

internal/locale/translations/fi_FI.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Tallenna artikkelit Linkkiin",
267267
"form.integration.linkwarden_api_key": "Linkwarden API-avain",
268268
"form.integration.linkwarden_endpoint": "Linkwarden Base URL",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Siirrä uudet artikkelit Matrixiin",
270271
"form.integration.matrix_bot_chat_id": "Matrix-huoneen tunnus",
271272
"form.integration.matrix_bot_password": "Matrix-käyttäjän salasana",

internal/locale/translations/fr_FR.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Sauvegarder les articles vers Linkwarden",
267267
"form.integration.linkwarden_api_key": "Clé d'API de Linkwarden",
268268
"form.integration.linkwarden_endpoint": "URL de base de Linkwarden",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "Envoyer les nouveaux articles vers Matrix",
270271
"form.integration.matrix_bot_chat_id": "Identifiant de la salle Matrix",
271272
"form.integration.matrix_bot_password": "Mot de passe de l'utilisateur Matrix",

internal/locale/translations/hi_IN.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
"form.integration.linkwarden_activate": "Save entries to Linkwarden",
267267
"form.integration.linkwarden_api_key": "Linkwarden API key",
268268
"form.integration.linkwarden_endpoint": "लिंकवर्डन बेस यूआरएलL",
269+
"form.integration.linkwarden_collection_id": "Linkwarden Collection ID",
269270
"form.integration.matrix_bot_activate": "नए लेखों को मैट्रिक्स में स्थानांतरित करें",
270271
"form.integration.matrix_bot_chat_id": "मैट्रिक्स रूम की आईडी",
271272
"form.integration.matrix_bot_password": "मैट्रिक्स उपयोगकर्ता के लिए पासवर्ड",

0 commit comments

Comments
 (0)