Passed
Push — master ( 7a190b...51e7b4 )
by Victor Hugo
01:04 queued 11s
created

devto.*ArticlesResource.Update   B

Complexity

Conditions 6

Size

Total Lines 23
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6.4689

Importance

Changes 0
Metric Value
cc 6
eloc 18
nop 2
dl 0
loc 23
rs 8.5666
c 0
b 0
f 0
ccs 13
cts 17
cp 0.7647
crap 6.4689
1
package devto
2
3
import (
4
	"context"
5
	"encoding/json"
6
	"fmt"
7
	"io/ioutil"
8
	"net/http"
9
	"strings"
10
11
	"github.com/google/go-querystring/query"
12
)
13
14
//ArticlesResource implements the APIResource interface
15
//for devto articles.
16
type ArticlesResource struct {
17
	API *Client
18
}
19
20
//List will return the articles uploaded to devto, the result
21
//can be narrowed down, filtered or enhanced using query
22
// parameters as specified on the documentation.
23
//See: https://docs.dev.to/api/#tag/articles/paths/~1articles/get
24
func (ar *ArticlesResource) List(ctx context.Context, opt ArticleListOptions) ([]Article, error) {
25 1
	var l []Article
26 1
	q, err := query.Values(opt)
27 1
	if err != nil {
28
		return nil, err
29
	}
30 1
	req, _ := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles?%s", q.Encode()), nil)
31 1
	res, _ := ar.API.HTTPClient.Do(req)
32 1
	cont, err := ioutil.ReadAll(res.Body)
33 1
	if err != nil {
34
		return nil, err
35
	}
36 1
	json.Unmarshal(cont, &l)
37 1
	return l, nil
38
}
39
40
//Find will retrieve an Article matching the ID passed.
41
func (ar *ArticlesResource) Find(ctx context.Context, id uint32) (Article, error) {
42 1
	var art Article
43 1
	req, _ := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles/%d", id), nil)
44 1
	res, err := ar.API.HTTPClient.Do(req)
45 1
	if err != nil {
46
		return art, err
47
	}
48 1
	cont, err := ioutil.ReadAll(res.Body)
49 1
	if err != nil {
50
		return art, err
51
	}
52 1
	json.Unmarshal(cont, &art)
53 1
	return art, nil
54
}
55
56
//New will create a new article on dev.to
57
func (ar *ArticlesResource) New(ctx context.Context, a Article) (Article, error) {
58 1
	if ar.API.Config.InsecureOnly {
59 1
		return a, ErrProtectedEndpoint
60
	}
61 1
	cont, err := json.Marshal(a)
62 1
	if err != nil {
63
		return a, err
64
	}
65 1
	req, err := ar.API.NewRequest(http.MethodPost, "api/articles", strings.NewReader(string(cont)))
66 1
	if err != nil {
67
		return a, err
68
	}
69 1
	req.Header.Add(APIKeyHeader, ar.API.Config.APIKey)
70 1
	res, err := ar.API.HTTPClient.Do(req)
71 1
	if err != nil {
72
		return a, err
73
	}
74 1
	content, err := ioutil.ReadAll(res.Body)
75 1
	if err != nil {
76
		return a, err
77
	}
78 1
	json.Unmarshal(content, &a)
79 1
	return a, nil
80
}
81
82
func (ar *ArticlesResource) Update(ctx context.Context, a Article) (Article, error) {
83 1
	if ar.API.Config.InsecureOnly {
84 1
		return a, ErrProtectedEndpoint
85
	}
86 1
	cont, err := json.Marshal(a)
87 1
	if err != nil {
88
		return a, err
89
	}
90 1
	req, err := ar.API.NewRequest(http.MethodPut, fmt.Sprintf("api/articles/%d", a.ID), strings.NewReader(string(cont)))
91 1
	if err != nil {
92
		return a, err
93
	}
94 1
	req.Header.Add(APIKeyHeader, ar.API.Config.APIKey)
95 1
	res, err := ar.API.HTTPClient.Do(req)
96 1
	if err != nil {
97
		return a, err
98
	}
99 1
	content, err := ioutil.ReadAll(res.Body)
100 1
	if err != nil {
101
		return a, err
102
	}
103 1
	json.Unmarshal(content, &a)
104 1
	return a, nil
105
}
106