kra/internal/service/system/operation_record.go

168 lines
5.2 KiB
Go

package system
import (
"fmt"
"kra/internal/biz/system"
types "kra/internal/service/types/system"
"github.com/go-kratos/kratos/v2/errors"
"github.com/go-kratos/kratos/v2/transport/http"
)
// OperationRecordService 操作记录服务
type OperationRecordService struct {
uc *system.OperationRecordUsecase
}
// NewOperationRecordService 创建操作记录服务
func NewOperationRecordService(uc *system.OperationRecordUsecase) *OperationRecordService {
return &OperationRecordService{uc: uc}
}
// OperationRecordInfo 操作记录信息
type OperationRecordInfo struct {
ID uint `json:"id"`
IP string `json:"ip"`
Method string `json:"method"`
Path string `json:"path"`
Status int `json:"status"`
Latency int64 `json:"latency"`
Agent string `json:"agent"`
ErrorMessage string `json:"error_message"`
Body string `json:"body"`
Resp string `json:"resp"`
UserID uint `json:"user_id"`
User *types.UserInfo `json:"user,omitempty"`
}
// GetOperationRecordListRequest 获取操作记录列表请求
type GetOperationRecordListRequest struct {
Page int `json:"page"`
PageSize int `json:"pageSize"`
Method string `json:"method"`
Path string `json:"path"`
Status int `json:"status"`
UserID uint `json:"user_id"`
}
// GetOperationRecordListResponse 获取操作记录列表响应
type GetOperationRecordListResponse struct {
List []*OperationRecordInfo `json:"list"`
Total int64 `json:"total"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
// DeleteOperationRecordRequest 删除操作记录请求
type DeleteOperationRecordRequest struct {
ID uint `json:"id"`
}
// DeleteOperationRecordByIdsRequest 批量删除操作记录请求
type DeleteOperationRecordByIdsRequest struct {
IDs []uint `json:"ids"`
}
// RegisterRoutes 注册路由
func (s *OperationRecordService) RegisterRoutes(rg *RouterGroup) {
// 操作记录(不需要操作记录中间件,避免递归)
rg.Private.DELETE("/sysOperationRecord/deleteSysOperationRecord", s.handleDelete)
rg.Private.DELETE("/sysOperationRecord/deleteSysOperationRecordByIds", s.handleDeleteByIds)
rg.Private.GET("/sysOperationRecord/findSysOperationRecord", s.handleFind)
rg.Private.GET("/sysOperationRecord/getSysOperationRecordList", s.handleGetList)
}
func (s *OperationRecordService) handleGetList(ctx http.Context) error {
var req GetOperationRecordListRequest
if err := ctx.Bind(&req); err != nil {
return err
}
filters := make(map[string]interface{})
if req.Method != "" {
filters["method"] = req.Method
}
if req.Path != "" {
filters["path"] = req.Path
}
if req.Status != 0 {
filters["status"] = req.Status
}
if req.UserID != 0 {
filters["user_id"] = req.UserID
}
list, total, err := s.uc.GetOperationRecordList(ctx, req.Page, req.PageSize, filters)
if err != nil {
return errors.InternalServer("LIST_ERROR", err.Error())
}
resp := &GetOperationRecordListResponse{
List: make([]*OperationRecordInfo, len(list)),
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}
for i, r := range list {
resp.List[i] = toOperationRecordInfo(r)
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "获取成功", "data": resp})
}
func (s *OperationRecordService) handleDelete(ctx http.Context) error {
var req DeleteOperationRecordRequest
if err := ctx.Bind(&req); err != nil {
return err
}
if err := s.uc.DeleteOperationRecord(ctx, req.ID); err != nil {
return errors.InternalServer("DELETE_ERROR", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "删除成功"})
}
func (s *OperationRecordService) handleDeleteByIds(ctx http.Context) error {
var req DeleteOperationRecordByIdsRequest
if err := ctx.Bind(&req); err != nil {
return err
}
if err := s.uc.DeleteOperationRecordByIds(ctx, req.IDs); err != nil {
return errors.InternalServer("DELETE_ERROR", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "批量删除成功"})
}
func (s *OperationRecordService) handleFind(ctx http.Context) error {
idStr := ctx.Request().URL.Query().Get("id")
if idStr == "" {
return errors.BadRequest("INVALID_ID", "id参数不能为空")
}
var id uint
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
return errors.BadRequest("INVALID_ID", "id参数格式错误")
}
record, err := s.uc.GetOperationRecord(ctx, id)
if err != nil {
return errors.NotFound("NOT_FOUND", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "获取成功", "data": toOperationRecordInfo(record)})
}
func toOperationRecordInfo(r *system.OperationRecord) *OperationRecordInfo {
info := &OperationRecordInfo{
ID: r.ID,
IP: r.IP,
Method: r.Method,
Path: r.Path,
Status: r.Status,
Latency: r.Latency,
Agent: r.Agent,
ErrorMessage: r.ErrorMessage,
Body: r.Body,
Resp: r.Resp,
UserID: r.UserID,
}
if r.User != nil {
userInfo := toTypesUserInfo(r.User)
info.User = &userInfo
}
return info
}