2022-01-26 16:40:50 +08:00
|
|
|
package api_config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"path"
|
|
|
|
"reflect"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
fiber "github.com/gofiber/fiber/v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
MethodAny = "ANY"
|
|
|
|
MethodGet = "GET"
|
|
|
|
MethodHead = "HEAD"
|
|
|
|
MethodPost = "POST"
|
|
|
|
MethodPut = "PUT"
|
|
|
|
MethodPatch = "PATCH"
|
|
|
|
MethodDelete = "DELETE"
|
|
|
|
MethodOptions = "OPTIONS"
|
|
|
|
)
|
|
|
|
|
|
|
|
type RouterConfig struct {
|
|
|
|
Url string `json:"url"`
|
|
|
|
Remark string `json:"remark"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type ApiRouterConfig struct {
|
|
|
|
routerConfigs []RouterConfig
|
|
|
|
noVerificationRouterConfigs []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type MountApiBasePramas struct {
|
|
|
|
Remark, Method, AbsolutePath, RelativePath string
|
|
|
|
NoAuthentication bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *MountApiBasePramas) getMethod() string {
|
|
|
|
if this.Method == "" {
|
|
|
|
return MethodPost
|
|
|
|
}
|
|
|
|
return this.Method
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *MountApiBasePramas) IsAnyMethod() bool {
|
|
|
|
return this.getMethod() == MethodAny
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *ApiRouterConfig) GetRouterConfigs() (routerConfig []RouterConfig) {
|
|
|
|
return this.routerConfigs
|
|
|
|
}
|
|
|
|
|
|
|
|
func getHandlerName(v interface{}) (controller string, action string) {
|
|
|
|
str := runtime.FuncForPC(reflect.ValueOf(v).Pointer()).Name()
|
|
|
|
strArr := strings.Split(str, "-")
|
|
|
|
tmp := strings.Split(strArr[0], ".")
|
2022-03-16 16:04:29 +08:00
|
|
|
if len(tmp) == 4 {
|
2022-01-26 16:40:50 +08:00
|
|
|
return tmp[2], tmp[3]
|
2022-03-16 16:04:29 +08:00
|
|
|
} else {
|
|
|
|
return "", ""
|
2022-01-26 16:40:50 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *ApiRouterConfig) MountApi(mountApiBasePramas MountApiBasePramas, routerGroup *fiber.Group, handlers fiber.Handler) {
|
|
|
|
|
|
|
|
if mountApiBasePramas.RelativePath == "" {
|
|
|
|
_, action := getHandlerName(handlers)
|
|
|
|
mountApiBasePramas.RelativePath = action
|
|
|
|
}
|
|
|
|
|
|
|
|
if !mountApiBasePramas.NoAuthentication {
|
|
|
|
this.routerConfigs = append(this.routerConfigs, RouterConfig{
|
|
|
|
Url: this.joinPaths(mountApiBasePramas.AbsolutePath, mountApiBasePramas.RelativePath),
|
|
|
|
Remark: mountApiBasePramas.Remark,
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
this.noVerificationRouterConfigs = append(this.noVerificationRouterConfigs, this.joinPaths(mountApiBasePramas.AbsolutePath, mountApiBasePramas.RelativePath))
|
|
|
|
}
|
|
|
|
|
|
|
|
this.mountApi(mountApiBasePramas, routerGroup, handlers)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *ApiRouterConfig) mountApi(mountApiBasePramas MountApiBasePramas, routerGroup *fiber.Group, handlers fiber.Handler) {
|
|
|
|
if mountApiBasePramas.IsAnyMethod() {
|
|
|
|
routerGroup.All(mountApiBasePramas.RelativePath, handlers)
|
|
|
|
} else {
|
|
|
|
routerGroup.Add(mountApiBasePramas.getMethod(), mountApiBasePramas.RelativePath, handlers)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *ApiRouterConfig) joinPaths(absolutePath, relativePath string) string {
|
|
|
|
if relativePath == "" {
|
|
|
|
return absolutePath
|
|
|
|
}
|
|
|
|
|
|
|
|
finalPath := path.Join(absolutePath, relativePath)
|
|
|
|
appendSlash := this.lastChar(relativePath) == '/' && this.lastChar(finalPath) != '/'
|
|
|
|
if appendSlash {
|
|
|
|
return finalPath + "/"
|
|
|
|
}
|
|
|
|
return finalPath
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *ApiRouterConfig) lastChar(str string) uint8 {
|
|
|
|
if str == "" {
|
|
|
|
panic("路由匹配符不能为空")
|
|
|
|
}
|
|
|
|
return str[len(str)-1]
|
|
|
|
}
|
|
|
|
|
|
|
|
var apiRouterConfig *ApiRouterConfig
|
|
|
|
var once sync.Once
|
|
|
|
|
|
|
|
func NewApiRouterConfig() *ApiRouterConfig {
|
|
|
|
once.Do(func() {
|
|
|
|
apiRouterConfig = new(ApiRouterConfig)
|
|
|
|
})
|
|
|
|
return apiRouterConfig
|
|
|
|
}
|