forked from admpub/nging
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
128 lines (112 loc) · 3.07 KB
/
config.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
/*
Nging is a toolbox for webmasters
Copyright (C) 2018-present Wenhui Shen <swh@admpub.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package model
import (
"github.com/webx-top/db"
"github.com/webx-top/echo"
"github.com/admpub/nging/application/dbschema"
"github.com/admpub/nging/application/model/base"
"github.com/admpub/nging/application/registry/settings"
)
func NewConfig(ctx echo.Context) *Config {
m := &Config{
NgingConfig: &dbschema.NgingConfig{},
base: base.New(ctx),
}
m.SetContext(ctx)
return m
}
type Config struct {
*dbschema.NgingConfig
base *base.Base
}
func (f *Config) Upsert() (pk interface{}, err error) {
m := &dbschema.NgingConfig{}
condition := db.And(
db.Cond{`key`: f.Key},
db.Cond{`group`: f.Group},
)
n, err := m.Count(nil, condition)
if err != nil {
if err != db.ErrNoMoreRows {
return
}
}
if n == 0 {
return f.NgingConfig.Add()
}
err = f.NgingConfig.Edit(nil, condition)
return
}
func (f *Config) ValueByKey(group, key string) string {
condition := db.And(
db.Cond{`key`: key},
db.Cond{`group`: group},
)
err := f.Get(nil, condition)
if err != nil {
return err.Error()
}
return f.Value
}
func (f *Config) Add() (pk interface{}, err error) {
return f.NgingConfig.Add()
}
func (f *Config) EditByPK(mw func(db.Result) db.Result, group string, key string) error {
condition := db.And(
db.Cond{`key`: key},
db.Cond{`group`: group},
)
return f.NgingConfig.Edit(mw, condition)
}
func (f *Config) Edit(mw func(db.Result) db.Result, args ...interface{}) error {
return f.NgingConfig.Edit(mw, args...)
}
func (f *Config) ListByGroup(group string) (func() int64, error) {
return f.NgingConfig.ListByOffset(nil, func(r db.Result) db.Result {
return r.OrderBy(`sort`)
}, 0, -1, `group`, group)
}
func (f *Config) ListMapByGroup(group string) (echo.H, error) {
_, err := f.ListByGroup(group)
if err != nil {
return nil, err
}
cfg := echo.H{}
decoder := settings.GetDecoder(group)
for _, v := range f.Objects() {
cfg, err = settings.DecodeConfig(v, cfg, decoder)
if err != nil {
return cfg, err
}
}
return cfg, err
}
func (f *Config) ListAllMapByGroup() (echo.H, error) {
_, err := f.NgingConfig.ListByOffset(nil, func(r db.Result) db.Result {
return r.OrderBy(`sort`)
}, 0, -1)
if err != nil {
return nil, err
}
cfg := echo.H{}
for _, v := range f.Objects() {
if _, _y := cfg[v.Group]; !_y {
cfg[v.Group] = echo.H{}
}
cfg.Store(v.Group).Set(v.Key, v)
}
return cfg, err
}