-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.go
133 lines (107 loc) · 3.37 KB
/
store.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
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
package setting
import (
"bytes"
"database/sql"
"fmt"
"github.com/pkg/errors"
"github.com/documize/community/domain/store"
)
// Store provides data access to user permission information.
type Store struct {
store.Context
store.SettingStorer
}
// Get fetches a configuration JSON element from the config table.
func (s Store) Get(area, path string) (value string, err error) {
qry := fmt.Sprintf("SELECT %s FROM dmz_config WHERE c_key = '%s';", s.GetJSONValue("c_config", path), area)
item := []byte{}
err = s.Runtime.Db.Get(&item, qry)
if err != nil {
return "", err
}
if len(item) > 1 {
q := []byte(`"`)
value = string(bytes.TrimPrefix(bytes.TrimSuffix(item, q), q))
}
return value, nil
}
// Set writes a configuration JSON element to the config table.
func (s Store) Set(area, json string) (err error) {
if area == "" {
return errors.New("no area")
}
tx, err := s.Runtime.Db.Beginx()
if err != nil {
s.Runtime.Log.Error(fmt.Sprintf("setting.Set %s", area), err)
return
}
_, err = tx.Exec(fmt.Sprintf("DELETE FROM dmz_config WHERE c_key = '%s'", area))
if err != nil && err != sql.ErrNoRows {
tx.Rollback()
s.Runtime.Log.Error(fmt.Sprintf("setting.Set %s", area), err)
return err
}
_, err = tx.Exec(fmt.Sprintf("INSERT INTO dmz_config (c_key,c_config) VALUES ('%s','%s')",
area, json))
if err != nil && err != sql.ErrNoRows {
tx.Rollback()
s.Runtime.Log.Error(fmt.Sprintf("setting.Set %s", area), err)
return err
}
tx.Commit()
return err
}
// GetUser fetches a configuration JSON element from the userconfig table for a given orgid/userid combination.
// Errors return the empty string. A blank path returns the whole JSON object, as JSON.
// You can store org level settings by providing an empty user ID.
func (s Store) GetUser(orgID, userID, key, path string) (value string, err error) {
var item = make([]uint8, 0)
qry := fmt.Sprintf("SELECT %s FROM dmz_user_config WHERE c_key = '%s' AND c_orgid='%s' AND c_userid='%s';",
s.GetJSONValue("c_config", path), key, orgID, userID)
err = s.Runtime.Db.Get(&item, qry)
if err != nil && err != sql.ErrNoRows {
return "", err
}
if len(item) > 1 {
q := []byte(`"`)
value = string(bytes.TrimPrefix(bytes.TrimSuffix(item, q), q))
}
return value, nil
}
// SetUser writes a configuration JSON element to the userconfig table for the specified user.
// You can store org level settings by providing an empty user ID.
func (s Store) SetUser(orgID, userID, key, json string) (err error) {
if key == "" {
return errors.New("no key")
}
tx, err := s.Runtime.Db.Beginx()
if err != nil {
return err
}
_, err = tx.Exec(s.Bind("DELETE FROM dmz_user_config WHERE c_orgid=? AND c_userid=? AND c_key=?"),
orgID, userID, key)
if err != nil {
fmt.Println(err)
}
_, err = tx.Exec(s.Bind("INSERT INTO dmz_user_config (c_orgid, c_userid, c_key, c_config) VALUES (?, ?, ?, ?)"),
orgID, userID, key, json)
if err != nil {
fmt.Println(err)
}
if err == nil {
tx.Commit()
} else {
tx.Rollback()
}
return err
}