reprogl

Форк
0
113 строк · 2.2 Кб
1
package repositories
2

3
import (
4
	"database/sql"
5
	"errors"
6

7
	"github.com/doug-martin/goqu/v9"
8
	"xelbot.com/reprogl/container"
9
	"xelbot.com/reprogl/models"
10
	"xelbot.com/reprogl/utils"
11
	trackmodels "xelbot.com/reprogl/utils/tracking/models"
12
)
13

14
type TrackingRepository struct {
15
	DB *sql.DB
16
}
17

18
func (tr *TrackingRepository) GetAgentByHash(hash string) (*models.TrackingAgent, error) {
19
	query := `
20
		SELECT
21
			ta.id,
22
			ta.user_agent,
23
			ta.hash,
24
			ta.is_bot,
25
			ta.created_at
26
		FROM tracking_agent AS ta
27
		WHERE (ta.hash = ?)`
28

29
	agent := &models.TrackingAgent{}
30

31
	err := tr.DB.QueryRow(query, hash).Scan(
32
		&agent.ID,
33
		&agent.UserAgent,
34
		&agent.Hash,
35
		&agent.IsBot,
36
		&agent.CreatedAt)
37

38
	if err != nil {
39
		if errors.Is(err, sql.ErrNoRows) {
40
			return nil, models.RecordNotFound
41
		} else {
42
			return nil, err
43
		}
44
	}
45

46
	return agent, nil
47
}
48

49
func (tr *TrackingRepository) SaveTrackingAgent(activity *trackmodels.Activity) (int, error) {
50
	query := `INSERT INTO tracking_agent
51
        (user_agent, hash, is_bot, created_at)
52
        VALUES(?, ?, ?, ?)`
53

54
	result, err := tr.DB.Exec(
55
		query,
56
		activity.UserAgent,
57
		container.MD5(activity.UserAgent),
58
		activity.IsBot(),
59
		activity.Time,
60
	)
61
	if err != nil {
62
		return 0, err
63
	}
64

65
	id, err := result.LastInsertId()
66
	if err != nil {
67
		return 0, err
68
	}
69

70
	return int(id), nil
71
}
72

73
func (tr *TrackingRepository) SaveTracking(activity *trackmodels.Activity, agentId, articleId int) error {
74
	data := goqu.Record{
75
		"ip_addr":     activity.Addr.String(),
76
		"is_cdn":      activity.IsCDN,
77
		"status_code": activity.Status,
78
		"duration":    activity.Duration.Microseconds(),
79

80
		"time_created": activity.Time.Format("2006-01-02 15:04:05.000"),
81
	}
82

83
	if agentId > 0 {
84
		data["user_agent_id"] = agentId
85
	}
86
	if articleId > 0 {
87
		data["post_id"] = articleId
88
	} else {
89
		data["request_uri"] = utils.EllipticalTruncate(activity.RequestedURI, 128)
90
	}
91

92
	if activity.LocationID > 0 {
93
		data["ip_long"] = activity.LocationID
94
	}
95

96
	if activity.Method != "GET" {
97
		data["method"] = activity.Method
98
	}
99

100
	ds := goqu.Dialect("mysql8").Insert("tracking").Rows(data)
101

102
	query, _, err := ds.ToSQL()
103
	if err != nil {
104
		return err
105
	}
106

107
	_, err = tr.DB.Exec(query)
108
	if err != nil {
109
		return err
110
	}
111

112
	return nil
113
}
114

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

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

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

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