Files

116 lines
3.5 KiB
Go
Raw Permalink Normal View History

package service
import (
"context"
"time"
"github.com/user-management-system/internal/domain"
"github.com/user-management-system/internal/repository"
)
// OperationLogService 操作日志服务
type OperationLogService struct {
operationLogRepo *repository.OperationLogRepository
}
// NewOperationLogService 创建操作日志服务
func NewOperationLogService(operationLogRepo *repository.OperationLogRepository) *OperationLogService {
return &OperationLogService{operationLogRepo: operationLogRepo}
}
// RecordOperation 记录操作日志
func (s *OperationLogService) RecordOperation(ctx context.Context, req *RecordOperationRequest) error {
log := &domain.OperationLog{
OperationType: req.OperationType,
OperationName: req.OperationName,
RequestMethod: req.RequestMethod,
RequestPath: req.RequestPath,
RequestParams: req.RequestParams,
ResponseStatus: req.ResponseStatus,
IP: req.IP,
UserAgent: req.UserAgent,
}
if req.UserID != 0 {
log.UserID = &req.UserID
}
return s.operationLogRepo.Create(ctx, log)
}
// RecordOperationRequest 记录操作请求
type RecordOperationRequest struct {
UserID int64 `json:"user_id"`
OperationType string `json:"operation_type"`
OperationName string `json:"operation_name"`
RequestMethod string `json:"request_method"`
RequestPath string `json:"request_path"`
RequestParams string `json:"request_params"`
ResponseStatus int `json:"response_status"`
IP string `json:"ip"`
UserAgent string `json:"user_agent"`
}
// ListOperationLogRequest 操作日志列表请求
type ListOperationLogRequest struct {
UserID int64 `json:"user_id"`
Method string `json:"method"`
Keyword string `json:"keyword"`
Page int `json:"page"`
PageSize int `json:"page_size"`
StartAt string `json:"start_at"`
EndAt string `json:"end_at"`
}
// GetOperationLogs 获取操作日志列表
func (s *OperationLogService) GetOperationLogs(ctx context.Context, req *ListOperationLogRequest) ([]*domain.OperationLog, int64, error) {
if req.Page <= 0 {
req.Page = 1
}
if req.PageSize <= 0 {
req.PageSize = 20
}
offset := (req.Page - 1) * req.PageSize
// 按关键词搜索
if req.Keyword != "" {
return s.operationLogRepo.Search(ctx, req.Keyword, offset, req.PageSize)
}
// 按用户 ID 查询
if req.UserID > 0 {
return s.operationLogRepo.ListByUserID(ctx, req.UserID, offset, req.PageSize)
}
// 按 HTTP 方法查询
if req.Method != "" {
return s.operationLogRepo.ListByMethod(ctx, req.Method, offset, req.PageSize)
}
// 按时间范围查询
if req.StartAt != "" && req.EndAt != "" {
start, err1 := time.Parse(time.RFC3339, req.StartAt)
end, err2 := time.Parse(time.RFC3339, req.EndAt)
if err1 == nil && err2 == nil {
return s.operationLogRepo.ListByTimeRange(ctx, start, end, offset, req.PageSize)
}
}
return s.operationLogRepo.List(ctx, offset, req.PageSize)
}
// GetMyOperationLogs 获取当前用户的操作日志
func (s *OperationLogService) GetMyOperationLogs(ctx context.Context, userID int64, page, pageSize int) ([]*domain.OperationLog, int64, error) {
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
offset := (page - 1) * pageSize
return s.operationLogRepo.ListByUserID(ctx, userID, offset, pageSize)
}
// CleanupOldLogs 清理旧日志(保留最近 N 天)
func (s *OperationLogService) CleanupOldLogs(ctx context.Context, retentionDays int) error {
return s.operationLogRepo.DeleteOlderThan(ctx, retentionDays)
}