204 lines
3.7 KiB
Go
204 lines
3.7 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
"yintai-api/app/admin/request"
|
|
"yintai-api/app/common/dao"
|
|
err2 "yintai-api/app/common/err"
|
|
"yintai-api/app/common/model"
|
|
"yintai-api/base/global"
|
|
|
|
"github.com/smbrave/goutil"
|
|
"github.com/spf13/cast"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var methods = map[string]struct{}{
|
|
http.MethodGet: {},
|
|
http.MethodPut: {},
|
|
http.MethodPost: {},
|
|
http.MethodPatch: {},
|
|
http.MethodDelete: {},
|
|
}
|
|
|
|
var types = map[string]struct{}{
|
|
model.ResourceTypeApi: {},
|
|
model.ResourceTypePage: {},
|
|
}
|
|
|
|
type Resource struct{}
|
|
|
|
func (r *Resource) Create(req request.ResourceCreate) int64 {
|
|
if _, ok := types[req.Type]; !ok {
|
|
err2.ParamErr("type", req.Type)
|
|
}
|
|
|
|
if req.Method != "" {
|
|
if _, ok := methods[strings.ToUpper(req.Method)]; !ok {
|
|
err2.ParamErr("method", req.Method)
|
|
}
|
|
}
|
|
|
|
// pid check
|
|
r.PidCheck(cast.ToInt64(req.Pid))
|
|
|
|
m := new(model.Resource)
|
|
m.Name = req.Name
|
|
m.Type = req.Type
|
|
m.Path = req.Path
|
|
m.Code = goutil.Md5(req.Path)
|
|
m.Method = req.Method
|
|
m.CreateTime = time.Now().Unix()
|
|
m.Pid = cast.ToInt64(req.Pid)
|
|
|
|
err := global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err := dao.NewResource().Create(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
resource, _ := dao.NewResource().Get(m.Pid)
|
|
if resource == nil {
|
|
m.Maps = fmt.Sprintf("/%d", m.ID)
|
|
} else {
|
|
m.Maps = fmt.Sprintf("%s/%d", resource.Maps, m.ID)
|
|
}
|
|
|
|
if err := dao.NewResource().Update(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return m.ID
|
|
}
|
|
|
|
func (r *Resource) PidCheck(pid int64) {
|
|
if pid == 0 {
|
|
return
|
|
}
|
|
|
|
resource, err := dao.NewResource().Get(pid)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if resource == nil {
|
|
err2.NotEsxErr()
|
|
}
|
|
}
|
|
|
|
func (r *Resource) Update(req request.ResourceUpdate) {
|
|
m, err := dao.NewResource().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
if req.Name != "" {
|
|
m.Name = req.Name
|
|
}
|
|
|
|
if _, ok := types[req.Type]; !ok {
|
|
err2.ParamErr("type", req.Type)
|
|
}
|
|
|
|
if req.Method != "" {
|
|
if _, ok := methods[strings.ToUpper(req.Method)]; !ok {
|
|
err2.ParamErr("method", req.Method)
|
|
}
|
|
}
|
|
|
|
if cast.ToInt64(req.Pid) != m.Pid {
|
|
r.PidCheck(m.Pid)
|
|
}
|
|
|
|
if req.Path != "" {
|
|
m.Path = req.Path
|
|
}
|
|
|
|
pid := cast.ToInt64(req.Pid)
|
|
if pid == m.ID {
|
|
err2.ParamErr("pid not error")
|
|
}
|
|
|
|
m.UpdateTime = time.Now().Unix()
|
|
oldMaps := m.Maps
|
|
err = global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
|
|
// 查询上级的maps更新m的maps
|
|
if pid != 0 {
|
|
// 先更新本级
|
|
m.Pid = pid
|
|
c, _ := dao.NewResource().Get(pid)
|
|
m.Maps = fmt.Sprintf("%s/%d", c.Maps, m.ID)
|
|
if err = dao.NewResource().Update(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 再更新下级
|
|
slavers, _ := dao.NewResource().GetMaps(oldMaps)
|
|
for _, slaver := range slavers {
|
|
master, _ := dao.NewResource().Get(slaver.Pid)
|
|
if master != nil {
|
|
slaver.Maps = fmt.Sprintf("%s/%d", master.Maps, slaver.ID)
|
|
if err = dao.NewResource().Update(slaver); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *Resource) Delete(req request.ResourceDelete) {
|
|
m, err := dao.NewResource().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
if err = dao.NewResource().Delete(m.ID); err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *Resource) List(req request.ResourceList) (any, int64) {
|
|
req.Pagination()
|
|
lists, count, err := dao.NewResource().List(req.Name, req.Type, req.Code, req.Method, req.Path, req.Page, req.Size, req.Sort)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
res := make([]map[string]any, 0)
|
|
for _, list := range lists {
|
|
res = append(res, list.Format())
|
|
}
|
|
|
|
return res, count
|
|
}
|