package store import ( "context" "time" ) // Retention-запросы (AGENT.md 6.4, Фаза 5): чистка сессий, аудита и файлов без // ссылок. Все методы идемпотентны и работают порциями, чтобы не держать // блокировку писателя надолго. // DeleteSessionsBefore удаляет сессии, истёкшие раньше указанного времени. func (s *Store) DeleteSessionsBefore(ctx context.Context, before time.Time) (int64, error) { result, err := s.writer.ExecContext(ctx, `DELETE FROM sessions WHERE expires_at <= ?`, s.Timestamp(before)) if err != nil { return 0, mapError(err) } affected, err := result.RowsAffected() if err != nil { return 0, err } return affected, nil } // DeleteAuditBefore удаляет записи аудита старше указанного времени. func (s *Store) DeleteAuditBefore(ctx context.Context, before time.Time) (int64, error) { result, err := s.writer.ExecContext(ctx, `DELETE FROM audit_log WHERE created_at <= ?`, s.Timestamp(before)) if err != nil { return 0, mapError(err) } affected, err := result.RowsAffected() if err != nil { return 0, err } return affected, nil } // DeleteFileRecord удаляет запись о файле (содержимое удаляет вызывающий). func (s *Store) DeleteFileRecord(ctx context.Context, id uint64) error { if _, err := s.writer.ExecContext(ctx, `DELETE FROM files WHERE id = ?`, int64(id)); err != nil { return mapError(err) } return nil } // RebuildSearchIndex пересобирает индекс полнотекстового поиска (FTS5). func (s *Store) RebuildSearchIndex(ctx context.Context) error { if _, err := s.writer.ExecContext(ctx, `INSERT INTO messages_fts (messages_fts) VALUES ('rebuild')`); err != nil { return mapError(err) } return nil }