generated from alecodes/base-template
feat: add basic linkding connection
This commit is contained in:
parent
43cd24e4d0
commit
43f6340a4a
8 changed files with 163 additions and 16 deletions
81
internal/service/linkding.go
Normal file
81
internal/service/linkding.go
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
ldApi "github.com/piero-vic/go-linkding"
|
||||
)
|
||||
|
||||
type Linkding struct {
|
||||
ServiceConfig
|
||||
client *ldApi.Client
|
||||
}
|
||||
|
||||
func (ld *Linkding) CheckBookmark(url string) (*ldApi.Bookmark, error) {
|
||||
bookmark := &ldApi.Bookmark{}
|
||||
|
||||
req, err := http.NewRequest(
|
||||
http.MethodGet,
|
||||
fmt.Sprintf("%v/api/bookmarks/check/?url=%d", ld.Host, url),
|
||||
nil,
|
||||
)
|
||||
if err != nil {
|
||||
return bookmark, err
|
||||
}
|
||||
|
||||
req.Header.Add("Content-Type", "application/json")
|
||||
req.Header.Add("Accept", "application/json")
|
||||
req.Header.Add("Authorization", fmt.Sprintf("Token %s", ld.Token))
|
||||
|
||||
res, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return bookmark, err
|
||||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
|
||||
if err := json.NewDecoder(res.Body).Decode(bookmark); err != nil {
|
||||
return bookmark, err
|
||||
}
|
||||
|
||||
return bookmark, nil
|
||||
}
|
||||
|
||||
func (ld *Linkding) Archive(url string) error {
|
||||
bookmark, err := ld.CheckBookmark(url)
|
||||
|
||||
payload := ldApi.CreateBookmarkRequest{
|
||||
URL: url,
|
||||
Unread: false,
|
||||
TagNames: bookmark.TagNames,
|
||||
}
|
||||
|
||||
if payload.TagNames == nil {
|
||||
payload.TagNames = []string{}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
_, err = ld.client.UpdateBookmark(bookmark.ID, payload)
|
||||
} else {
|
||||
_, err = ld.client.CreateBookmark(payload)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (ld *Linkding) IsAvailable() (bool, error) {
|
||||
_, err := ld.client.ListTags(ldApi.ListTagsParams{})
|
||||
|
||||
return err == nil, err
|
||||
}
|
||||
|
||||
func NewLinkding(config ServiceConfig) (*Linkding, error) {
|
||||
mf := &Linkding{
|
||||
ServiceConfig: config,
|
||||
client: ldApi.NewClient(config.Host, config.Token),
|
||||
}
|
||||
|
||||
return mf, nil
|
||||
}
|
||||
42
internal/service/service.go
Normal file
42
internal/service/service.go
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package service
|
||||
|
||||
import "fmt"
|
||||
|
||||
type ServiceOption string
|
||||
|
||||
const (
|
||||
ServiceLinkding ServiceOption = "linkding"
|
||||
)
|
||||
|
||||
type ServiceConfig struct {
|
||||
Service ServiceOption
|
||||
Host string
|
||||
User string
|
||||
Token string
|
||||
}
|
||||
|
||||
type Service interface {
|
||||
IsAvailable() (bool, error)
|
||||
Archive(string) error
|
||||
}
|
||||
|
||||
func ResolveService(serviceConfig ServiceConfig) (Service, error) {
|
||||
var service Service
|
||||
switch serviceConfig.Service {
|
||||
case ServiceLinkding:
|
||||
service, _ = NewLinkding(serviceConfig)
|
||||
default:
|
||||
return nil, fmt.Errorf("Could not determine service to connect to")
|
||||
}
|
||||
|
||||
if isAvailable, err := service.IsAvailable(); !isAvailable {
|
||||
return nil, fmt.Errorf(
|
||||
"Could not connect to the service %v in %v: %v",
|
||||
serviceConfig.Service,
|
||||
serviceConfig.Host,
|
||||
err,
|
||||
)
|
||||
}
|
||||
|
||||
return service, nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue