summaryrefslogtreecommitdiff
path: root/internal/integration/notion/notion.go
blob: fe579928aa1bf47daaacbddb6cbb6dc4c8136fab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

package notion

import (
	"fmt"

	"miniflux.app/v2/internal/http/client"
)

// Client represents a Notion client.
type Client struct {
	token  string
	pageID string
}

// NewClient returns a new Notion client.
func NewClient(token, pageID string) *Client {
	return &Client{token, pageID}
}

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")
	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 patch entry: %v", error)
	}

	if response.HasServerFailure() {
		return fmt.Errorf("notion: request failed, status=%d", response.StatusCode)
	}
	return nil
}