2026-04-28 11:32:50 +08:00
|
|
|
package app
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
|
|
|
|
|
"github.com/geo-platform/tenant-api/internal/ops/domain"
|
|
|
|
|
"github.com/geo-platform/tenant-api/internal/ops/repository"
|
2026-05-13 15:59:39 +08:00
|
|
|
"github.com/geo-platform/tenant-api/internal/shared/ipregion"
|
2026-04-28 11:32:50 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type AuditService struct {
|
2026-04-29 00:46:37 +08:00
|
|
|
repo *repository.AuditRepository
|
|
|
|
|
logger *zap.Logger
|
2026-05-13 15:59:39 +08:00
|
|
|
ipRegions *ipregion.Resolver
|
2026-04-28 11:32:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewAuditService(repo *repository.AuditRepository, logger *zap.Logger) *AuditService {
|
|
|
|
|
return &AuditService{repo: repo, logger: logger}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-13 15:59:39 +08:00
|
|
|
func (s *AuditService) WithIPRegionResolver(resolver *ipregion.Resolver) *AuditService {
|
2026-04-29 00:46:37 +08:00
|
|
|
s.ipRegions = resolver
|
|
|
|
|
return s
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 11:32:50 +08:00
|
|
|
func (s *AuditService) Append(ctx context.Context, e domain.AuditEvent) error {
|
2026-04-29 00:46:37 +08:00
|
|
|
if e.IPRegion == "" && s.ipRegions != nil {
|
|
|
|
|
e.IPRegion = s.ipRegions.Lookup(e.IP)
|
|
|
|
|
}
|
2026-04-28 11:32:50 +08:00
|
|
|
if err := s.repo.Append(ctx, e); err != nil {
|
|
|
|
|
s.logger.Warn("ops audit append failed",
|
|
|
|
|
zap.String("action", e.Action),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *AuditService) List(ctx context.Context, f domain.AuditLogFilter) ([]domain.AuditLog, int64, error) {
|
|
|
|
|
return s.repo.List(ctx, f)
|
|
|
|
|
}
|