Ai
4 Star 15 Fork 5

eoLinker/APIPark

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
initialization.go 3.64 KB
一键复制 编辑 原始数据 按行查看 历史
choosy 提交于 2024-10-28 18:39 +08:00 . update remark
//go:build init
package main
import (
"bytes"
"encoding/csv"
"fmt"
"os"
"sort"
"strings"
"time"
_ "github.com/APIParkLab/APIPark/resources/access"
_ "github.com/APIParkLab/APIPark/resources/permit"
_ "github.com/APIParkLab/APIPark/resources/plugin"
"github.com/eolinker/eosc/log"
"github.com/eolinker/go-common/access"
"github.com/eolinker/go-common/permit"
"github.com/eolinker/go-common/pm3"
"github.com/eolinker/go-common/utils"
)
const unsetValue = "-"
func doCheck() {
accessConf, unset := loadAccess()
drivers := pm3.List()
newAccess := 0
for _, p := range drivers {
if ac, ok := p.(pm3.AccessConfig); ok {
if len(ac.Access()) > 0 {
for asKey := range ac.Access() {
key := strings.ToLower(asKey)
if _, has := accessConf[key]; !has {
accessConf[key] = empty(key)
newAccess++
}
}
}
}
}
for asKey := range permit.All() {
key := strings.ToLower(asKey)
if _, has := accessConf[key]; !has {
accessConf[key] = empty(key)
newAccess++
}
}
if newAccess > 0 || unset > 0 {
f := accessFile()
fmt.Printf("%d access need set, see : %s and %s", newAccess+unset, saveTemplate(accessConf, f), saveCsv(accessConf, f))
}
os.Exit(0)
}
func accessFile() string {
if version == "" {
return time.Now().Format("20060102-150405")
}
return version
}
func saveCsv(as map[string]*Access, key string) string {
buf := &bytes.Buffer{}
w := csv.NewWriter(buf)
err := w.Write([]string{"group", "name", "cname", "desc"})
if err != nil {
return ""
}
list := utils.MapToSliceNoKey(as)
sort.Sort(AccessListSort(list))
for _, i := range list {
err := w.Write([]string{i.Group, i.Name, i.Cname, i.Desc})
if err != nil {
return ""
}
}
w.Flush()
filePath := fmt.Sprintf("access.%s.csv", key)
err = os.WriteFile(filePath, buf.Bytes(), 0666)
if err != nil {
log.Fatal(err)
}
return filePath
}
type AccessListSort []*Access
func (ls AccessListSort) Len() int {
return len(ls)
}
func (ls AccessListSort) Less(i, j int) bool {
if ls[i].Group != ls[j].Group {
return ls[i].Group < ls[j].Group
}
if ls[i].Cname != ls[j].Cname {
return ls[i].Cname < ls[j].Cname
}
return ls[i].Name < ls[j].Name
}
func (ls AccessListSort) Swap(i, j int) {
ls[i], ls[j] = ls[j], ls[i]
}
func saveTemplate(as map[string]*Access, key string) string {
out := make(map[string][]access.Access)
for _, a := range as {
out[a.Group] = append(out[a.Group], access.Access{
Name: a.Name,
CName: a.Cname,
Desc: a.Desc,
})
}
buf := &bytes.Buffer{}
err := yaml.NewEncoder(buf).Encode(out)
if err != nil {
log.Fatal(err)
return ""
}
filePath := fmt.Sprintf("access.%s.yml", key)
err = os.WriteFile(filePath, buf.Bytes(), 0666)
if err != nil {
log.Fatal(err)
}
return filePath
}
type Access struct {
Key string
Group string
Name string
Cname string
Desc string
}
func empty(key string) *Access {
group, name := readKey(key)
return &Access{
Key: key,
Group: group,
Name: name,
Cname: unsetValue,
Desc: unsetValue,
}
}
func readKey(key string) (group string, name string) {
ls := strings.Split(key, ".")
if len(ls) != 2 {
log.Fatal("invalid access key:[%s]", key)
}
return ls[0], ls[1]
}
func loadAccess() (map[string]*Access, int) {
confAccess := access.All()
unset := 0
as := make(map[string]*Access)
for group, al := range confAccess {
for _, a := range al {
g, name := readKey(a.Name)
if g != group {
log.Fatal("invalid access key:[%s]", a.Name)
}
as[a.Name] = &Access{
Key: a.Name,
Group: group,
Name: name,
Cname: a.CName,
Desc: a.Desc,
}
if a.CName == unsetValue || a.Desc == unsetValue {
unset++
}
}
}
return as, unset
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/eolink/APIPark.git
git@gitee.com:eolink/APIPark.git
eolink
APIPark
APIPark
main

搜索帮助