QueryEvents 查询事件
(ctx context.Context, query *AuditQuery)
| 491 | |
| 492 | // QueryEvents 查询事件 |
| 493 | func (al *InMemoryAuditLog) QueryEvents(ctx context.Context, query *AuditQuery) (*AuditResult, error) { |
| 494 | start := time.Now() |
| 495 | |
| 496 | al.mu.RLock() |
| 497 | defer al.mu.RUnlock() |
| 498 | |
| 499 | var filteredEvents []*AuditEvent |
| 500 | for i := range al.events { |
| 501 | event := &al.events[i] |
| 502 | if al.matchesQuery(event, query) { |
| 503 | filteredEvents = append(filteredEvents, event) |
| 504 | } |
| 505 | } |
| 506 | |
| 507 | // 应用排序 |
| 508 | if query.OrderBy != "" { |
| 509 | al.sortEvents(filteredEvents, query.OrderBy, query.OrderDesc) |
| 510 | } |
| 511 | |
| 512 | // 应用分页 |
| 513 | total := int64(len(filteredEvents)) |
| 514 | offset := query.Offset |
| 515 | if offset < 0 { |
| 516 | offset = 0 |
| 517 | } |
| 518 | limit := query.Limit |
| 519 | if limit <= 0 { |
| 520 | limit = 100 |
| 521 | } |
| 522 | |
| 523 | var events []*AuditEvent |
| 524 | if offset < len(filteredEvents) { |
| 525 | end := offset + limit |
| 526 | if end > len(filteredEvents) { |
| 527 | end = len(filteredEvents) |
| 528 | } |
| 529 | events = filteredEvents[offset:end] |
| 530 | } else { |
| 531 | events = []*AuditEvent{} |
| 532 | } |
| 533 | |
| 534 | return &AuditResult{ |
| 535 | Events: events, |
| 536 | Total: total, |
| 537 | Offset: offset, |
| 538 | Limit: limit, |
| 539 | HasMore: int64(offset+limit) < total, |
| 540 | QueryTime: time.Since(start), |
| 541 | }, nil |
| 542 | } |
| 543 | |
| 544 | // matchesQuery 检查事件是否匹配查询条件 |
| 545 | func (al *InMemoryAuditLog) matchesQuery(event *AuditEvent, query *AuditQuery) bool { |
no test coverage detected