mattermost-plugin-cleanup-c.../server/autocleanup/store.go
Felipe M. a1e70da201
All checks were successful
ci / test (push) Successful in 4m53s
ci / lint (push) Successful in 5m19s
ci / build (push) Successful in 4m2s
Fix channel cleanup skipping posts across paginated deletes.
Offset-based pagination advanced after each page even though deletions
shift remaining posts, so large cleanups silently left messages behind.
Also page through all auto-cleanup KV keys and log individual delete failures.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 15:58:41 +02:00

80 lines
1.8 KiB
Go

package autocleanup
import (
"github.com/mattermost/mattermost/server/public/pluginapi"
"github.com/pkg/errors"
)
const listKeysPageSize = 1000
// Store persists per-channel automatic cleanup configuration.
type Store struct {
client *pluginapi.Client
}
func NewStore(client *pluginapi.Client) *Store {
return &Store{client: client}
}
func (s *Store) Get(channelID string) (*Config, error) {
var config Config
if err := s.client.KV.Get(kvKey(channelID), &config); err != nil {
return nil, errors.Wrap(err, "failed to get auto cleanup config")
}
if config.OffsetDays <= 0 {
return nil, nil
}
config.ChannelID = channelID
return &config, nil
}
func (s *Store) Set(channelID string, offsetDays int) error {
if offsetDays <= 0 {
return errors.New("offset_days must be greater than zero")
}
config := Config{
ChannelID: channelID,
OffsetDays: offsetDays,
}
_, err := s.client.KV.Set(kvKey(channelID), config)
return errors.Wrap(err, "failed to set auto cleanup config")
}
func (s *Store) Delete(channelID string) error {
if err := s.client.KV.Delete(kvKey(channelID)); err != nil {
return errors.Wrap(err, "failed to delete auto cleanup config")
}
return nil
}
func (s *Store) List() ([]Config, error) {
configs := make([]Config, 0)
for page := 0; ; page++ {
keys, err := s.client.KV.ListKeys(page, listKeysPageSize, pluginapi.WithPrefix(kvKeyPrefix))
if err != nil {
return nil, errors.Wrap(err, "failed to list auto cleanup configs")
}
if len(keys) == 0 {
break
}
for _, key := range keys {
channelID := key[len(kvKeyPrefix):]
config, err := s.Get(channelID)
if err != nil {
return nil, err
}
if config != nil {
configs = append(configs, *config)
}
}
if len(keys) < listKeysPageSize {
break
}
}
return configs, nil
}