/
data.go
160 lines (130 loc) · 2.96 KB
/
data.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package storage
import (
"encoding/base64"
"strings"
"time"
"crypto/sha256"
log "github.com/Sirupsen/logrus"
)
type AddState struct {
Version string `json:"version"`
Time string `json:"time"`
State string `json:"state"`
Error string `json:"error"`
}
// AddData ...
func (db *DB) AddData(user User, data string) (AddState, error) {
var state AddState
currentTime := time.Now()
// Find user id
userID, err := db.findUserID(user)
if err != nil {
log.Error(err.Error())
return state, err
}
version := calculateSHA(data)
addDataSQL := `INSERT INTO keys(version, userid, time, data) values(?, ?, ?, ?)`
addDataStmt, err := db.Conn.Prepare(addDataSQL)
if err != nil {
log.Error(err.Error())
return state, err
}
_, err = addDataStmt.Exec(version, userID, currentTime.Unix(), data)
if err != nil {
log.Error(err.Error())
return state, err
}
textTime, err := currentTime.MarshalText()
if err != nil {
log.Error(err.Error())
return state, err
}
state.Version = version
state.Time = string(textTime)
state.State = "OK"
return state, nil
}
// List user uploaded versions
type List struct {
Version string `json:"version"`
Time time.Time `json:"time"`
}
// ListVersions list user data versions
func (db *DB) ListVersions(user User) ([]List, error) {
var list []List
userID, err := db.findUserID(user)
if err != nil {
log.Error(err.Error())
return list, err
}
listSQL := `SELECT version, time FROM keys WHERE userid=?`
rows, err := db.Conn.Query(listSQL, userID)
if err != nil {
log.Error()
return list, err
}
for rows.Next() {
var v string
var t time.Time
err := rows.Scan(&v, &t)
if err != nil {
log.Error(err.Error())
return list, err
}
list = append(list, List{v, t})
}
return list, nil
}
// GetUserData ...
func (db *DB) GetUserData(user User, version string) (string, error) {
var data string
userID, err := db.findUserID(user)
if err != nil {
log.Error(err.Error())
return data, err
}
getSQL := `SELECT data FROM keys WHERE userid=? and version=?`
rows, err := db.Conn.Query(getSQL, userID, version)
if err != nil {
log.Error(err.Error())
return data, err
}
for rows.Next() {
err := rows.Scan(&data)
log.Warn(data)
if err != nil {
log.Error(err.Error())
return data, err
}
}
return data, nil
}
// DeleteData ...
func (db *DB) DeleteData(user User, version string) error {
userID, err := db.findUserID(user)
if err != nil {
log.Error(err.Error())
return err
}
deleteSQL := `DELETE FROM keys WHERE userid=? AND version=?`
deleteStmt, err := db.Conn.Prepare(deleteSQL)
if err != nil {
log.Error(err.Error())
return err
}
_, err = deleteStmt.Exec(userID, version)
if err != nil {
log.Error(err.Error())
return err
}
return nil
}
// calculateSHA ...
func calculateSHA(data string) string {
h := sha256.New()
h.Write([]byte(data))
sum := h.Sum(nil)
b64 := base64.URLEncoding.EncodeToString(sum)
cut := strings.TrimRight(b64[len(b64)-8:], "=")
return cut
}