reprogl

Форк
0
/
comment.go 
132 строки · 2.8 Кб
1
package backend
2

3
import (
4
	"bytes"
5
	"encoding/json"
6
	"errors"
7
	"io"
8
	"net/http"
9
	"strconv"
10
)
11

12
var NotAllowedComment = errors.New("backend: not allowed comment")
13

14
type CommentatorDTO struct {
15
	Name    string `json:"name"`
16
	Email   string `json:"email"`
17
	Website string `json:"website"`
18
}
19

20
type CommentUserDTO struct {
21
	ID int `json:"id"`
22
}
23

24
type CommentDTO struct {
25
	Commentator *CommentatorDTO `json:"commentator,omitempty"`
26
	User        *CommentUserDTO `json:"user,omitempty"`
27
	Text        string          `json:"text"`
28
	TopicID     int             `json:"topicId"`
29
	ParentID    int             `json:"parentId"`
30
	UserAgent   string          `json:"userAgent"`
31
	IP          string          `json:"ipAddress"`
32
}
33

34
type CreatedCommentDTO struct {
35
	ID      int    `json:"id"`
36
	Text    string `json:"text"`
37
	Name    string `json:"username"`
38
	Email   string `json:"email"`
39
	Website string `json:"website"`
40
	Country string `json:"countryFlag"`
41
}
42

43
type CreateCommentResponse struct {
44
	Violations []FormError        `json:"errors,omitempty"`
45
	Comment    *CreatedCommentDTO `json:"comment,omitempty"`
46
}
47

48
func SendComment(comment CommentDTO) (*CreateCommentResponse, error) {
49
	var result CreateCommentResponse
50
	jsonBody, err := json.Marshal(comment)
51
	if err != nil {
52
		return nil, err
53
	}
54

55
	request, err := http.NewRequest(http.MethodPost, apiURL()+"/api/comments/external", bytes.NewReader(jsonBody))
56
	if err != nil {
57
		return nil, err
58
	}
59

60
	request.Header.Set("Content-Type", "application/json")
61

62
	response, err := send(request)
63
	if err != nil {
64
		return nil, err
65
	}
66

67
	if response.StatusCode == http.StatusForbidden {
68
		return nil, NotAllowedComment
69
	}
70

71
	defer response.Body.Close()
72
	buf, err := io.ReadAll(response.Body)
73
	if err != nil {
74
		return nil, err
75
	}
76

77
	if !json.Valid(buf) {
78
		return nil, errors.New("invalid JSON string")
79
	}
80

81
	err = json.Unmarshal(buf, &result)
82
	if err != nil {
83
		return nil, err
84
	}
85

86
	return &result, nil
87
}
88

89
func PingGeolocation() {
90
	request, err := http.NewRequest(http.MethodPost, apiURL()+"/api/comments/geo-location", http.NoBody)
91
	if err != nil {
92
		return
93
	}
94

95
	_, _ = send(request)
96
}
97

98
func RefreshComment(id int) (*CreatedCommentDTO, error) {
99
	request, err := http.NewRequest(http.MethodGet, apiURL()+"/api/comments/"+strconv.Itoa(id), http.NoBody)
100
	if err != nil {
101
		return nil, err
102
	}
103

104
	response, err := send(request)
105
	if err != nil {
106
		return nil, err
107
	}
108

109
	if response.StatusCode != http.StatusOK {
110
		return nil, errors.New("status not OK")
111
	}
112

113
	defer response.Body.Close()
114
	buf, err := io.ReadAll(response.Body)
115
	if err != nil {
116
		return nil, err
117
	}
118

119
	if !json.Valid(buf) {
120
		return nil, errors.New("invalid JSON string")
121
	}
122

123
	var result = struct {
124
		Comment *CreatedCommentDTO `json:"comment,omitempty"`
125
	}{}
126
	err = json.Unmarshal(buf, &result)
127
	if err != nil {
128
		return nil, err
129
	}
130

131
	return result.Comment, nil
132
}
133

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.