You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.6 KiB

7 years ago
package audit
import (
"fmt"
"net/http"
"strconv"
"github.com/mafanr/g"
"github.com/sunface/talent"
"github.com/labstack/echo"
"go.uber.org/zap"
)
const (
TypeService = 1
TypeApi = 2
TypeStrategy = 3
TypePrivilegy = 4
TypeBatch = 5
OpCreate = 1
OpEdit = 2
OpRelease = 3
OpOffline = 4
OpDelete = 5
)
func Log(userID string, service string, targetType int, targetID string, opType int, content string, desc string) {
newc := g.B64.EncodeToString(talent.String2Bytes(content))
query := fmt.Sprintf("insert into audit_log (user_id,service,target_type,target_id,op_type,content,description) values ('%s','%s','%d','%s','%d','%s','%s')",
userID, service, targetType, targetID, opType, newc, desc)
_, err := g.DB.Exec(query)
if err != nil {
g.L.Info("record audit log error", zap.Error(err), zap.String("query", query))
}
}
func Count(c echo.Context) error {
tt := c.FormValue("target_type")
tid := c.FormValue("target_id")
if tt == "" || tid == "" {
return c.JSON(http.StatusBadRequest, g.Result{
Status: http.StatusBadRequest,
ErrCode: g.ParamEmptyC,
Message: g.ParamEmptyE,
})
}
var query string
if tt == "0" {
query = fmt.Sprintf("select count(1) from audit_log where service in (%s)", tid)
} else {
query = fmt.Sprintf("select count(1) from audit_log where target_id='%s' and target_type='%s'", tid, tt)
}
rows, err := g.DB.Query(query)
if err != nil {
g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC,
Message: g.DatabaseE,
})
}
var total int
rows.Next()
rows.Scan(&total)
return c.JSON(http.StatusOK, g.Result{
Status: http.StatusOK,
Data: total,
})
}
type AuditLog struct {
ID int `db:"id" json:"-"`
UserID string `db:"user_id" json:"user_id"`
Service string `db:"service" json:"service"`
TargetType string `db:"target_type" json:"target_type"`
TargetID string `db:"target_id" json:"target_id"`
OpType string `db:"op_type" json:"op_type"`
Content string `db:"content" json:"content"`
Desc string `db:"description" json:"desc"`
ModifyDate string `db:"modify_date" json:"modify_date"`
}
func Load(c echo.Context) error {
tt := c.FormValue("target_type")
tid := c.FormValue("target_id")
pageS := c.FormValue("page")
if tt == "" || tid == "" || pageS == "" {
return c.JSON(http.StatusBadRequest, g.Result{
Status: http.StatusBadRequest,
ErrCode: g.ParamEmptyC,
Message: g.ParamEmptyE,
})
}
page, _ := strconv.Atoi(pageS)
if page <= 0 {
return c.JSON(http.StatusBadRequest, g.Result{
Status: http.StatusBadRequest,
ErrCode: g.ParamInvalidC,
Message: g.ParamInvalidE,
})
}
rs := make([]AuditLog, 0)
var query string
if tt == "0" {
query = fmt.Sprintf("select * from audit_log where service in (%s) order by modify_date desc limit %d offset %d", tid, g.PER_PAGE, g.PER_PAGE*(page-1))
} else {
query = fmt.Sprintf("select * from audit_log where target_id='%s' and target_type='%s' order by modify_date desc limit %d offset %d", tid, tt, g.PER_PAGE, g.PER_PAGE*(page-1))
}
err := g.DB.Select(&rs, query)
if err != nil {
g.L.Info("access database error", zap.Error(err), zap.String("query", query))
return c.JSON(http.StatusInternalServerError, g.Result{
Status: http.StatusInternalServerError,
ErrCode: g.DatabaseC,
Message: g.DatabaseE,
})
}
for i, l := range rs {
b, _ := g.B64.DecodeString(l.Content)
rs[i].Content = talent.Bytes2String(b)
}
return c.JSON(http.StatusOK, g.Result{
Status: http.StatusOK,
Data: rs,
})
}