package mock import ( "context" "fmt" "tera-clone/services/tera-api/internal/domain" "tera-clone/services/tera-api/internal/logservice" ) func (s *Store) ClearPortLogs(ctx context.Context, channel string) (domain.PortLogClearResult, error) { if _, err := parseChannel(channel); channel != "ALL" && err != nil { return domain.PortLogClearResult{}, err } // Refuse deletion if its audit request cannot be persisted. if _, err := s.RecordAudit(ctx, domain.AuditEvent{Action: "log.port.clear.request", Target: channel, Result: "succeeded", Message: "administrator requested clearing this port's communication logs"}); err != nil { return domain.PortLogClearResult{}, err } s.mu.Lock() defer s.mu.Unlock() deleted := 0 if s.logJournal != nil { cleaner, ok := s.logJournal.(logservice.PortLogCleaner) if !ok { return domain.PortLogClearResult{}, fmt.Errorf("port log clearing is not supported by this journal") } count, err := cleaner.ClearPort(channel) if err != nil { return domain.PortLogClearResult{}, err } deleted = count if err := s.refreshPortJournalLocked(); err != nil { return domain.PortLogClearResult{}, err } } else { before := s.portLogEvents kept := make([]domain.PortLogEvent, 0, len(before)) for _, event := range before { if channel == "ALL" || event.Channel == channel { deleted++ continue } kept = append(kept, event) } s.portLogEvents, s.portLogLoaded = kept, true if err := s.persistPortLogStoreLocked(); err != nil { s.portLogEvents = before return domain.PortLogClearResult{}, err } } id := s.recordAuditLocked(ctx, "log.port.clear", channel, "succeeded", fmt.Sprintf("cleared %d port communication log records; system, audit and link logs preserved", deleted)) return domain.PortLogClearResult{Channel: channel, Deleted: deleted, AuditID: id}, nil }