120 lines
5.6 KiB
Go
120 lines
5.6 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"kra/internal/biz"
|
|
"kra/internal/service/dto"
|
|
)
|
|
|
|
type AuditService struct{ uc *biz.AuditUsecase }
|
|
|
|
func NewAuditService(uc *biz.AuditUsecase) *AuditService { return &AuditService{uc: uc} }
|
|
|
|
type AuditRecorder struct{ uc *biz.AuditRecorderUsecase }
|
|
|
|
func NewAuditRecorder(uc *biz.AuditRecorderUsecase) *AuditRecorder { return &AuditRecorder{uc: uc} }
|
|
|
|
func (s *AuditRecorder) RecordOperation(ctx context.Context, v *biz.OperationRecord) error {
|
|
return s.uc.RecordOperation(ctx, v)
|
|
}
|
|
func (s *AuditRecorder) RecordOperationRequest(ctx context.Context, value *dto.OperationRecordRequest) error {
|
|
return s.RecordOperation(ctx, &biz.OperationRecord{IP: value.IP, Method: value.Method, Path: value.Path, Status: value.Status, LatencyMS: value.LatencyMS, Agent: value.Agent, ErrorMessage: value.ErrorMessage, Body: value.Body, Response: value.Response, UserID: value.UserID, RequestID: value.RequestID, TraceID: value.TraceID, DeviceID: value.DeviceID})
|
|
}
|
|
func (s *AuditService) OperationsFilter(ctx context.Context, page, size int, path, method string, status int) ([]map[string]any, int64, error) {
|
|
return s.Operations(ctx, page, size, &biz.OperationRecord{Path: path, Method: method, Status: status})
|
|
}
|
|
func opDTO(v *biz.OperationRecord) map[string]any {
|
|
user := map[string]any{}
|
|
if v.User != nil {
|
|
user = convertUser(v.User)
|
|
}
|
|
return map[string]any{"ID": v.ID, "CreatedAt": v.CreatedAt, "DeletedAt": nil, "ip": v.IP, "method": v.Method, "path": v.Path, "status": v.Status, "latency_ms": v.LatencyMS, "agent": v.Agent, "error_message": v.ErrorMessage, "body": v.Body, "resp": v.Response, "user_id": v.UserID, "request_id": v.RequestID, "trace_id": v.TraceID, "device_id": v.DeviceID, "user": user}
|
|
}
|
|
func (s *AuditService) Operations(ctx context.Context, page, size int, q *biz.OperationRecord) ([]map[string]any, int64, error) {
|
|
items, total, err := s.uc.ListOperations(ctx, page, size, q)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
out := make([]map[string]any, 0, len(items))
|
|
for _, v := range items {
|
|
out = append(out, opDTO(v))
|
|
}
|
|
return out, total, nil
|
|
}
|
|
func (s *AuditService) Operation(ctx context.Context, id uint) (map[string]any, error) {
|
|
v, err := s.uc.FindOperation(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return opDTO(v), nil
|
|
}
|
|
func (s *AuditService) DeleteOperations(ctx context.Context, ids []uint) error {
|
|
return s.uc.DeleteOperations(ctx, ids)
|
|
}
|
|
|
|
func (s *AuditRecorder) RecordLogin(ctx context.Context, v *biz.LoginLog) error {
|
|
return s.uc.RecordLogin(ctx, v)
|
|
}
|
|
func (s *AuditRecorder) RecordLoginRequest(ctx context.Context, value *dto.LoginLogRequest) error {
|
|
return s.RecordLogin(ctx, &biz.LoginLog{Username: value.Username, IP: value.IP, Status: value.Status, ErrorMessage: value.ErrorMessage, Agent: value.Agent, UserID: value.UserID})
|
|
}
|
|
func (s *AuditService) LoginsFilter(ctx context.Context, page, size int, username string, status bool) ([]map[string]any, int64, error) {
|
|
return s.Logins(ctx, page, size, &biz.LoginLog{Username: username, Status: status, FilterByStatus: status})
|
|
}
|
|
func loginDTO(v *biz.LoginLog) map[string]any {
|
|
user := map[string]any{}
|
|
if v.User != nil {
|
|
user = convertUser(v.User)
|
|
}
|
|
return map[string]any{"ID": v.ID, "CreatedAt": v.CreatedAt, "DeletedAt": nil, "username": v.Username, "ip": v.IP, "status": v.Status, "errorMessage": v.ErrorMessage, "agent": v.Agent, "userId": v.UserID, "user": user}
|
|
}
|
|
func (s *AuditService) Logins(ctx context.Context, page, size int, q *biz.LoginLog) ([]map[string]any, int64, error) {
|
|
items, total, err := s.uc.ListLogins(ctx, page, size, q)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
out := make([]map[string]any, 0, len(items))
|
|
for _, v := range items {
|
|
out = append(out, loginDTO(v))
|
|
}
|
|
return out, total, nil
|
|
}
|
|
func (s *AuditService) Login(ctx context.Context, id uint) (map[string]any, error) {
|
|
v, err := s.uc.FindLogin(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return loginDTO(v), nil
|
|
}
|
|
func (s *AuditService) DeleteLogins(ctx context.Context, ids []uint) error {
|
|
return s.uc.DeleteLogins(ctx, ids)
|
|
}
|
|
|
|
func (s *AuditRecorder) RecordDataAccess(ctx context.Context, v *biz.DataAccessLog) error {
|
|
return s.uc.RecordDataAccess(ctx, v)
|
|
}
|
|
func (s *AuditRecorder) RecordDataAccessRequest(ctx context.Context, value *dto.DataAccessRecordRequest) error {
|
|
return s.RecordDataAccess(ctx, &biz.DataAccessLog{EventType: value.EventType, Operation: value.Operation, UserID: value.UserID, AuthorityID: value.AuthorityID, RequestID: value.RequestID, Method: value.Method, Path: value.Path, Detail: value.Detail})
|
|
}
|
|
func (s *AuditService) DataAccessRequest(ctx context.Context, req *dto.DataAccessListRequest) ([]map[string]any, int64, error) {
|
|
return s.DataAccess(ctx, req.Page, req.PageSize, &biz.DataAccessLog{EventType: req.EventType, TargetTable: req.TargetTable, UserID: req.UserID})
|
|
}
|
|
func dataAccessDTO(v *biz.DataAccessLog) map[string]any {
|
|
return map[string]any{"ID": v.ID, "CreatedAt": v.CreatedAt, "DeletedAt": nil, "eventType": v.EventType, "targetTable": v.TargetTable, "operation": v.Operation, "userId": v.UserID, "authorityId": v.AuthorityID, "scope": v.Scope, "requestId": v.RequestID, "method": v.Method, "path": v.Path, "detail": v.Detail}
|
|
}
|
|
func (s *AuditService) DataAccess(ctx context.Context, page, size int, q *biz.DataAccessLog) ([]map[string]any, int64, error) {
|
|
items, total, err := s.uc.ListDataAccess(ctx, page, size, q)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
out := make([]map[string]any, 0, len(items))
|
|
for _, v := range items {
|
|
out = append(out, dataAccessDTO(v))
|
|
}
|
|
return out, total, nil
|
|
}
|
|
func (s *AuditService) DeleteDataAccess(ctx context.Context, ids []uint) error {
|
|
return s.uc.DeleteDataAccess(ctx, ids)
|
|
}
|