-
Notifications
You must be signed in to change notification settings - Fork 28
/
service.go
111 lines (96 loc) · 3.16 KB
/
service.go
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package analytic
import (
"time"
"github.com/authgear/authgear-server/pkg/lib/config"
"github.com/authgear/authgear-server/pkg/lib/meter"
)
// CountResult includes the redis keys of the report
// Expiration should be set to those keys after storing the count to the db
type CountResult struct {
RedisKeys []string
}
type DailyCountResult struct {
*CountResult
ActiveUser int
SignupPageView int
SignupUniquePageView int
LoginPageView int
LoginUniquePageView int
}
type WeeklyCountResult struct {
*CountResult
ActiveUser int
}
type MonthlyCountResult struct {
*CountResult
ActiveUser int
}
type ReadCounterStore interface {
GetDailyPageViewCount(
appID config.AppID,
pageType meter.PageType,
date *time.Time,
) (pageView int, uniquePageView int, redisKeys []string, err error)
GetDailyActiveUserCount(appID config.AppID, date *time.Time) (count int, redisKey string, err error)
GetWeeklyActiveUserCount(appID config.AppID, year int, week int) (count int, redisKey string, err error)
GetMonthlyActiveUserCount(appID config.AppID, year int, month int) (count int, redisKey string, err error)
SetKeysExpire(keys []string, expiration time.Duration) error
}
type Service struct {
ReadCounter ReadCounterStore
}
func (s *Service) GetDailyCountResult(appID config.AppID, date *time.Time) (*DailyCountResult, error) {
redisKeys := []string{}
signupPageView, signupUniquePageView, keys, err := s.ReadCounter.GetDailyPageViewCount(appID, meter.PageTypeSignup, date)
if err != nil {
return nil, err
}
redisKeys = append(redisKeys, keys...)
loginPageView, loginUniquePageView, keys, err := s.ReadCounter.GetDailyPageViewCount(appID, meter.PageTypeLogin, date)
if err != nil {
return nil, err
}
redisKeys = append(redisKeys, keys...)
activeUserCount, dailyActiveUserKey, err := s.ReadCounter.GetDailyActiveUserCount(appID, date)
if err != nil {
return nil, err
}
redisKeys = append(redisKeys, dailyActiveUserKey)
return &DailyCountResult{
ActiveUser: activeUserCount,
SignupPageView: signupPageView,
SignupUniquePageView: signupUniquePageView,
LoginPageView: loginPageView,
LoginUniquePageView: loginUniquePageView,
CountResult: &CountResult{
RedisKeys: redisKeys,
},
}, nil
}
func (s *Service) GetWeeklyCountResult(appID config.AppID, year int, week int) (*WeeklyCountResult, error) {
activeUserCount, weeklyActiveUserKey, err := s.ReadCounter.GetWeeklyActiveUserCount(appID, year, week)
if err != nil {
return nil, err
}
return &WeeklyCountResult{
ActiveUser: activeUserCount,
CountResult: &CountResult{
RedisKeys: []string{weeklyActiveUserKey},
},
}, nil
}
func (s *Service) GetMonthlyCountResult(appID config.AppID, year int, month int) (*MonthlyCountResult, error) {
activeUserCount, monthlyActiveUserKey, err := s.ReadCounter.GetMonthlyActiveUserCount(appID, year, month)
if err != nil {
return nil, err
}
return &MonthlyCountResult{
ActiveUser: activeUserCount,
CountResult: &CountResult{
RedisKeys: []string{monthlyActiveUserKey},
},
}, nil
}
func (s *Service) SetKeysExpire(keys []string, expiration time.Duration) error {
return s.ReadCounter.SetKeysExpire(keys, expiration)
}