206 lines
5.3 KiB
Go
206 lines
5.3 KiB
Go
package controllers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"intent-system/pkg/config"
|
|
"intent-system/pkg/dal/core"
|
|
"intent-system/pkg/dal/ws"
|
|
"intent-system/pkg/itypes"
|
|
"intent-system/pkg/middleware"
|
|
"intent-system/pkg/sessions"
|
|
"net/http"
|
|
|
|
"github.com/civet148/sqlca/v2"
|
|
|
|
"github.com/civet148/log"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type Controller struct {
|
|
cfg *config.Config
|
|
BizCore *core.BizCore
|
|
CommonCore *core.CommonCore
|
|
PlatformCore *core.PlatformCore
|
|
CustomerCore *core.CustomerCore
|
|
DeployCore *core.DeployCore
|
|
GatewayCore *core.GatewayCore
|
|
SchedulerCore *core.SchedulerCore
|
|
DeployTaskCore *core.DeployTaskCore
|
|
|
|
DeployProgressPool *ws.WebSocketPool //
|
|
}
|
|
|
|
func NewController(cfg *config.Config) *Controller {
|
|
var err error
|
|
//var my, pg *sqlca.Engine
|
|
var my *sqlca.Engine
|
|
my, err = sqlca.NewEngine(cfg.DSN)
|
|
if err != nil {
|
|
log.Panic("MySQL source [%s] connect error [%s]", cfg.DSN, err.Error())
|
|
return nil
|
|
}
|
|
my.Debug(cfg.Debug) //SQL调试日志
|
|
my.SlowQuery(true, 800) //慢查询告警
|
|
// pg, err = sqlca.NewEngine(cfg.Postgresql)
|
|
// if err != nil {
|
|
// log.Panic(" Postgresql source [%s] connect error [%s]", cfg.Postgresql, err.Error())
|
|
// return nil
|
|
// }
|
|
// pg.Debug(cfg.Debug) //SQL调试日志
|
|
// pg.SlowQuery(true, 800) //慢查询告警
|
|
return &Controller{
|
|
cfg: cfg,
|
|
BizCore: core.NewBizCore(cfg, my),
|
|
CommonCore: core.NewCommonCore(cfg, my),
|
|
PlatformCore: core.NewPlatformCore(cfg, my),
|
|
CustomerCore: core.NewCustomerCore(cfg, my),
|
|
DeployCore: core.NewDeployCore(cfg, my),
|
|
GatewayCore: core.NewGatewayCore(cfg, my),
|
|
//SchedulerCore: core.NewSchedulerCore(cfg, my, pg),
|
|
DeployProgressPool: ws.NewWebSocketPool(),
|
|
}
|
|
}
|
|
|
|
func (m *Controller) OK(c *gin.Context, data interface{}, count int, total int64) {
|
|
var bc = itypes.BizOK
|
|
if data == nil {
|
|
data = struct{}{}
|
|
}
|
|
var r = &itypes.HttpResponse{
|
|
Header: itypes.HttpHeader{
|
|
Code: bc.Code,
|
|
Message: bc.Message,
|
|
Count: count,
|
|
Total: total,
|
|
},
|
|
Data: data,
|
|
}
|
|
c.JSON(http.StatusOK, r)
|
|
c.Abort()
|
|
}
|
|
|
|
func (m *Controller) Error(c *gin.Context, bc itypes.BizCode) {
|
|
var r = &itypes.HttpResponse{
|
|
Header: itypes.HttpHeader{
|
|
Code: bc.Code,
|
|
Message: bc.Message,
|
|
Count: 0,
|
|
},
|
|
Data: struct{}{},
|
|
}
|
|
log.Errorf("[Controller] response error code [%d] message [%s]", bc.Code, bc.Message)
|
|
c.JSON(http.StatusOK, r)
|
|
c.Abort()
|
|
}
|
|
|
|
func (m *Controller) ErrorStatus(c *gin.Context, status int, message string) {
|
|
log.Errorf("[Controller] http status code [%d] message [%s]", status, message)
|
|
c.String(status, message)
|
|
c.Abort()
|
|
}
|
|
|
|
func (m *Controller) RpcResult(c *gin.Context, data interface{}, err error, id interface{}) {
|
|
var status = http.StatusOK
|
|
var strResp string
|
|
if err != nil {
|
|
status = http.StatusInternalServerError
|
|
data = &itypes.RpcResponse{
|
|
Id: id,
|
|
JsonRpc: "2.0",
|
|
Error: itypes.RpcError{
|
|
Code: itypes.CODE_INTERNAL_SERVER_ERROR,
|
|
Message: err.Error(),
|
|
},
|
|
Result: nil,
|
|
}
|
|
}
|
|
switch data.(type) {
|
|
case string:
|
|
strResp = data.(string)
|
|
default:
|
|
{
|
|
b, _ := json.Marshal(data)
|
|
strResp = string(b)
|
|
}
|
|
}
|
|
|
|
c.String(status, strResp)
|
|
c.Abort()
|
|
}
|
|
|
|
func (m *Controller) GetClientIP(c *gin.Context) (strIP string) {
|
|
return c.ClientIP()
|
|
}
|
|
func (m *Controller) GetClientSystemOS(c *gin.Context) (strOS string) {
|
|
userAgent := c.GetHeader("User-Agent")
|
|
return userAgent
|
|
}
|
|
|
|
func (m *Controller) ContextFromAuthToken(c *gin.Context) (ctx *itypes.Context, ok bool) {
|
|
var err error
|
|
ctx = sessions.GetContext(c)
|
|
if ctx == nil {
|
|
err = log.Errorf("user session context is nil, token [%s]", middleware.GetAuthToken(c))
|
|
m.Error(c, itypes.NewBizCode(itypes.CODE_UNAUTHORIZED, err.Error()))
|
|
return
|
|
}
|
|
return ctx, true
|
|
}
|
|
|
|
func (m *Controller) ContextPlatformPrivilege(c *gin.Context, privileges ...string) (ctx *itypes.Context, ok bool) {
|
|
var err error
|
|
ctx = sessions.GetContext(c)
|
|
if ctx == nil {
|
|
err = log.Errorf("user session context is nil, token [%s]", middleware.GetAuthToken(c))
|
|
m.Error(c, itypes.NewBizCode(itypes.CODE_UNAUTHORIZED, err.Error()))
|
|
return
|
|
}
|
|
for _, auth := range privileges {
|
|
if m.PlatformCore.CheckPrivilege(c, ctx, auth) {
|
|
return ctx, true
|
|
}
|
|
}
|
|
err = log.Errorf("user name [%s] id [%v] have no privilege %+v", ctx.UserName(), ctx.UserId(), privileges)
|
|
m.Error(c, itypes.NewBizCode(itypes.CODE_ACCESS_DENY, err.Error()))
|
|
return ctx, false
|
|
}
|
|
|
|
func (m *Controller) CheckPrivilege(c *gin.Context, ctx *itypes.Context, privileges ...string) (ok bool) {
|
|
for _, auth := range privileges {
|
|
if m.PlatformCore.CheckPrivilege(c, ctx, auth) {
|
|
return true
|
|
}
|
|
}
|
|
log.Warnf("operator name [%s] id [%v] have no privilege %+v", ctx.UserName(), ctx.UserId(), privileges)
|
|
return false
|
|
}
|
|
|
|
func (m *Controller) bindJSON(c *gin.Context, req interface{}) (err error) {
|
|
if err = c.ShouldBindJSON(req); err != nil {
|
|
err = log.Errorf("invalid json or required fields, error [%s]", err)
|
|
m.Error(c, itypes.NewBizCode(itypes.CODE_INVALID_JSON_OR_REQUIRED_PARAMS, err.Error()))
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
body, _ := json.MarshalIndent(req, "", "\t")
|
|
log.Debugf("request from [%s] body [%+v]", c.ClientIP(), string(body))
|
|
return nil
|
|
}
|
|
|
|
func (m *Controller) isNilString(strIn string) bool {
|
|
if strIn == "" {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (m *Controller) isZero(n interface{}) bool {
|
|
strNumber := fmt.Sprintf("%v", n)
|
|
if strNumber == "0" {
|
|
return true
|
|
}
|
|
return false
|
|
}
|