tracker

Форк
0
131 строка · 2.7 Кб
1
package uploader
2

3
import (
4
	"bytes"
5
	"encoding/csv"
6
	"encoding/json"
7
	"fmt"
8
	"io"
9
	"mime/multipart"
10
	"net/http"
11
	"net/http/httputil"
12
	"strconv"
13
	"time"
14

15
	"github.com/pocketbase/dbx"
16
	"github.com/pocketbase/pocketbase/models"
17
)
18

19
type UploadError struct {
20
	ErrorType string `json:"error_type"`
21
	Message   string `json:"message"`
22
}
23
type UploadResponse struct {
24
	Errors  []UploadError `json:"errors"`
25
	Code    int           `json:"code"`
26
	Message string        `json:"message"`
27
}
28

29
func (t *Task) yandex(tracker *models.Record) error {
30
	to := time.Now().Add(-time.Hour * 4).Format("2006-01-02 15:04:05")
31
	records, err := t.app.Dao().FindRecordsByFilter(
32
		"conversions",
33
		"uploaded = false && network = 'yandex' && tracker = {:tracker} && created < {:to}",
34
		"-created",
35
		100, // limit
36
		0,
37
		dbx.Params{"tracker": tracker.Id, "to": to},
38
	)
39

40
	if err != nil {
41
		return err
42
	}
43

44
	if len(records) == 0 {
45
		t.app.Logger().Warn("empty yandex conversion")
46
		return nil
47
	}
48

49
	yaurl := tracker.GetString("yaurl")
50
	yatoken := tracker.GetString("yatoken")
51

52
	// create conversions file data
53
	data := &bytes.Buffer{}
54
	// create writer for conversions file data
55
	file := csv.NewWriter(data)
56
	if err := file.Write([]string{
57
		//"ClientId",
58
		"Yclid",
59
		"Target",
60
		"DateTime",
61
	}); err != nil {
62
		return err
63
	}
64

65
	for _, record := range records {
66
		if err := file.Write([]string{
67
			//item.ClientId,
68
			record.GetString("yclid"),
69
			"app_install",
70
			strconv.Itoa(int(record.Created.Time().In(t.loc).Unix())),
71
		}); err != nil {
72
			t.app.Logger().Warn("error on write csv row", "error", err)
73
			continue
74
		}
75
	}
76

77
	file.Flush()
78

79
	// create all body
80
	body := &bytes.Buffer{}
81
	// create writer for body
82
	writer := multipart.NewWriter(body)
83

84
	part, _ := writer.CreateFormFile("file", "file.csv")
85
	if _, err := io.Copy(part, data); err != nil {
86
		return err
87
	}
88
	if err := writer.Close(); err != nil {
89
		return err
90
	}
91

92
	request, _ := http.NewRequest("POST", yaurl, body)
93
	request.Header.Add("Authorization", "OAuth "+yatoken)
94
	request.Header.Add("Content-Type", writer.FormDataContentType())
95
	dump, err := httputil.DumpRequest(request, true)
96
	if err != nil {
97
		return err
98
	}
99

100
	_ = dump // debug here
101

102
	resp, err := t.client.Do(request)
103
	if err != nil {
104
		return err
105
	}
106

107
	dump, err = httputil.DumpResponse(resp, true)
108
	if err != nil {
109
		return err
110
	}
111

112
	_ = dump // debug here
113

114
	result := UploadResponse{}
115
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
116
		return err
117
	}
118
	if len(result.Errors) != 0 {
119
		return fmt.Errorf("error on upload file: %s", result.Message)
120
	}
121

122
	for _, record := range records {
123
		record.Set("uploaded", true)
124

125
		if err := t.app.Dao().Save(record); err != nil {
126
			t.app.Logger().Warn("error save uploaded conversions", "error", err)
127
		}
128
	}
129

130
	return nil
131
}
132

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

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

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

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