1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package event
17
18 import (
19 "context"
20 "strconv"
21 "time"
22
23 "github.com/jinzhu/gorm"
24
25 "github.com/chaos-mesh/chaos-mesh/pkg/dashboard/core"
26 )
27
28 func NewStore(db *gorm.DB) core.EventStore {
29 db.AutoMigrate(&core.Event{})
30
31 return &eventStore{db}
32 }
33
34 type eventStore struct {
35 db *gorm.DB
36 }
37
38 func (e *eventStore) List(_ context.Context) ([]*core.Event, error) {
39 var events []*core.Event
40
41 if err := e.db.Find(&events).Error; err != nil {
42 return nil, err
43 }
44
45 return events, nil
46 }
47
48 func (e *eventStore) ListBy(_ context.Context, by string, args ...interface{}) ([]*core.Event, error) {
49 var events []*core.Event
50
51 if err := e.db.Where(by, args...).Find(&events).Error; err != nil {
52 return nil, err
53 }
54
55 return events, nil
56 }
57
58 func (e *eventStore) ListByUID(c context.Context, uid string) ([]*core.Event, error) {
59 return e.ListBy(c, "object_id = ?", uid)
60 }
61
62 func (e *eventStore) ListByUIDs(c context.Context, uids []string) ([]*core.Event, error) {
63 return e.ListBy(c, "object_id IN (?)", uids)
64 }
65
66 func (e *eventStore) ListByExperiment(c context.Context, namespace string, name string, kind string) ([]*core.Event, error) {
67 return e.ListBy(c, "namespace = ? AND name = ? AND kind = ?", namespace, name, kind)
68 }
69
70 func (e *eventStore) ListByFilter(_ context.Context, filter core.Filter) ([]*core.Event, error) {
71 var (
72 events []*core.Event
73 limit int
74 err error
75 )
76
77 query, args := filter.ConstructQueryArgs()
78 statement := e.db.Where(query, args...).Order("id desc")
79
80 if filter.Limit != "" {
81 limit, err = strconv.Atoi(filter.Limit)
82 if err != nil {
83 return nil, err
84 }
85
86 statement = statement.Limit(limit)
87 }
88
89 if err := statement.Find(&events).Error; err != nil {
90 return nil, err
91 }
92
93 return events, nil
94 }
95
96 func (e *eventStore) Find(_ context.Context, id uint) (*core.Event, error) {
97 event := new(core.Event)
98
99 if err := e.db.First(event, id).Error; err != nil {
100 return nil, err
101 }
102
103 return event, nil
104 }
105
106 func (e *eventStore) Create(_ context.Context, event *core.Event) error {
107 return e.db.Create(event).Error
108 }
109
110 func (e *eventStore) DeleteByUID(_ context.Context, uid string) error {
111 return e.db.Where("object_id = ?", uid).Delete(&core.Event{}).Error
112 }
113
114 func (e *eventStore) DeleteByUIDs(_ context.Context, uids []string) error {
115 return e.db.Where("object_id IN (?)", uids).Delete(&core.Event{}).Error
116 }
117
118 func (e *eventStore) DeleteByTime(_ context.Context, start string, end string) error {
119 return e.db.Where("created_at BETWEEN ? AND ?", start, end).Delete(&core.Event{}).Error
120 }
121
122 func (e *eventStore) DeleteByDuration(_ context.Context, duration time.Duration) error {
123 now := time.Now().UTC().Add(-duration).Format("2006-01-02 15:04:05")
124
125 return e.db.Where("created_at <= ?", now).Delete(&core.Event{}).Error
126 }
127