forked from uadmin/uadmin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
revert_log_handler.go
104 lines (99 loc) · 3.75 KB
/
revert_log_handler.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
package uadmin
import (
"encoding/json"
"fmt"
"net/http"
"reflect"
"strconv"
"time"
)
// RevertLogHandler !
func revertLogHandler(w http.ResponseWriter, r *http.Request) {
log := Log{}
Get(&log, "id = ?", r.FormValue("log_id"))
if log.Action == log.Action.Deleted() {
s := db.NewScope(models[log.TableName])
tableName := s.TableName()
sql := fmt.Sprintf("update %s set deleted_at = null where id = %d", tableName, log.TableID)
db.Exec(sql)
} else {
now := time.Now()
DType := reflect.TypeOf(now)
var langParser map[string]string
err := json.Unmarshal([]byte(log.Activity), &langParser)
if err != nil {
fmt.Println(err.Error())
}
modelType := reflect.TypeOf(models[log.TableName])
newType := reflect.New(modelType)
Get(newType.Elem().Addr().Interface(), "id = ?", log.TableID)
model, ok := NewModel(log.TableName, true)
if !ok {
}
var t reflect.Type
t = reflect.TypeOf(model.Interface()).Elem()
for index := 0; index < t.NumField(); index++ {
if t.Field(index).Type.Kind() == reflect.Int {
_v := string(langParser[t.Field(index).Name])
//_v = fmt.Sprintf("%+v", _v)
i, _ := strconv.ParseInt(_v, 10, 64)
newType.Elem().FieldByName(t.Field(index).Name).SetInt(i)
} else if t.Field(index).Type.Kind() == reflect.String {
// Check if Multilingual
val := ""
if t.Field(index).Tag.Get("multilingual") == cTRUE {
tVal := map[string]string{}
langs := []Language{}
Filter(&langs, "`active` = ?", true)
for _, lang := range langs {
tVal[lang.Code] = fmt.Sprint(langParser[lang.Code+"-"+t.Field(index).Name])
}
b, _ := json.Marshal(tVal)
val = string(b)
} else {
val = string(langParser[t.Field(index).Name])
}
newType.Elem().FieldByName(t.Field(index).Name).SetString(val)
} else if t.Field(index).Type.Kind() == reflect.Bool {
var val bool
val = false
if string(langParser[t.Field(index).Name]) == "true" {
val = true
}
newType.Elem().FieldByName(t.Field(index).Name).SetBool(val)
} else if t.Field(index).Type.Kind() == reflect.Uint {
_v := string(langParser[t.Field(index).Name])
i, _ := strconv.ParseInt(_v, 10, 64)
val := uint(i)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(val))
} else if t.Field(index).Type.Kind() == reflect.Float64 {
_v := string(langParser[t.Field(index).Name])
i, _ := strconv.ParseFloat(_v, 64)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(i))
} else if t.Field(index).Type.Kind() == reflect.Float32 {
_v := string(langParser[t.Field(index).Name])
i, _ := strconv.ParseFloat(_v, 32)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(float32(i)))
} else if t.Field(index).Type.Kind() == reflect.Int32 {
_v := string(langParser[t.Field(index).Name])
i, _ := strconv.ParseInt(_v, 10, 32)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(int32(i)))
} else if t.Field(index).Type.Kind() == reflect.Int64 {
_v := string(langParser[t.Field(index).Name])
i, _ := strconv.ParseInt(_v, 10, 64)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(i))
} else if t.Field(index).Type.Kind() == reflect.Ptr && t.Field(index).Type.Elem() == DType {
if fmt.Sprint(langParser[t.Field(index).Name]) != "" {
tm, _ := time.Parse("2006-01-02 15:04:05 -0700", string(langParser[t.Field(index).Name]))
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(&tm))
}
} else if t.Field(index).Type == DType {
_v := string(langParser[t.Field(index).Name])
tm, _ := time.Parse("2006-01-02 15:04:05 -0700", _v)
newType.Elem().FieldByName(t.Field(index).Name).Set(reflect.ValueOf(tm))
} else {
}
}
Save(newType.Elem().Addr().Interface())
}
}